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 }