stream_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright 2010 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 json
  5. import (
  6. "bytes"
  7. "io/ioutil"
  8. "net"
  9. "reflect"
  10. "strings"
  11. "testing"
  12. )
  13. // Test values for the stream test.
  14. // One of each JSON kind.
  15. var streamTest = []interface{}{
  16. 0.1,
  17. "hello",
  18. nil,
  19. true,
  20. false,
  21. []interface{}{"a", "b", "c"},
  22. map[string]interface{}{"K": "Kelvin", "ß": "long s"},
  23. 3.14, // another value to make sure something can follow map
  24. }
  25. var streamEncoded = `0.1
  26. "hello"
  27. null
  28. true
  29. false
  30. ["a","b","c"]
  31. {"ß":"long s","K":"Kelvin"}
  32. 3.14
  33. `
  34. func TestEncoder(t *testing.T) {
  35. for i := 0; i <= len(streamTest); i++ {
  36. var buf bytes.Buffer
  37. enc := NewEncoder(&buf)
  38. for j, v := range streamTest[0:i] {
  39. if err := enc.Encode(v); err != nil {
  40. t.Fatalf("encode #%d: %v", j, err)
  41. }
  42. }
  43. if have, want := buf.String(), nlines(streamEncoded, i); have != want {
  44. t.Errorf("encoding %d items: mismatch", i)
  45. diff(t, []byte(have), []byte(want))
  46. break
  47. }
  48. }
  49. }
  50. func TestDecoder(t *testing.T) {
  51. for i := 0; i <= len(streamTest); i++ {
  52. // Use stream without newlines as input,
  53. // just to stress the decoder even more.
  54. // Our test input does not include back-to-back numbers.
  55. // Otherwise stripping the newlines would
  56. // merge two adjacent JSON values.
  57. var buf bytes.Buffer
  58. for _, c := range nlines(streamEncoded, i) {
  59. if c != '\n' {
  60. buf.WriteRune(c)
  61. }
  62. }
  63. out := make([]interface{}, i)
  64. dec := NewDecoder(&buf)
  65. for j := range out {
  66. if err := dec.Decode(&out[j]); err != nil {
  67. t.Fatalf("decode #%d/%d: %v", j, i, err)
  68. }
  69. }
  70. if !reflect.DeepEqual(out, streamTest[0:i]) {
  71. t.Errorf("decoding %d items: mismatch", i)
  72. for j := range out {
  73. if !reflect.DeepEqual(out[j], streamTest[j]) {
  74. t.Errorf("#%d: have %v want %v", j, out[j], streamTest[j])
  75. }
  76. }
  77. break
  78. }
  79. }
  80. }
  81. func TestDecoderBuffered(t *testing.T) {
  82. r := strings.NewReader(`{"Name": "Gopher"} extra `)
  83. var m struct {
  84. Name string
  85. }
  86. d := NewDecoder(r)
  87. err := d.Decode(&m)
  88. if err != nil {
  89. t.Fatal(err)
  90. }
  91. if m.Name != "Gopher" {
  92. t.Errorf("Name = %q; want Gopher", m.Name)
  93. }
  94. rest, err := ioutil.ReadAll(d.Buffered())
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. if g, w := string(rest), " extra "; g != w {
  99. t.Errorf("Remaining = %q; want %q", g, w)
  100. }
  101. }
  102. func nlines(s string, n int) string {
  103. if n <= 0 {
  104. return ""
  105. }
  106. for i, c := range s {
  107. if c == '\n' {
  108. if n--; n == 0 {
  109. return s[0 : i+1]
  110. }
  111. }
  112. }
  113. return s
  114. }
  115. func TestRawMessage(t *testing.T) {
  116. // TODO(rsc): Should not need the * in *RawMessage
  117. var data struct {
  118. X float64
  119. Id *RawMessage
  120. Y float32
  121. }
  122. const raw = `["\u0056",null]`
  123. const msg = `{"X":0.1,"Id":["\u0056",null],"Y":0.2}`
  124. err := Unmarshal([]byte(msg), &data)
  125. if err != nil {
  126. t.Fatalf("Unmarshal: %v", err)
  127. }
  128. if string([]byte(*data.Id)) != raw {
  129. t.Fatalf("Raw mismatch: have %#q want %#q", []byte(*data.Id), raw)
  130. }
  131. b, err := Marshal(&data)
  132. if err != nil {
  133. t.Fatalf("Marshal: %v", err)
  134. }
  135. if string(b) != msg {
  136. t.Fatalf("Marshal: have %#q want %#q", b, msg)
  137. }
  138. }
  139. func TestNullRawMessage(t *testing.T) {
  140. // TODO(rsc): Should not need the * in *RawMessage
  141. var data struct {
  142. X float64
  143. Id *RawMessage
  144. Y float32
  145. }
  146. data.Id = new(RawMessage)
  147. const msg = `{"X":0.1,"Id":null,"Y":0.2}`
  148. err := Unmarshal([]byte(msg), &data)
  149. if err != nil {
  150. t.Fatalf("Unmarshal: %v", err)
  151. }
  152. if data.Id != nil {
  153. t.Fatalf("Raw mismatch: have non-nil, want nil")
  154. }
  155. b, err := Marshal(&data)
  156. if err != nil {
  157. t.Fatalf("Marshal: %v", err)
  158. }
  159. if string(b) != msg {
  160. t.Fatalf("Marshal: have %#q want %#q", b, msg)
  161. }
  162. }
  163. var blockingTests = []string{
  164. `{"x": 1}`,
  165. `[1, 2, 3]`,
  166. }
  167. func TestBlocking(t *testing.T) {
  168. for _, enc := range blockingTests {
  169. r, w := net.Pipe()
  170. go w.Write([]byte(enc))
  171. var val interface{}
  172. // If Decode reads beyond what w.Write writes above,
  173. // it will block, and the test will deadlock.
  174. if err := NewDecoder(r).Decode(&val); err != nil {
  175. t.Errorf("decoding %s: %v", enc, err)
  176. }
  177. r.Close()
  178. w.Close()
  179. }
  180. }
  181. func BenchmarkEncoderEncode(b *testing.B) {
  182. b.ReportAllocs()
  183. type T struct {
  184. X, Y string
  185. }
  186. v := &T{"foo", "bar"}
  187. for i := 0; i < b.N; i++ {
  188. if err := NewEncoder(ioutil.Discard).Encode(v); err != nil {
  189. b.Fatal(err)
  190. }
  191. }
  192. }