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  }