encoder_test.go 22 KB

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