1package macaroon
2
3import (
4	"testing"
5
6	qt "github.com/frankban/quicktest"
7	"github.com/google/go-cmp/cmp"
8)
9
10var packetEquals = qt.CmpEquals(cmp.AllowUnexported(packetV1{}, packetV2{}))
11
12var parsePacketV2Tests = []struct {
13	about        string
14	data         string
15	expectPacket packetV2
16	expectData   string
17	expectError  string
18}{{
19	about: "EOS packet",
20	data:  "\x00",
21	expectPacket: packetV2{
22		fieldType: fieldEOS,
23	},
24}, {
25	about: "simple field",
26	data:  "\x02\x03xyz",
27	expectPacket: packetV2{
28		fieldType: 2,
29		data:      []byte("xyz"),
30	},
31}, {
32	about:       "empty buffer",
33	data:        "",
34	expectError: "varint value extends past end of buffer",
35}, {
36	about:       "varint out of range",
37	data:        "\xff\xff\xff\xff\xff\xff\x7f",
38	expectError: "varint value out of range",
39}, {
40	about:       "varint way out of range",
41	data:        "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f",
42	expectError: "varint value out of range",
43}, {
44	about:       "unterminated varint",
45	data:        "\x80",
46	expectError: "varint value extends past end of buffer",
47}, {
48	about:       "field data too long",
49	data:        "\x01\x02a",
50	expectError: "field data extends past end of buffer",
51}, {
52	about:       "bad data length varint",
53	data:        "\x01\xff",
54	expectError: "varint value extends past end of buffer",
55}}
56
57func TestParsePacketV2(t *testing.T) {
58	c := qt.New(t)
59	for i, test := range parsePacketV2Tests {
60		c.Logf("test %d: %v", i, test.about)
61		data, p, err := parsePacketV2([]byte(test.data))
62		if test.expectError != "" {
63			c.Assert(err, qt.ErrorMatches, test.expectError)
64			c.Assert(data, qt.IsNil)
65			c.Assert(p, packetEquals, packetV2{})
66		} else {
67			c.Assert(err, qt.Equals, nil)
68			c.Assert(p, packetEquals, test.expectPacket)
69		}
70	}
71}
72
73var parseSectionV2Tests = []struct {
74	about string
75	data  string
76
77	expectData    string
78	expectPackets []packetV2
79	expectError   string
80}{{
81	about: "no packets",
82	data:  "\x00",
83}, {
84	about: "one packet",
85	data:  "\x02\x03xyz\x00",
86	expectPackets: []packetV2{{
87		fieldType: 2,
88		data:      []byte("xyz"),
89	}},
90}, {
91	about: "two packets",
92	data:  "\x02\x03xyz\x07\x05abcde\x00",
93	expectPackets: []packetV2{{
94		fieldType: 2,
95		data:      []byte("xyz"),
96	}, {
97		fieldType: 7,
98		data:      []byte("abcde"),
99	}},
100}, {
101	about:       "unterminated section",
102	data:        "\x02\x03xyz\x07\x05abcde",
103	expectError: "section extends past end of buffer",
104}, {
105	about:       "out of order fields",
106	data:        "\x07\x05abcde\x02\x03xyz\x00",
107	expectError: "fields out of order",
108}, {
109	about:       "bad packet",
110	data:        "\x07\x05abcde\xff",
111	expectError: "varint value extends past end of buffer",
112}}
113
114func TestParseSectionV2(t *testing.T) {
115	c := qt.New(t)
116	for i, test := range parseSectionV2Tests {
117		c.Logf("test %d: %v", i, test.about)
118		data, ps, err := parseSectionV2([]byte(test.data))
119		if test.expectError != "" {
120			c.Assert(err, qt.ErrorMatches, test.expectError)
121			c.Assert(data, qt.IsNil)
122			c.Assert(ps, qt.IsNil)
123		} else {
124			c.Assert(err, qt.Equals, nil)
125			c.Assert(ps, packetEquals, test.expectPackets)
126		}
127	}
128}
129