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