github.com/4ad/go@v0.0.0-20161219182952-69a12818b605/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  // A top-level nil pointer generates a panic with a helpful string-valued message.
   834  func TestTopLevelNilPointer(t *testing.T) {
   835  	var ip *int
   836  	encodeErr, panicErr := encodeAndRecover(ip)
   837  	if encodeErr != nil {
   838  		t.Fatal("error in encode:", encodeErr)
   839  	}
   840  	if panicErr == nil {
   841  		t.Fatal("top-level nil pointer did not panic")
   842  	}
   843  	errMsg := panicErr.Error()
   844  	if !strings.Contains(errMsg, "nil pointer") {
   845  		t.Fatal("expected nil pointer error, got:", errMsg)
   846  	}
   847  }
   848  
   849  func encodeAndRecover(value interface{}) (encodeErr, panicErr error) {
   850  	defer func() {
   851  		e := recover()
   852  		if e != nil {
   853  			switch err := e.(type) {
   854  			case error:
   855  				panicErr = err
   856  			default:
   857  				panicErr = fmt.Errorf("%v", err)
   858  			}
   859  		}
   860  	}()
   861  
   862  	encodeErr = NewEncoder(ioutil.Discard).Encode(value)
   863  	return
   864  }
   865  
   866  func TestNilPointerPanics(t *testing.T) {
   867  	var (
   868  		nilStringPtr      *string
   869  		intMap            = make(map[int]int)
   870  		intMapPtr         = &intMap
   871  		nilIntMapPtr      *map[int]int
   872  		zero              int
   873  		nilBoolChannel    chan bool
   874  		nilBoolChannelPtr *chan bool
   875  		nilStringSlice    []string
   876  		stringSlice       = make([]string, 1)
   877  		nilStringSlicePtr *[]string
   878  	)
   879  
   880  	testCases := []struct {
   881  		value     interface{}
   882  		mustPanic bool
   883  	}{
   884  		{nilStringPtr, true},
   885  		{intMap, false},
   886  		{intMapPtr, false},
   887  		{nilIntMapPtr, true},
   888  		{zero, false},
   889  		{nilStringSlice, false},
   890  		{stringSlice, false},
   891  		{nilStringSlicePtr, true},
   892  		{nilBoolChannel, false},
   893  		{nilBoolChannelPtr, true},
   894  	}
   895  
   896  	for _, tt := range testCases {
   897  		_, panicErr := encodeAndRecover(tt.value)
   898  		if tt.mustPanic {
   899  			if panicErr == nil {
   900  				t.Errorf("expected panic with input %#v, did not panic", tt.value)
   901  			}
   902  			continue
   903  		}
   904  		if panicErr != nil {
   905  			t.Fatalf("expected no panic with input %#v, got panic=%v", tt.value, panicErr)
   906  		}
   907  	}
   908  }
   909  
   910  func TestNilPointerInsideInterface(t *testing.T) {
   911  	var ip *int
   912  	si := struct {
   913  		I interface{}
   914  	}{
   915  		I: ip,
   916  	}
   917  	buf := new(bytes.Buffer)
   918  	err := NewEncoder(buf).Encode(si)
   919  	if err == nil {
   920  		t.Fatal("expected error, got none")
   921  	}
   922  	errMsg := err.Error()
   923  	if !strings.Contains(errMsg, "nil pointer") || !strings.Contains(errMsg, "interface") {
   924  		t.Fatal("expected error about nil pointer and interface, got:", errMsg)
   925  	}
   926  }
   927  
   928  type Bug4Public struct {
   929  	Name   string
   930  	Secret Bug4Secret
   931  }
   932  
   933  type Bug4Secret struct {
   934  	a int // error: no exported fields.
   935  }
   936  
   937  // Test that a failed compilation doesn't leave around an executable encoder.
   938  // Issue 3273.
   939  func TestMutipleEncodingsOfBadType(t *testing.T) {
   940  	x := Bug4Public{
   941  		Name:   "name",
   942  		Secret: Bug4Secret{1},
   943  	}
   944  	buf := new(bytes.Buffer)
   945  	enc := NewEncoder(buf)
   946  	err := enc.Encode(x)
   947  	if err == nil {
   948  		t.Fatal("first encoding: expected error")
   949  	}
   950  	buf.Reset()
   951  	enc = NewEncoder(buf)
   952  	err = enc.Encode(x)
   953  	if err == nil {
   954  		t.Fatal("second encoding: expected error")
   955  	}
   956  	if !strings.Contains(err.Error(), "no exported fields") {
   957  		t.Errorf("expected error about no exported fields; got %v", err)
   958  	}
   959  }
   960  
   961  // There was an error check comparing the length of the input with the
   962  // length of the slice being decoded. It was wrong because the next
   963  // thing in the input might be a type definition, which would lead to
   964  // an incorrect length check. This test reproduces the corner case.
   965  
   966  type Z struct {
   967  }
   968  
   969  func Test29ElementSlice(t *testing.T) {
   970  	Register(Z{})
   971  	src := make([]interface{}, 100) // Size needs to be bigger than size of type definition.
   972  	for i := range src {
   973  		src[i] = Z{}
   974  	}
   975  	buf := new(bytes.Buffer)
   976  	err := NewEncoder(buf).Encode(src)
   977  	if err != nil {
   978  		t.Fatalf("encode: %v", err)
   979  		return
   980  	}
   981  
   982  	var dst []interface{}
   983  	err = NewDecoder(buf).Decode(&dst)
   984  	if err != nil {
   985  		t.Errorf("decode: %v", err)
   986  		return
   987  	}
   988  }
   989  
   990  // Don't crash, just give error when allocating a huge slice.
   991  // Issue 8084.
   992  func TestErrorForHugeSlice(t *testing.T) {
   993  	// Encode an int slice.
   994  	buf := new(bytes.Buffer)
   995  	slice := []int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
   996  	err := NewEncoder(buf).Encode(slice)
   997  	if err != nil {
   998  		t.Fatal("encode:", err)
   999  	}
  1000  	// Reach into the buffer and smash the count to make the encoded slice very long.
  1001  	buf.Bytes()[buf.Len()-len(slice)-1] = 0xfa
  1002  	// Decode and see error.
  1003  	err = NewDecoder(buf).Decode(&slice)
  1004  	if err == nil {
  1005  		t.Fatal("decode: no error")
  1006  	}
  1007  	if !strings.Contains(err.Error(), "slice too big") {
  1008  		t.Fatalf("decode: expected slice too big error, got %s", err.Error())
  1009  	}
  1010  }
  1011  
  1012  type badDataTest struct {
  1013  	input string      // The input encoded as a hex string.
  1014  	error string      // A substring of the error that should result.
  1015  	data  interface{} // What to decode into.
  1016  }
  1017  
  1018  var badDataTests = []badDataTest{
  1019  	{"", "EOF", nil},
  1020  	{"7F6869", "unexpected EOF", nil},
  1021  	{"036e6f77206973207468652074696d6520666f7220616c6c20676f6f64206d656e", "unknown type id", new(ET2)},
  1022  	{"0424666f6f", "field numbers out of bounds", new(ET2)}, // Issue 6323.
  1023  	{"05100028557b02027f8302", "interface encoding", nil},   // Issue 10270.
  1024  	// Issue 10273.
  1025  	{"130a00fb5dad0bf8ff020263e70002fa28020202a89859", "slice length too large", nil},
  1026  	{"0f1000fb285d003316020735ff023a65c5", "interface encoding", nil},
  1027  	{"03fffb0616fffc00f902ff02ff03bf005d02885802a311a8120228022c028ee7", "GobDecoder", nil},
  1028  	// Issue 10491.
  1029  	{"10fe010f020102fe01100001fe010e000016fe010d030102fe010e00010101015801fe01100000000bfe011000f85555555555555555", "exceeds input size", nil},
  1030  }
  1031  
  1032  // TestBadData tests that various problems caused by malformed input
  1033  // are caught as errors and do not cause panics.
  1034  func TestBadData(t *testing.T) {
  1035  	for i, test := range badDataTests {
  1036  		data, err := hex.DecodeString(test.input)
  1037  		if err != nil {
  1038  			t.Fatalf("#%d: hex error: %s", i, err)
  1039  		}
  1040  		d := NewDecoder(bytes.NewReader(data))
  1041  		err = d.Decode(test.data)
  1042  		if err == nil {
  1043  			t.Errorf("decode: no error")
  1044  			continue
  1045  		}
  1046  		if !strings.Contains(err.Error(), test.error) {
  1047  			t.Errorf("#%d: decode: expected %q error, got %s", i, test.error, err.Error())
  1048  		}
  1049  	}
  1050  }
  1051  
  1052  // TestHugeWriteFails tests that enormous messages trigger an error.
  1053  func TestHugeWriteFails(t *testing.T) {
  1054  	if testing.Short() {
  1055  		// Requires allocating a monster, so don't do this from all.bash.
  1056  		t.Skip("skipping huge allocation in short mode")
  1057  	}
  1058  	huge := make([]byte, tooBig)
  1059  	huge[0] = 7 // Make sure it's not all zeros.
  1060  	buf := new(bytes.Buffer)
  1061  	err := NewEncoder(buf).Encode(huge)
  1062  	if err == nil {
  1063  		t.Fatalf("expected error for huge slice")
  1064  	}
  1065  	if !strings.Contains(err.Error(), "message too big") {
  1066  		t.Fatalf("expected 'too big' error; got %s\n", err.Error())
  1067  	}
  1068  }