github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/ebpftracer/decoder/decoder_test.go (about) 1 package decoder 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "net/netip" 7 "testing" 8 9 "github.com/castai/kvisor/pkg/ebpftracer/types" 10 "github.com/castai/kvisor/pkg/logging" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 "golang.org/x/net/dns/dnsmessage" 14 ) 15 16 var ( 17 log *logging.Logger 18 ) 19 20 func TestDecodeContext(t *testing.T) { 21 buf := new(bytes.Buffer) 22 ctxExpected := types.EventContext{ 23 Ts: 11, 24 StartTime: 223, 25 CgroupID: 22, 26 Pid: 543, 27 Tid: 77, 28 Ppid: 4567, 29 HostPid: 5430, 30 HostTid: 124, 31 HostPpid: 555, 32 NodeHostPid: 51, 33 Uid: 9876, 34 MntID: 1357, 35 PidID: 3758, 36 Comm: [16]byte{1, 3, 5, 3, 1, 5, 56, 6, 7, 32, 2, 4}, 37 UtsName: [16]byte{5, 6, 7, 8, 9, 4, 3, 2}, 38 Flags: 12, 39 LeaderStartTime: 10, 40 ParentStartTime: 11, 41 EventID: 16, 42 Syscall: 9, 43 MatchedPolicies: 7, 44 Retval: 4, 45 StackID: 10, 46 ProcessorId: 5, 47 } 48 err := binary.Write(buf, binary.LittleEndian, ctxExpected) 49 assert.Equal(t, nil, err) 50 var ctxObtained types.EventContext 51 rawData := buf.Bytes() 52 d := NewEventDecoder(log, rawData) 53 cursorBefore := d.cursor 54 err = d.DecodeContext(&ctxObtained) 55 cursorAfter := d.cursor 56 57 // checking no error 58 assert.Equal(t, nil, err) 59 // checking decoding succeeded correctly 60 assert.Equal(t, ctxExpected, ctxObtained) 61 // checking decoder cursor on buffer moved appropriately 62 assert.Equal(t, int(ctxExpected.GetSizeBytes()), cursorAfter-cursorBefore) 63 } 64 65 func TestDecodeSignalContext(t *testing.T) { 66 buf := new(bytes.Buffer) 67 ctxExpected := types.SignalContext{ 68 EventID: 100, 69 } 70 err := binary.Write(buf, binary.LittleEndian, ctxExpected) 71 assert.Equal(t, nil, err) 72 var ctxObtained types.SignalContext 73 rawData := buf.Bytes() 74 d := NewEventDecoder(log, rawData) 75 cursorBefore := d.cursor 76 err = d.DecodeSignalContext(&ctxObtained) 77 cursorAfter := d.cursor 78 79 // checking no error 80 assert.Equal(t, nil, err) 81 // checking decoding succeeded correctly 82 assert.Equal(t, ctxExpected, ctxObtained) 83 // checking decoder cursor on buffer moved appropriately 84 assert.Equal(t, int(ctxExpected.GetSizeBytes()), cursorAfter-cursorBefore) 85 } 86 87 func TestDecodeUint8(t *testing.T) { 88 buf := new(bytes.Buffer) 89 var expected uint8 = 42 90 err := binary.Write(buf, binary.LittleEndian, expected) 91 // checking no error 92 assert.Equal(t, nil, err) 93 b := buf.Bytes() 94 d := NewEventDecoder(log, b) 95 cursorBefore := d.cursor 96 var obtained uint8 97 err = d.DecodeUint8(&obtained) 98 cursorAfter := d.cursor 99 // checking no error 100 assert.Equal(t, nil, err) 101 // checking decoding succeeded correctly 102 assert.Equal(t, expected, obtained) 103 // checking decoder cursor on buffer moved appropriately 104 assert.Equal(t, 1, cursorAfter-cursorBefore) // cursor should move 1 byte 105 } 106 107 func TestDecodeInt8(t *testing.T) { 108 buf := new(bytes.Buffer) 109 var expected int8 = -42 110 err := binary.Write(buf, binary.LittleEndian, expected) 111 // checking no error 112 assert.Equal(t, nil, err) 113 b := buf.Bytes() 114 d := NewEventDecoder(log, b) 115 cursorBefore := d.cursor 116 var obtained int8 117 err = d.DecodeInt8(&obtained) 118 cursorAfter := d.cursor 119 // checking no error 120 assert.Equal(t, nil, err) 121 // checking decoding succeeded correctly 122 assert.Equal(t, expected, obtained) 123 // checking decoder cursor on buffer moved appropriately 124 assert.Equal(t, 1, cursorAfter-cursorBefore) // cursor should move 1 byte 125 } 126 127 func TestDecodeUint16(t *testing.T) { 128 buf := new(bytes.Buffer) 129 var expected uint16 = 5555 130 err := binary.Write(buf, binary.LittleEndian, expected) 131 // checking no error 132 assert.Equal(t, nil, err) 133 b := buf.Bytes() 134 d := NewEventDecoder(log, b) 135 cursorBefore := d.cursor 136 var obtained uint16 137 err = d.DecodeUint16(&obtained) 138 cursorAfter := d.cursor 139 // checking no error 140 assert.Equal(t, nil, err) 141 // checking decoding succeeded correctly 142 assert.Equal(t, expected, obtained) 143 // checking decoder cursor on buffer moved appropriately 144 assert.Equal(t, 2, cursorAfter-cursorBefore) // cursor should move 2 byte 145 } 146 147 func TestDecodeUint16BigEndian(t *testing.T) { 148 buf := new(bytes.Buffer) 149 var expected uint16 = 5555 150 err := binary.Write(buf, binary.BigEndian, expected) 151 // checking no error 152 assert.Equal(t, nil, err) 153 b := buf.Bytes() 154 d := NewEventDecoder(log, b) 155 cursorBefore := d.cursor 156 var obtained uint16 157 err = d.DecodeUint16BigEndian(&obtained) 158 cursorAfter := d.cursor 159 // checking no error 160 assert.Equal(t, nil, err) 161 // checking decoding succeeded correctly 162 assert.Equal(t, expected, obtained) 163 // checking decoder cursor on buffer moved appropriately 164 assert.Equal(t, 2, cursorAfter-cursorBefore) // cursor should move 2 byte 165 } 166 func TestDecodeInt16(t *testing.T) { 167 buf := new(bytes.Buffer) 168 var expected int16 = -3456 169 err := binary.Write(buf, binary.LittleEndian, expected) 170 // checking no error 171 assert.Equal(t, nil, err) 172 b := buf.Bytes() 173 d := NewEventDecoder(log, b) 174 cursorBefore := d.cursor 175 var obtained int16 176 err = d.DecodeInt16(&obtained) 177 cursorAfter := d.cursor 178 // checking no error 179 assert.Equal(t, nil, err) 180 // checking decoding succeeded correctly 181 assert.Equal(t, expected, obtained) 182 // checking decoder cursor on buffer moved appropriately 183 assert.Equal(t, 2, cursorAfter-cursorBefore) // cursor should move 2 byte 184 } 185 186 func TestDecodeUint32(t *testing.T) { 187 buf := new(bytes.Buffer) 188 var expected uint32 = 5555 189 err := binary.Write(buf, binary.LittleEndian, expected) 190 // checking no error 191 assert.Equal(t, nil, err) 192 b := buf.Bytes() 193 d := NewEventDecoder(log, b) 194 cursorBefore := d.cursor 195 var obtained uint32 196 err = d.DecodeUint32(&obtained) 197 cursorAfter := d.cursor 198 // checking no error 199 assert.Equal(t, nil, err) 200 // checking decoding succeeded correctly 201 assert.Equal(t, expected, obtained) 202 // checking decoder cursor on buffer moved appropriately 203 assert.Equal(t, cursorAfter-cursorBefore, 4) // cursor should move 4 byte 204 } 205 206 func TestDecodeUint32BigEndian(t *testing.T) { 207 buf := new(bytes.Buffer) 208 var expected uint32 = 5555 209 err := binary.Write(buf, binary.BigEndian, expected) 210 // checking no error 211 assert.Equal(t, nil, err) 212 b := buf.Bytes() 213 d := NewEventDecoder(log, b) 214 cursorBefore := d.cursor 215 var obtained uint32 216 err = d.DecodeUint32BigEndian(&obtained) 217 cursorAfter := d.cursor 218 // checking no error 219 assert.Equal(t, nil, err) 220 // checking decoding succeeded correctly 221 assert.Equal(t, expected, obtained) 222 // checking decoder cursor on buffer moved appropriately 223 assert.Equal(t, cursorAfter-cursorBefore, 4) // cursor should move 4 byte 224 } 225 func TestDecodeInt32(t *testing.T) { 226 buf := new(bytes.Buffer) 227 var expected int32 = -3456 228 err := binary.Write(buf, binary.LittleEndian, expected) 229 // checking no error 230 assert.Equal(t, nil, err) 231 b := buf.Bytes() 232 d := NewEventDecoder(log, b) 233 cursorBefore := d.cursor 234 var obtained int32 235 err = d.DecodeInt32(&obtained) 236 cursorAfter := d.cursor 237 // checking no error 238 assert.Equal(t, nil, err) 239 // checking decoding succeeded correctly 240 assert.Equal(t, expected, obtained) 241 // checking decoder cursor on buffer moved appropriately 242 assert.Equal(t, 4, cursorAfter-cursorBefore) // cursor should move 4 byte 243 } 244 245 func TestDecodeUint64(t *testing.T) { 246 buf := new(bytes.Buffer) 247 var expected uint64 = 5555 248 err := binary.Write(buf, binary.LittleEndian, expected) 249 // checking no error 250 assert.Equal(t, nil, err) 251 b := buf.Bytes() 252 d := NewEventDecoder(log, b) 253 cursorBefore := d.cursor 254 var obtained uint64 255 err = d.DecodeUint64(&obtained) 256 cursorAfter := d.cursor 257 // checking no error 258 assert.Equal(t, nil, err) 259 // checking decoding succeeded correctly 260 assert.Equal(t, expected, obtained) 261 // checking decoder cursor on buffer moved appropriately 262 assert.Equal(t, 8, cursorAfter-cursorBefore) // cursor should move 8 byte 263 } 264 265 func TestDecodeInt64(t *testing.T) { 266 buf := new(bytes.Buffer) 267 var expected int64 = -3456 268 err := binary.Write(buf, binary.LittleEndian, expected) 269 // checking no error 270 assert.Equal(t, nil, err) 271 b := buf.Bytes() 272 d := NewEventDecoder(log, b) 273 cursorBefore := d.cursor 274 var obtained int64 275 err = d.DecodeInt64(&obtained) 276 cursorAfter := d.cursor 277 // checking no error 278 assert.Equal(t, nil, err) 279 // checking decoding succeeded correctly 280 assert.Equal(t, expected, obtained) 281 // checking decoder cursor on buffer moved appropriately 282 assert.Equal(t, 8, cursorAfter-cursorBefore) // cursor should move 8 byte 283 } 284 285 func TestDecodeBoolTrue(t *testing.T) { 286 buf := new(bytes.Buffer) 287 expected := true 288 err := binary.Write(buf, binary.LittleEndian, expected) 289 // checking no error 290 assert.Equal(t, nil, err) 291 b := buf.Bytes() 292 d := NewEventDecoder(log, b) 293 cursorBefore := d.cursor 294 var obtained bool 295 err = d.DecodeBool(&obtained) 296 cursorAfter := d.cursor 297 // checking no error 298 assert.Equal(t, nil, err) 299 // checking decoding succeeded correctly 300 assert.Equal(t, expected, obtained) 301 // checking decoder cursor on buffer moved appropriately 302 assert.Equal(t, 1, cursorAfter-cursorBefore) // cursor should move 1 byte 303 } 304 305 func TestDecodeBoolFalse(t *testing.T) { 306 buf := new(bytes.Buffer) 307 expected := false 308 err := binary.Write(buf, binary.LittleEndian, expected) 309 // checking no error 310 assert.Equal(t, nil, err) 311 b := buf.Bytes() 312 d := NewEventDecoder(log, b) 313 cursorBefore := d.cursor 314 var obtained bool 315 err = d.DecodeBool(&obtained) 316 cursorAfter := d.cursor 317 // checking no error 318 assert.Equal(t, nil, err) 319 // checking decoding succeeded correctly 320 assert.Equal(t, expected, obtained) 321 // checking decoder cursor on buffer moved appropriately 322 assert.Equal(t, 1, cursorAfter-cursorBefore) // cursor should move 1 byte 323 } 324 325 // TODO DecodeBytes and DecodeIntArray 326 func TestDecodeBytes(t *testing.T) { 327 type JustAStruct struct { 328 A1 uint32 329 A2 uint64 330 } 331 expected := JustAStruct{ 332 A1: 43, 333 A2: 444434, 334 } 335 buf := new(bytes.Buffer) 336 err := binary.Write(buf, binary.LittleEndian, &expected) 337 assert.Equal(t, nil, err) 338 339 var sunPathBuf [12]byte // 12 is the size of JustAStruct 340 d := NewEventDecoder(log, buf.Bytes()) 341 err = d.DecodeBytes(sunPathBuf[:], 12) 342 assert.Equal(t, nil, err) 343 344 r := bytes.NewBuffer(sunPathBuf[:]) 345 var obtained JustAStruct 346 err = binary.Read(r, binary.LittleEndian, &obtained) 347 assert.Equal(t, nil, err) 348 assert.Equal(t, expected, obtained) 349 } 350 351 func TestDecodeIntArray(t *testing.T) { 352 var raw []byte 353 raw = append(raw, 1, 2, 3, 4, 5, 6, 7, 8) 354 decoder := NewEventDecoder(log, raw) 355 var obtained [2]int32 356 err := decoder.DecodeIntArray(obtained[:], 2) 357 assert.Equal(t, nil, err) 358 rawcp := append(raw, 1, 2, 3, 4, 5, 6, 7, 8) 359 dataBuff := bytes.NewBuffer(rawcp) 360 var expected [2]int32 361 err = binary.Read(dataBuff, binary.LittleEndian, &expected) 362 assert.Equal(t, nil, err) 363 // checking decoding works as expected 364 assert.Equal(t, expected, obtained) 365 } 366 367 func TestDecodeSlimCred(t *testing.T) { 368 buf := new(bytes.Buffer) 369 expected := types.SlimCred{ 370 Uid: 43, 371 Gid: 6789, 372 Suid: 987, 373 Sgid: 678, 374 Euid: 543, 375 Egid: 7538, 376 Fsuid: 687, 377 Fsgid: 3454, 378 UserNamespace: 34, 379 SecureBits: 456789, 380 CapInheritable: 342, 381 CapPermitted: 9873, 382 CapEffective: 555, 383 CapBounding: 5555, 384 CapAmbient: 432, 385 } 386 err := binary.Write(buf, binary.LittleEndian, expected) 387 assert.Equal(t, nil, err) 388 var obtained types.SlimCred 389 rawBuf := buf.Bytes() 390 d := NewEventDecoder(log, rawBuf) 391 err = d.DecodeSlimCred(&obtained) 392 assert.Equal(t, nil, err) 393 assert.Equal(t, expected, obtained) 394 } 395 396 func TestDecodeChunkMeta(t *testing.T) { 397 buf := new(bytes.Buffer) 398 expected := types.ChunkMeta{ 399 BinType: 54, 400 CgroupID: 6543, 401 Metadata: [28]byte{5, 4, 3, 5, 6, 7, 4, 54, 3, 32, 4, 4, 4, 4, 4}, 402 Size: 6543, 403 Off: 76543, 404 } 405 err := binary.Write(buf, binary.LittleEndian, expected) 406 assert.Equal(t, nil, err) 407 var obtained types.ChunkMeta 408 rawBuf := buf.Bytes() 409 d := NewEventDecoder(log, rawBuf) 410 err = d.DecodeChunkMeta(&obtained) 411 assert.Equal(t, nil, err) 412 assert.Equal(t, expected, obtained) 413 } 414 415 func TestDecodeVfsWriteMeta(t *testing.T) { 416 buf := new(bytes.Buffer) 417 expected := types.VfsFileMeta{ 418 DevID: 54, 419 Inode: 543, 420 Mode: 654, 421 Pid: 98479, 422 } 423 err := binary.Write(buf, binary.LittleEndian, expected) 424 assert.Equal(t, nil, err) 425 var obtained types.VfsFileMeta 426 rawBuf := buf.Bytes() 427 d := NewEventDecoder(log, rawBuf) 428 err = d.DecodeVfsFileMeta(&obtained) 429 assert.Equal(t, nil, err) 430 assert.Equal(t, expected, obtained) 431 } 432 433 func TestDecodeKernelModuleMeta(t *testing.T) { 434 buf := new(bytes.Buffer) 435 expected := types.KernelModuleMeta{ 436 DevID: 7489, 437 Inode: 543, 438 Pid: 7654, 439 Size: 4533, 440 } 441 err := binary.Write(buf, binary.LittleEndian, expected) 442 assert.Equal(t, nil, err) 443 var obtained types.KernelModuleMeta 444 rawBuf := buf.Bytes() 445 d := NewEventDecoder(log, rawBuf) 446 err = d.DecodeKernelModuleMeta(&obtained) 447 assert.Equal(t, nil, err) 448 assert.Equal(t, expected, obtained) 449 } 450 451 func TestDecodeBpfObjectMeta(t *testing.T) { 452 buf := new(bytes.Buffer) 453 expected := types.BpfObjectMeta{ 454 Name: [16]byte{80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, 455 Rand: 543, 456 Pid: 7654, 457 Size: 4533, 458 } 459 err := binary.Write(buf, binary.LittleEndian, expected) 460 assert.Equal(t, nil, err) 461 var obtained types.BpfObjectMeta 462 rawBuf := buf.Bytes() 463 d := NewEventDecoder(log, rawBuf) 464 err = d.DecodeBpfObjectMeta(&obtained) 465 assert.Equal(t, nil, err) 466 assert.Equal(t, expected, obtained) 467 } 468 469 func TestDecodeMprotectWriteMeta(t *testing.T) { 470 buf := new(bytes.Buffer) 471 expected := types.MprotectWriteMeta{ 472 Pid: 12, 473 Ts: 6789, 474 } 475 err := binary.Write(buf, binary.LittleEndian, expected) 476 assert.Equal(t, nil, err) 477 var obtained types.MprotectWriteMeta 478 rawBuf := buf.Bytes() 479 d := NewEventDecoder(log, rawBuf) 480 err = d.DecodeMprotectWriteMeta(&obtained) 481 assert.Equal(t, nil, err) 482 assert.Equal(t, expected, obtained) 483 } 484 485 func BenchmarkDecodeContext(*testing.B) { 486 var ctx types.EventContext 487 /* 488 s := eventContext{ 489 Ts: 11, 490 ProcessorId: 32, 491 CgroupID: 22, 492 Pid: 543, 493 Tid: 77, 494 Ppid: 4567, 495 HostPid: 5430, 496 HostTid: 124, 497 HostPpid: 555, 498 Uid: 9876, 499 MntID: 1357, 500 PidID: 3758, 501 Comm: [16]byte{1, 3, 5, 3, 1, 5, 56, 6, 7, 32, 2, 4}, 502 UtsName: [16]byte{5, 6, 7, 8, 9, 4, 3, 2}, 503 EventID: 654, 504 Retval: 6543, 505 StackID: 6, 506 Argnum: 234, 507 } 508 ****************** 509 buffer is the []byte representation of s instance 510 ****************** 511 */ 512 buffer := []byte{11, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 31, 2, 0, 0, 77, 0, 0, 0, 215, 17, 0, 0, 513 54, 21, 0, 0, 124, 0, 0, 0, 43, 2, 0, 0, 148, 38, 0, 0, 77, 5, 0, 0, 174, 14, 0, 0, 1, 3, 5, 3, 1, 5, 56, 6, 7, 32, 514 2, 4, 0, 0, 0, 0, 5, 6, 7, 8, 9, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 142, 2, 0, 0, 143, 25, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 234, 515 0, 0, 0} 516 for i := 0; i < 100; i++ { 517 decoder := NewEventDecoder(log, buffer) 518 decoder.DecodeContext(&ctx) 519 } 520 } 521 func BenchmarkBinaryContext(*testing.B) { 522 var ctx types.EventContext 523 /* 524 s := eventContext{ 525 Ts: 11, 526 CgroupID: 22, 527 ProcessorId: 432, 528 Pid: 543, 529 Tid: 77, 530 Ppid: 4567, 531 HostPid: 5430, 532 HostTid: 124, 533 HostPpid: 555, 534 Uid: 9876, 535 MntID: 1357, 536 PidID: 3758, 537 Comm: [16]byte{1, 3, 5, 3, 1, 5, 56, 6, 7, 32, 2, 4}, 538 UtsName: [16]byte{5, 6, 7, 8, 9, 4, 3, 2}, 539 EventID: 654, 540 Retval: 6543, 541 StackID: 6, 542 Argnum: 234, 543 } 544 ****************** 545 buffer is the []byte representation of s instance 546 ****************** 547 */ 548 549 buffer := []byte{11, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 31, 2, 0, 0, 77, 0, 0, 0, 215, 17, 0, 0, 550 54, 21, 0, 0, 124, 0, 0, 0, 43, 2, 0, 0, 148, 38, 0, 0, 77, 5, 0, 0, 174, 14, 0, 0, 1, 3, 5, 3, 1, 5, 56, 6, 7, 32, 551 2, 4, 0, 0, 0, 0, 5, 6, 7, 8, 9, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 142, 2, 0, 0, 143, 25, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 234, 552 0, 0, 0} 553 for i := 0; i < 100; i++ { 554 binBuf := bytes.NewBuffer(buffer) 555 binary.Read(binBuf, binary.LittleEndian, &ctx) 556 } 557 } 558 559 func BenchmarkDecodeUint8(*testing.B) { 560 buffer := []byte{234} 561 var num uint8 562 for i := 0; i < 100; i++ { 563 decoder := NewEventDecoder(log, buffer) 564 decoder.DecodeUint8(&num) 565 } 566 } 567 568 func BenchmarkBinaryUint8(*testing.B) { 569 buffer := []byte{234} 570 var num uint8 571 for i := 0; i < 100; i++ { 572 decoder := bytes.NewBuffer(buffer) 573 binary.Read(decoder, binary.LittleEndian, &num) 574 } 575 } 576 577 func BenchmarkDecodeInt8(*testing.B) { 578 buffer := []byte{234} 579 var num int8 580 for i := 0; i < 100; i++ { 581 decoder := NewEventDecoder(log, buffer) 582 decoder.DecodeInt8(&num) 583 } 584 } 585 586 func BenchmarkBinaryInt8(*testing.B) { 587 buffer := []byte{234} 588 var num int8 589 for i := 0; i < 100; i++ { 590 decoder := bytes.NewBuffer(buffer) 591 binary.Read(decoder, binary.LittleEndian, &num) 592 } 593 } 594 595 func BenchmarkDecodeUint16(*testing.B) { 596 buffer := []byte{179, 21} 597 var num uint16 598 for i := 0; i < 100; i++ { 599 decoder := NewEventDecoder(log, buffer) 600 decoder.DecodeUint16(&num) 601 } 602 } 603 604 func BenchmarkBinaryUint16(*testing.B) { 605 buffer := []byte{179, 21} 606 var num uint16 607 for i := 0; i < 100; i++ { 608 decoder := bytes.NewBuffer(buffer) 609 binary.Read(decoder, binary.LittleEndian, &num) 610 } 611 } 612 613 func BenchmarkDecodeInt16(*testing.B) { 614 buffer := []byte{179, 221} 615 var num int16 616 for i := 0; i < 100; i++ { 617 decoder := NewEventDecoder(log, buffer) 618 decoder.DecodeInt16(&num) 619 } 620 } 621 622 func BenchmarkBinaryInt16(*testing.B) { 623 buffer := []byte{179, 221} 624 var num int16 625 for i := 0; i < 100; i++ { 626 decoder := bytes.NewBuffer(buffer) 627 binary.Read(decoder, binary.LittleEndian, &num) 628 } 629 } 630 631 func BenchmarkDecodeUint32(*testing.B) { 632 buffer := []byte{179, 21, 56, 234} 633 var num uint32 634 for i := 0; i < 100; i++ { 635 decoder := NewEventDecoder(log, buffer) 636 decoder.DecodeUint32(&num) 637 } 638 } 639 640 func BenchmarkBinaryUint32(*testing.B) { 641 buffer := []byte{179, 21, 56, 234} 642 var num uint32 643 for i := 0; i < 100; i++ { 644 decoder := bytes.NewBuffer(buffer) 645 binary.Read(decoder, binary.LittleEndian, &num) 646 } 647 } 648 func BenchmarkDecodeInt32(*testing.B) { 649 buffer := []byte{179, 21, 56, 234} 650 var num int32 651 for i := 0; i < 100; i++ { 652 decoder := NewEventDecoder(log, buffer) 653 decoder.DecodeInt32(&num) 654 } 655 } 656 657 func BenchmarkBinaryInt32(*testing.B) { 658 buffer := []byte{179, 21, 56, 234} 659 var num int32 660 for i := 0; i < 100; i++ { 661 decoder := bytes.NewBuffer(buffer) 662 binary.Read(decoder, binary.LittleEndian, &num) 663 } 664 } 665 666 func BenchmarkDecodeUint64(*testing.B) { 667 buffer := []byte{179, 21, 56, 234, 45, 65, 234, 255} 668 var num uint64 669 for i := 0; i < 100; i++ { 670 decoder := NewEventDecoder(log, buffer) 671 decoder.DecodeUint64(&num) 672 } 673 } 674 675 func BenchmarkBinaryUint64(*testing.B) { 676 buffer := []byte{179, 21, 56, 234, 45, 65, 234, 255} 677 var num uint64 678 for i := 0; i < 100; i++ { 679 decoder := bytes.NewBuffer(buffer) 680 binary.Read(decoder, binary.LittleEndian, &num) 681 } 682 } 683 684 func BenchmarkDecodeInt64(*testing.B) { 685 buffer := []byte{179, 21, 56, 234, 45, 65, 234, 255} 686 var num int64 687 for i := 0; i < 100; i++ { 688 decoder := NewEventDecoder(log, buffer) 689 decoder.DecodeInt64(&num) 690 } 691 } 692 693 func BenchmarkBinaryInt64(*testing.B) { 694 buffer := []byte{179, 21, 56, 234, 45, 65, 234, 255} 695 var num int64 696 for i := 0; i < 100; i++ { 697 decoder := bytes.NewBuffer(buffer) 698 binary.Read(decoder, binary.LittleEndian, &num) 699 } 700 } 701 702 func BenchmarkDecodeBool(*testing.B) { 703 buffer := []byte{1} 704 var num bool 705 for i := 0; i < 100; i++ { 706 decoder := NewEventDecoder(log, buffer) 707 decoder.DecodeBool(&num) 708 } 709 } 710 func BenchmarkBinaryBool(*testing.B) { 711 buffer := []byte{1} 712 var num bool 713 for i := 0; i < 100; i++ { 714 decoder := bytes.NewBuffer(buffer) 715 binary.Read(decoder, binary.LittleEndian, &num) 716 } 717 } 718 719 func BenchmarkDecodeSlimCred(*testing.B) { 720 /* 721 s := bufferdecoder.SlimCred{ 722 Uid: 12, 723 Gid: 34, 724 Suid: 56, 725 Sgid: 78, 726 Euid: 91, 727 Egid: 234, 728 Fsuid: 654, 729 Fsgid: 765, 730 UserNamespace: 7654, 731 SecureBits: 7654, 732 CapInheritable: 345, 733 CapPermitted: 234, 734 CapEffective: 7653, 735 CapBounding: 8765, 736 CapAmbient: 765423, 737 } 738 739 ****************** 740 buffer is the []byte representation of s instance 741 ****************** 742 */ 743 buffer := []byte{12, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 234, 0, 0, 0, 142, 2, 0, 0, 253, 2, 0, 0, 744 230, 29, 0, 0, 230, 29, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 229, 29, 0, 0, 0, 0, 0, 0, 745 61, 34, 0, 0, 0, 0, 0, 0, 239, 173, 11, 0, 0, 0, 0, 0} 746 var s types.SlimCred 747 for i := 0; i < 100; i++ { 748 decoder := NewEventDecoder(log, buffer) 749 decoder.DecodeSlimCred(&s) 750 } 751 } 752 753 func BenchmarkBinarySlimCred(*testing.B) { 754 /* 755 s := bufferdecoder.SlimCred{ 756 Uid: 12, 757 Gid: 34, 758 Suid: 56, 759 Sgid: 78, 760 Euid: 91, 761 Egid: 234, 762 Fsuid: 654, 763 Fsgid: 765, 764 UserNamespace: 7654, 765 SecureBits: 7654, 766 CapInheritable: 345, 767 CapPermitted: 234, 768 CapEffective: 7653, 769 CapBounding: 8765, 770 CapAmbient: 765423, 771 } 772 773 ****************** 774 buffer is the []byte representation of s instance 775 ****************** 776 */ 777 buffer := []byte{12, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 234, 0, 0, 0, 142, 2, 0, 0, 253, 2, 0, 0, 778 230, 29, 0, 0, 230, 29, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 229, 29, 0, 0, 0, 0, 0, 0, 779 61, 34, 0, 0, 0, 0, 0, 0, 239, 173, 11, 0, 0, 0, 0, 0} 780 var s types.SlimCred 781 for i := 0; i < 100; i++ { 782 binBuf := bytes.NewBuffer(buffer) 783 binary.Read(binBuf, binary.LittleEndian, &s) 784 } 785 } 786 787 func BenchmarkDecodeChunkMeta(*testing.B) { 788 /* 789 s := ChunkMeta{ 790 binType: 1, 791 CgroupID: 54, 792 Metadata: [24]byte{ 793 54, 794 12, 795 54, 796 145, 797 42, 798 72, 799 134, 800 64, 801 125, 802 53, 803 62, 804 62, 805 123, 806 255, 807 123, 808 5, 809 0, 810 32, 811 234, 812 23, 813 42, 814 123, 815 32, 816 2, 817 }, 818 Size: 2, 819 Off: 23, 820 } 821 ****************** 822 buffer is the []byte representation of s instance 823 ****************** 824 */ 825 buffer := []byte{1, 54, 0, 0, 0, 0, 0, 0, 0, 54, 12, 54, 145, 42, 72, 134, 64, 125, 53, 62, 62, 123, 255, 123, 5, 0, 32, 234, 826 23, 42, 123, 32, 2, 2, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0} 827 var s types.ChunkMeta 828 for i := 0; i < 100; i++ { 829 decoder := NewEventDecoder(log, buffer) 830 decoder.DecodeChunkMeta(&s) 831 } 832 } 833 func BenchmarkBinaryChunkMeta(*testing.B) { 834 /* 835 s := ChunkMeta{ 836 binType: 1, 837 CgroupID: 54, 838 Metadata: [24]byte{ 839 54, 840 12, 841 54, 842 145, 843 42, 844 72, 845 134, 846 64, 847 125, 848 53, 849 62, 850 62, 851 123, 852 255, 853 123, 854 5, 855 0, 856 32, 857 234, 858 23, 859 42, 860 123, 861 32, 862 2, 863 }, 864 Size: 2, 865 Off: 23, 866 } 867 ****************** 868 buffer is the []byte representation of s instance 869 ****************** 870 */ 871 buffer := []byte{1, 54, 0, 0, 0, 0, 0, 0, 0, 54, 12, 54, 145, 42, 72, 134, 64, 125, 53, 62, 62, 123, 255, 123, 5, 0, 32, 234, 872 23, 42, 123, 32, 2, 2, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0} 873 var s types.ChunkMeta 874 for i := 0; i < 100; i++ { 875 binBuf := bytes.NewBuffer(buffer) 876 binary.Read(binBuf, binary.LittleEndian, &s) 877 } 878 } 879 880 func BenchmarkDecodeVfsWriteMeta(*testing.B) { 881 /* 882 s := VfsFileMeta{ 883 DevID: 24, 884 Inode: 3, 885 Mode: 255, 886 Pid: 0, 887 } 888 ****************** 889 buffer is the []byte representation of s instance 890 ****************** 891 */ 892 893 buffer := []byte{24, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0} 894 var s types.VfsFileMeta 895 for i := 0; i < 100; i++ { 896 decoder := NewEventDecoder(log, buffer) 897 decoder.DecodeVfsFileMeta(&s) 898 } 899 } 900 901 func BenchmarkBinaryVfsWriteMeta(*testing.B) { 902 /* 903 s := VfsFileMeta{ 904 DevID: 24, 905 Inode: 3, 906 Mode: 255, 907 Pid: 0, 908 } 909 ****************** 910 buffer is the []byte representation of s instance 911 ****************** 912 */ 913 914 buffer := []byte{24, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0} 915 var s types.VfsFileMeta 916 for i := 0; i < 100; i++ { 917 binBuf := bytes.NewBuffer(buffer) 918 binary.Read(binBuf, binary.LittleEndian, &s) 919 } 920 } 921 922 func BenchmarkDecodeKernelModuleMeta(*testing.B) { 923 /* 924 s := KernelModuleMeta{ 925 DevID: 43, 926 Inode: 65, 927 Pid: 234, 928 Size: 1, 929 } 930 ****************** 931 buffer is the []byte representation of s instance 932 ****************** 933 */ 934 buffer := []byte{43, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0} 935 var s types.KernelModuleMeta 936 for i := 0; i < 100; i++ { 937 decoder := NewEventDecoder(log, buffer) 938 decoder.DecodeKernelModuleMeta(&s) 939 } 940 } 941 942 func BenchmarkBinaryKernelModuleMeta(*testing.B) { 943 /* 944 s := KernelModuleMeta{ 945 DevID: 43, 946 Inode: 65, 947 Pid: 234, 948 Size: 1, 949 } 950 ****************** 951 buffer is the []byte representation of s instance 952 ****************** 953 */ 954 buffer := []byte{43, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0} 955 var s types.KernelModuleMeta 956 for i := 0; i < 100; i++ { 957 binBuf := bytes.NewBuffer(buffer) 958 binary.Read(binBuf, binary.LittleEndian, &s) 959 } 960 } 961 962 func BenchmarkDecodeMprotectWriteMeta(*testing.B) { 963 /* 964 s := MprotectWriteMeta{ 965 Ts: 123, 966 } 967 ****************** 968 buffer is the []byte representation of s instance 969 ****************** 970 */ 971 buffer := []byte{123, 0, 0, 0, 0, 0, 0, 0} 972 var s types.MprotectWriteMeta 973 for i := 0; i < 100; i++ { 974 decoder := NewEventDecoder(log, buffer) 975 decoder.DecodeMprotectWriteMeta(&s) 976 } 977 } 978 979 func BenchmarkBinaryMprotectWriteMeta(*testing.B) { 980 /* 981 s := MprotectWriteMeta{ 982 Ts: 123, 983 } 984 ****************** 985 buffer is the []byte representation of s instance 986 ****************** 987 */ 988 buffer := []byte{123, 0, 0, 0, 0, 0, 0, 0} 989 var s types.MprotectWriteMeta 990 for i := 0; i < 100; i++ { 991 binBuf := bytes.NewBuffer(buffer) 992 binary.Read(binBuf, binary.LittleEndian, &s) 993 } 994 } 995 996 func TestPrintUint32IP(t *testing.T) { 997 var input uint32 = 3232238339 998 ip := PrintUint32IP(input) 999 1000 expectedIP := "192.168.11.3" 1001 assert.Equal(t, expectedIP, ip) 1002 } 1003 1004 func TestPrint16BytesSliceIP(t *testing.T) { 1005 input := []byte{32, 1, 13, 184, 133, 163, 0, 0, 0, 0, 138, 46, 3, 112, 115, 52} 1006 ip := Print16BytesSliceIP(input) 1007 1008 expectedIP := "2001:db8:85a3::8a2e:370:7334" 1009 assert.Equal(t, expectedIP, ip) 1010 } 1011 1012 type dnsRecord struct { 1013 dnsType uint32 1014 name string 1015 ip string 1016 } 1017 1018 type dnsData struct { 1019 question string 1020 answers []dnsRecord 1021 } 1022 1023 var udpDnsData = dnsData{ 1024 question: "orf.at", 1025 answers: []dnsRecord{ 1026 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.142"}, 1027 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.150"}, 1028 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.141"}, 1029 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.4"}, 1030 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.140"}, 1031 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.149"}, 1032 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.139"}, 1033 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.3"}, 1034 }, 1035 } 1036 var dnsOverUDP4 = []byte{ 1037 // Payload size 1038 0xe4, 0x00, 0x00, 0x00, 1039 1040 // IP header 1041 0x45, 0x00, 0x00, 0xe4, 0xb4, 0x0c, 0x40, 0x00, 0x3f, 0x11, 0x71, 0x44, 0x0a, 0x60, 0x00, 0x0a, 1042 0x0a, 0xf4, 0x00, 0x5b, 1043 1044 // UDP header 1045 0x00, 0x35, 0xc5, 0x78, 0x00, 0xd0, 0x16, 0x9a, 1046 1047 // DNS message 1048 0xc2, 0x3b, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x6f, 0x72, 0x66, 1049 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 1050 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8e, 0x03, 0x6f, 1051 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 1052 0xc2, 0xe8, 0x68, 0x96, 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 1053 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8d, 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 1054 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x04, 1055 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 1056 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8c, 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 1057 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x95, 0x03, 0x6f, 0x72, 0x66, 1058 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 1059 0x68, 0x8b, 0x03, 0x6f, 0x72, 0x66, 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1060 0x00, 0x1e, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x03, 1061 } 1062 1063 var tcpDnsData = dnsData{ 1064 question: "orf.at", 1065 answers: []dnsRecord{ 1066 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.149"}, 1067 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.140"}, 1068 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.139"}, 1069 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.3"}, 1070 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.4"}, 1071 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.142"}, 1072 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.150"}, 1073 {uint32(dnsmessage.TypeA), "orf.at", "194.232.104.141"}, 1074 }, 1075 } 1076 var dnsOverTCP4FullMessage = []byte{ 1077 // Payload size 1078 0xd9, 0x00, 0x00, 0x00, 1079 1080 // IP header 1081 0x45, 0x00, 0x00, 0xd9, 0x1f, 0x80, 0x00, 0x00, 0x3e, 0x06, 0x40, 0xca, 0x08, 0x08, 0x08, 0x08, 1082 0x0a, 0xf4, 0x00, 0xd2, 1083 1084 // TCP header 1085 0x00, 0x35, 0x8c, 0xa3, 0x68, 0x44, 0x89, 0x14, 0xf6, 0xbc, 0xee, 0x75, 0x80, 0x18, 0x10, 0x00, 1086 0xde, 0x52, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x9c, 0x9f, 0xf4, 0x2a, 0xaa, 0xaa, 0x20, 0x0d, 1087 1088 // DNS length 1089 0x00, 0xa3, 1090 1091 // DNS message 1092 0xbb, 0xcb, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x72, 0x66, 1093 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1094 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x95, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1095 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8c, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1096 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8b, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1097 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x03, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1098 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x04, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1099 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8e, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1100 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x96, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1101 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8d, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x00, 0x00, 1102 0x00, 0x00, 0x00, 1103 } 1104 1105 // NOTE: both the IP header checksum and TCP checksum are invalid, but since we are not useing them 1106 // anyway, it doesn't matter for the test. 1107 var dnsOverTCP4Partial = []byte{ 1108 // Payload size 1109 0xc9, 0x00, 0x00, 0x00, 1110 1111 0x0a, 0xf4, 0x00, 0xd2, 1112 1113 // TCP header 1114 0x00, 0x35, 0x8c, 0xa3, 0x68, 0x44, 0x89, 0x14, 0xf6, 0xbc, 0xee, 0x75, 0x80, 0x18, 0x10, 0x00, 1115 0xde, 0x52, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x9c, 0x9f, 0xf4, 0x2a, 0xaa, 0xaa, 0x20, 0x0d, 1116 1117 // DNS length 1118 0x00, 0xa0, 1119 1120 // DNS message 1121 0xbb, 0xcb, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x72, 0x66, 1122 0x02, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1123 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x95, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1124 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8c, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1125 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8b, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1126 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x03, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1127 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x04, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1128 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8e, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1129 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x96, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 1130 0x3f, 0xd1, 0x00, 0x04, 0xc2, 0xe8, 0x68, 0x8d, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x00, 0x00, 1131 0x00, 0x00, 0x00, 1132 } 1133 1134 func TestDecodeDns(t *testing.T) { 1135 type testCase struct { 1136 title string 1137 data []byte 1138 expectError bool 1139 expectedDns dnsData 1140 } 1141 1142 testCases := []testCase{ 1143 { 1144 title: "udp", 1145 data: dnsOverUDP4, 1146 expectedDns: udpDnsData, 1147 }, 1148 { 1149 title: "tcp full message", 1150 data: dnsOverTCP4FullMessage, 1151 expectedDns: tcpDnsData, 1152 }, 1153 { 1154 title: "tcp partial message", 1155 data: dnsOverTCP4Partial, 1156 expectError: true, 1157 }, 1158 } 1159 1160 for _, test := range testCases { 1161 t.Run(test.title, func(t *testing.T) { 1162 d := NewEventDecoder(log, test.data) 1163 1164 result, err := d.ReadProtoDNS() 1165 if test.expectError { 1166 require.Error(t, err) 1167 } else { 1168 require.NoError(t, err) 1169 } 1170 1171 require.Equal(t, test.expectedDns.question, result.GetDNSQuestionDomain()) 1172 require.Len(t, result.GetAnswers(), len(test.expectedDns.answers)) 1173 1174 for i, answer := range result.GetAnswers() { 1175 expectedAnswer := test.expectedDns.answers[i] 1176 1177 require.Equal(t, expectedAnswer.dnsType, answer.Type) 1178 require.Equal(t, expectedAnswer.name, answer.Name) 1179 resIP, _ := netip.AddrFromSlice(answer.Ip) 1180 require.Equal(t, expectedAnswer.ip, resIP.String()) 1181 } 1182 }) 1183 } 1184 }