1package macaroon
2
3import (
4	"strconv"
5	"strings"
6	"testing"
7	"unicode"
8
9	qt "github.com/frankban/quicktest"
10)
11
12func TestAppendPacket(t *testing.T) {
13	c := qt.New(t)
14	data, ok := appendPacketV1(nil, "field", []byte("some data"))
15	c.Assert(ok, qt.Equals, true)
16	c.Assert(string(data), qt.Equals, "0014field some data\n")
17
18	data, ok = appendPacketV1(data, "otherfield", []byte("more and more data"))
19	c.Assert(ok, qt.Equals, true)
20	c.Assert(string(data), qt.Equals, "0014field some data\n0022otherfield more and more data\n")
21}
22
23func TestAppendPacketTooBig(t *testing.T) {
24	c := qt.New(t)
25	data, ok := appendPacketV1(nil, "field", make([]byte, 65532))
26	c.Assert(ok, qt.Equals, false)
27	c.Assert(data, qt.IsNil)
28}
29
30var parsePacketV1Tests = []struct {
31	data      string
32	expect    packetV1
33	expectErr string
34}{{
35	expectErr: "packet too short",
36}, {
37	data: "0014field some data\n",
38	expect: packetV1{
39		fieldName: []byte("field"),
40		data:      []byte("some data"),
41		totalLen:  20,
42	},
43}, {
44	data:      "0015field some data\n",
45	expectErr: "packet size too big",
46}, {
47	data:      "0003a\n",
48	expectErr: "packet size too small",
49}, {
50	data:      "0014fieldwithoutanyspaceordata\n",
51	expectErr: "cannot parse field name",
52}, {
53	data: "fedcsomefield " + strings.Repeat("x", 0xfedc-len("0000somefield \n")) + "\n",
54	expect: packetV1{
55		fieldName: []byte("somefield"),
56		data:      []byte(strings.Repeat("x", 0xfedc-len("0000somefield \n"))),
57		totalLen:  0xfedc,
58	},
59}, {
60	data:      "zzzzbadpacketsizenomacaroon",
61	expectErr: "cannot parse size",
62}}
63
64func TestParsePacketV1(t *testing.T) {
65	c := qt.New(t)
66	for i, test := range parsePacketV1Tests {
67		c.Logf("test %d: %q", i, truncate(test.data))
68		p, err := parsePacketV1([]byte(test.data))
69		if test.expectErr != "" {
70			c.Assert(err, qt.ErrorMatches, test.expectErr)
71			c.Assert(p, packetEquals, packetV1{})
72			continue
73		}
74		c.Assert(err, qt.Equals, nil)
75		c.Assert(p, packetEquals, test.expect)
76	}
77}
78
79func truncate(d string) string {
80	if len(d) > 50 {
81		return d[0:50] + "..."
82	}
83	return d
84}
85
86func TestAsciiHex(t *testing.T) {
87	c := qt.New(t)
88	for b := 0; b < 256; b++ {
89		n, err := strconv.ParseInt(string(b), 16, 8)
90		value, ok := asciiHex(byte(b))
91		if err != nil || unicode.IsUpper(rune(b)) {
92			c.Assert(ok, qt.Equals, false)
93			c.Assert(value, qt.Equals, 0)
94		} else {
95			c.Assert(ok, qt.Equals, true)
96			c.Assert(value, qt.Equals, int(n))
97		}
98	}
99}
100