github.com/euank/go@v0.0.0-20160829210321-495514729181/src/encoding/gob/encoder_test.go (about)

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