1
2
3
4
5 package gob
6
7 import (
8 "bytes"
9 "errors"
10 "flag"
11 "math"
12 "math/rand"
13 "reflect"
14 "strings"
15 "testing"
16 "time"
17 )
18
19 var doFuzzTests = flag.Bool("gob.fuzz", false, "run the fuzz tests, which are large and very slow")
20
21
22 type EncodeT struct {
23 x uint64
24 b []byte
25 }
26
27 var encodeT = []EncodeT{
28 {0x00, []byte{0x00}},
29 {0x0F, []byte{0x0F}},
30 {0xFF, []byte{0xFF, 0xFF}},
31 {0xFFFF, []byte{0xFE, 0xFF, 0xFF}},
32 {0xFFFFFF, []byte{0xFD, 0xFF, 0xFF, 0xFF}},
33 {0xFFFFFFFF, []byte{0xFC, 0xFF, 0xFF, 0xFF, 0xFF}},
34 {0xFFFFFFFFFF, []byte{0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
35 {0xFFFFFFFFFFFF, []byte{0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
36 {0xFFFFFFFFFFFFFF, []byte{0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
37 {0xFFFFFFFFFFFFFFFF, []byte{0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
38 {0x1111, []byte{0xFE, 0x11, 0x11}},
39 {0x1111111111111111, []byte{0xF8, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}},
40 {0x8888888888888888, []byte{0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88}},
41 {1 << 63, []byte{0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
42 }
43
44
45
46 func testError(t *testing.T) {
47 if e := recover(); e != nil {
48 t.Error(e.(gobError).err)
49 }
50 }
51
52 func newDecBuffer(data []byte) *decBuffer {
53 return &decBuffer{
54 data: data,
55 }
56 }
57
58
59 func TestUintCodec(t *testing.T) {
60 defer testError(t)
61 b := new(encBuffer)
62 encState := newEncoderState(b)
63 for _, tt := range encodeT {
64 b.Reset()
65 encState.encodeUint(tt.x)
66 if !bytes.Equal(tt.b, b.Bytes()) {
67 t.Errorf("encodeUint: %#x encode: expected % x got % x", tt.x, tt.b, b.Bytes())
68 }
69 }
70 for u := uint64(0); ; u = (u + 1) * 7 {
71 b.Reset()
72 encState.encodeUint(u)
73 decState := newDecodeState(newDecBuffer(b.Bytes()))
74 v := decState.decodeUint()
75 if u != v {
76 t.Errorf("Encode/Decode: sent %#x received %#x", u, v)
77 }
78 if u&(1<<63) != 0 {
79 break
80 }
81 }
82 }
83
84 func verifyInt(i int64, t *testing.T) {
85 defer testError(t)
86 var b = new(encBuffer)
87 encState := newEncoderState(b)
88 encState.encodeInt(i)
89 decState := newDecodeState(newDecBuffer(b.Bytes()))
90 j := decState.decodeInt()
91 if i != j {
92 t.Errorf("Encode/Decode: sent %#x received %#x", uint64(i), uint64(j))
93 }
94 }
95
96
97 func TestIntCodec(t *testing.T) {
98 for u := uint64(0); ; u = (u + 1) * 7 {
99
100 i := int64(u)
101 verifyInt(i, t)
102 verifyInt(-i, t)
103 verifyInt(^i, t)
104 if u&(1<<63) != 0 {
105 break
106 }
107 }
108 verifyInt(-1<<63, t)
109 }
110
111
112 var boolResult = []byte{0x07, 0x01}
113
114
115 var signedResult = []byte{0x07, 2 * 17}
116 var unsignedResult = []byte{0x07, 17}
117 var floatResult = []byte{0x07, 0xFE, 0x31, 0x40}
118
119
120 var complexResult = []byte{0x07, 0xFE, 0x31, 0x40, 0xFE, 0x33, 0x40}
121
122
123 var bytesResult = []byte{0x07, 0x05, 'h', 'e', 'l', 'l', 'o'}
124
125 func newDecodeState(buf *decBuffer) *decoderState {
126 d := new(decoderState)
127 d.b = buf
128 return d
129 }
130
131 func newEncoderState(b *encBuffer) *encoderState {
132 b.Reset()
133 state := &encoderState{enc: nil, b: b}
134 state.fieldnum = -1
135 return state
136 }
137
138
139
140 func TestScalarEncInstructions(t *testing.T) {
141 var b = new(encBuffer)
142
143
144 {
145 var data bool = true
146 instr := &encInstr{encBool, 6, nil, 0}
147 state := newEncoderState(b)
148 instr.op(instr, state, reflect.ValueOf(data))
149 if !bytes.Equal(boolResult, b.Bytes()) {
150 t.Errorf("bool enc instructions: expected % x got % x", boolResult, b.Bytes())
151 }
152 }
153
154
155 {
156 b.Reset()
157 var data int = 17
158 instr := &encInstr{encInt, 6, nil, 0}
159 state := newEncoderState(b)
160 instr.op(instr, state, reflect.ValueOf(data))
161 if !bytes.Equal(signedResult, b.Bytes()) {
162 t.Errorf("int enc instructions: expected % x got % x", signedResult, b.Bytes())
163 }
164 }
165
166
167 {
168 b.Reset()
169 var data uint = 17
170 instr := &encInstr{encUint, 6, nil, 0}
171 state := newEncoderState(b)
172 instr.op(instr, state, reflect.ValueOf(data))
173 if !bytes.Equal(unsignedResult, b.Bytes()) {
174 t.Errorf("uint enc instructions: expected % x got % x", unsignedResult, b.Bytes())
175 }
176 }
177
178
179 {
180 b.Reset()
181 var data int8 = 17
182 instr := &encInstr{encInt, 6, nil, 0}
183 state := newEncoderState(b)
184 instr.op(instr, state, reflect.ValueOf(data))
185 if !bytes.Equal(signedResult, b.Bytes()) {
186 t.Errorf("int8 enc instructions: expected % x got % x", signedResult, b.Bytes())
187 }
188 }
189
190
191 {
192 b.Reset()
193 var data uint8 = 17
194 instr := &encInstr{encUint, 6, nil, 0}
195 state := newEncoderState(b)
196 instr.op(instr, state, reflect.ValueOf(data))
197 if !bytes.Equal(unsignedResult, b.Bytes()) {
198 t.Errorf("uint8 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
199 }
200 }
201
202
203 {
204 b.Reset()
205 var data int16 = 17
206 instr := &encInstr{encInt, 6, nil, 0}
207 state := newEncoderState(b)
208 instr.op(instr, state, reflect.ValueOf(data))
209 if !bytes.Equal(signedResult, b.Bytes()) {
210 t.Errorf("int16 enc instructions: expected % x got % x", signedResult, b.Bytes())
211 }
212 }
213
214
215 {
216 b.Reset()
217 var data uint16 = 17
218 instr := &encInstr{encUint, 6, nil, 0}
219 state := newEncoderState(b)
220 instr.op(instr, state, reflect.ValueOf(data))
221 if !bytes.Equal(unsignedResult, b.Bytes()) {
222 t.Errorf("uint16 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
223 }
224 }
225
226
227 {
228 b.Reset()
229 var data int32 = 17
230 instr := &encInstr{encInt, 6, nil, 0}
231 state := newEncoderState(b)
232 instr.op(instr, state, reflect.ValueOf(data))
233 if !bytes.Equal(signedResult, b.Bytes()) {
234 t.Errorf("int32 enc instructions: expected % x got % x", signedResult, b.Bytes())
235 }
236 }
237
238
239 {
240 b.Reset()
241 var data uint32 = 17
242 instr := &encInstr{encUint, 6, nil, 0}
243 state := newEncoderState(b)
244 instr.op(instr, state, reflect.ValueOf(data))
245 if !bytes.Equal(unsignedResult, b.Bytes()) {
246 t.Errorf("uint32 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
247 }
248 }
249
250
251 {
252 b.Reset()
253 var data int64 = 17
254 instr := &encInstr{encInt, 6, nil, 0}
255 state := newEncoderState(b)
256 instr.op(instr, state, reflect.ValueOf(data))
257 if !bytes.Equal(signedResult, b.Bytes()) {
258 t.Errorf("int64 enc instructions: expected % x got % x", signedResult, b.Bytes())
259 }
260 }
261
262
263 {
264 b.Reset()
265 var data uint64 = 17
266 instr := &encInstr{encUint, 6, nil, 0}
267 state := newEncoderState(b)
268 instr.op(instr, state, reflect.ValueOf(data))
269 if !bytes.Equal(unsignedResult, b.Bytes()) {
270 t.Errorf("uint64 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
271 }
272 }
273
274
275 {
276 b.Reset()
277 var data float32 = 17
278 instr := &encInstr{encFloat, 6, nil, 0}
279 state := newEncoderState(b)
280 instr.op(instr, state, reflect.ValueOf(data))
281 if !bytes.Equal(floatResult, b.Bytes()) {
282 t.Errorf("float32 enc instructions: expected % x got % x", floatResult, b.Bytes())
283 }
284 }
285
286
287 {
288 b.Reset()
289 var data float64 = 17
290 instr := &encInstr{encFloat, 6, nil, 0}
291 state := newEncoderState(b)
292 instr.op(instr, state, reflect.ValueOf(data))
293 if !bytes.Equal(floatResult, b.Bytes()) {
294 t.Errorf("float64 enc instructions: expected % x got % x", floatResult, b.Bytes())
295 }
296 }
297
298
299 {
300 b.Reset()
301 data := []byte("hello")
302 instr := &encInstr{encUint8Array, 6, nil, 0}
303 state := newEncoderState(b)
304 instr.op(instr, state, reflect.ValueOf(data))
305 if !bytes.Equal(bytesResult, b.Bytes()) {
306 t.Errorf("bytes enc instructions: expected % x got % x", bytesResult, b.Bytes())
307 }
308 }
309
310
311 {
312 b.Reset()
313 var data string = "hello"
314 instr := &encInstr{encString, 6, nil, 0}
315 state := newEncoderState(b)
316 instr.op(instr, state, reflect.ValueOf(data))
317 if !bytes.Equal(bytesResult, b.Bytes()) {
318 t.Errorf("string enc instructions: expected % x got % x", bytesResult, b.Bytes())
319 }
320 }
321 }
322
323 func execDec(instr *decInstr, state *decoderState, t *testing.T, value reflect.Value) {
324 defer testError(t)
325 v := int(state.decodeUint())
326 if v+state.fieldnum != 6 {
327 t.Fatalf("decoding field number %d, got %d", 6, v+state.fieldnum)
328 }
329 instr.op(instr, state, value.Elem())
330 state.fieldnum = 6
331 }
332
333 func newDecodeStateFromData(data []byte) *decoderState {
334 b := newDecBuffer(data)
335 state := newDecodeState(b)
336 state.fieldnum = -1
337 return state
338 }
339
340
341
342 func TestScalarDecInstructions(t *testing.T) {
343 ovfl := errors.New("overflow")
344
345
346 {
347 var data bool
348 instr := &decInstr{decBool, 6, nil, ovfl}
349 state := newDecodeStateFromData(boolResult)
350 execDec(instr, state, t, reflect.ValueOf(&data))
351 if data != true {
352 t.Errorf("bool a = %v not true", data)
353 }
354 }
355
356 {
357 var data int
358 instr := &decInstr{decOpTable[reflect.Int], 6, nil, ovfl}
359 state := newDecodeStateFromData(signedResult)
360 execDec(instr, state, t, reflect.ValueOf(&data))
361 if data != 17 {
362 t.Errorf("int a = %v not 17", data)
363 }
364 }
365
366
367 {
368 var data uint
369 instr := &decInstr{decOpTable[reflect.Uint], 6, nil, ovfl}
370 state := newDecodeStateFromData(unsignedResult)
371 execDec(instr, state, t, reflect.ValueOf(&data))
372 if data != 17 {
373 t.Errorf("uint a = %v not 17", data)
374 }
375 }
376
377
378 {
379 var data int8
380 instr := &decInstr{decInt8, 6, nil, ovfl}
381 state := newDecodeStateFromData(signedResult)
382 execDec(instr, state, t, reflect.ValueOf(&data))
383 if data != 17 {
384 t.Errorf("int8 a = %v not 17", data)
385 }
386 }
387
388
389 {
390 var data uint8
391 instr := &decInstr{decUint8, 6, nil, ovfl}
392 state := newDecodeStateFromData(unsignedResult)
393 execDec(instr, state, t, reflect.ValueOf(&data))
394 if data != 17 {
395 t.Errorf("uint8 a = %v not 17", data)
396 }
397 }
398
399
400 {
401 var data int16
402 instr := &decInstr{decInt16, 6, nil, ovfl}
403 state := newDecodeStateFromData(signedResult)
404 execDec(instr, state, t, reflect.ValueOf(&data))
405 if data != 17 {
406 t.Errorf("int16 a = %v not 17", data)
407 }
408 }
409
410
411 {
412 var data uint16
413 instr := &decInstr{decUint16, 6, nil, ovfl}
414 state := newDecodeStateFromData(unsignedResult)
415 execDec(instr, state, t, reflect.ValueOf(&data))
416 if data != 17 {
417 t.Errorf("uint16 a = %v not 17", data)
418 }
419 }
420
421
422 {
423 var data int32
424 instr := &decInstr{decInt32, 6, nil, ovfl}
425 state := newDecodeStateFromData(signedResult)
426 execDec(instr, state, t, reflect.ValueOf(&data))
427 if data != 17 {
428 t.Errorf("int32 a = %v not 17", data)
429 }
430 }
431
432
433 {
434 var data uint32
435 instr := &decInstr{decUint32, 6, nil, ovfl}
436 state := newDecodeStateFromData(unsignedResult)
437 execDec(instr, state, t, reflect.ValueOf(&data))
438 if data != 17 {
439 t.Errorf("uint32 a = %v not 17", data)
440 }
441 }
442
443
444 {
445 var data uintptr
446 instr := &decInstr{decOpTable[reflect.Uintptr], 6, nil, ovfl}
447 state := newDecodeStateFromData(unsignedResult)
448 execDec(instr, state, t, reflect.ValueOf(&data))
449 if data != 17 {
450 t.Errorf("uintptr a = %v not 17", data)
451 }
452 }
453
454
455 {
456 var data int64
457 instr := &decInstr{decInt64, 6, nil, ovfl}
458 state := newDecodeStateFromData(signedResult)
459 execDec(instr, state, t, reflect.ValueOf(&data))
460 if data != 17 {
461 t.Errorf("int64 a = %v not 17", data)
462 }
463 }
464
465
466 {
467 var data uint64
468 instr := &decInstr{decUint64, 6, nil, ovfl}
469 state := newDecodeStateFromData(unsignedResult)
470 execDec(instr, state, t, reflect.ValueOf(&data))
471 if data != 17 {
472 t.Errorf("uint64 a = %v not 17", data)
473 }
474 }
475
476
477 {
478 var data float32
479 instr := &decInstr{decFloat32, 6, nil, ovfl}
480 state := newDecodeStateFromData(floatResult)
481 execDec(instr, state, t, reflect.ValueOf(&data))
482 if data != 17 {
483 t.Errorf("float32 a = %v not 17", data)
484 }
485 }
486
487
488 {
489 var data float64
490 instr := &decInstr{decFloat64, 6, nil, ovfl}
491 state := newDecodeStateFromData(floatResult)
492 execDec(instr, state, t, reflect.ValueOf(&data))
493 if data != 17 {
494 t.Errorf("float64 a = %v not 17", data)
495 }
496 }
497
498
499 {
500 var data complex64
501 instr := &decInstr{decOpTable[reflect.Complex64], 6, nil, ovfl}
502 state := newDecodeStateFromData(complexResult)
503 execDec(instr, state, t, reflect.ValueOf(&data))
504 if data != 17+19i {
505 t.Errorf("complex a = %v not 17+19i", data)
506 }
507 }
508
509
510 {
511 var data complex128
512 instr := &decInstr{decOpTable[reflect.Complex128], 6, nil, ovfl}
513 state := newDecodeStateFromData(complexResult)
514 execDec(instr, state, t, reflect.ValueOf(&data))
515 if data != 17+19i {
516 t.Errorf("complex a = %v not 17+19i", data)
517 }
518 }
519
520
521 {
522 var data []byte
523 instr := &decInstr{decUint8Slice, 6, nil, ovfl}
524 state := newDecodeStateFromData(bytesResult)
525 execDec(instr, state, t, reflect.ValueOf(&data))
526 if string(data) != "hello" {
527 t.Errorf(`bytes a = %q not "hello"`, string(data))
528 }
529 }
530
531
532 {
533 var data string
534 instr := &decInstr{decString, 6, nil, ovfl}
535 state := newDecodeStateFromData(bytesResult)
536 execDec(instr, state, t, reflect.ValueOf(&data))
537 if data != "hello" {
538 t.Errorf(`bytes a = %q not "hello"`, data)
539 }
540 }
541 }
542
543 func TestEndToEnd(t *testing.T) {
544 type T2 struct {
545 T string
546 }
547 type T3 struct {
548 X float64
549 Z *int
550 }
551 type T1 struct {
552 A, B, C int
553 M map[string]*float64
554 M2 map[int]T3
555 Mstring map[string]string
556 Mintptr map[int]*int
557 Mcomp map[complex128]complex128
558 Marr map[[2]string][2]*float64
559 EmptyMap map[string]int
560 N *[3]float64
561 Strs *[2]string
562 Int64s *[]int64
563 RI complex64
564 S string
565 Y []byte
566 T *T2
567 }
568 pi := 3.14159
569 e := 2.71828
570 two := 2.0
571 meaning := 42
572 fingers := 5
573 s1 := "string1"
574 s2 := "string2"
575 var comp1 complex128 = complex(1.0, 1.0)
576 var comp2 complex128 = complex(1.0, 1.0)
577 var arr1 [2]string
578 arr1[0] = s1
579 arr1[1] = s2
580 var arr2 [2]string
581 arr2[0] = s2
582 arr2[1] = s1
583 var floatArr1 [2]*float64
584 floatArr1[0] = &pi
585 floatArr1[1] = &e
586 var floatArr2 [2]*float64
587 floatArr2[0] = &e
588 floatArr2[1] = &two
589 t1 := &T1{
590 A: 17,
591 B: 18,
592 C: -5,
593 M: map[string]*float64{"pi": &pi, "e": &e},
594 M2: map[int]T3{4: {X: pi, Z: &meaning}, 10: {X: e, Z: &fingers}},
595 Mstring: map[string]string{"pi": "3.14", "e": "2.71"},
596 Mintptr: map[int]*int{meaning: &fingers, fingers: &meaning},
597 Mcomp: map[complex128]complex128{comp1: comp2, comp2: comp1},
598 Marr: map[[2]string][2]*float64{arr1: floatArr1, arr2: floatArr2},
599 EmptyMap: make(map[string]int),
600 N: &[3]float64{1.5, 2.5, 3.5},
601 Strs: &[2]string{s1, s2},
602 Int64s: &[]int64{77, 89, 123412342134},
603 RI: 17 - 23i,
604 S: "Now is the time",
605 Y: []byte("hello, sailor"),
606 T: &T2{"this is T2"},
607 }
608 b := new(bytes.Buffer)
609 err := NewEncoder(b).Encode(t1)
610 if err != nil {
611 t.Error("encode:", err)
612 }
613 var _t1 T1
614 err = NewDecoder(b).Decode(&_t1)
615 if err != nil {
616 t.Fatal("decode:", err)
617 }
618 if !reflect.DeepEqual(t1, &_t1) {
619 t.Errorf("encode expected %v got %v", *t1, _t1)
620 }
621
622 if t1.EmptyMap == nil {
623 t.Errorf("nil map sent")
624 }
625 if _t1.EmptyMap == nil {
626 t.Errorf("nil map received")
627 }
628 }
629
630 func TestOverflow(t *testing.T) {
631 type inputT struct {
632 Maxi int64
633 Mini int64
634 Maxu uint64
635 Maxf float64
636 Minf float64
637 Maxc complex128
638 Minc complex128
639 }
640 var it inputT
641 var err error
642 b := new(bytes.Buffer)
643 enc := NewEncoder(b)
644 dec := NewDecoder(b)
645
646
647 b.Reset()
648 it = inputT{
649 Maxi: math.MaxInt8 + 1,
650 }
651 type outi8 struct {
652 Maxi int8
653 Mini int8
654 }
655 var o1 outi8
656 enc.Encode(it)
657 err = dec.Decode(&o1)
658 if err == nil || err.Error() != `value for "Maxi" out of range` {
659 t.Error("wrong overflow error for int8:", err)
660 }
661 it = inputT{
662 Mini: math.MinInt8 - 1,
663 }
664 b.Reset()
665 enc.Encode(it)
666 err = dec.Decode(&o1)
667 if err == nil || err.Error() != `value for "Mini" out of range` {
668 t.Error("wrong underflow error for int8:", err)
669 }
670
671
672 b.Reset()
673 it = inputT{
674 Maxi: math.MaxInt16 + 1,
675 }
676 type outi16 struct {
677 Maxi int16
678 Mini int16
679 }
680 var o2 outi16
681 enc.Encode(it)
682 err = dec.Decode(&o2)
683 if err == nil || err.Error() != `value for "Maxi" out of range` {
684 t.Error("wrong overflow error for int16:", err)
685 }
686 it = inputT{
687 Mini: math.MinInt16 - 1,
688 }
689 b.Reset()
690 enc.Encode(it)
691 err = dec.Decode(&o2)
692 if err == nil || err.Error() != `value for "Mini" out of range` {
693 t.Error("wrong underflow error for int16:", err)
694 }
695
696
697 b.Reset()
698 it = inputT{
699 Maxi: math.MaxInt32 + 1,
700 }
701 type outi32 struct {
702 Maxi int32
703 Mini int32
704 }
705 var o3 outi32
706 enc.Encode(it)
707 err = dec.Decode(&o3)
708 if err == nil || err.Error() != `value for "Maxi" out of range` {
709 t.Error("wrong overflow error for int32:", err)
710 }
711 it = inputT{
712 Mini: math.MinInt32 - 1,
713 }
714 b.Reset()
715 enc.Encode(it)
716 err = dec.Decode(&o3)
717 if err == nil || err.Error() != `value for "Mini" out of range` {
718 t.Error("wrong underflow error for int32:", err)
719 }
720
721
722 b.Reset()
723 it = inputT{
724 Maxu: math.MaxUint8 + 1,
725 }
726 type outu8 struct {
727 Maxu uint8
728 }
729 var o4 outu8
730 enc.Encode(it)
731 err = dec.Decode(&o4)
732 if err == nil || err.Error() != `value for "Maxu" out of range` {
733 t.Error("wrong overflow error for uint8:", err)
734 }
735
736
737 b.Reset()
738 it = inputT{
739 Maxu: math.MaxUint16 + 1,
740 }
741 type outu16 struct {
742 Maxu uint16
743 }
744 var o5 outu16
745 enc.Encode(it)
746 err = dec.Decode(&o5)
747 if err == nil || err.Error() != `value for "Maxu" out of range` {
748 t.Error("wrong overflow error for uint16:", err)
749 }
750
751
752 b.Reset()
753 it = inputT{
754 Maxu: math.MaxUint32 + 1,
755 }
756 type outu32 struct {
757 Maxu uint32
758 }
759 var o6 outu32
760 enc.Encode(it)
761 err = dec.Decode(&o6)
762 if err == nil || err.Error() != `value for "Maxu" out of range` {
763 t.Error("wrong overflow error for uint32:", err)
764 }
765
766
767 b.Reset()
768 it = inputT{
769 Maxf: math.MaxFloat32 * 2,
770 }
771 type outf32 struct {
772 Maxf float32
773 Minf float32
774 }
775 var o7 outf32
776 enc.Encode(it)
777 err = dec.Decode(&o7)
778 if err == nil || err.Error() != `value for "Maxf" out of range` {
779 t.Error("wrong overflow error for float32:", err)
780 }
781
782
783 b.Reset()
784 it = inputT{
785 Maxc: complex(math.MaxFloat32*2, math.MaxFloat32*2),
786 }
787 type outc64 struct {
788 Maxc complex64
789 Minc complex64
790 }
791 var o8 outc64
792 enc.Encode(it)
793 err = dec.Decode(&o8)
794 if err == nil || err.Error() != `value for "Maxc" out of range` {
795 t.Error("wrong overflow error for complex64:", err)
796 }
797 }
798
799 func TestNesting(t *testing.T) {
800 type RT struct {
801 A string
802 Next *RT
803 }
804 rt := new(RT)
805 rt.A = "level1"
806 rt.Next = new(RT)
807 rt.Next.A = "level2"
808 b := new(bytes.Buffer)
809 NewEncoder(b).Encode(rt)
810 var drt RT
811 dec := NewDecoder(b)
812 err := dec.Decode(&drt)
813 if err != nil {
814 t.Fatal("decoder error:", err)
815 }
816 if drt.A != rt.A {
817 t.Errorf("nesting: encode expected %v got %v", *rt, drt)
818 }
819 if drt.Next == nil {
820 t.Errorf("nesting: recursion failed")
821 }
822 if drt.Next.A != rt.Next.A {
823 t.Errorf("nesting: encode expected %v got %v", *rt.Next, *drt.Next)
824 }
825 }
826
827
828 type T0 struct {
829 A int
830 B int
831 C int
832 D int
833 }
834 type T1 struct {
835 A int
836 B *int
837 C **int
838 D ***int
839 }
840 type T2 struct {
841 A ***int
842 B **int
843 C *int
844 D int
845 }
846
847 func TestAutoIndirection(t *testing.T) {
848
849 var t1 T1
850 t1.A = 17
851 t1.B = new(int)
852 *t1.B = 177
853 t1.C = new(*int)
854 *t1.C = new(int)
855 **t1.C = 1777
856 t1.D = new(**int)
857 *t1.D = new(*int)
858 **t1.D = new(int)
859 ***t1.D = 17777
860 b := new(bytes.Buffer)
861 enc := NewEncoder(b)
862 enc.Encode(t1)
863 dec := NewDecoder(b)
864 var t0 T0
865 dec.Decode(&t0)
866 if t0.A != 17 || t0.B != 177 || t0.C != 1777 || t0.D != 17777 {
867 t.Errorf("t1->t0: expected {17 177 1777 17777}; got %v", t0)
868 }
869
870
871 var t2 T2
872 t2.D = 17777
873 t2.C = new(int)
874 *t2.C = 1777
875 t2.B = new(*int)
876 *t2.B = new(int)
877 **t2.B = 177
878 t2.A = new(**int)
879 *t2.A = new(*int)
880 **t2.A = new(int)
881 ***t2.A = 17
882 b.Reset()
883 enc.Encode(t2)
884 t0 = T0{}
885 dec.Decode(&t0)
886 if t0.A != 17 || t0.B != 177 || t0.C != 1777 || t0.D != 17777 {
887 t.Errorf("t2->t0 expected {17 177 1777 17777}; got %v", t0)
888 }
889
890
891 t0 = T0{17, 177, 1777, 17777}
892 b.Reset()
893 enc.Encode(t0)
894 t1 = T1{}
895 dec.Decode(&t1)
896 if t1.A != 17 || *t1.B != 177 || **t1.C != 1777 || ***t1.D != 17777 {
897 t.Errorf("t0->t1 expected {17 177 1777 17777}; got {%d %d %d %d}", t1.A, *t1.B, **t1.C, ***t1.D)
898 }
899
900
901 b.Reset()
902 enc.Encode(t0)
903 t2 = T2{}
904 dec.Decode(&t2)
905 if ***t2.A != 17 || **t2.B != 177 || *t2.C != 1777 || t2.D != 17777 {
906 t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.A, **t2.B, *t2.C, t2.D)
907 }
908
909
910 b.Reset()
911 enc.Encode(t0)
912 ***t2.A = 0
913 **t2.B = 0
914 *t2.C = 0
915 t2.D = 0
916 dec.Decode(&t2)
917 if ***t2.A != 17 || **t2.B != 177 || *t2.C != 1777 || t2.D != 17777 {
918 t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.A, **t2.B, *t2.C, t2.D)
919 }
920 }
921
922 type RT0 struct {
923 A int
924 B string
925 C float64
926 }
927 type RT1 struct {
928 C float64
929 B string
930 A int
931 NotSet string
932 }
933
934 func TestReorderedFields(t *testing.T) {
935 var rt0 RT0
936 rt0.A = 17
937 rt0.B = "hello"
938 rt0.C = 3.14159
939 b := new(bytes.Buffer)
940 NewEncoder(b).Encode(rt0)
941 dec := NewDecoder(b)
942 var rt1 RT1
943
944 err := dec.Decode(&rt1)
945 if err != nil {
946 t.Fatal("decode error:", err)
947 }
948 if rt0.A != rt1.A || rt0.B != rt1.B || rt0.C != rt1.C {
949 t.Errorf("rt1->rt0: expected %v; got %v", rt0, rt1)
950 }
951 }
952
953
954 type IT0 struct {
955 A int64
956 B string
957 Ignore_d []int
958 Ignore_e [3]float64
959 Ignore_f bool
960 Ignore_g string
961 Ignore_h []byte
962 Ignore_i *RT1
963 Ignore_m map[string]int
964 C float64
965 }
966
967 func TestIgnoredFields(t *testing.T) {
968 var it0 IT0
969 it0.A = 17
970 it0.B = "hello"
971 it0.C = 3.14159
972 it0.Ignore_d = []int{1, 2, 3}
973 it0.Ignore_e[0] = 1.0
974 it0.Ignore_e[1] = 2.0
975 it0.Ignore_e[2] = 3.0
976 it0.Ignore_f = true
977 it0.Ignore_g = "pay no attention"
978 it0.Ignore_h = []byte("to the curtain")
979 it0.Ignore_i = &RT1{3.1, "hi", 7, "hello"}
980 it0.Ignore_m = map[string]int{"one": 1, "two": 2}
981
982 b := new(bytes.Buffer)
983 NewEncoder(b).Encode(it0)
984 dec := NewDecoder(b)
985 var rt1 RT1
986
987 err := dec.Decode(&rt1)
988 if err != nil {
989 t.Error("error: ", err)
990 }
991 if int(it0.A) != rt1.A || it0.B != rt1.B || it0.C != rt1.C {
992 t.Errorf("rt0->rt1: expected %v; got %v", it0, rt1)
993 }
994 }
995
996 func TestBadRecursiveType(t *testing.T) {
997 type Rec ***Rec
998 var rec Rec
999 b := new(bytes.Buffer)
1000 err := NewEncoder(b).Encode(&rec)
1001 if err == nil {
1002 t.Error("expected error; got none")
1003 } else if !strings.Contains(err.Error(), "recursive") {
1004 t.Error("expected recursive type error; got", err)
1005 }
1006
1007 }
1008
1009 type Indirect struct {
1010 A ***[3]int
1011 S ***[]int
1012 M ****map[string]int
1013 }
1014
1015 type Direct struct {
1016 A [3]int
1017 S []int
1018 M map[string]int
1019 }
1020
1021 func TestIndirectSliceMapArray(t *testing.T) {
1022
1023 i := new(Indirect)
1024 i.A = new(**[3]int)
1025 *i.A = new(*[3]int)
1026 **i.A = new([3]int)
1027 ***i.A = [3]int{1, 2, 3}
1028 i.S = new(**[]int)
1029 *i.S = new(*[]int)
1030 **i.S = new([]int)
1031 ***i.S = []int{4, 5, 6}
1032 i.M = new(***map[string]int)
1033 *i.M = new(**map[string]int)
1034 **i.M = new(*map[string]int)
1035 ***i.M = new(map[string]int)
1036 ****i.M = map[string]int{"one": 1, "two": 2, "three": 3}
1037 b := new(bytes.Buffer)
1038 NewEncoder(b).Encode(i)
1039 dec := NewDecoder(b)
1040 var d Direct
1041 err := dec.Decode(&d)
1042 if err != nil {
1043 t.Error("error: ", err)
1044 }
1045 if len(d.A) != 3 || d.A[0] != 1 || d.A[1] != 2 || d.A[2] != 3 {
1046 t.Errorf("indirect to direct: d.A is %v not %v", d.A, ***i.A)
1047 }
1048 if len(d.S) != 3 || d.S[0] != 4 || d.S[1] != 5 || d.S[2] != 6 {
1049 t.Errorf("indirect to direct: d.S is %v not %v", d.S, ***i.S)
1050 }
1051 if len(d.M) != 3 || d.M["one"] != 1 || d.M["two"] != 2 || d.M["three"] != 3 {
1052 t.Errorf("indirect to direct: d.M is %v not %v", d.M, ***i.M)
1053 }
1054
1055 d.A = [3]int{11, 22, 33}
1056 d.S = []int{44, 55, 66}
1057 d.M = map[string]int{"four": 4, "five": 5, "six": 6}
1058 i = new(Indirect)
1059 b.Reset()
1060 NewEncoder(b).Encode(d)
1061 dec = NewDecoder(b)
1062 err = dec.Decode(&i)
1063 if err != nil {
1064 t.Fatal("error: ", err)
1065 }
1066 if len(***i.A) != 3 || (***i.A)[0] != 11 || (***i.A)[1] != 22 || (***i.A)[2] != 33 {
1067 t.Errorf("direct to indirect: ***i.A is %v not %v", ***i.A, d.A)
1068 }
1069 if len(***i.S) != 3 || (***i.S)[0] != 44 || (***i.S)[1] != 55 || (***i.S)[2] != 66 {
1070 t.Errorf("direct to indirect: ***i.S is %v not %v", ***i.S, ***i.S)
1071 }
1072 if len(****i.M) != 3 || (****i.M)["four"] != 4 || (****i.M)["five"] != 5 || (****i.M)["six"] != 6 {
1073 t.Errorf("direct to indirect: ****i.M is %v not %v", ****i.M, d.M)
1074 }
1075 }
1076
1077
1078 type Squarer interface {
1079 Square() int
1080 }
1081
1082 type Int int
1083
1084 func (i Int) Square() int {
1085 return int(i * i)
1086 }
1087
1088 type Float float64
1089
1090 func (f Float) Square() int {
1091 return int(f * f)
1092 }
1093
1094 type Vector []int
1095
1096 func (v Vector) Square() int {
1097 sum := 0
1098 for _, x := range v {
1099 sum += x * x
1100 }
1101 return sum
1102 }
1103
1104 type Point struct {
1105 X, Y int
1106 }
1107
1108 func (p Point) Square() int {
1109 return p.X*p.X + p.Y*p.Y
1110 }
1111
1112
1113 type InterfaceItem struct {
1114 I int
1115 Sq1, Sq2, Sq3 Squarer
1116 F float64
1117 Sq []Squarer
1118 }
1119
1120
1121 type NoInterfaceItem struct {
1122 I int
1123 F float64
1124 }
1125
1126 func TestInterface(t *testing.T) {
1127 iVal := Int(3)
1128 fVal := Float(5)
1129
1130
1131 vVal := Vector{1, 2, 3}
1132 b := new(bytes.Buffer)
1133 item1 := &InterfaceItem{1, iVal, fVal, vVal, 11.5, []Squarer{iVal, fVal, nil, vVal}}
1134
1135 Register(Int(0))
1136 Register(Float(0))
1137 Register(Vector{})
1138 err := NewEncoder(b).Encode(item1)
1139 if err != nil {
1140 t.Error("expected no encode error; got", err)
1141 }
1142
1143 item2 := InterfaceItem{}
1144 err = NewDecoder(b).Decode(&item2)
1145 if err != nil {
1146 t.Fatal("decode:", err)
1147 }
1148 if item2.I != item1.I {
1149 t.Error("normal int did not decode correctly")
1150 }
1151 if item2.Sq1 == nil || item2.Sq1.Square() != iVal.Square() {
1152 t.Error("Int did not decode correctly")
1153 }
1154 if item2.Sq2 == nil || item2.Sq2.Square() != fVal.Square() {
1155 t.Error("Float did not decode correctly")
1156 }
1157 if item2.Sq3 == nil || item2.Sq3.Square() != vVal.Square() {
1158 t.Error("Vector did not decode correctly")
1159 }
1160 if item2.F != item1.F {
1161 t.Error("normal float did not decode correctly")
1162 }
1163
1164 if len(item1.Sq) != len(item2.Sq) {
1165 t.Fatalf("[]Squarer length wrong: got %d; expected %d", len(item2.Sq), len(item1.Sq))
1166 }
1167 for i, v1 := range item1.Sq {
1168 v2 := item2.Sq[i]
1169 if v1 == nil || v2 == nil {
1170 if v1 != nil || v2 != nil {
1171 t.Errorf("item %d inconsistent nils", i)
1172 }
1173 } else if v1.Square() != v2.Square() {
1174 t.Errorf("item %d inconsistent values: %v %v", i, v1, v2)
1175 }
1176 }
1177 }
1178
1179
1180 type BasicInterfaceItem struct {
1181 Int, Int8, Int16, Int32, Int64 any
1182 Uint, Uint8, Uint16, Uint32, Uint64 any
1183 Float32, Float64 any
1184 Complex64, Complex128 any
1185 Bool any
1186 String any
1187 Bytes any
1188 }
1189
1190 func TestInterfaceBasic(t *testing.T) {
1191 b := new(bytes.Buffer)
1192 item1 := &BasicInterfaceItem{
1193 int(1), int8(1), int16(1), int32(1), int64(1),
1194 uint(1), uint8(1), uint16(1), uint32(1), uint64(1),
1195 float32(1), 1.0,
1196 complex64(1i), complex128(1i),
1197 true,
1198 "hello",
1199 []byte("sailor"),
1200 }
1201 err := NewEncoder(b).Encode(item1)
1202 if err != nil {
1203 t.Error("expected no encode error; got", err)
1204 }
1205
1206 item2 := &BasicInterfaceItem{}
1207 err = NewDecoder(b).Decode(&item2)
1208 if err != nil {
1209 t.Fatal("decode:", err)
1210 }
1211 if !reflect.DeepEqual(item1, item2) {
1212 t.Errorf("encode expected %v got %v", item1, item2)
1213 }
1214
1215 if v, ok := item2.Bool.(bool); !ok || !v {
1216 t.Error("boolean should be true")
1217 }
1218 if v, ok := item2.String.(string); !ok || v != item1.String.(string) {
1219 t.Errorf("string should be %v is %v", item1.String, v)
1220 }
1221 }
1222
1223 type String string
1224
1225 type PtrInterfaceItem struct {
1226 Str1 any
1227 Str2 any
1228 }
1229
1230
1231
1232 func TestInterfacePointer(t *testing.T) {
1233 b := new(bytes.Buffer)
1234 str1 := "howdy"
1235 str2 := String("kiddo")
1236 item1 := &PtrInterfaceItem{
1237 &str1,
1238 &str2,
1239 }
1240
1241 Register(str2)
1242 err := NewEncoder(b).Encode(item1)
1243 if err != nil {
1244 t.Error("expected no encode error; got", err)
1245 }
1246
1247 item2 := &PtrInterfaceItem{}
1248 err = NewDecoder(b).Decode(&item2)
1249 if err != nil {
1250 t.Fatal("decode:", err)
1251 }
1252
1253 if v, ok := item2.Str1.(string); !ok || v != str1 {
1254 t.Errorf("basic string failed: %q should be %q", v, str1)
1255 }
1256 if v, ok := item2.Str2.(String); !ok || v != str2 {
1257 t.Errorf("derived type String failed: %q should be %q", v, str2)
1258 }
1259 }
1260
1261 func TestIgnoreInterface(t *testing.T) {
1262 iVal := Int(3)
1263 fVal := Float(5)
1264
1265
1266 pVal := Point{2, 3}
1267 b := new(bytes.Buffer)
1268 item1 := &InterfaceItem{1, iVal, fVal, pVal, 11.5, nil}
1269
1270 Register(Int(0))
1271 Register(Float(0))
1272 Register(Point{})
1273 err := NewEncoder(b).Encode(item1)
1274 if err != nil {
1275 t.Error("expected no encode error; got", err)
1276 }
1277
1278 item2 := NoInterfaceItem{}
1279 err = NewDecoder(b).Decode(&item2)
1280 if err != nil {
1281 t.Fatal("decode:", err)
1282 }
1283 if item2.I != item1.I {
1284 t.Error("normal int did not decode correctly")
1285 }
1286 if item2.F != item1.F {
1287 t.Error("normal float did not decode correctly")
1288 }
1289 }
1290
1291 type U struct {
1292 A int
1293 B string
1294 c float64
1295 D uint
1296 }
1297
1298 func TestUnexportedFields(t *testing.T) {
1299 var u0 U
1300 u0.A = 17
1301 u0.B = "hello"
1302 u0.c = 3.14159
1303 u0.D = 23
1304 b := new(bytes.Buffer)
1305 NewEncoder(b).Encode(u0)
1306 dec := NewDecoder(b)
1307 var u1 U
1308 u1.c = 1234.
1309 err := dec.Decode(&u1)
1310 if err != nil {
1311 t.Fatal("decode error:", err)
1312 }
1313 if u0.A != u1.A || u0.B != u1.B || u0.D != u1.D {
1314 t.Errorf("u1->u0: expected %v; got %v", u0, u1)
1315 }
1316 if u1.c != 1234. {
1317 t.Error("u1.c modified")
1318 }
1319 }
1320
1321 var singletons = []any{
1322 true,
1323 7,
1324 uint(10),
1325 3.2,
1326 "hello",
1327 [3]int{11, 22, 33},
1328 []float32{0.5, 0.25, 0.125},
1329 map[string]int{"one": 1, "two": 2},
1330 }
1331
1332 func TestDebugSingleton(t *testing.T) {
1333 if debugFunc == nil {
1334 return
1335 }
1336 b := new(bytes.Buffer)
1337
1338 for _, x := range singletons {
1339 err := NewEncoder(b).Encode(x)
1340 if err != nil {
1341 t.Fatal("encode:", err)
1342 }
1343 }
1344 debugFunc(b)
1345 }
1346
1347
1348 type OnTheFly struct {
1349 A int
1350 }
1351
1352 type DT struct {
1353
1354 A int
1355 B string
1356 C float64
1357 I any
1358 J any
1359 I_nil any
1360 M map[string]int
1361 T [3]int
1362 S []string
1363 }
1364
1365 func newDT() DT {
1366 var dt DT
1367 dt.A = 17
1368 dt.B = "hello"
1369 dt.C = 3.14159
1370 dt.I = 271828
1371 dt.J = OnTheFly{3}
1372 dt.I_nil = nil
1373 dt.M = map[string]int{"one": 1, "two": 2}
1374 dt.T = [3]int{11, 22, 33}
1375 dt.S = []string{"hi", "joe"}
1376 return dt
1377 }
1378
1379 func TestDebugStruct(t *testing.T) {
1380 if debugFunc == nil {
1381 return
1382 }
1383 Register(OnTheFly{})
1384 dt := newDT()
1385 b := new(bytes.Buffer)
1386 err := NewEncoder(b).Encode(dt)
1387 if err != nil {
1388 t.Fatal("encode:", err)
1389 }
1390 debugBuffer := bytes.NewBuffer(b.Bytes())
1391 dt2 := &DT{}
1392 err = NewDecoder(b).Decode(&dt2)
1393 if err != nil {
1394 t.Error("decode:", err)
1395 }
1396 debugFunc(debugBuffer)
1397 }
1398
1399 func encFuzzDec(rng *rand.Rand, in any) error {
1400 buf := new(bytes.Buffer)
1401 enc := NewEncoder(buf)
1402 if err := enc.Encode(&in); err != nil {
1403 return err
1404 }
1405
1406 b := buf.Bytes()
1407 for i, bi := range b {
1408 if rng.Intn(10) < 3 {
1409 b[i] = bi + uint8(rng.Intn(256))
1410 }
1411 }
1412
1413 dec := NewDecoder(buf)
1414 var e any
1415 if err := dec.Decode(&e); err != nil {
1416 return err
1417 }
1418 return nil
1419 }
1420
1421
1422 func TestFuzz(t *testing.T) {
1423 if !*doFuzzTests {
1424 t.Skipf("disabled; run with -gob.fuzz to enable")
1425 }
1426
1427
1428 input := []any{
1429 new(int),
1430 new(float32),
1431 new(float64),
1432 new(complex128),
1433 &ByteStruct{255},
1434 &ArrayStruct{},
1435 &StringStruct{"hello"},
1436 &GobTest1{0, &StringStruct{"hello"}},
1437 }
1438 testFuzz(t, time.Now().UnixNano(), 100, input...)
1439 }
1440
1441 func TestFuzzRegressions(t *testing.T) {
1442 if !*doFuzzTests {
1443 t.Skipf("disabled; run with -gob.fuzz to enable")
1444 }
1445
1446
1447 testFuzz(t, 1328492090837718000, 100, new(float32))
1448
1449
1450 testFuzz(t, 1330522872628565000, 100, new(int))
1451 }
1452
1453 func testFuzz(t *testing.T, seed int64, n int, input ...any) {
1454 for _, e := range input {
1455 t.Logf("seed=%d n=%d e=%T", seed, n, e)
1456 rng := rand.New(rand.NewSource(seed))
1457 for i := 0; i < n; i++ {
1458 encFuzzDec(rng, e)
1459 }
1460 }
1461 }
1462
1463
1464
1465 func TestFuzzOneByte(t *testing.T) {
1466 if !*doFuzzTests {
1467 t.Skipf("disabled; run with -gob.fuzz to enable")
1468 }
1469
1470 buf := new(bytes.Buffer)
1471 Register(OnTheFly{})
1472 dt := newDT()
1473 if err := NewEncoder(buf).Encode(dt); err != nil {
1474 t.Fatal(err)
1475 }
1476 s := buf.String()
1477
1478 indices := make([]int, 0, len(s))
1479 for i := 0; i < len(s); i++ {
1480 switch i {
1481 case 14, 167, 231, 265:
1482 continue
1483 case 248:
1484
1485
1486 continue
1487 }
1488 indices = append(indices, i)
1489 }
1490 if testing.Short() {
1491 indices = []int{1, 111, 178}
1492 }
1493 for _, i := range indices {
1494 for j := 0; j < 256; j += 3 {
1495 b := []byte(s)
1496 b[i] ^= byte(j)
1497 var e DT
1498 func() {
1499 defer func() {
1500 if p := recover(); p != nil {
1501 t.Errorf("crash for b[%d] ^= 0x%x", i, j)
1502 panic(p)
1503 }
1504 }()
1505 err := NewDecoder(bytes.NewReader(b)).Decode(&e)
1506 _ = err
1507 }()
1508 }
1509 }
1510 }
1511
1512
1513
1514 func TestErrorInvalidTypeId(t *testing.T) {
1515 data := []byte{0x01, 0x00, 0x01, 0x00}
1516 d := NewDecoder(bytes.NewReader(data))
1517
1518
1519
1520
1521
1522 for i := 0; i < 2; i++ {
1523 var foo struct{}
1524 err := d.Decode(&foo)
1525 if err != errBadType {
1526 t.Fatalf("decode: expected %s, got %s", errBadType, err)
1527 }
1528 }
1529 }
1530
View as plain text