github.com/sbinet/go@v0.0.0-20160827155028-54d7de7dd62b/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 }