a go dns packet parser
1package magna 2 3import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7) 8 9func TestHeaderDecode(t *testing.T) { 10 bytes := []byte{ 11 0x01, 0x02, // ID 12 0xaa, 0xaa, // QR, Opcode, AA, TC, RD, RA, Z, RCODE 13 0x00, 0x01, // QDCOUNT 14 0x00, 0x02, // ANCOUNT 15 0x00, 0x03, // NSCOUNT 16 0x00, 0x04, // ARCOUNT 17 } 18 19 var header Header 20 offset, err := header.Decode(bytes, 0) 21 if err != nil { 22 t.Errorf("error should be nil\n") 23 } 24 25 if offset != 12 { 26 t.Errorf("offset should be 12 not %v\n", offset) 27 } 28 29 assert.Equal(t, header.ID, uint16(258)) 30 assert.Equal(t, header.QR, true) 31 assert.Equal(t, header.OPCode, OPCode(5)) 32 assert.Equal(t, header.AA, false) 33 assert.Equal(t, header.TC, true) 34 assert.Equal(t, header.RD, false) 35 assert.Equal(t, header.RA, true) 36 assert.Equal(t, header.Z, uint8(0b010)) 37 assert.Equal(t, header.RCode, RCode(0b1010)) 38 assert.Equal(t, header.QDCount, uint16(1)) 39 assert.Equal(t, header.ANCount, uint16(2)) 40 assert.Equal(t, header.NSCount, uint16(3)) 41 assert.Equal(t, header.ARCount, uint16(4)) 42} 43 44func TestHeaderEncode(t *testing.T) { 45 bytes := []byte{ 46 0x01, 0x02, // ID 47 0xaa, 0xaa, // QR, Opcode, AA, TC, RD, RA, Z, RCODE 48 0x00, 0x01, // QDCOUNT 49 0x00, 0x02, // ANCOUNT 50 0x00, 0x03, // NSCOUNT 51 0x00, 0x04, // ARCOUNT 52 } 53 54 var header Header 55 _, err := header.Decode(bytes, 0) 56 assert.NoError(t, err) 57 58 actual := header.Encode() 59 assert.Equal(t, bytes, actual) 60} 61 62func FuzzDecodeHeader(f *testing.F) { 63 testcases := [][]byte{ 64 { 65 0x01, 0x02, 66 0xaa, 0xaa, 67 0x00, 0x01, 68 0x00, 0x02, 69 0x00, 0x03, 70 0x00, 0x04, 71 }, 72 } 73 for _, tc := range testcases { 74 f.Add(tc) // Use f.Add to provide a seed corpus 75 } 76 var header Header 77 f.Fuzz(func(t *testing.T, msg []byte) { 78 header.Decode(msg, 0) 79 }) 80}