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}