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