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}