a go dns packet parser
1package magna 2 3import ( 4 "reflect" 5 "testing" 6) 7 8func assert_eq(t *testing.T, expected any, actual any) { 9 if reflect.TypeOf(expected) != reflect.TypeOf(actual) { 10 t.Errorf("expected type: %T\t actual type: %T\n", expected, actual) 11 } 12 13 if expected != actual { 14 t.Fatalf("expected: %#v\t actual: %#v\n", expected, actual) 15 } 16} 17 18func assert_no_error(t *testing.T, err error) { 19 if err != nil { 20 t.Fatalf("err is not nil: %v\n", err) 21 } 22} 23 24func assert_error(t *testing.T, err error) { 25 if err == nil { 26 t.Fatalf("err is not nil: %v\n", err) 27 } 28} 29 30func TestHeaderDecode(t *testing.T) { 31 bytes := []byte{ 32 0x01, 0x02, // ID 33 0xaa, 0xaa, // QR, Opcode, AA, TC, RD, RA, Z, RCODE 34 0x00, 0x01, // QDCOUNT 35 0x00, 0x02, // ANCOUNT 36 0x00, 0x03, // NSCOUNT 37 0x00, 0x04, // ARCOUNT 38 } 39 40 var header Header 41 offset, err := header.Decode(bytes, 0) 42 if err != nil { 43 t.Errorf("error should be nil\n") 44 } 45 46 if offset != 12 { 47 t.Errorf("offset should be 12 not %v\n", offset) 48 } 49 50 assert_eq(t, header.ID, uint16(258)) 51 assert_eq(t, header.QR, true) 52 assert_eq(t, header.OPCode, OPCode(5)) 53 assert_eq(t, header.AA, false) 54 assert_eq(t, header.TC, true) 55 assert_eq(t, header.RD, false) 56 assert_eq(t, header.RA, true) 57 assert_eq(t, header.Z, uint8(0b010)) 58 assert_eq(t, header.RCode, RCode(0b1010)) 59 assert_eq(t, header.QDCount, uint16(1)) 60 assert_eq(t, header.ANCount, uint16(2)) 61 assert_eq(t, header.NSCount, uint16(3)) 62 assert_eq(t, header.ARCount, uint16(4)) 63} 64 65func TestHeaderEncode(t *testing.T) { 66 bytes := []byte{ 67 0x01, 0x02, // ID 68 0xaa, 0xaa, // QR, Opcode, AA, TC, RD, RA, Z, RCODE 69 0x00, 0x01, // QDCOUNT 70 0x00, 0x02, // ANCOUNT 71 0x00, 0x03, // NSCOUNT 72 0x00, 0x04, // ARCOUNT 73 } 74 75 var header Header 76 _, err := header.Decode(bytes, 0) 77 assert_no_error(t, err) 78 79 actual := header.Encode() 80 for i := 0; i < len(bytes); i++ { 81 if bytes[i] != actual[i] { 82 t.Fatal(bytes, actual) 83 } 84 } 85} 86 87func FuzzDecodeHeader(f *testing.F) { 88 testcases := [][]byte{ 89 { 90 0x01, 0x02, 91 0xaa, 0xaa, 92 0x00, 0x01, 93 0x00, 0x02, 94 0x00, 0x03, 95 0x00, 0x04, 96 }, 97 } 98 for _, tc := range testcases { 99 f.Add(tc) // Use f.Add to provide a seed corpus 100 } 101 var header Header 102 f.Fuzz(func(t *testing.T, msg []byte) { 103 header.Decode(msg, 0) 104 }) 105}