github.com/gopacket/gopacket@v1.1.0/pcapgo/snoop_test.go (about) 1 // Copyright 2019 The GoPacket Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. 6 package pcapgo 7 8 import ( 9 "bytes" 10 "fmt" 11 "reflect" 12 "testing" 13 "time" 14 ) 15 16 var ( 17 spHeader = []byte{ 18 0x73, 0x6E, 0x6F, 0x6F, 0x70, 0x00, 0x00, 0x00, 19 0x00, 0x00, 0x00, 0x02, 20 0x00, 0x00, 0x00, 0x04, 21 } 22 23 pack = []byte{ 24 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xBE, 0xB8, 0x4C, 0x00, 0x0C, 0xB1, 0x47, 25 0x7c, 0x5a, 0x1c, 0x49, 0x3c, 0xd1, 0x1e, 0x65, 0x50, 0x7f, 0xb9, 0xca, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x1e, 0x65, 26 0x50, 0x7f, 0xb9, 0xca, 0x0a, 0x00, 0x33, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x33, 0x01, 0x00, 0x00, 27 } 28 ) 29 30 func OpenHandlePack() (buf []byte, handle *SnoopReader, err error) { 31 buf = make([]byte, len(spHeader)+len(pack)) 32 copy(buf, append(spHeader, pack...)) 33 handle, err = NewSnoopReader(bytes.NewReader(buf)) 34 return buf, handle, err 35 } 36 37 func equalError(t *testing.T, err error, eq error) { 38 if err.Error() != eq.Error() { 39 t.Error(err) 40 } 41 } 42 43 func equalNil(t *testing.T, err error) { 44 if err != nil { 45 t.Error(err) 46 } 47 } 48 49 func equal(t *testing.T, expected, actual interface{}) { 50 if !reflect.DeepEqual(expected, actual) { 51 t.Error(fmt.Errorf("Not equal: \nexpected: %s\nactual : %s", expected, actual)) 52 } 53 } 54 55 func TestReadHeader(t *testing.T) { 56 _, err := NewSnoopReader(bytes.NewReader(spHeader)) 57 equalNil(t, err) 58 } 59 60 func TestBadHeader(t *testing.T) { 61 buf := make([]byte, len(spHeader)) 62 copy(buf, spHeader) 63 buf[6] = 0xff 64 _, err := NewSnoopReader(bytes.NewReader(buf)) 65 equalError(t, err, fmt.Errorf("%s: %s", unknownMagic, "736e6f6f7000ff00")) 66 67 buf[6] = 0x00 68 buf[11] = 0x03 69 _, err = NewSnoopReader(bytes.NewReader(buf)) 70 equalError(t, err, fmt.Errorf("%s: %d", unknownVersion, 3)) 71 72 buf[11] = 0x02 73 buf[15] = 0x0b // linktype 11 is undefined 74 _, err = NewSnoopReader(bytes.NewReader(buf)) 75 equalError(t, err, fmt.Errorf("%s, Code:%d", unkownLinkType, 11)) 76 77 buf[15] = 0x04 78 } 79 80 func TestReadPacket(t *testing.T) { 81 _, handle, err := OpenHandlePack() 82 equalNil(t, err) 83 84 _, _, err = handle.ReadPacketData() 85 equalNil(t, err) 86 } 87 88 func TestZeroCopy(t *testing.T) { 89 _, handle, err := OpenHandlePack() 90 equalNil(t, err) 91 92 var cnt int 93 for cnt = 0; ; cnt++ { 94 _, _, err := handle.ZeroCopyReadPacketData() 95 if err != nil { 96 equalError(t, err, fmt.Errorf("EOF")) 97 break 98 } 99 } 100 if cnt != 1 { 101 t.Error(err) 102 } 103 } 104 105 func TestPacketHeader(t *testing.T) { 106 _, handle, err := OpenHandlePack() 107 equalNil(t, err) 108 _, ci, err := handle.ReadPacketData() 109 equalNil(t, err) 110 111 equal(t, ci.CaptureLength, 42) 112 equal(t, ci.Length, 42) 113 equal(t, ci.Timestamp, time.Date(2019, 04, 23, 07, 01, 32, 831815*1000, time.UTC)) //with nanosec 114 115 } 116 117 func TestBadPacketHeader(t *testing.T) { 118 buf, handle, err := OpenHandlePack() 119 equalNil(t, err) 120 buf[23] = 0x2C 121 _, _, err = handle.ReadPacketData() 122 equalError(t, err, fmt.Errorf(originalLenExceeded)) 123 buf[23] = 0x2A 124 } 125 126 func TestBigPacketData(t *testing.T) { 127 buf, handle, err := OpenHandlePack() 128 equalNil(t, err) 129 // increase OriginalLen 130 buf[19] = 0x00 131 buf[18] = 0x11 132 // increase includedLen 133 buf[23] = 0x00 134 buf[22] = 0x11 135 _, _, err = handle.ReadPacketData() 136 equalError(t, err, fmt.Errorf(captureLenExceeded)) 137 buf[23] = 0x44 138 buf[22] = 0x00 139 buf[19] = 0x44 140 buf[18] = 0x00 141 } 142 143 func TestLinkType(t *testing.T) { 144 _, handle, err := OpenHandlePack() 145 equalNil(t, err) 146 _, err = handle.LinkType() 147 equalNil(t, err) 148 } 149 150 func TestNotOverlapBuf(t *testing.T) { 151 buf := make([]byte, len(spHeader)+len(pack)*2) 152 packs := append(spHeader, pack...) 153 copy(buf, append(packs, pack...)) 154 handle, err := NewSnoopReader(bytes.NewReader(buf)) 155 equalNil(t, err) 156 overlap, _, err := handle.ReadPacketData() 157 equalNil(t, err) 158 overlap2, _, err := handle.ReadPacketData() 159 equalNil(t, err) 160 overlap[30] = 0xff 161 if overlap[30] == overlap2[30] { 162 t.Error(fmt.Errorf("Should not be: %x", overlap[30])) 163 } 164 165 } 166 167 func GeneratePacks(num int) []byte { 168 buf := make([]byte, len(spHeader)+(len(pack)*num)) 169 packs := append(spHeader, pack...) 170 for i := 1; i < num; i++ { 171 packs = append(packs, pack...) 172 } 173 copy(buf, packs) 174 return buf 175 } 176 func BenchmarkReadPacketData(b *testing.B) { 177 buf := GeneratePacks(100) 178 handle, _ := NewSnoopReader(bytes.NewReader(buf)) 179 for n := 0; n < b.N; n++ { 180 _, _, _ = handle.ReadPacketData() 181 } 182 } 183 184 func BenchmarkZeroCopyReadPacketData(b *testing.B) { 185 buf := GeneratePacks(100) 186 handle, _ := NewSnoopReader(bytes.NewReader(buf)) 187 for n := 0; n < b.N; n++ { 188 _, _, _ = handle.ZeroCopyReadPacketData() 189 } 190 }