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