bufio_test.go 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912
  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 bufio_test
  5. import (
  6. . "bufio"
  7. "bytes"
  8. "errors"
  9. "fmt"
  10. "io"
  11. "math/rand"
  12. "strconv"
  13. "strings"
  14. "testing"
  15. "testing/iotest"
  16. "time"
  17. "unicode/utf8"
  18. )
  19. // Reads from a reader and rot13s the result.
  20. type rot13Reader struct {
  21. r io.Reader
  22. }
  23. func newRot13Reader(r io.Reader) *rot13Reader {
  24. r13 := new(rot13Reader)
  25. r13.r = r
  26. return r13
  27. }
  28. func (r13 *rot13Reader) Read(p []byte) (int, error) {
  29. n, err := r13.r.Read(p)
  30. for i := 0; i < n; i++ {
  31. c := p[i] | 0x20 // lowercase byte
  32. if 'a' <= c && c <= 'm' {
  33. p[i] += 13
  34. } else if 'n' <= c && c <= 'z' {
  35. p[i] -= 13
  36. }
  37. }
  38. return n, err
  39. }
  40. // Call ReadByte to accumulate the text of a file
  41. func readBytes(buf *Reader) string {
  42. var b [1000]byte
  43. nb := 0
  44. for {
  45. c, err := buf.ReadByte()
  46. if err == io.EOF {
  47. break
  48. }
  49. if err == nil {
  50. b[nb] = c
  51. nb++
  52. } else if err != iotest.ErrTimeout {
  53. panic("Data: " + err.Error())
  54. }
  55. }
  56. return string(b[0:nb])
  57. }
  58. func TestReaderSimple(t *testing.T) {
  59. data := "hello world"
  60. b := NewReader(strings.NewReader(data))
  61. if s := readBytes(b); s != "hello world" {
  62. t.Errorf("simple hello world test failed: got %q", s)
  63. }
  64. b = NewReader(newRot13Reader(strings.NewReader(data)))
  65. if s := readBytes(b); s != "uryyb jbeyq" {
  66. t.Errorf("rot13 hello world test failed: got %q", s)
  67. }
  68. }
  69. type readMaker struct {
  70. name string
  71. fn func(io.Reader) io.Reader
  72. }
  73. var readMakers = []readMaker{
  74. {"full", func(r io.Reader) io.Reader { return r }},
  75. {"byte", iotest.OneByteReader},
  76. {"half", iotest.HalfReader},
  77. {"data+err", iotest.DataErrReader},
  78. {"timeout", iotest.TimeoutReader},
  79. }
  80. // Call ReadString (which ends up calling everything else)
  81. // to accumulate the text of a file.
  82. func readLines(b *Reader) string {
  83. s := ""
  84. for {
  85. s1, err := b.ReadString('\n')
  86. if err == io.EOF {
  87. break
  88. }
  89. if err != nil && err != iotest.ErrTimeout {
  90. panic("GetLines: " + err.Error())
  91. }
  92. s += s1
  93. }
  94. return s
  95. }
  96. // Call Read to accumulate the text of a file
  97. func reads(buf *Reader, m int) string {
  98. var b [1000]byte
  99. nb := 0
  100. for {
  101. n, err := buf.Read(b[nb : nb+m])
  102. nb += n
  103. if err == io.EOF {
  104. break
  105. }
  106. }
  107. return string(b[0:nb])
  108. }
  109. type bufReader struct {
  110. name string
  111. fn func(*Reader) string
  112. }
  113. var bufreaders = []bufReader{
  114. {"1", func(b *Reader) string { return reads(b, 1) }},
  115. {"2", func(b *Reader) string { return reads(b, 2) }},
  116. {"3", func(b *Reader) string { return reads(b, 3) }},
  117. {"4", func(b *Reader) string { return reads(b, 4) }},
  118. {"5", func(b *Reader) string { return reads(b, 5) }},
  119. {"7", func(b *Reader) string { return reads(b, 7) }},
  120. {"bytes", readBytes},
  121. {"lines", readLines},
  122. }
  123. const minReadBufferSize = 16
  124. var bufsizes = []int{
  125. 0, minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096,
  126. }
  127. func TestReader(t *testing.T) {
  128. var texts [31]string
  129. str := ""
  130. all := ""
  131. for i := 0; i < len(texts)-1; i++ {
  132. texts[i] = str + "\n"
  133. all += texts[i]
  134. str += string(rune(i%26 + 'a'))
  135. }
  136. texts[len(texts)-1] = all
  137. for h := 0; h < len(texts); h++ {
  138. text := texts[h]
  139. for i := 0; i < len(readMakers); i++ {
  140. for j := 0; j < len(bufreaders); j++ {
  141. for k := 0; k < len(bufsizes); k++ {
  142. readmaker := readMakers[i]
  143. bufreader := bufreaders[j]
  144. bufsize := bufsizes[k]
  145. read := readmaker.fn(strings.NewReader(text))
  146. buf := NewReaderSize(read, bufsize)
  147. s := bufreader.fn(buf)
  148. if s != text {
  149. t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
  150. readmaker.name, bufreader.name, bufsize, text, s)
  151. }
  152. }
  153. }
  154. }
  155. }
  156. }
  157. type zeroReader struct{}
  158. func (zeroReader) Read(p []byte) (int, error) {
  159. return 0, nil
  160. }
  161. func TestZeroReader(t *testing.T) {
  162. var z zeroReader
  163. r := NewReader(z)
  164. c := make(chan error)
  165. go func() {
  166. _, err := r.ReadByte()
  167. c <- err
  168. }()
  169. select {
  170. case err := <-c:
  171. if err == nil {
  172. t.Error("error expected")
  173. } else if err != io.ErrNoProgress {
  174. t.Error("unexpected error:", err)
  175. }
  176. case <-time.After(time.Second):
  177. t.Error("test timed out (endless loop in ReadByte?)")
  178. }
  179. }
  180. // A StringReader delivers its data one string segment at a time via Read.
  181. type StringReader struct {
  182. data []string
  183. step int
  184. }
  185. func (r *StringReader) Read(p []byte) (n int, err error) {
  186. if r.step < len(r.data) {
  187. s := r.data[r.step]
  188. n = copy(p, s)
  189. r.step++
  190. } else {
  191. err = io.EOF
  192. }
  193. return
  194. }
  195. func readRuneSegments(t *testing.T, segments []string) {
  196. got := ""
  197. want := strings.Join(segments, "")
  198. r := NewReader(&StringReader{data: segments})
  199. for {
  200. r, _, err := r.ReadRune()
  201. if err != nil {
  202. if err != io.EOF {
  203. return
  204. }
  205. break
  206. }
  207. got += string(r)
  208. }
  209. if got != want {
  210. t.Errorf("segments=%v got=%s want=%s", segments, got, want)
  211. }
  212. }
  213. var segmentList = [][]string{
  214. {},
  215. {""},
  216. {"日", "本語"},
  217. {"\u65e5", "\u672c", "\u8a9e"},
  218. {"\U000065e5", "\U0000672c", "\U00008a9e"},
  219. {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
  220. {"Hello", ", ", "World", "!"},
  221. {"Hello", ", ", "", "World", "!"},
  222. }
  223. func TestReadRune(t *testing.T) {
  224. for _, s := range segmentList {
  225. readRuneSegments(t, s)
  226. }
  227. }
  228. func TestUnreadRune(t *testing.T) {
  229. segments := []string{"Hello, world:", "日本語"}
  230. r := NewReader(&StringReader{data: segments})
  231. got := ""
  232. want := strings.Join(segments, "")
  233. // Normal execution.
  234. for {
  235. r1, _, err := r.ReadRune()
  236. if err != nil {
  237. if err != io.EOF {
  238. t.Error("unexpected error on ReadRune:", err)
  239. }
  240. break
  241. }
  242. got += string(r1)
  243. // Put it back and read it again.
  244. if err = r.UnreadRune(); err != nil {
  245. t.Fatal("unexpected error on UnreadRune:", err)
  246. }
  247. r2, _, err := r.ReadRune()
  248. if err != nil {
  249. t.Fatal("unexpected error reading after unreading:", err)
  250. }
  251. if r1 != r2 {
  252. t.Fatalf("incorrect rune after unread: got %c, want %c", r1, r2)
  253. }
  254. }
  255. if got != want {
  256. t.Errorf("got %q, want %q", got, want)
  257. }
  258. }
  259. func TestNoUnreadRuneAfterPeek(t *testing.T) {
  260. br := NewReader(strings.NewReader("example"))
  261. br.ReadRune()
  262. br.Peek(1)
  263. if err := br.UnreadRune(); err == nil {
  264. t.Error("UnreadRune didn't fail after Peek")
  265. }
  266. }
  267. func TestNoUnreadByteAfterPeek(t *testing.T) {
  268. br := NewReader(strings.NewReader("example"))
  269. br.ReadByte()
  270. br.Peek(1)
  271. if err := br.UnreadByte(); err == nil {
  272. t.Error("UnreadByte didn't fail after Peek")
  273. }
  274. }
  275. func TestNoUnreadRuneAfterDiscard(t *testing.T) {
  276. br := NewReader(strings.NewReader("example"))
  277. br.ReadRune()
  278. br.Discard(1)
  279. if err := br.UnreadRune(); err == nil {
  280. t.Error("UnreadRune didn't fail after Discard")
  281. }
  282. }
  283. func TestNoUnreadByteAfterDiscard(t *testing.T) {
  284. br := NewReader(strings.NewReader("example"))
  285. br.ReadByte()
  286. br.Discard(1)
  287. if err := br.UnreadByte(); err == nil {
  288. t.Error("UnreadByte didn't fail after Discard")
  289. }
  290. }
  291. func TestNoUnreadRuneAfterWriteTo(t *testing.T) {
  292. br := NewReader(strings.NewReader("example"))
  293. br.WriteTo(io.Discard)
  294. if err := br.UnreadRune(); err == nil {
  295. t.Error("UnreadRune didn't fail after WriteTo")
  296. }
  297. }
  298. func TestNoUnreadByteAfterWriteTo(t *testing.T) {
  299. br := NewReader(strings.NewReader("example"))
  300. br.WriteTo(io.Discard)
  301. if err := br.UnreadByte(); err == nil {
  302. t.Error("UnreadByte didn't fail after WriteTo")
  303. }
  304. }
  305. func TestUnreadByte(t *testing.T) {
  306. segments := []string{"Hello, ", "world"}
  307. r := NewReader(&StringReader{data: segments})
  308. got := ""
  309. want := strings.Join(segments, "")
  310. // Normal execution.
  311. for {
  312. b1, err := r.ReadByte()
  313. if err != nil {
  314. if err != io.EOF {
  315. t.Error("unexpected error on ReadByte:", err)
  316. }
  317. break
  318. }
  319. got += string(b1)
  320. // Put it back and read it again.
  321. if err = r.UnreadByte(); err != nil {
  322. t.Fatal("unexpected error on UnreadByte:", err)
  323. }
  324. b2, err := r.ReadByte()
  325. if err != nil {
  326. t.Fatal("unexpected error reading after unreading:", err)
  327. }
  328. if b1 != b2 {
  329. t.Fatalf("incorrect byte after unread: got %q, want %q", b1, b2)
  330. }
  331. }
  332. if got != want {
  333. t.Errorf("got %q, want %q", got, want)
  334. }
  335. }
  336. func TestUnreadByteMultiple(t *testing.T) {
  337. segments := []string{"Hello, ", "world"}
  338. data := strings.Join(segments, "")
  339. for n := 0; n <= len(data); n++ {
  340. r := NewReader(&StringReader{data: segments})
  341. // Read n bytes.
  342. for i := 0; i < n; i++ {
  343. b, err := r.ReadByte()
  344. if err != nil {
  345. t.Fatalf("n = %d: unexpected error on ReadByte: %v", n, err)
  346. }
  347. if b != data[i] {
  348. t.Fatalf("n = %d: incorrect byte returned from ReadByte: got %q, want %q", n, b, data[i])
  349. }
  350. }
  351. // Unread one byte if there is one.
  352. if n > 0 {
  353. if err := r.UnreadByte(); err != nil {
  354. t.Errorf("n = %d: unexpected error on UnreadByte: %v", n, err)
  355. }
  356. }
  357. // Test that we cannot unread any further.
  358. if err := r.UnreadByte(); err == nil {
  359. t.Errorf("n = %d: expected error on UnreadByte", n)
  360. }
  361. }
  362. }
  363. func TestUnreadByteOthers(t *testing.T) {
  364. // A list of readers to use in conjunction with UnreadByte.
  365. var readers = []func(*Reader, byte) ([]byte, error){
  366. (*Reader).ReadBytes,
  367. (*Reader).ReadSlice,
  368. func(r *Reader, delim byte) ([]byte, error) {
  369. data, err := r.ReadString(delim)
  370. return []byte(data), err
  371. },
  372. // ReadLine doesn't fit the data/pattern easily
  373. // so we leave it out. It should be covered via
  374. // the ReadSlice test since ReadLine simply calls
  375. // ReadSlice, and it's that function that handles
  376. // the last byte.
  377. }
  378. // Try all readers with UnreadByte.
  379. for rno, read := range readers {
  380. // Some input data that is longer than the minimum reader buffer size.
  381. const n = 10
  382. var buf bytes.Buffer
  383. for i := 0; i < n; i++ {
  384. buf.WriteString("abcdefg")
  385. }
  386. r := NewReaderSize(&buf, minReadBufferSize)
  387. readTo := func(delim byte, want string) {
  388. data, err := read(r, delim)
  389. if err != nil {
  390. t.Fatalf("#%d: unexpected error reading to %c: %v", rno, delim, err)
  391. }
  392. if got := string(data); got != want {
  393. t.Fatalf("#%d: got %q, want %q", rno, got, want)
  394. }
  395. }
  396. // Read the data with occasional UnreadByte calls.
  397. for i := 0; i < n; i++ {
  398. readTo('d', "abcd")
  399. for j := 0; j < 3; j++ {
  400. if err := r.UnreadByte(); err != nil {
  401. t.Fatalf("#%d: unexpected error on UnreadByte: %v", rno, err)
  402. }
  403. readTo('d', "d")
  404. }
  405. readTo('g', "efg")
  406. }
  407. // All data should have been read.
  408. _, err := r.ReadByte()
  409. if err != io.EOF {
  410. t.Errorf("#%d: got error %v; want EOF", rno, err)
  411. }
  412. }
  413. }
  414. // Test that UnreadRune fails if the preceding operation was not a ReadRune.
  415. func TestUnreadRuneError(t *testing.T) {
  416. buf := make([]byte, 3) // All runes in this test are 3 bytes long
  417. r := NewReader(&StringReader{data: []string{"日本語日本語日本語"}})
  418. if r.UnreadRune() == nil {
  419. t.Error("expected error on UnreadRune from fresh buffer")
  420. }
  421. _, _, err := r.ReadRune()
  422. if err != nil {
  423. t.Error("unexpected error on ReadRune (1):", err)
  424. }
  425. if err = r.UnreadRune(); err != nil {
  426. t.Error("unexpected error on UnreadRune (1):", err)
  427. }
  428. if r.UnreadRune() == nil {
  429. t.Error("expected error after UnreadRune (1)")
  430. }
  431. // Test error after Read.
  432. _, _, err = r.ReadRune() // reset state
  433. if err != nil {
  434. t.Error("unexpected error on ReadRune (2):", err)
  435. }
  436. _, err = r.Read(buf)
  437. if err != nil {
  438. t.Error("unexpected error on Read (2):", err)
  439. }
  440. if r.UnreadRune() == nil {
  441. t.Error("expected error after Read (2)")
  442. }
  443. // Test error after ReadByte.
  444. _, _, err = r.ReadRune() // reset state
  445. if err != nil {
  446. t.Error("unexpected error on ReadRune (2):", err)
  447. }
  448. for range buf {
  449. _, err = r.ReadByte()
  450. if err != nil {
  451. t.Error("unexpected error on ReadByte (2):", err)
  452. }
  453. }
  454. if r.UnreadRune() == nil {
  455. t.Error("expected error after ReadByte")
  456. }
  457. // Test error after UnreadByte.
  458. _, _, err = r.ReadRune() // reset state
  459. if err != nil {
  460. t.Error("unexpected error on ReadRune (3):", err)
  461. }
  462. _, err = r.ReadByte()
  463. if err != nil {
  464. t.Error("unexpected error on ReadByte (3):", err)
  465. }
  466. err = r.UnreadByte()
  467. if err != nil {
  468. t.Error("unexpected error on UnreadByte (3):", err)
  469. }
  470. if r.UnreadRune() == nil {
  471. t.Error("expected error after UnreadByte (3)")
  472. }
  473. // Test error after ReadSlice.
  474. _, _, err = r.ReadRune() // reset state
  475. if err != nil {
  476. t.Error("unexpected error on ReadRune (4):", err)
  477. }
  478. _, err = r.ReadSlice(0)
  479. if err != io.EOF {
  480. t.Error("unexpected error on ReadSlice (4):", err)
  481. }
  482. if r.UnreadRune() == nil {
  483. t.Error("expected error after ReadSlice (4)")
  484. }
  485. }
  486. func TestUnreadRuneAtEOF(t *testing.T) {
  487. // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
  488. r := NewReader(strings.NewReader("x"))
  489. r.ReadRune()
  490. r.ReadRune()
  491. r.UnreadRune()
  492. _, _, err := r.ReadRune()
  493. if err == nil {
  494. t.Error("expected error at EOF")
  495. } else if err != io.EOF {
  496. t.Error("expected EOF; got", err)
  497. }
  498. }
  499. func TestReadWriteRune(t *testing.T) {
  500. const NRune = 1000
  501. byteBuf := new(bytes.Buffer)
  502. w := NewWriter(byteBuf)
  503. // Write the runes out using WriteRune
  504. buf := make([]byte, utf8.UTFMax)
  505. for r := rune(0); r < NRune; r++ {
  506. size := utf8.EncodeRune(buf, r)
  507. nbytes, err := w.WriteRune(r)
  508. if err != nil {
  509. t.Fatalf("WriteRune(0x%x) error: %s", r, err)
  510. }
  511. if nbytes != size {
  512. t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes)
  513. }
  514. }
  515. w.Flush()
  516. r := NewReader(byteBuf)
  517. // Read them back with ReadRune
  518. for r1 := rune(0); r1 < NRune; r1++ {
  519. size := utf8.EncodeRune(buf, r1)
  520. nr, nbytes, err := r.ReadRune()
  521. if nr != r1 || nbytes != size || err != nil {
  522. t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err)
  523. }
  524. }
  525. }
  526. func TestWriteInvalidRune(t *testing.T) {
  527. // Invalid runes, including negative ones, should be written as the
  528. // replacement character.
  529. for _, r := range []rune{-1, utf8.MaxRune + 1} {
  530. var buf bytes.Buffer
  531. w := NewWriter(&buf)
  532. w.WriteRune(r)
  533. w.Flush()
  534. if s := buf.String(); s != "\uFFFD" {
  535. t.Errorf("WriteRune(%d) wrote %q, not replacement character", r, s)
  536. }
  537. }
  538. }
  539. func TestReadStringAllocs(t *testing.T) {
  540. r := strings.NewReader(" foo foo 42 42 42 42 42 42 42 42 4.2 4.2 4.2 4.2\n")
  541. buf := NewReader(r)
  542. allocs := testing.AllocsPerRun(100, func() {
  543. r.Seek(0, io.SeekStart)
  544. buf.Reset(r)
  545. _, err := buf.ReadString('\n')
  546. if err != nil {
  547. t.Fatal(err)
  548. }
  549. })
  550. if allocs != 1 {
  551. t.Errorf("Unexpected number of allocations, got %f, want 1", allocs)
  552. }
  553. }
  554. func TestWriter(t *testing.T) {
  555. var data [8192]byte
  556. for i := 0; i < len(data); i++ {
  557. data[i] = byte(' ' + i%('~'-' '))
  558. }
  559. w := new(bytes.Buffer)
  560. for i := 0; i < len(bufsizes); i++ {
  561. for j := 0; j < len(bufsizes); j++ {
  562. nwrite := bufsizes[i]
  563. bs := bufsizes[j]
  564. // Write nwrite bytes using buffer size bs.
  565. // Check that the right amount makes it out
  566. // and that the data is correct.
  567. w.Reset()
  568. buf := NewWriterSize(w, bs)
  569. context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs)
  570. n, e1 := buf.Write(data[0:nwrite])
  571. if e1 != nil || n != nwrite {
  572. t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1)
  573. continue
  574. }
  575. if e := buf.Flush(); e != nil {
  576. t.Errorf("%s: buf.Flush = %v", context, e)
  577. }
  578. written := w.Bytes()
  579. if len(written) != nwrite {
  580. t.Errorf("%s: %d bytes written", context, len(written))
  581. }
  582. for l := 0; l < len(written); l++ {
  583. if written[l] != data[l] {
  584. t.Errorf("wrong bytes written")
  585. t.Errorf("want=%q", data[0:len(written)])
  586. t.Errorf("have=%q", written)
  587. }
  588. }
  589. }
  590. }
  591. }
  592. func TestWriterAppend(t *testing.T) {
  593. got := new(bytes.Buffer)
  594. var want []byte
  595. rn := rand.New(rand.NewSource(0))
  596. w := NewWriterSize(got, 64)
  597. for i := 0; i < 100; i++ {
  598. // Obtain a buffer to append to.
  599. b := w.AvailableBuffer()
  600. if w.Available() != cap(b) {
  601. t.Fatalf("Available() = %v, want %v", w.Available(), cap(b))
  602. }
  603. // While not recommended, it is valid to append to a shifted buffer.
  604. // This forces Write to copy the input.
  605. if rn.Intn(8) == 0 && cap(b) > 0 {
  606. b = b[1:1:cap(b)]
  607. }
  608. // Append a random integer of varying width.
  609. n := int64(rn.Intn(1 << rn.Intn(30)))
  610. want = append(strconv.AppendInt(want, n, 10), ' ')
  611. b = append(strconv.AppendInt(b, n, 10), ' ')
  612. w.Write(b)
  613. }
  614. w.Flush()
  615. if !bytes.Equal(got.Bytes(), want) {
  616. t.Errorf("output mismatch:\ngot %s\nwant %s", got.Bytes(), want)
  617. }
  618. }
  619. // Check that write errors are returned properly.
  620. type errorWriterTest struct {
  621. n, m int
  622. err error
  623. expect error
  624. }
  625. func (w errorWriterTest) Write(p []byte) (int, error) {
  626. return len(p) * w.n / w.m, w.err
  627. }
  628. var errorWriterTests = []errorWriterTest{
  629. {0, 1, nil, io.ErrShortWrite},
  630. {1, 2, nil, io.ErrShortWrite},
  631. {1, 1, nil, nil},
  632. {0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
  633. {1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
  634. {1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
  635. }
  636. func TestWriteErrors(t *testing.T) {
  637. for _, w := range errorWriterTests {
  638. buf := NewWriter(w)
  639. _, e := buf.Write([]byte("hello world"))
  640. if e != nil {
  641. t.Errorf("Write hello to %v: %v", w, e)
  642. continue
  643. }
  644. // Two flushes, to verify the error is sticky.
  645. for i := 0; i < 2; i++ {
  646. e = buf.Flush()
  647. if e != w.expect {
  648. t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect)
  649. }
  650. }
  651. }
  652. }
  653. func TestNewReaderSizeIdempotent(t *testing.T) {
  654. const BufSize = 1000
  655. b := NewReaderSize(strings.NewReader("hello world"), BufSize)
  656. // Does it recognize itself?
  657. b1 := NewReaderSize(b, BufSize)
  658. if b1 != b {
  659. t.Error("NewReaderSize did not detect underlying Reader")
  660. }
  661. // Does it wrap if existing buffer is too small?
  662. b2 := NewReaderSize(b, 2*BufSize)
  663. if b2 == b {
  664. t.Error("NewReaderSize did not enlarge buffer")
  665. }
  666. }
  667. func TestNewWriterSizeIdempotent(t *testing.T) {
  668. const BufSize = 1000
  669. b := NewWriterSize(new(bytes.Buffer), BufSize)
  670. // Does it recognize itself?
  671. b1 := NewWriterSize(b, BufSize)
  672. if b1 != b {
  673. t.Error("NewWriterSize did not detect underlying Writer")
  674. }
  675. // Does it wrap if existing buffer is too small?
  676. b2 := NewWriterSize(b, 2*BufSize)
  677. if b2 == b {
  678. t.Error("NewWriterSize did not enlarge buffer")
  679. }
  680. }
  681. func TestWriteString(t *testing.T) {
  682. const BufSize = 8
  683. buf := new(bytes.Buffer)
  684. b := NewWriterSize(buf, BufSize)
  685. b.WriteString("0") // easy
  686. b.WriteString("123456") // still easy
  687. b.WriteString("7890") // easy after flush
  688. b.WriteString("abcdefghijklmnopqrstuvwxy") // hard
  689. b.WriteString("z")
  690. if err := b.Flush(); err != nil {
  691. t.Error("WriteString", err)
  692. }
  693. s := "01234567890abcdefghijklmnopqrstuvwxyz"
  694. if string(buf.Bytes()) != s {
  695. t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
  696. }
  697. }
  698. func TestBufferFull(t *testing.T) {
  699. const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
  700. buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
  701. line, err := buf.ReadSlice('!')
  702. if string(line) != "And now, hello, " || err != ErrBufferFull {
  703. t.Errorf("first ReadSlice(,) = %q, %v", line, err)
  704. }
  705. line, err = buf.ReadSlice('!')
  706. if string(line) != "world!" || err != nil {
  707. t.Errorf("second ReadSlice(,) = %q, %v", line, err)
  708. }
  709. }
  710. func TestPeek(t *testing.T) {
  711. p := make([]byte, 10)
  712. // string is 16 (minReadBufferSize) long.
  713. buf := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize)
  714. if s, err := buf.Peek(1); string(s) != "a" || err != nil {
  715. t.Fatalf("want %q got %q, err=%v", "a", string(s), err)
  716. }
  717. if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
  718. t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err)
  719. }
  720. if _, err := buf.Peek(-1); err != ErrNegativeCount {
  721. t.Fatalf("want ErrNegativeCount got %v", err)
  722. }
  723. if s, err := buf.Peek(32); string(s) != "abcdefghijklmnop" || err != ErrBufferFull {
  724. t.Fatalf("want %q, ErrBufFull got %q, err=%v", "abcdefghijklmnop", string(s), err)
  725. }
  726. if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
  727. t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)
  728. }
  729. if s, err := buf.Peek(1); string(s) != "d" || err != nil {
  730. t.Fatalf("want %q got %q, err=%v", "d", string(s), err)
  731. }
  732. if s, err := buf.Peek(2); string(s) != "de" || err != nil {
  733. t.Fatalf("want %q got %q, err=%v", "de", string(s), err)
  734. }
  735. if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil {
  736. t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err)
  737. }
  738. if s, err := buf.Peek(4); string(s) != "ghij" || err != nil {
  739. t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err)
  740. }
  741. if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil {
  742. t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err)
  743. }
  744. if s, err := buf.Peek(0); string(s) != "" || err != nil {
  745. t.Fatalf("want %q got %q, err=%v", "", string(s), err)
  746. }
  747. if _, err := buf.Peek(1); err != io.EOF {
  748. t.Fatalf("want EOF got %v", err)
  749. }
  750. // Test for issue 3022, not exposing a reader's error on a successful Peek.
  751. buf = NewReaderSize(dataAndEOFReader("abcd"), 32)
  752. if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
  753. t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
  754. }
  755. if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
  756. t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
  757. }
  758. if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
  759. t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
  760. }
  761. if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
  762. t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
  763. }
  764. }
  765. type dataAndEOFReader string
  766. func (r dataAndEOFReader) Read(p []byte) (int, error) {
  767. return copy(p, r), io.EOF
  768. }
  769. func TestPeekThenUnreadRune(t *testing.T) {
  770. // This sequence used to cause a crash.
  771. r := NewReader(strings.NewReader("x"))
  772. r.ReadRune()
  773. r.Peek(1)
  774. r.UnreadRune()
  775. r.ReadRune() // Used to panic here
  776. }
  777. var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy")
  778. var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy")
  779. var testInputrn = []byte("012\r\n345\r\n678\r\n9ab\r\ncde\r\nfgh\r\nijk\r\nlmn\r\nopq\r\nrst\r\nuvw\r\nxy\r\n\n\r\n")
  780. // TestReader wraps a []byte and returns reads of a specific length.
  781. type testReader struct {
  782. data []byte
  783. stride int
  784. }
  785. func (t *testReader) Read(buf []byte) (n int, err error) {
  786. n = t.stride
  787. if n > len(t.data) {
  788. n = len(t.data)
  789. }
  790. if n > len(buf) {
  791. n = len(buf)
  792. }
  793. copy(buf, t.data)
  794. t.data = t.data[n:]
  795. if len(t.data) == 0 {
  796. err = io.EOF
  797. }
  798. return
  799. }
  800. func testReadLine(t *testing.T, input []byte) {
  801. //for stride := 1; stride < len(input); stride++ {
  802. for stride := 1; stride < 2; stride++ {
  803. done := 0
  804. reader := testReader{input, stride}
  805. l := NewReaderSize(&reader, len(input)+1)
  806. for {
  807. line, isPrefix, err := l.ReadLine()
  808. if len(line) > 0 && err != nil {
  809. t.Errorf("ReadLine returned both data and error: %s", err)
  810. }
  811. if isPrefix {
  812. t.Errorf("ReadLine returned prefix")
  813. }
  814. if err != nil {
  815. if err != io.EOF {
  816. t.Fatalf("Got unknown error: %s", err)
  817. }
  818. break
  819. }
  820. if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) {
  821. t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line)
  822. }
  823. done += len(line)
  824. }
  825. if done != len(testOutput) {
  826. t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride)
  827. }
  828. }
  829. }
  830. func TestReadLine(t *testing.T) {
  831. testReadLine(t, testInput)
  832. testReadLine(t, testInputrn)
  833. }
  834. func TestLineTooLong(t *testing.T) {
  835. data := make([]byte, 0)
  836. for i := 0; i < minReadBufferSize*5/2; i++ {
  837. data = append(data, '0'+byte(i%10))
  838. }
  839. buf := bytes.NewReader(data)
  840. l := NewReaderSize(buf, minReadBufferSize)
  841. line, isPrefix, err := l.ReadLine()
  842. if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
  843. t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err)
  844. }
  845. data = data[len(line):]
  846. line, isPrefix, err = l.ReadLine()
  847. if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
  848. t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err)
  849. }
  850. data = data[len(line):]
  851. line, isPrefix, err = l.ReadLine()
  852. if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil {
  853. t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err)
  854. }
  855. line, isPrefix, err = l.ReadLine()
  856. if isPrefix || err == nil {
  857. t.Errorf("expected no more lines: %x %s", line, err)
  858. }
  859. }
  860. func TestReadAfterLines(t *testing.T) {
  861. line1 := "this is line1"
  862. restData := "this is line2\nthis is line 3\n"
  863. inbuf := bytes.NewReader([]byte(line1 + "\n" + restData))
  864. outbuf := new(bytes.Buffer)
  865. maxLineLength := len(line1) + len(restData)/2
  866. l := NewReaderSize(inbuf, maxLineLength)
  867. line, isPrefix, err := l.ReadLine()
  868. if isPrefix || err != nil || string(line) != line1 {
  869. t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line))
  870. }
  871. n, err := io.Copy(outbuf, l)
  872. if int(n) != len(restData) || err != nil {
  873. t.Errorf("bad result for Read: n=%d err=%v", n, err)
  874. }
  875. if outbuf.String() != restData {
  876. t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData)
  877. }
  878. }
  879. func TestReadEmptyBuffer(t *testing.T) {
  880. l := NewReaderSize(new(bytes.Buffer), minReadBufferSize)
  881. line, isPrefix, err := l.ReadLine()
  882. if err != io.EOF {
  883. t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
  884. }
  885. }
  886. func TestLinesAfterRead(t *testing.T) {
  887. l := NewReaderSize(bytes.NewReader([]byte("foo")), minReadBufferSize)
  888. _, err := io.ReadAll(l)
  889. if err != nil {
  890. t.Error(err)
  891. return
  892. }
  893. line, isPrefix, err := l.ReadLine()
  894. if err != io.EOF {
  895. t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
  896. }
  897. }
  898. func TestReadLineNonNilLineOrError(t *testing.T) {
  899. r := NewReader(strings.NewReader("line 1\n"))
  900. for i := 0; i < 2; i++ {
  901. l, _, err := r.ReadLine()
  902. if l != nil && err != nil {
  903. t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both",
  904. i+1, l, err)
  905. }
  906. }
  907. }
  908. type readLineResult struct {
  909. line []byte
  910. isPrefix bool
  911. err error
  912. }
  913. var readLineNewlinesTests = []struct {
  914. input string
  915. expect []readLineResult
  916. }{
  917. {"012345678901234\r\n012345678901234\r\n", []readLineResult{
  918. {[]byte("012345678901234"), true, nil},
  919. {nil, false, nil},
  920. {[]byte("012345678901234"), true, nil},
  921. {nil, false, nil},
  922. {nil, false, io.EOF},
  923. }},
  924. {"0123456789012345\r012345678901234\r", []readLineResult{
  925. {[]byte("0123456789012345"), true, nil},
  926. {[]byte("\r012345678901234"), true, nil},
  927. {[]byte("\r"), false, nil},
  928. {nil, false, io.EOF},
  929. }},
  930. }
  931. func TestReadLineNewlines(t *testing.T) {
  932. for _, e := range readLineNewlinesTests {
  933. testReadLineNewlines(t, e.input, e.expect)
  934. }
  935. }
  936. func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) {
  937. b := NewReaderSize(strings.NewReader(input), minReadBufferSize)
  938. for i, e := range expect {
  939. line, isPrefix, err := b.ReadLine()
  940. if !bytes.Equal(line, e.line) {
  941. t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line)
  942. return
  943. }
  944. if isPrefix != e.isPrefix {
  945. t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix)
  946. return
  947. }
  948. if err != e.err {
  949. t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err)
  950. return
  951. }
  952. }
  953. }
  954. func createTestInput(n int) []byte {
  955. input := make([]byte, n)
  956. for i := range input {
  957. // 101 and 251 are arbitrary prime numbers.
  958. // The idea is to create an input sequence
  959. // which doesn't repeat too frequently.
  960. input[i] = byte(i % 251)
  961. if i%101 == 0 {
  962. input[i] ^= byte(i / 101)
  963. }
  964. }
  965. return input
  966. }
  967. func TestReaderWriteTo(t *testing.T) {
  968. input := createTestInput(8192)
  969. r := NewReader(onlyReader{bytes.NewReader(input)})
  970. w := new(bytes.Buffer)
  971. if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) {
  972. t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input))
  973. }
  974. for i, val := range w.Bytes() {
  975. if val != input[i] {
  976. t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i])
  977. }
  978. }
  979. }
  980. type errorWriterToTest struct {
  981. rn, wn int
  982. rerr, werr error
  983. expected error
  984. }
  985. func (r errorWriterToTest) Read(p []byte) (int, error) {
  986. return len(p) * r.rn, r.rerr
  987. }
  988. func (w errorWriterToTest) Write(p []byte) (int, error) {
  989. return len(p) * w.wn, w.werr
  990. }
  991. var errorWriterToTests = []errorWriterToTest{
  992. {1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe},
  993. {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
  994. {0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe},
  995. {0, 1, io.EOF, nil, nil},
  996. }
  997. func TestReaderWriteToErrors(t *testing.T) {
  998. for i, rw := range errorWriterToTests {
  999. r := NewReader(rw)
  1000. if _, err := r.WriteTo(rw); err != rw.expected {
  1001. t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
  1002. }
  1003. }
  1004. }
  1005. func TestWriterReadFrom(t *testing.T) {
  1006. ws := []func(io.Writer) io.Writer{
  1007. func(w io.Writer) io.Writer { return onlyWriter{w} },
  1008. func(w io.Writer) io.Writer { return w },
  1009. }
  1010. rs := []func(io.Reader) io.Reader{
  1011. iotest.DataErrReader,
  1012. func(r io.Reader) io.Reader { return r },
  1013. }
  1014. for ri, rfunc := range rs {
  1015. for wi, wfunc := range ws {
  1016. input := createTestInput(8192)
  1017. b := new(bytes.Buffer)
  1018. w := NewWriter(wfunc(b))
  1019. r := rfunc(bytes.NewReader(input))
  1020. if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) {
  1021. t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input))
  1022. continue
  1023. }
  1024. if err := w.Flush(); err != nil {
  1025. t.Errorf("Flush returned %v", err)
  1026. continue
  1027. }
  1028. if got, want := b.String(), string(input); got != want {
  1029. t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n", wi, ri, got, want)
  1030. }
  1031. }
  1032. }
  1033. }
  1034. type errorReaderFromTest struct {
  1035. rn, wn int
  1036. rerr, werr error
  1037. expected error
  1038. }
  1039. func (r errorReaderFromTest) Read(p []byte) (int, error) {
  1040. return len(p) * r.rn, r.rerr
  1041. }
  1042. func (w errorReaderFromTest) Write(p []byte) (int, error) {
  1043. return len(p) * w.wn, w.werr
  1044. }
  1045. var errorReaderFromTests = []errorReaderFromTest{
  1046. {0, 1, io.EOF, nil, nil},
  1047. {1, 1, io.EOF, nil, nil},
  1048. {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
  1049. {0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe},
  1050. {1, 0, nil, io.ErrShortWrite, io.ErrShortWrite},
  1051. }
  1052. func TestWriterReadFromErrors(t *testing.T) {
  1053. for i, rw := range errorReaderFromTests {
  1054. w := NewWriter(rw)
  1055. if _, err := w.ReadFrom(rw); err != rw.expected {
  1056. t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
  1057. }
  1058. }
  1059. }
  1060. // TestWriterReadFromCounts tests that using io.Copy to copy into a
  1061. // bufio.Writer does not prematurely flush the buffer. For example, when
  1062. // buffering writes to a network socket, excessive network writes should be
  1063. // avoided.
  1064. func TestWriterReadFromCounts(t *testing.T) {
  1065. var w0 writeCountingDiscard
  1066. b0 := NewWriterSize(&w0, 1234)
  1067. b0.WriteString(strings.Repeat("x", 1000))
  1068. if w0 != 0 {
  1069. t.Fatalf("write 1000 'x's: got %d writes, want 0", w0)
  1070. }
  1071. b0.WriteString(strings.Repeat("x", 200))
  1072. if w0 != 0 {
  1073. t.Fatalf("write 1200 'x's: got %d writes, want 0", w0)
  1074. }
  1075. io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))})
  1076. if w0 != 0 {
  1077. t.Fatalf("write 1230 'x's: got %d writes, want 0", w0)
  1078. }
  1079. io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))})
  1080. if w0 != 1 {
  1081. t.Fatalf("write 1239 'x's: got %d writes, want 1", w0)
  1082. }
  1083. var w1 writeCountingDiscard
  1084. b1 := NewWriterSize(&w1, 1234)
  1085. b1.WriteString(strings.Repeat("x", 1200))
  1086. b1.Flush()
  1087. if w1 != 1 {
  1088. t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1)
  1089. }
  1090. b1.WriteString(strings.Repeat("x", 89))
  1091. if w1 != 1 {
  1092. t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1)
  1093. }
  1094. io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))})
  1095. if w1 != 1 {
  1096. t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1)
  1097. }
  1098. io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))})
  1099. if w1 != 2 {
  1100. t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1)
  1101. }
  1102. b1.Flush()
  1103. if w1 != 3 {
  1104. t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1)
  1105. }
  1106. }
  1107. // A writeCountingDiscard is like io.Discard and counts the number of times
  1108. // Write is called on it.
  1109. type writeCountingDiscard int
  1110. func (w *writeCountingDiscard) Write(p []byte) (int, error) {
  1111. *w++
  1112. return len(p), nil
  1113. }
  1114. type negativeReader int
  1115. func (r *negativeReader) Read([]byte) (int, error) { return -1, nil }
  1116. func TestNegativeRead(t *testing.T) {
  1117. // should panic with a description pointing at the reader, not at itself.
  1118. // (should NOT panic with slice index error, for example.)
  1119. b := NewReader(new(negativeReader))
  1120. defer func() {
  1121. switch err := recover().(type) {
  1122. case nil:
  1123. t.Fatal("read did not panic")
  1124. case error:
  1125. if !strings.Contains(err.Error(), "reader returned negative count from Read") {
  1126. t.Fatalf("wrong panic: %v", err)
  1127. }
  1128. default:
  1129. t.Fatalf("unexpected panic value: %T(%v)", err, err)
  1130. }
  1131. }()
  1132. b.Read(make([]byte, 100))
  1133. }
  1134. var errFake = errors.New("fake error")
  1135. type errorThenGoodReader struct {
  1136. didErr bool
  1137. nread int
  1138. }
  1139. func (r *errorThenGoodReader) Read(p []byte) (int, error) {
  1140. r.nread++
  1141. if !r.didErr {
  1142. r.didErr = true
  1143. return 0, errFake
  1144. }
  1145. return len(p), nil
  1146. }
  1147. func TestReaderClearError(t *testing.T) {
  1148. r := &errorThenGoodReader{}
  1149. b := NewReader(r)
  1150. buf := make([]byte, 1)
  1151. if _, err := b.Read(nil); err != nil {
  1152. t.Fatalf("1st nil Read = %v; want nil", err)
  1153. }
  1154. if _, err := b.Read(buf); err != errFake {
  1155. t.Fatalf("1st Read = %v; want errFake", err)
  1156. }
  1157. if _, err := b.Read(nil); err != nil {
  1158. t.Fatalf("2nd nil Read = %v; want nil", err)
  1159. }
  1160. if _, err := b.Read(buf); err != nil {
  1161. t.Fatalf("3rd Read with buffer = %v; want nil", err)
  1162. }
  1163. if r.nread != 2 {
  1164. t.Errorf("num reads = %d; want 2", r.nread)
  1165. }
  1166. }
  1167. // Test for golang.org/issue/5947
  1168. func TestWriterReadFromWhileFull(t *testing.T) {
  1169. buf := new(bytes.Buffer)
  1170. w := NewWriterSize(buf, 10)
  1171. // Fill buffer exactly.
  1172. n, err := w.Write([]byte("0123456789"))
  1173. if n != 10 || err != nil {
  1174. t.Fatalf("Write returned (%v, %v), want (10, nil)", n, err)
  1175. }
  1176. // Use ReadFrom to read in some data.
  1177. n2, err := w.ReadFrom(strings.NewReader("abcdef"))
  1178. if n2 != 6 || err != nil {
  1179. t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)", n2, err)
  1180. }
  1181. }
  1182. type emptyThenNonEmptyReader struct {
  1183. r io.Reader
  1184. n int
  1185. }
  1186. func (r *emptyThenNonEmptyReader) Read(p []byte) (int, error) {
  1187. if r.n <= 0 {
  1188. return r.r.Read(p)
  1189. }
  1190. r.n--
  1191. return 0, nil
  1192. }
  1193. // Test for golang.org/issue/7611
  1194. func TestWriterReadFromUntilEOF(t *testing.T) {
  1195. buf := new(bytes.Buffer)
  1196. w := NewWriterSize(buf, 5)
  1197. // Partially fill buffer
  1198. n, err := w.Write([]byte("0123"))
  1199. if n != 4 || err != nil {
  1200. t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
  1201. }
  1202. // Use ReadFrom to read in some data.
  1203. r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 3}
  1204. n2, err := w.ReadFrom(r)
  1205. if n2 != 4 || err != nil {
  1206. t.Fatalf("ReadFrom returned (%v, %v), want (4, nil)", n2, err)
  1207. }
  1208. w.Flush()
  1209. if got, want := string(buf.Bytes()), "0123abcd"; got != want {
  1210. t.Fatalf("buf.Bytes() returned %q, want %q", got, want)
  1211. }
  1212. }
  1213. func TestWriterReadFromErrNoProgress(t *testing.T) {
  1214. buf := new(bytes.Buffer)
  1215. w := NewWriterSize(buf, 5)
  1216. // Partially fill buffer
  1217. n, err := w.Write([]byte("0123"))
  1218. if n != 4 || err != nil {
  1219. t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
  1220. }
  1221. // Use ReadFrom to read in some data.
  1222. r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 100}
  1223. n2, err := w.ReadFrom(r)
  1224. if n2 != 0 || err != io.ErrNoProgress {
  1225. t.Fatalf("buf.Bytes() returned (%v, %v), want (0, io.ErrNoProgress)", n2, err)
  1226. }
  1227. }
  1228. type readFromWriter struct {
  1229. buf []byte
  1230. writeBytes int
  1231. readFromBytes int
  1232. }
  1233. func (w *readFromWriter) Write(p []byte) (int, error) {
  1234. w.buf = append(w.buf, p...)
  1235. w.writeBytes += len(p)
  1236. return len(p), nil
  1237. }
  1238. func (w *readFromWriter) ReadFrom(r io.Reader) (int64, error) {
  1239. b, err := io.ReadAll(r)
  1240. w.buf = append(w.buf, b...)
  1241. w.readFromBytes += len(b)
  1242. return int64(len(b)), err
  1243. }
  1244. // Test that calling (*Writer).ReadFrom with a partially-filled buffer
  1245. // fills the buffer before switching over to ReadFrom.
  1246. func TestWriterReadFromWithBufferedData(t *testing.T) {
  1247. const bufsize = 16
  1248. input := createTestInput(64)
  1249. rfw := &readFromWriter{}
  1250. w := NewWriterSize(rfw, bufsize)
  1251. const writeSize = 8
  1252. if n, err := w.Write(input[:writeSize]); n != writeSize || err != nil {
  1253. t.Errorf("w.Write(%v bytes) = %v, %v; want %v, nil", writeSize, n, err, writeSize)
  1254. }
  1255. n, err := w.ReadFrom(bytes.NewReader(input[writeSize:]))
  1256. if wantn := len(input[writeSize:]); int(n) != wantn || err != nil {
  1257. t.Errorf("io.Copy(w, %v bytes) = %v, %v; want %v, nil", wantn, n, err, wantn)
  1258. }
  1259. if err := w.Flush(); err != nil {
  1260. t.Errorf("w.Flush() = %v, want nil", err)
  1261. }
  1262. if got, want := rfw.writeBytes, bufsize; got != want {
  1263. t.Errorf("wrote %v bytes with Write, want %v", got, want)
  1264. }
  1265. if got, want := rfw.readFromBytes, len(input)-bufsize; got != want {
  1266. t.Errorf("wrote %v bytes with ReadFrom, want %v", got, want)
  1267. }
  1268. }
  1269. func TestReadZero(t *testing.T) {
  1270. for _, size := range []int{100, 2} {
  1271. t.Run(fmt.Sprintf("bufsize=%d", size), func(t *testing.T) {
  1272. r := io.MultiReader(strings.NewReader("abc"), &emptyThenNonEmptyReader{r: strings.NewReader("def"), n: 1})
  1273. br := NewReaderSize(r, size)
  1274. want := func(s string, wantErr error) {
  1275. p := make([]byte, 50)
  1276. n, err := br.Read(p)
  1277. if err != wantErr || n != len(s) || string(p[:n]) != s {
  1278. t.Fatalf("read(%d) = %q, %v, want %q, %v", len(p), string(p[:n]), err, s, wantErr)
  1279. }
  1280. t.Logf("read(%d) = %q, %v", len(p), string(p[:n]), err)
  1281. }
  1282. want("abc", nil)
  1283. want("", nil)
  1284. want("def", nil)
  1285. want("", io.EOF)
  1286. })
  1287. }
  1288. }
  1289. func TestReaderReset(t *testing.T) {
  1290. r := NewReader(strings.NewReader("foo foo"))
  1291. buf := make([]byte, 3)
  1292. r.Read(buf)
  1293. if string(buf) != "foo" {
  1294. t.Errorf("buf = %q; want foo", buf)
  1295. }
  1296. r.Reset(strings.NewReader("bar bar"))
  1297. all, err := io.ReadAll(r)
  1298. if err != nil {
  1299. t.Fatal(err)
  1300. }
  1301. if string(all) != "bar bar" {
  1302. t.Errorf("ReadAll = %q; want bar bar", all)
  1303. }
  1304. *r = Reader{} // zero out the Reader
  1305. r.Reset(strings.NewReader("bar bar"))
  1306. all, err = io.ReadAll(r)
  1307. if err != nil {
  1308. t.Fatal(err)
  1309. }
  1310. if string(all) != "bar bar" {
  1311. t.Errorf("ReadAll = %q; want bar bar", all)
  1312. }
  1313. }
  1314. func TestWriterReset(t *testing.T) {
  1315. var buf1, buf2, buf3 bytes.Buffer
  1316. w := NewWriter(&buf1)
  1317. w.WriteString("foo")
  1318. w.Reset(&buf2) // and not flushed
  1319. w.WriteString("bar")
  1320. w.Flush()
  1321. if buf1.String() != "" {
  1322. t.Errorf("buf1 = %q; want empty", buf1.String())
  1323. }
  1324. if buf2.String() != "bar" {
  1325. t.Errorf("buf2 = %q; want bar", buf2.String())
  1326. }
  1327. *w = Writer{} // zero out the Writer
  1328. w.Reset(&buf3) // and not flushed
  1329. w.WriteString("bar")
  1330. w.Flush()
  1331. if buf1.String() != "" {
  1332. t.Errorf("buf1 = %q; want empty", buf1.String())
  1333. }
  1334. if buf3.String() != "bar" {
  1335. t.Errorf("buf3 = %q; want bar", buf3.String())
  1336. }
  1337. }
  1338. func TestReaderDiscard(t *testing.T) {
  1339. tests := []struct {
  1340. name string
  1341. r io.Reader
  1342. bufSize int // 0 means 16
  1343. peekSize int
  1344. n int // input to Discard
  1345. want int // from Discard
  1346. wantErr error // from Discard
  1347. wantBuffered int
  1348. }{
  1349. {
  1350. name: "normal case",
  1351. r: strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
  1352. peekSize: 16,
  1353. n: 6,
  1354. want: 6,
  1355. wantBuffered: 10,
  1356. },
  1357. {
  1358. name: "discard causing read",
  1359. r: strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
  1360. n: 6,
  1361. want: 6,
  1362. wantBuffered: 10,
  1363. },
  1364. {
  1365. name: "discard all without peek",
  1366. r: strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
  1367. n: 26,
  1368. want: 26,
  1369. wantBuffered: 0,
  1370. },
  1371. {
  1372. name: "discard more than end",
  1373. r: strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
  1374. n: 27,
  1375. want: 26,
  1376. wantErr: io.EOF,
  1377. wantBuffered: 0,
  1378. },
  1379. // Any error from filling shouldn't show up until we
  1380. // get past the valid bytes. Here we return 5 valid bytes at the same time
  1381. // as an error, but test that we don't see the error from Discard.
  1382. {
  1383. name: "fill error, discard less",
  1384. r: newScriptedReader(func(p []byte) (n int, err error) {
  1385. if len(p) < 5 {
  1386. panic("unexpected small read")
  1387. }
  1388. return 5, errors.New("5-then-error")
  1389. }),
  1390. n: 4,
  1391. want: 4,
  1392. wantErr: nil,
  1393. wantBuffered: 1,
  1394. },
  1395. {
  1396. name: "fill error, discard equal",
  1397. r: newScriptedReader(func(p []byte) (n int, err error) {
  1398. if len(p) < 5 {
  1399. panic("unexpected small read")
  1400. }
  1401. return 5, errors.New("5-then-error")
  1402. }),
  1403. n: 5,
  1404. want: 5,
  1405. wantErr: nil,
  1406. wantBuffered: 0,
  1407. },
  1408. {
  1409. name: "fill error, discard more",
  1410. r: newScriptedReader(func(p []byte) (n int, err error) {
  1411. if len(p) < 5 {
  1412. panic("unexpected small read")
  1413. }
  1414. return 5, errors.New("5-then-error")
  1415. }),
  1416. n: 6,
  1417. want: 5,
  1418. wantErr: errors.New("5-then-error"),
  1419. wantBuffered: 0,
  1420. },
  1421. // Discard of 0 shouldn't cause a read:
  1422. {
  1423. name: "discard zero",
  1424. r: newScriptedReader(), // will panic on Read
  1425. n: 0,
  1426. want: 0,
  1427. wantErr: nil,
  1428. wantBuffered: 0,
  1429. },
  1430. {
  1431. name: "discard negative",
  1432. r: newScriptedReader(), // will panic on Read
  1433. n: -1,
  1434. want: 0,
  1435. wantErr: ErrNegativeCount,
  1436. wantBuffered: 0,
  1437. },
  1438. }
  1439. for _, tt := range tests {
  1440. br := NewReaderSize(tt.r, tt.bufSize)
  1441. if tt.peekSize > 0 {
  1442. peekBuf, err := br.Peek(tt.peekSize)
  1443. if err != nil {
  1444. t.Errorf("%s: Peek(%d): %v", tt.name, tt.peekSize, err)
  1445. continue
  1446. }
  1447. if len(peekBuf) != tt.peekSize {
  1448. t.Errorf("%s: len(Peek(%d)) = %v; want %v", tt.name, tt.peekSize, len(peekBuf), tt.peekSize)
  1449. continue
  1450. }
  1451. }
  1452. discarded, err := br.Discard(tt.n)
  1453. if ge, we := fmt.Sprint(err), fmt.Sprint(tt.wantErr); discarded != tt.want || ge != we {
  1454. t.Errorf("%s: Discard(%d) = (%v, %v); want (%v, %v)", tt.name, tt.n, discarded, ge, tt.want, we)
  1455. continue
  1456. }
  1457. if bn := br.Buffered(); bn != tt.wantBuffered {
  1458. t.Errorf("%s: after Discard, Buffered = %d; want %d", tt.name, bn, tt.wantBuffered)
  1459. }
  1460. }
  1461. }
  1462. func TestReaderSize(t *testing.T) {
  1463. if got, want := NewReader(nil).Size(), DefaultBufSize; got != want {
  1464. t.Errorf("NewReader's Reader.Size = %d; want %d", got, want)
  1465. }
  1466. if got, want := NewReaderSize(nil, 1234).Size(), 1234; got != want {
  1467. t.Errorf("NewReaderSize's Reader.Size = %d; want %d", got, want)
  1468. }
  1469. }
  1470. func TestWriterSize(t *testing.T) {
  1471. if got, want := NewWriter(nil).Size(), DefaultBufSize; got != want {
  1472. t.Errorf("NewWriter's Writer.Size = %d; want %d", got, want)
  1473. }
  1474. if got, want := NewWriterSize(nil, 1234).Size(), 1234; got != want {
  1475. t.Errorf("NewWriterSize's Writer.Size = %d; want %d", got, want)
  1476. }
  1477. }
  1478. // An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
  1479. type onlyReader struct {
  1480. io.Reader
  1481. }
  1482. // An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have.
  1483. type onlyWriter struct {
  1484. io.Writer
  1485. }
  1486. // A scriptedReader is an io.Reader that executes its steps sequentially.
  1487. type scriptedReader []func(p []byte) (n int, err error)
  1488. func (sr *scriptedReader) Read(p []byte) (n int, err error) {
  1489. if len(*sr) == 0 {
  1490. panic("too many Read calls on scripted Reader. No steps remain.")
  1491. }
  1492. step := (*sr)[0]
  1493. *sr = (*sr)[1:]
  1494. return step(p)
  1495. }
  1496. func newScriptedReader(steps ...func(p []byte) (n int, err error)) io.Reader {
  1497. sr := scriptedReader(steps)
  1498. return &sr
  1499. }
  1500. // eofReader returns the number of bytes read and io.EOF for the read that consumes the last of the content.
  1501. type eofReader struct {
  1502. buf []byte
  1503. }
  1504. func (r *eofReader) Read(p []byte) (int, error) {
  1505. read := copy(p, r.buf)
  1506. r.buf = r.buf[read:]
  1507. switch read {
  1508. case 0, len(r.buf):
  1509. // As allowed in the documentation, this will return io.EOF
  1510. // in the same call that consumes the last of the data.
  1511. // https://godoc.org/io#Reader
  1512. return read, io.EOF
  1513. }
  1514. return read, nil
  1515. }
  1516. func TestPartialReadEOF(t *testing.T) {
  1517. src := make([]byte, 10)
  1518. eofR := &eofReader{buf: src}
  1519. r := NewReader(eofR)
  1520. // Start by reading 5 of the 10 available bytes.
  1521. dest := make([]byte, 5)
  1522. read, err := r.Read(dest)
  1523. if err != nil {
  1524. t.Fatalf("unexpected error: %v", err)
  1525. }
  1526. if n := len(dest); read != n {
  1527. t.Fatalf("read %d bytes; wanted %d bytes", read, n)
  1528. }
  1529. // The Reader should have buffered all the content from the io.Reader.
  1530. if n := len(eofR.buf); n != 0 {
  1531. t.Fatalf("got %d bytes left in bufio.Reader source; want 0 bytes", n)
  1532. }
  1533. // To prove the point, check that there are still 5 bytes available to read.
  1534. if n := r.Buffered(); n != 5 {
  1535. t.Fatalf("got %d bytes buffered in bufio.Reader; want 5 bytes", n)
  1536. }
  1537. // This is the second read of 0 bytes.
  1538. read, err = r.Read([]byte{})
  1539. if err != nil {
  1540. t.Fatalf("unexpected error: %v", err)
  1541. }
  1542. if read != 0 {
  1543. t.Fatalf("read %d bytes; want 0 bytes", read)
  1544. }
  1545. }
  1546. type writerWithReadFromError struct{}
  1547. func (w writerWithReadFromError) ReadFrom(r io.Reader) (int64, error) {
  1548. return 0, errors.New("writerWithReadFromError error")
  1549. }
  1550. func (w writerWithReadFromError) Write(b []byte) (n int, err error) {
  1551. return 10, nil
  1552. }
  1553. func TestWriterReadFromMustSetUnderlyingError(t *testing.T) {
  1554. var wr = NewWriter(writerWithReadFromError{})
  1555. if _, err := wr.ReadFrom(strings.NewReader("test2")); err == nil {
  1556. t.Fatal("expected ReadFrom returns error, got nil")
  1557. }
  1558. if _, err := wr.Write([]byte("123")); err == nil {
  1559. t.Fatal("expected Write returns error, got nil")
  1560. }
  1561. }
  1562. type writeErrorOnlyWriter struct{}
  1563. func (w writeErrorOnlyWriter) Write(p []byte) (n int, err error) {
  1564. return 0, errors.New("writeErrorOnlyWriter error")
  1565. }
  1566. // Ensure that previous Write errors are immediately returned
  1567. // on any ReadFrom. See golang.org/issue/35194.
  1568. func TestWriterReadFromMustReturnUnderlyingError(t *testing.T) {
  1569. var wr = NewWriter(writeErrorOnlyWriter{})
  1570. s := "test1"
  1571. wantBuffered := len(s)
  1572. if _, err := wr.WriteString(s); err != nil {
  1573. t.Fatalf("unexpected error: %v", err)
  1574. }
  1575. if err := wr.Flush(); err == nil {
  1576. t.Error("expected flush error, got nil")
  1577. }
  1578. if _, err := wr.ReadFrom(strings.NewReader("test2")); err == nil {
  1579. t.Fatal("expected error, got nil")
  1580. }
  1581. if buffered := wr.Buffered(); buffered != wantBuffered {
  1582. t.Fatalf("Buffered = %v; want %v", buffered, wantBuffered)
  1583. }
  1584. }
  1585. func BenchmarkReaderCopyOptimal(b *testing.B) {
  1586. // Optimal case is where the underlying reader implements io.WriterTo
  1587. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1588. src := NewReader(srcBuf)
  1589. dstBuf := new(bytes.Buffer)
  1590. dst := onlyWriter{dstBuf}
  1591. for i := 0; i < b.N; i++ {
  1592. srcBuf.Reset()
  1593. src.Reset(srcBuf)
  1594. dstBuf.Reset()
  1595. io.Copy(dst, src)
  1596. }
  1597. }
  1598. func BenchmarkReaderCopyUnoptimal(b *testing.B) {
  1599. // Unoptimal case is where the underlying reader doesn't implement io.WriterTo
  1600. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1601. src := NewReader(onlyReader{srcBuf})
  1602. dstBuf := new(bytes.Buffer)
  1603. dst := onlyWriter{dstBuf}
  1604. for i := 0; i < b.N; i++ {
  1605. srcBuf.Reset()
  1606. src.Reset(onlyReader{srcBuf})
  1607. dstBuf.Reset()
  1608. io.Copy(dst, src)
  1609. }
  1610. }
  1611. func BenchmarkReaderCopyNoWriteTo(b *testing.B) {
  1612. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1613. srcReader := NewReader(srcBuf)
  1614. src := onlyReader{srcReader}
  1615. dstBuf := new(bytes.Buffer)
  1616. dst := onlyWriter{dstBuf}
  1617. for i := 0; i < b.N; i++ {
  1618. srcBuf.Reset()
  1619. srcReader.Reset(srcBuf)
  1620. dstBuf.Reset()
  1621. io.Copy(dst, src)
  1622. }
  1623. }
  1624. func BenchmarkReaderWriteToOptimal(b *testing.B) {
  1625. const bufSize = 16 << 10
  1626. buf := make([]byte, bufSize)
  1627. r := bytes.NewReader(buf)
  1628. srcReader := NewReaderSize(onlyReader{r}, 1<<10)
  1629. if _, ok := io.Discard.(io.ReaderFrom); !ok {
  1630. b.Fatal("io.Discard doesn't support ReaderFrom")
  1631. }
  1632. for i := 0; i < b.N; i++ {
  1633. r.Seek(0, io.SeekStart)
  1634. srcReader.Reset(onlyReader{r})
  1635. n, err := srcReader.WriteTo(io.Discard)
  1636. if err != nil {
  1637. b.Fatal(err)
  1638. }
  1639. if n != bufSize {
  1640. b.Fatalf("n = %d; want %d", n, bufSize)
  1641. }
  1642. }
  1643. }
  1644. func BenchmarkReaderReadString(b *testing.B) {
  1645. r := strings.NewReader(" foo foo 42 42 42 42 42 42 42 42 4.2 4.2 4.2 4.2\n")
  1646. buf := NewReader(r)
  1647. b.ReportAllocs()
  1648. for i := 0; i < b.N; i++ {
  1649. r.Seek(0, io.SeekStart)
  1650. buf.Reset(r)
  1651. _, err := buf.ReadString('\n')
  1652. if err != nil {
  1653. b.Fatal(err)
  1654. }
  1655. }
  1656. }
  1657. func BenchmarkWriterCopyOptimal(b *testing.B) {
  1658. // Optimal case is where the underlying writer implements io.ReaderFrom
  1659. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1660. src := onlyReader{srcBuf}
  1661. dstBuf := new(bytes.Buffer)
  1662. dst := NewWriter(dstBuf)
  1663. for i := 0; i < b.N; i++ {
  1664. srcBuf.Reset()
  1665. dstBuf.Reset()
  1666. dst.Reset(dstBuf)
  1667. io.Copy(dst, src)
  1668. }
  1669. }
  1670. func BenchmarkWriterCopyUnoptimal(b *testing.B) {
  1671. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1672. src := onlyReader{srcBuf}
  1673. dstBuf := new(bytes.Buffer)
  1674. dst := NewWriter(onlyWriter{dstBuf})
  1675. for i := 0; i < b.N; i++ {
  1676. srcBuf.Reset()
  1677. dstBuf.Reset()
  1678. dst.Reset(onlyWriter{dstBuf})
  1679. io.Copy(dst, src)
  1680. }
  1681. }
  1682. func BenchmarkWriterCopyNoReadFrom(b *testing.B) {
  1683. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1684. src := onlyReader{srcBuf}
  1685. dstBuf := new(bytes.Buffer)
  1686. dstWriter := NewWriter(dstBuf)
  1687. dst := onlyWriter{dstWriter}
  1688. for i := 0; i < b.N; i++ {
  1689. srcBuf.Reset()
  1690. dstBuf.Reset()
  1691. dstWriter.Reset(dstBuf)
  1692. io.Copy(dst, src)
  1693. }
  1694. }
  1695. func BenchmarkReaderEmpty(b *testing.B) {
  1696. b.ReportAllocs()
  1697. str := strings.Repeat("x", 16<<10)
  1698. for i := 0; i < b.N; i++ {
  1699. br := NewReader(strings.NewReader(str))
  1700. n, err := io.Copy(io.Discard, br)
  1701. if err != nil {
  1702. b.Fatal(err)
  1703. }
  1704. if n != int64(len(str)) {
  1705. b.Fatal("wrong length")
  1706. }
  1707. }
  1708. }
  1709. func BenchmarkWriterEmpty(b *testing.B) {
  1710. b.ReportAllocs()
  1711. str := strings.Repeat("x", 1<<10)
  1712. bs := []byte(str)
  1713. for i := 0; i < b.N; i++ {
  1714. bw := NewWriter(io.Discard)
  1715. bw.Flush()
  1716. bw.WriteByte('a')
  1717. bw.Flush()
  1718. bw.WriteRune('B')
  1719. bw.Flush()
  1720. bw.Write(bs)
  1721. bw.Flush()
  1722. bw.WriteString(str)
  1723. bw.Flush()
  1724. }
  1725. }
  1726. func BenchmarkWriterFlush(b *testing.B) {
  1727. b.ReportAllocs()
  1728. bw := NewWriter(io.Discard)
  1729. str := strings.Repeat("x", 50)
  1730. for i := 0; i < b.N; i++ {
  1731. bw.WriteString(str)
  1732. bw.Flush()
  1733. }
  1734. }