1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
13 func builderBytesEq(b *Builder, want ...byte) error {
14 got := b.BytesOrPanic()
15 if !bytes.Equal(got, want) {
16 return fmt.Errorf("Bytes() = %v, want %v", got, want)
21 func TestBytes(t *testing.T) {
23 v := []byte("foobarbaz")
27 if err := builderBytesEq(&b, v...); err != nil {
30 s := String(b.BytesOrPanic())
31 for _, w := range []string{"foo", "bar", "baz"} {
33 if !s.ReadBytes(&got, 3) {
34 t.Errorf("ReadBytes() = false, want true (w = %v)", w)
37 if !bytes.Equal(got, want) {
38 t.Errorf("ReadBytes(): got = %v, want %v", got, want)
42 t.Errorf("len(s) = %d, want 0", len(s))
46 func TestUint8(t *testing.T) {
49 if err := builderBytesEq(&b, 42); err != nil {
53 var s String = b.BytesOrPanic()
56 t.Error("ReadUint8() = false, want true")
59 t.Errorf("v = %d, want 42", v)
62 t.Errorf("len(s) = %d, want 0", len(s))
66 func TestUint16(t *testing.T) {
69 if err := builderBytesEq(&b, 255, 254); err != nil {
72 var s String = b.BytesOrPanic()
74 if !s.ReadUint16(&v) {
75 t.Error("ReadUint16() == false, want true")
78 t.Errorf("v = %d, want 65534", v)
81 t.Errorf("len(s) = %d, want 0", len(s))
85 func TestUint24(t *testing.T) {
88 if err := builderBytesEq(&b, 255, 254, 253); err != nil {
92 var s String = b.BytesOrPanic()
94 if !s.ReadUint24(&v) {
95 t.Error("ReadUint8() = false, want true")
98 t.Errorf("v = %d, want fffefd", v)
101 t.Errorf("len(s) = %d, want 0", len(s))
105 func TestUint24Truncation(t *testing.T) {
107 b.AddUint24(0x10111213)
108 if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil {
113 func TestUint32(t *testing.T) {
115 b.AddUint32(0xfffefdfc)
116 if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil {
120 var s String = b.BytesOrPanic()
122 if !s.ReadUint32(&v) {
123 t.Error("ReadUint8() = false, want true")
126 t.Errorf("v = %x, want fffefdfc", v)
129 t.Errorf("len(s) = %d, want 0", len(s))
133 func TestUMultiple(t *testing.T) {
136 b.AddUint32(0xfffefdfc)
138 if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil {
142 var s String = b.BytesOrPanic()
148 if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) {
149 t.Error("ReadUint8() = false, want true")
151 if x != 23 || y != 0xfffefdfc || z != 42 {
152 t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z)
155 t.Errorf("len(s) = %d, want 0", len(s))
159 func TestUint8LengthPrefixedSimple(t *testing.T) {
161 b.AddUint8LengthPrefixed(func(c *Builder) {
165 if err := builderBytesEq(&b, 2, 23, 42); err != nil {
169 var base, child String = b.BytesOrPanic(), nil
171 if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) ||
172 !child.ReadUint8(&y) {
173 t.Error("parsing failed")
175 if x != 23 || y != 42 {
176 t.Errorf("want x, y == 23, 42; got %d, %d", x, y)
179 t.Errorf("len(base) = %d, want 0", len(base))
182 t.Errorf("len(child) = %d, want 0", len(child))
186 func TestUint8LengthPrefixedMulti(t *testing.T) {
188 b.AddUint8LengthPrefixed(func(c *Builder) {
193 b.AddUint8LengthPrefixed(func(c *Builder) {
197 if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil {
201 var s, child String = b.BytesOrPanic(), nil
202 var u, v, w, x, y uint8
203 if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) ||
204 !s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) {
205 t.Error("parsing failed")
207 if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 {
208 t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234",
212 t.Errorf("len(s) = %d, want 0", len(s))
215 t.Errorf("len(child) = %d, want 0", len(child))
219 func TestUint8LengthPrefixedNested(t *testing.T) {
221 b.AddUint8LengthPrefixed(func(c *Builder) {
223 c.AddUint8LengthPrefixed(func(d *Builder) {
229 if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil {
233 var base, child1, child2 String = b.BytesOrPanic(), nil, nil
235 if !base.ReadUint8LengthPrefixed(&child1) {
236 t.Error("parsing base failed")
238 if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) {
239 t.Error("parsing child1 failed")
241 if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) {
242 t.Error("parsing child2 failed")
244 if u != 5 || v != 23 || w != 42 || x != 123 {
245 t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123",
249 t.Errorf("len(base) = %d, want 0", len(base))
251 if len(child1) != 0 {
252 t.Errorf("len(child1) = %d, want 0", len(child1))
255 t.Errorf("len(child2) = %d, want 0", len(child2))
259 func TestPreallocatedBuffer(t *testing.T) {
261 b := NewBuilder(buf[0:0])
263 b.AddUint8LengthPrefixed(func(c *Builder) {
267 b.AddUint16(1286) // Outgrow buf by one byte.
268 want := []byte{1, 2, 3, 4, 0}
269 if !bytes.Equal(buf[:], want) {
270 t.Errorf("buf = %v want %v", buf, want)
272 if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil {
277 func TestWriteWithPendingChild(t *testing.T) {
279 b.AddUint8LengthPrefixed(func(c *Builder) {
280 c.AddUint8LengthPrefixed(func(d *Builder) {
282 if recover() == nil {
283 t.Errorf("recover() = nil, want error; c.AddUint8() did not panic")
286 c.AddUint8(2) // panics
289 if recover() == nil {
290 t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
293 b.AddUint8(2) // panics
297 if recover() == nil {
298 t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
301 b.AddUint8(2) // panics
307 func TestASN1Int64(t *testing.T) {
312 {-0x800000, []byte{2, 3, 128, 0, 0}},
313 {-256, []byte{2, 2, 255, 0}},
314 {-129, []byte{2, 2, 255, 127}},
315 {-128, []byte{2, 1, 128}},
316 {-1, []byte{2, 1, 255}},
317 {0, []byte{2, 1, 0}},
318 {1, []byte{2, 1, 1}},
319 {2, []byte{2, 1, 2}},
320 {127, []byte{2, 1, 127}},
321 {128, []byte{2, 2, 0, 128}},
322 {256, []byte{2, 2, 1, 0}},
323 {0x800000, []byte{2, 4, 0, 128, 0, 0}},
325 for i, tt := range tests {
327 b.AddASN1Int64(tt.in)
328 if err := builderBytesEq(&b, tt.want...); err != nil {
329 t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
333 s := String(b.BytesOrPanic())
334 ok := s.ReadASN1Integer(&n)
335 if !ok || n != tt.in {
336 t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
340 t.Errorf("len(s) = %d, want 0", len(s))
345 func TestASN1Uint64(t *testing.T) {
350 {0, []byte{2, 1, 0}},
351 {1, []byte{2, 1, 1}},
352 {2, []byte{2, 1, 2}},
353 {127, []byte{2, 1, 127}},
354 {128, []byte{2, 2, 0, 128}},
355 {256, []byte{2, 2, 1, 0}},
356 {0x800000, []byte{2, 4, 0, 128, 0, 0}},
357 {0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}},
358 {0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}},
359 {0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}},
361 for i, tt := range tests {
363 b.AddASN1Uint64(tt.in)
364 if err := builderBytesEq(&b, tt.want...); err != nil {
365 t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
369 s := String(b.BytesOrPanic())
370 ok := s.ReadASN1Integer(&n)
371 if !ok || n != tt.in {
372 t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
376 t.Errorf("len(s) = %d, want 0", len(s))