diff options
| author | Michael Stapelberg <stapelberg@debian.org> | 2013-03-04 21:27:36 +0100 | 
|---|---|---|
| committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-04 21:27:36 +0100 | 
| commit | 04b08da9af0c450d645ab7389d1467308cfc2db8 (patch) | |
| tree | db247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/encoding/gob/encoder_test.go | |
| parent | 917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff) | |
| download | golang-04b08da9af0c450d645ab7389d1467308cfc2db8.tar.gz | |
Imported Upstream version 1.1~hg20130304upstream/1.1_hg20130304
Diffstat (limited to 'src/pkg/encoding/gob/encoder_test.go')
| -rw-r--r-- | src/pkg/encoding/gob/encoder_test.go | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/src/pkg/encoding/gob/encoder_test.go b/src/pkg/encoding/gob/encoder_test.go index c4947cbb8..b684772c6 100644 --- a/src/pkg/encoding/gob/encoder_test.go +++ b/src/pkg/encoding/gob/encoder_test.go @@ -736,3 +736,109 @@ func TestPtrToMapOfMap(t *testing.T) {  		t.Fatalf("expected %v got %v", data, newData)  	}  } + +// A top-level nil pointer generates a panic with a helpful string-valued message. +func TestTopLevelNilPointer(t *testing.T) { +	errMsg := topLevelNilPanic(t) +	if errMsg == "" { +		t.Fatal("top-level nil pointer did not panic") +	} +	if !strings.Contains(errMsg, "nil pointer") { +		t.Fatal("expected nil pointer error, got:", errMsg) +	} +} + +func topLevelNilPanic(t *testing.T) (panicErr string) { +	defer func() { +		e := recover() +		if err, ok := e.(string); ok { +			panicErr = err +		} +	}() +	var ip *int +	buf := new(bytes.Buffer) +	if err := NewEncoder(buf).Encode(ip); err != nil { +		t.Fatal("error in encode:", err) +	} +	return +} + +func TestNilPointerInsideInterface(t *testing.T) { +	var ip *int +	si := struct { +		I interface{} +	}{ +		I: ip, +	} +	buf := new(bytes.Buffer) +	err := NewEncoder(buf).Encode(si) +	if err == nil { +		t.Fatal("expected error, got none") +	} +	errMsg := err.Error() +	if !strings.Contains(errMsg, "nil pointer") || !strings.Contains(errMsg, "interface") { +		t.Fatal("expected error about nil pointer and interface, got:", errMsg) +	} +} + +type Bug4Public struct { +	Name   string +	Secret Bug4Secret +} + +type Bug4Secret struct { +	a int // error: no exported fields. +} + +// Test that a failed compilation doesn't leave around an executable encoder. +// Issue 3273. +func TestMutipleEncodingsOfBadType(t *testing.T) { +	x := Bug4Public{ +		Name:   "name", +		Secret: Bug4Secret{1}, +	} +	buf := new(bytes.Buffer) +	enc := NewEncoder(buf) +	err := enc.Encode(x) +	if err == nil { +		t.Fatal("first encoding: expected error") +	} +	buf.Reset() +	enc = NewEncoder(buf) +	err = enc.Encode(x) +	if err == nil { +		t.Fatal("second encoding: expected error") +	} +	if !strings.Contains(err.Error(), "no exported fields") { +		t.Errorf("expected error about no exported fields; got %v", err) +	} +} + +// There was an error check comparing the length of the input with the +// length of the slice being decoded. It was wrong because the next +// thing in the input might be a type definition, which would lead to +// an incorrect length check.  This test reproduces the corner case. + +type Z struct { +} + +func Test29ElementSlice(t *testing.T) { +	Register(Z{}) +	src := make([]interface{}, 100) // Size needs to be bigger than size of type definition. +	for i := range src { +		src[i] = Z{} +	} +	buf := new(bytes.Buffer) +	err := NewEncoder(buf).Encode(src) +	if err != nil { +		t.Fatalf("encode: %v", err) +		return +	} + +	var dst []interface{} +	err = NewDecoder(buf).Decode(&dst) +	if err != nil { +		t.Errorf("decode: %v", err) +		return +	} +} | 
