Home | History | Annotate | Download | only in gob
      1 // Copyright 2009 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.
      4 
      5 package gob
      6 
      7 import (
      8 	"bytes"
      9 	"encoding/hex"
     10 	"fmt"
     11 	"reflect"
     12 	"strings"
     13 	"testing"
     14 )
     15 
     16 // Test basic operations in a safe manner.
     17 func TestBasicEncoderDecoder(t *testing.T) {
     18 	var values = []interface{}{
     19 		true,
     20 		int(123),
     21 		int8(123),
     22 		int16(-12345),
     23 		int32(123456),
     24 		int64(-1234567),
     25 		uint(123),
     26 		uint8(123),
     27 		uint16(12345),
     28 		uint32(123456),
     29 		uint64(1234567),
     30 		uintptr(12345678),
     31 		float32(1.2345),
     32 		float64(1.2345678),
     33 		complex64(1.2345 + 2.3456i),
     34 		complex128(1.2345678 + 2.3456789i),
     35 		[]byte("hello"),
     36 		string("hello"),
     37 	}
     38 	for _, value := range values {
     39 		b := new(bytes.Buffer)
     40 		enc := NewEncoder(b)
     41 		err := enc.Encode(value)
     42 		if err != nil {
     43 			t.Error("encoder fail:", err)
     44 		}
     45 		dec := NewDecoder(b)
     46 		result := reflect.New(reflect.TypeOf(value))
     47 		err = dec.Decode(result.Interface())
     48 		if err != nil {
     49 			t.Fatalf("error decoding %T: %v:", reflect.TypeOf(value), err)
     50 		}
     51 		if !reflect.DeepEqual(value, result.Elem().Interface()) {
     52 			t.Fatalf("%T: expected %v got %v", value, value, result.Elem().Interface())
     53 		}
     54 	}
     55 }
     56 
     57 type ET0 struct {
     58 	A int
     59 	B string
     60 }
     61 
     62 type ET2 struct {
     63 	X string
     64 }
     65 
     66 type ET1 struct {
     67 	A    int
     68 	Et2  *ET2
     69 	Next *ET1
     70 }
     71 
     72 // Like ET1 but with a different name for a field
     73 type ET3 struct {
     74 	A             int
     75 	Et2           *ET2
     76 	DifferentNext *ET1
     77 }
     78 
     79 // Like ET1 but with a different type for a field
     80 type ET4 struct {
     81 	A    int
     82 	Et2  float64
     83 	Next int
     84 }
     85 
     86 func TestEncoderDecoder(t *testing.T) {
     87 	b := new(bytes.Buffer)
     88 	enc := NewEncoder(b)
     89 	et0 := new(ET0)
     90 	et0.A = 7
     91 	et0.B = "gobs of fun"
     92 	err := enc.Encode(et0)
     93 	if err != nil {
     94 		t.Error("encoder fail:", err)
     95 	}
     96 	//fmt.Printf("% x %q\n", b, b)
     97 	//Debug(b)
     98 	dec := NewDecoder(b)
     99 	newEt0 := new(ET0)
    100 	err = dec.Decode(newEt0)
    101 	if err != nil {
    102 		t.Fatal("error decoding ET0:", err)
    103 	}
    104 
    105 	if !reflect.DeepEqual(et0, newEt0) {
    106 		t.Fatalf("invalid data for et0: expected %+v; got %+v", *et0, *newEt0)
    107 	}
    108 	if b.Len() != 0 {
    109 		t.Error("not at eof;", b.Len(), "bytes left")
    110 	}
    111 	//	t.FailNow()
    112 
    113 	b = new(bytes.Buffer)
    114 	enc = NewEncoder(b)
    115 	et1 := new(ET1)
    116 	et1.A = 7
    117 	et1.Et2 = new(ET2)
    118 	err = enc.Encode(et1)
    119 	if err != nil {
    120 		t.Error("encoder fail:", err)
    121 	}
    122 	dec = NewDecoder(b)
    123 	newEt1 := new(ET1)
    124 	err = dec.Decode(newEt1)
    125 	if err != nil {
    126 		t.Fatal("error decoding ET1:", err)
    127 	}
    128 
    129 	if !reflect.DeepEqual(et1, newEt1) {
    130 		t.Fatalf("invalid data for et1: expected %+v; got %+v", *et1, *newEt1)
    131 	}
    132 	if b.Len() != 0 {
    133 		t.Error("not at eof;", b.Len(), "bytes left")
    134 	}
    135 
    136 	enc.Encode(et1)
    137 	newEt1 = new(ET1)
    138 	err = dec.Decode(newEt1)
    139 	if err != nil {
    140 		t.Fatal("round 2: error decoding ET1:", err)
    141 	}
    142 	if !reflect.DeepEqual(et1, newEt1) {
    143 		t.Fatalf("round 2: invalid data for et1: expected %+v; got %+v", *et1, *newEt1)
    144 	}
    145 	if b.Len() != 0 {
    146 		t.Error("round 2: not at eof;", b.Len(), "bytes left")
    147 	}
    148 
    149 	// Now test with a running encoder/decoder pair that we recognize a type mismatch.
    150 	err = enc.Encode(et1)
    151 	if err != nil {
    152 		t.Error("round 3: encoder fail:", err)
    153 	}
    154 	newEt2 := new(ET2)
    155 	err = dec.Decode(newEt2)
    156 	if err == nil {
    157 		t.Fatal("round 3: expected `bad type' error decoding ET2")
    158 	}
    159 }
    160 
    161 // Run one value through the encoder/decoder, but use the wrong type.
    162 // Input is always an ET1; we compare it to whatever is under 'e'.
    163 func badTypeCheck(e interface{}, shouldFail bool, msg string, t *testing.T) {
    164 	b := new(bytes.Buffer)
    165 	enc := NewEncoder(b)
    166 	et1 := new(ET1)
    167 	et1.A = 7
    168 	et1.Et2 = new(ET2)
    169 	err := enc.Encode(et1)
    170 	if err != nil {
    171 		t.Error("encoder fail:", err)
    172 	}
    173 	dec := NewDecoder(b)
    174 	err = dec.Decode(e)
    175 	if shouldFail && err == nil {
    176 		t.Error("expected error for", msg)
    177 	}
    178 	if !shouldFail && err != nil {
    179 		t.Error("unexpected error for", msg, err)
    180 	}
    181 }
    182 
    183 // Test that we recognize a bad type the first time.
    184 func TestWrongTypeDecoder(t *testing.T) {
    185 	badTypeCheck(new(ET2), true, "no fields in common", t)
    186 	badTypeCheck(new(ET3), false, "different name of field", t)
    187 	badTypeCheck(new(ET4), true, "different type of field", t)
    188 }
    189 
    190 // Types not supported at top level by the Encoder.
    191 var unsupportedValues = []interface{}{
    192 	make(chan int),
    193 	func(a int) bool { return true },
    194 }
    195 
    196 func TestUnsupported(t *testing.T) {
    197 	var b bytes.Buffer
    198 	enc := NewEncoder(&b)
    199 	for _, v := range unsupportedValues {
    200 		err := enc.Encode(v)
    201 		if err == nil {
    202 			t.Errorf("expected error for %T; got none", v)
    203 		}
    204 	}
    205 }
    206 
    207 func encAndDec(in, out interface{}) error {
    208 	b := new(bytes.Buffer)
    209 	enc := NewEncoder(b)
    210 	err := enc.Encode(in)
    211 	if err != nil {
    212 		return err
    213 	}
    214 	dec := NewDecoder(b)
    215 	err = dec.Decode(out)
    216 	if err != nil {
    217 		return err
    218 	}
    219 	return nil
    220 }
    221 
    222 func TestTypeToPtrType(t *testing.T) {
    223 	// Encode a T, decode a *T
    224 	type Type0 struct {
    225 		A int
    226 	}
    227 	t0 := Type0{7}
    228 	t0p := new(Type0)
    229 	if err := encAndDec(t0, t0p); err != nil {
    230 		t.Error(err)
    231 	}
    232 }
    233 
    234 func TestPtrTypeToType(t *testing.T) {
    235 	// Encode a *T, decode a T
    236 	type Type1 struct {
    237 		A uint
    238 	}
    239 	t1p := &Type1{17}
    240 	var t1 Type1
    241 	if err := encAndDec(t1, t1p); err != nil {
    242 		t.Error(err)
    243 	}
    244 }
    245 
    246 func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
    247 	type Type2 struct {
    248 		A ****float64
    249 	}
    250 	t2 := Type2{}
    251 	t2.A = new(***float64)
    252 	*t2.A = new(**float64)
    253 	**t2.A = new(*float64)
    254 	***t2.A = new(float64)
    255 	****t2.A = 27.4
    256 	t2pppp := new(***Type2)
    257 	if err := encAndDec(t2, t2pppp); err != nil {
    258 		t.Fatal(err)
    259 	}
    260 	if ****(****t2pppp).A != ****t2.A {
    261 		t.Errorf("wrong value after decode: %g not %g", ****(****t2pppp).A, ****t2.A)
    262 	}
    263 }
    264 
    265 func TestSlice(t *testing.T) {
    266 	type Type3 struct {
    267 		A []string
    268 	}
    269 	t3p := &Type3{[]string{"hello", "world"}}
    270 	var t3 Type3
    271 	if err := encAndDec(t3, t3p); err != nil {
    272 		t.Error(err)
    273 	}
    274 }
    275 
    276 func TestValueError(t *testing.T) {
    277 	// Encode a *T, decode a T
    278 	type Type4 struct {
    279 		A int
    280 	}
    281 	t4p := &Type4{3}
    282 	var t4 Type4 // note: not a pointer.
    283 	if err := encAndDec(t4p, t4); err == nil || strings.Index(err.Error(), "pointer") < 0 {
    284 		t.Error("expected error about pointer; got", err)
    285 	}
    286 }
    287 
    288 func TestArray(t *testing.T) {
    289 	type Type5 struct {
    290 		A [3]string
    291 		B [3]byte
    292 	}
    293 	type Type6 struct {
    294 		A [2]string // can't hold t5.a
    295 	}
    296 	t5 := Type5{[3]string{"hello", ",", "world"}, [3]byte{1, 2, 3}}
    297 	var t5p Type5
    298 	if err := encAndDec(t5, &t5p); err != nil {
    299 		t.Error(err)
    300 	}
    301 	var t6 Type6
    302 	if err := encAndDec(t5, &t6); err == nil {
    303 		t.Error("should fail with mismatched array sizes")
    304 	}
    305 }
    306 
    307 func TestRecursiveMapType(t *testing.T) {
    308 	type recursiveMap map[string]recursiveMap
    309 	r1 := recursiveMap{"A": recursiveMap{"B": nil, "C": nil}, "D": nil}
    310 	r2 := make(recursiveMap)
    311 	if err := encAndDec(r1, &r2); err != nil {
    312 		t.Error(err)
    313 	}
    314 }
    315 
    316 func TestRecursiveSliceType(t *testing.T) {
    317 	type recursiveSlice []recursiveSlice
    318 	r1 := recursiveSlice{0: recursiveSlice{0: nil}, 1: nil}
    319 	r2 := make(recursiveSlice, 0)
    320 	if err := encAndDec(r1, &r2); err != nil {
    321 		t.Error(err)
    322 	}
    323 }
    324 
    325 // Regression test for bug: must send zero values inside arrays
    326 func TestDefaultsInArray(t *testing.T) {
    327 	type Type7 struct {
    328 		B []bool
    329 		I []int
    330 		S []string
    331 		F []float64
    332 	}
    333 	t7 := Type7{
    334 		[]bool{false, false, true},
    335 		[]int{0, 0, 1},
    336 		[]string{"hi", "", "there"},
    337 		[]float64{0, 0, 1},
    338 	}
    339 	var t7p Type7
    340 	if err := encAndDec(t7, &t7p); err != nil {
    341 		t.Error(err)
    342 	}
    343 }
    344 
    345 var testInt int
    346 var testFloat32 float32
    347 var testString string
    348 var testSlice []string
    349 var testMap map[string]int
    350 var testArray [7]int
    351 
    352 type SingleTest struct {
    353 	in  interface{}
    354 	out interface{}
    355 	err string
    356 }
    357 
    358 var singleTests = []SingleTest{
    359 	{17, &testInt, ""},
    360 	{float32(17.5), &testFloat32, ""},
    361 	{"bike shed", &testString, ""},
    362 	{[]string{"bike", "shed", "paint", "color"}, &testSlice, ""},
    363 	{map[string]int{"seven": 7, "twelve": 12}, &testMap, ""},
    364 	{[7]int{4, 55, 0, 0, 0, 0, 0}, &testArray, ""}, // case that once triggered a bug
    365 	{[7]int{4, 55, 1, 44, 22, 66, 1234}, &testArray, ""},
    366 
    367 	// Decode errors
    368 	{172, &testFloat32, "type"},
    369 }
    370 
    371 func TestSingletons(t *testing.T) {
    372 	b := new(bytes.Buffer)
    373 	enc := NewEncoder(b)
    374 	dec := NewDecoder(b)
    375 	for _, test := range singleTests {
    376 		b.Reset()
    377 		err := enc.Encode(test.in)
    378 		if err != nil {
    379 			t.Errorf("error encoding %v: %s", test.in, err)
    380 			continue
    381 		}
    382 		err = dec.Decode(test.out)
    383 		switch {
    384 		case err != nil && test.err == "":
    385 			t.Errorf("error decoding %v: %s", test.in, err)
    386 			continue
    387 		case err == nil && test.err != "":
    388 			t.Errorf("expected error decoding %v: %s", test.in, test.err)
    389 			continue
    390 		case err != nil && test.err != "":
    391 			if strings.Index(err.Error(), test.err) < 0 {
    392 				t.Errorf("wrong error decoding %v: wanted %s, got %v", test.in, test.err, err)
    393 			}
    394 			continue
    395 		}
    396 		// Get rid of the pointer in the rhs
    397 		val := reflect.ValueOf(test.out).Elem().Interface()
    398 		if !reflect.DeepEqual(test.in, val) {
    399 			t.Errorf("decoding singleton: expected %v got %v", test.in, val)
    400 		}
    401 	}
    402 }
    403 
    404 func TestStructNonStruct(t *testing.T) {
    405 	type Struct struct {
    406 		A string
    407 	}
    408 	type NonStruct string
    409 	s := Struct{"hello"}
    410 	var sp Struct
    411 	if err := encAndDec(s, &sp); err != nil {
    412 		t.Error(err)
    413 	}
    414 	var ns NonStruct
    415 	if err := encAndDec(s, &ns); err == nil {
    416 		t.Error("should get error for struct/non-struct")
    417 	} else if strings.Index(err.Error(), "type") < 0 {
    418 		t.Error("for struct/non-struct expected type error; got", err)
    419 	}
    420 	// Now try the other way
    421 	var nsp NonStruct
    422 	if err := encAndDec(ns, &nsp); err != nil {
    423 		t.Error(err)
    424 	}
    425 	if err := encAndDec(ns, &s); err == nil {
    426 		t.Error("should get error for non-struct/struct")
    427 	} else if strings.Index(err.Error(), "type") < 0 {
    428 		t.Error("for non-struct/struct expected type error; got", err)
    429 	}
    430 }
    431 
    432 type interfaceIndirectTestI interface {
    433 	F() bool
    434 }
    435 
    436 type interfaceIndirectTestT struct{}
    437 
    438 func (this *interfaceIndirectTestT) F() bool {
    439 	return true
    440 }
    441 
    442 // A version of a bug reported on golang-nuts.  Also tests top-level
    443 // slice of interfaces.  The issue was registering *T caused T to be
    444 // stored as the concrete type.
    445 func TestInterfaceIndirect(t *testing.T) {
    446 	Register(&interfaceIndirectTestT{})
    447 	b := new(bytes.Buffer)
    448 	w := []interfaceIndirectTestI{&interfaceIndirectTestT{}}
    449 	err := NewEncoder(b).Encode(w)
    450 	if err != nil {
    451 		t.Fatal("encode error:", err)
    452 	}
    453 
    454 	var r []interfaceIndirectTestI
    455 	err = NewDecoder(b).Decode(&r)
    456 	if err != nil {
    457 		t.Fatal("decode error:", err)
    458 	}
    459 }
    460 
    461 // Now follow various tests that decode into things that can't represent the
    462 // encoded value, all of which should be legal.
    463 
    464 // Also, when the ignored object contains an interface value, it may define
    465 // types. Make sure that skipping the value still defines the types by using
    466 // the encoder/decoder pair to send a value afterwards.  If an interface
    467 // is sent, its type in the test is always NewType0, so this checks that the
    468 // encoder and decoder don't skew with respect to type definitions.
    469 
    470 type Struct0 struct {
    471 	I interface{}
    472 }
    473 
    474 type NewType0 struct {
    475 	S string
    476 }
    477 
    478 type ignoreTest struct {
    479 	in, out interface{}
    480 }
    481 
    482 var ignoreTests = []ignoreTest{
    483 	// Decode normal struct into an empty struct
    484 	{&struct{ A int }{23}, &struct{}{}},
    485 	// Decode normal struct into a nil.
    486 	{&struct{ A int }{23}, nil},
    487 	// Decode singleton string into a nil.
    488 	{"hello, world", nil},
    489 	// Decode singleton slice into a nil.
    490 	{[]int{1, 2, 3, 4}, nil},
    491 	// Decode struct containing an interface into a nil.
    492 	{&Struct0{&NewType0{"value0"}}, nil},
    493 	// Decode singleton slice of interfaces into a nil.
    494 	{[]interface{}{"hi", &NewType0{"value1"}, 23}, nil},
    495 }
    496 
    497 func TestDecodeIntoNothing(t *testing.T) {
    498 	Register(new(NewType0))
    499 	for i, test := range ignoreTests {
    500 		b := new(bytes.Buffer)
    501 		enc := NewEncoder(b)
    502 		err := enc.Encode(test.in)
    503 		if err != nil {
    504 			t.Errorf("%d: encode error %s:", i, err)
    505 			continue
    506 		}
    507 		dec := NewDecoder(b)
    508 		err = dec.Decode(test.out)
    509 		if err != nil {
    510 			t.Errorf("%d: decode error: %s", i, err)
    511 			continue
    512 		}
    513 		// Now see if the encoder and decoder are in a consistent state.
    514 		str := fmt.Sprintf("Value %d", i)
    515 		err = enc.Encode(&NewType0{str})
    516 		if err != nil {
    517 			t.Fatalf("%d: NewType0 encode error: %s", i, err)
    518 		}
    519 		ns := new(NewType0)
    520 		err = dec.Decode(ns)
    521 		if err != nil {
    522 			t.Fatalf("%d: NewType0 decode error: %s", i, err)
    523 		}
    524 		if ns.S != str {
    525 			t.Fatalf("%d: expected %q got %q", i, str, ns.S)
    526 		}
    527 	}
    528 }
    529 
    530 func TestIgnoreRecursiveType(t *testing.T) {
    531 	// It's hard to build a self-contained test for this because
    532 	// we can't build compatible types in one package with
    533 	// different items so something is ignored. Here is
    534 	// some data that represents, according to debug.go:
    535 	// type definition {
    536 	//	slice "recursiveSlice" id=106
    537 	//		elem id=106
    538 	// }
    539 	data := []byte{
    540 		0x1d, 0xff, 0xd3, 0x02, 0x01, 0x01, 0x0e, 0x72,
    541 		0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65,
    542 		0x53, 0x6c, 0x69, 0x63, 0x65, 0x01, 0xff, 0xd4,
    543 		0x00, 0x01, 0xff, 0xd4, 0x00, 0x00, 0x07, 0xff,
    544 		0xd4, 0x00, 0x02, 0x01, 0x00, 0x00,
    545 	}
    546 	dec := NewDecoder(bytes.NewReader(data))
    547 	// Issue 10415: This caused infinite recursion.
    548 	err := dec.Decode(nil)
    549 	if err != nil {
    550 		t.Fatal(err)
    551 	}
    552 }
    553 
    554 // Another bug from golang-nuts, involving nested interfaces.
    555 type Bug0Outer struct {
    556 	Bug0Field interface{}
    557 }
    558 
    559 type Bug0Inner struct {
    560 	A int
    561 }
    562 
    563 func TestNestedInterfaces(t *testing.T) {
    564 	var buf bytes.Buffer
    565 	e := NewEncoder(&buf)
    566 	d := NewDecoder(&buf)
    567 	Register(new(Bug0Outer))
    568 	Register(new(Bug0Inner))
    569 	f := &Bug0Outer{&Bug0Outer{&Bug0Inner{7}}}
    570 	var v interface{} = f
    571 	err := e.Encode(&v)
    572 	if err != nil {
    573 		t.Fatal("Encode:", err)
    574 	}
    575 	err = d.Decode(&v)
    576 	if err != nil {
    577 		t.Fatal("Decode:", err)
    578 	}
    579 	// Make sure it decoded correctly.
    580 	outer1, ok := v.(*Bug0Outer)
    581 	if !ok {
    582 		t.Fatalf("v not Bug0Outer: %T", v)
    583 	}
    584 	outer2, ok := outer1.Bug0Field.(*Bug0Outer)
    585 	if !ok {
    586 		t.Fatalf("v.Bug0Field not Bug0Outer: %T", outer1.Bug0Field)
    587 	}
    588 	inner, ok := outer2.Bug0Field.(*Bug0Inner)
    589 	if !ok {
    590 		t.Fatalf("v.Bug0Field.Bug0Field not Bug0Inner: %T", outer2.Bug0Field)
    591 	}
    592 	if inner.A != 7 {
    593 		t.Fatalf("final value %d; expected %d", inner.A, 7)
    594 	}
    595 }
    596 
    597 // The bugs keep coming. We forgot to send map subtypes before the map.
    598 
    599 type Bug1Elem struct {
    600 	Name string
    601 	Id   int
    602 }
    603 
    604 type Bug1StructMap map[string]Bug1Elem
    605 
    606 func bug1EncDec(in Bug1StructMap, out *Bug1StructMap) error {
    607 	return nil
    608 }
    609 
    610 func TestMapBug1(t *testing.T) {
    611 	in := make(Bug1StructMap)
    612 	in["val1"] = Bug1Elem{"elem1", 1}
    613 	in["val2"] = Bug1Elem{"elem2", 2}
    614 
    615 	b := new(bytes.Buffer)
    616 	enc := NewEncoder(b)
    617 	err := enc.Encode(in)
    618 	if err != nil {
    619 		t.Fatal("encode:", err)
    620 	}
    621 	dec := NewDecoder(b)
    622 	out := make(Bug1StructMap)
    623 	err = dec.Decode(&out)
    624 	if err != nil {
    625 		t.Fatal("decode:", err)
    626 	}
    627 	if !reflect.DeepEqual(in, out) {
    628 		t.Errorf("mismatch: %v %v", in, out)
    629 	}
    630 }
    631 
    632 func TestGobMapInterfaceEncode(t *testing.T) {
    633 	m := map[string]interface{}{
    634 		"up": uintptr(0),
    635 		"i0": []int{-1},
    636 		"i1": []int8{-1},
    637 		"i2": []int16{-1},
    638 		"i3": []int32{-1},
    639 		"i4": []int64{-1},
    640 		"u0": []uint{1},
    641 		"u1": []uint8{1},
    642 		"u2": []uint16{1},
    643 		"u3": []uint32{1},
    644 		"u4": []uint64{1},
    645 		"f0": []float32{1},
    646 		"f1": []float64{1},
    647 		"c0": []complex64{complex(2, -2)},
    648 		"c1": []complex128{complex(2, float64(-2))},
    649 		"us": []uintptr{0},
    650 		"bo": []bool{false},
    651 		"st": []string{"s"},
    652 	}
    653 	enc := NewEncoder(new(bytes.Buffer))
    654 	err := enc.Encode(m)
    655 	if err != nil {
    656 		t.Errorf("encode map: %s", err)
    657 	}
    658 }
    659 
    660 func TestSliceReusesMemory(t *testing.T) {
    661 	buf := new(bytes.Buffer)
    662 	// Bytes
    663 	{
    664 		x := []byte("abcd")
    665 		enc := NewEncoder(buf)
    666 		err := enc.Encode(x)
    667 		if err != nil {
    668 			t.Errorf("bytes: encode: %s", err)
    669 		}
    670 		// Decode into y, which is big enough.
    671 		y := []byte("ABCDE")
    672 		addr := &y[0]
    673 		dec := NewDecoder(buf)
    674 		err = dec.Decode(&y)
    675 		if err != nil {
    676 			t.Fatal("bytes: decode:", err)
    677 		}
    678 		if !bytes.Equal(x, y) {
    679 			t.Errorf("bytes: expected %q got %q\n", x, y)
    680 		}
    681 		if addr != &y[0] {
    682 			t.Errorf("bytes: unnecessary reallocation")
    683 		}
    684 	}
    685 	// general slice
    686 	{
    687 		x := []rune("abcd")
    688 		enc := NewEncoder(buf)
    689 		err := enc.Encode(x)
    690 		if err != nil {
    691 			t.Errorf("ints: encode: %s", err)
    692 		}
    693 		// Decode into y, which is big enough.
    694 		y := []rune("ABCDE")
    695 		addr := &y[0]
    696 		dec := NewDecoder(buf)
    697 		err = dec.Decode(&y)
    698 		if err != nil {
    699 			t.Fatal("ints: decode:", err)
    700 		}
    701 		if !reflect.DeepEqual(x, y) {
    702 			t.Errorf("ints: expected %q got %q\n", x, y)
    703 		}
    704 		if addr != &y[0] {
    705 			t.Errorf("ints: unnecessary reallocation")
    706 		}
    707 	}
    708 }
    709 
    710 // Used to crash: negative count in recvMessage.
    711 func TestBadCount(t *testing.T) {
    712 	b := []byte{0xfb, 0xa5, 0x82, 0x2f, 0xca, 0x1}
    713 	if err := NewDecoder(bytes.NewReader(b)).Decode(nil); err == nil {
    714 		t.Error("expected error from bad count")
    715 	} else if err.Error() != errBadCount.Error() {
    716 		t.Error("expected bad count error; got", err)
    717 	}
    718 }
    719 
    720 // Verify that sequential Decoders built on a single input will
    721 // succeed if the input implements ReadByte and there is no
    722 // type information in the stream.
    723 func TestSequentialDecoder(t *testing.T) {
    724 	b := new(bytes.Buffer)
    725 	enc := NewEncoder(b)
    726 	const count = 10
    727 	for i := 0; i < count; i++ {
    728 		s := fmt.Sprintf("%d", i)
    729 		if err := enc.Encode(s); err != nil {
    730 			t.Error("encoder fail:", err)
    731 		}
    732 	}
    733 	for i := 0; i < count; i++ {
    734 		dec := NewDecoder(b)
    735 		var s string
    736 		if err := dec.Decode(&s); err != nil {
    737 			t.Fatal("decoder fail:", err)
    738 		}
    739 		if s != fmt.Sprintf("%d", i) {
    740 			t.Fatalf("decode expected %d got %s", i, s)
    741 		}
    742 	}
    743 }
    744 
    745 // Should be able to have unrepresentable fields (chan, func, *chan etc.); we just ignore them.
    746 type Bug2 struct {
    747 	A   int
    748 	C   chan int
    749 	CP  *chan int
    750 	F   func()
    751 	FPP **func()
    752 }
    753 
    754 func TestChanFuncIgnored(t *testing.T) {
    755 	c := make(chan int)
    756 	f := func() {}
    757 	fp := &f
    758 	b0 := Bug2{23, c, &c, f, &fp}
    759 	var buf bytes.Buffer
    760 	enc := NewEncoder(&buf)
    761 	if err := enc.Encode(b0); err != nil {
    762 		t.Fatal("error encoding:", err)
    763 	}
    764 	var b1 Bug2
    765 	err := NewDecoder(&buf).Decode(&b1)
    766 	if err != nil {
    767 		t.Fatal("decode:", err)
    768 	}
    769 	if b1.A != b0.A {
    770 		t.Fatalf("got %d want %d", b1.A, b0.A)
    771 	}
    772 	if b1.C != nil || b1.CP != nil || b1.F != nil || b1.FPP != nil {
    773 		t.Fatal("unexpected value for chan or func")
    774 	}
    775 }
    776 
    777 func TestSliceIncompatibility(t *testing.T) {
    778 	var in = []byte{1, 2, 3}
    779 	var out []int
    780 	if err := encAndDec(in, &out); err == nil {
    781 		t.Error("expected compatibility error")
    782 	}
    783 }
    784 
    785 // Mutually recursive slices of structs caused problems.
    786 type Bug3 struct {
    787 	Num      int
    788 	Children []*Bug3
    789 }
    790 
    791 func TestGobPtrSlices(t *testing.T) {
    792 	in := []*Bug3{
    793 		{1, nil},
    794 		{2, nil},
    795 	}
    796 	b := new(bytes.Buffer)
    797 	err := NewEncoder(b).Encode(&in)
    798 	if err != nil {
    799 		t.Fatal("encode:", err)
    800 	}
    801 
    802 	var out []*Bug3
    803 	err = NewDecoder(b).Decode(&out)
    804 	if err != nil {
    805 		t.Fatal("decode:", err)
    806 	}
    807 	if !reflect.DeepEqual(in, out) {
    808 		t.Fatalf("got %v; wanted %v", out, in)
    809 	}
    810 }
    811 
    812 // getDecEnginePtr cached engine for ut.base instead of ut.user so we passed
    813 // a *map and then tried to reuse its engine to decode the inner map.
    814 func TestPtrToMapOfMap(t *testing.T) {
    815 	Register(make(map[string]interface{}))
    816 	subdata := make(map[string]interface{})
    817 	subdata["bar"] = "baz"
    818 	data := make(map[string]interface{})
    819 	data["foo"] = subdata
    820 
    821 	b := new(bytes.Buffer)
    822 	err := NewEncoder(b).Encode(data)
    823 	if err != nil {
    824 		t.Fatal("encode:", err)
    825 	}
    826 	var newData map[string]interface{}
    827 	err = NewDecoder(b).Decode(&newData)
    828 	if err != nil {
    829 		t.Fatal("decode:", err)
    830 	}
    831 	if !reflect.DeepEqual(data, newData) {
    832 		t.Fatalf("expected %v got %v", data, newData)
    833 	}
    834 }
    835 
    836 // A top-level nil pointer generates a panic with a helpful string-valued message.
    837 func TestTopLevelNilPointer(t *testing.T) {
    838 	errMsg := topLevelNilPanic(t)
    839 	if errMsg == "" {
    840 		t.Fatal("top-level nil pointer did not panic")
    841 	}
    842 	if !strings.Contains(errMsg, "nil pointer") {
    843 		t.Fatal("expected nil pointer error, got:", errMsg)
    844 	}
    845 }
    846 
    847 func topLevelNilPanic(t *testing.T) (panicErr string) {
    848 	defer func() {
    849 		e := recover()
    850 		if err, ok := e.(string); ok {
    851 			panicErr = err
    852 		}
    853 	}()
    854 	var ip *int
    855 	buf := new(bytes.Buffer)
    856 	if err := NewEncoder(buf).Encode(ip); err != nil {
    857 		t.Fatal("error in encode:", err)
    858 	}
    859 	return
    860 }
    861 
    862 func TestNilPointerInsideInterface(t *testing.T) {
    863 	var ip *int
    864 	si := struct {
    865 		I interface{}
    866 	}{
    867 		I: ip,
    868 	}
    869 	buf := new(bytes.Buffer)
    870 	err := NewEncoder(buf).Encode(si)
    871 	if err == nil {
    872 		t.Fatal("expected error, got none")
    873 	}
    874 	errMsg := err.Error()
    875 	if !strings.Contains(errMsg, "nil pointer") || !strings.Contains(errMsg, "interface") {
    876 		t.Fatal("expected error about nil pointer and interface, got:", errMsg)
    877 	}
    878 }
    879 
    880 type Bug4Public struct {
    881 	Name   string
    882 	Secret Bug4Secret
    883 }
    884 
    885 type Bug4Secret struct {
    886 	a int // error: no exported fields.
    887 }
    888 
    889 // Test that a failed compilation doesn't leave around an executable encoder.
    890 // Issue 3273.
    891 func TestMutipleEncodingsOfBadType(t *testing.T) {
    892 	x := Bug4Public{
    893 		Name:   "name",
    894 		Secret: Bug4Secret{1},
    895 	}
    896 	buf := new(bytes.Buffer)
    897 	enc := NewEncoder(buf)
    898 	err := enc.Encode(x)
    899 	if err == nil {
    900 		t.Fatal("first encoding: expected error")
    901 	}
    902 	buf.Reset()
    903 	enc = NewEncoder(buf)
    904 	err = enc.Encode(x)
    905 	if err == nil {
    906 		t.Fatal("second encoding: expected error")
    907 	}
    908 	if !strings.Contains(err.Error(), "no exported fields") {
    909 		t.Errorf("expected error about no exported fields; got %v", err)
    910 	}
    911 }
    912 
    913 // There was an error check comparing the length of the input with the
    914 // length of the slice being decoded. It was wrong because the next
    915 // thing in the input might be a type definition, which would lead to
    916 // an incorrect length check.  This test reproduces the corner case.
    917 
    918 type Z struct {
    919 }
    920 
    921 func Test29ElementSlice(t *testing.T) {
    922 	Register(Z{})
    923 	src := make([]interface{}, 100) // Size needs to be bigger than size of type definition.
    924 	for i := range src {
    925 		src[i] = Z{}
    926 	}
    927 	buf := new(bytes.Buffer)
    928 	err := NewEncoder(buf).Encode(src)
    929 	if err != nil {
    930 		t.Fatalf("encode: %v", err)
    931 		return
    932 	}
    933 
    934 	var dst []interface{}
    935 	err = NewDecoder(buf).Decode(&dst)
    936 	if err != nil {
    937 		t.Errorf("decode: %v", err)
    938 		return
    939 	}
    940 }
    941 
    942 // Don't crash, just give error when allocating a huge slice.
    943 // Issue 8084.
    944 func TestErrorForHugeSlice(t *testing.T) {
    945 	// Encode an int slice.
    946 	buf := new(bytes.Buffer)
    947 	slice := []int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
    948 	err := NewEncoder(buf).Encode(slice)
    949 	if err != nil {
    950 		t.Fatal("encode:", err)
    951 	}
    952 	// Reach into the buffer and smash the count to make the encoded slice very long.
    953 	buf.Bytes()[buf.Len()-len(slice)-1] = 0xfa
    954 	// Decode and see error.
    955 	err = NewDecoder(buf).Decode(&slice)
    956 	if err == nil {
    957 		t.Fatal("decode: no error")
    958 	}
    959 	if !strings.Contains(err.Error(), "slice too big") {
    960 		t.Fatalf("decode: expected slice too big error, got %s", err.Error())
    961 	}
    962 }
    963 
    964 type badDataTest struct {
    965 	input string      // The input encoded as a hex string.
    966 	error string      // A substring of the error that should result.
    967 	data  interface{} // What to decode into.
    968 }
    969 
    970 var badDataTests = []badDataTest{
    971 	{"", "EOF", nil},
    972 	{"7F6869", "unexpected EOF", nil},
    973 	{"036e6f77206973207468652074696d6520666f7220616c6c20676f6f64206d656e", "unknown type id", new(ET2)},
    974 	{"0424666f6f", "field numbers out of bounds", new(ET2)}, // Issue 6323.
    975 	{"05100028557b02027f8302", "interface encoding", nil},   // Issue 10270.
    976 	// Issue 10273.
    977 	{"130a00fb5dad0bf8ff020263e70002fa28020202a89859", "slice length too large", nil},
    978 	{"0f1000fb285d003316020735ff023a65c5", "interface encoding", nil},
    979 	{"03fffb0616fffc00f902ff02ff03bf005d02885802a311a8120228022c028ee7", "GobDecoder", nil},
    980 	// Issue 10491.
    981 	{"10fe010f020102fe01100001fe010e000016fe010d030102fe010e00010101015801fe01100000000bfe011000f85555555555555555", "length exceeds input size", nil},
    982 }
    983 
    984 // TestBadData tests that various problems caused by malformed input
    985 // are caught as errors and do not cause panics.
    986 func TestBadData(t *testing.T) {
    987 	for i, test := range badDataTests {
    988 		data, err := hex.DecodeString(test.input)
    989 		if err != nil {
    990 			t.Fatalf("#%d: hex error: %s", i, err)
    991 		}
    992 		d := NewDecoder(bytes.NewReader(data))
    993 		err = d.Decode(test.data)
    994 		if err == nil {
    995 			t.Errorf("decode: no error")
    996 			continue
    997 		}
    998 		if !strings.Contains(err.Error(), test.error) {
    999 			t.Errorf("#%d: decode: expected %q error, got %s", i, test.error, err.Error())
   1000 		}
   1001 	}
   1002 }
   1003 
   1004 // TestHugeWriteFails tests that enormous messages trigger an error.
   1005 func TestHugeWriteFails(t *testing.T) {
   1006 	if testing.Short() {
   1007 		// Requires allocating a monster, so don't do this from all.bash.
   1008 		t.Skip("skipping huge allocation in short mode")
   1009 	}
   1010 	huge := make([]byte, tooBig)
   1011 	huge[0] = 7 // Make sure it's not all zeros.
   1012 	buf := new(bytes.Buffer)
   1013 	err := NewEncoder(buf).Encode(huge)
   1014 	if err == nil {
   1015 		t.Fatalf("expected error for huge slice")
   1016 	}
   1017 	if !strings.Contains(err.Error(), "message too big") {
   1018 		t.Fatalf("expected 'too big' error; got %s\n", err.Error())
   1019 	}
   1020 }
   1021