bufio_test.go 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418
  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. "bytes"
  7. "errors"
  8. "fmt"
  9. "io"
  10. "io/ioutil"
  11. "strings"
  12. "testing"
  13. "testing/iotest"
  14. "time"
  15. "unicode/utf8"
  16. . "gopkg.in/bufio.v1"
  17. )
  18. // Reads from a reader and rot13s the result.
  19. type rot13Reader struct {
  20. r io.Reader
  21. }
  22. func newRot13Reader(r io.Reader) *rot13Reader {
  23. r13 := new(rot13Reader)
  24. r13.r = r
  25. return r13
  26. }
  27. func (r13 *rot13Reader) Read(p []byte) (int, error) {
  28. n, err := r13.r.Read(p)
  29. if err != nil {
  30. return n, err
  31. }
  32. for i := 0; i < n; i++ {
  33. c := p[i] | 0x20 // lowercase byte
  34. if 'a' <= c && c <= 'm' {
  35. p[i] += 13
  36. } else if 'n' <= c && c <= 'z' {
  37. p[i] -= 13
  38. }
  39. }
  40. return n, nil
  41. }
  42. // Call ReadByte to accumulate the text of a file
  43. func readBytes(buf *Reader) string {
  44. var b [1000]byte
  45. nb := 0
  46. for {
  47. c, err := buf.ReadByte()
  48. if err == io.EOF {
  49. break
  50. }
  51. if err == nil {
  52. b[nb] = c
  53. nb++
  54. } else if err != iotest.ErrTimeout {
  55. panic("Data: " + err.Error())
  56. }
  57. }
  58. return string(b[0:nb])
  59. }
  60. func TestReaderSimple(t *testing.T) {
  61. data := "hello world"
  62. b := NewReader(strings.NewReader(data))
  63. if s := readBytes(b); s != "hello world" {
  64. t.Errorf("simple hello world test failed: got %q", s)
  65. }
  66. b = NewReader(newRot13Reader(strings.NewReader(data)))
  67. if s := readBytes(b); s != "uryyb jbeyq" {
  68. t.Errorf("rot13 hello world test failed: got %q", s)
  69. }
  70. }
  71. type readMaker struct {
  72. name string
  73. fn func(io.Reader) io.Reader
  74. }
  75. var readMakers = []readMaker{
  76. {"full", func(r io.Reader) io.Reader { return r }},
  77. {"byte", iotest.OneByteReader},
  78. {"half", iotest.HalfReader},
  79. {"data+err", iotest.DataErrReader},
  80. {"timeout", iotest.TimeoutReader},
  81. }
  82. // Call ReadString (which ends up calling everything else)
  83. // to accumulate the text of a file.
  84. func readLines(b *Reader) string {
  85. s := ""
  86. for {
  87. s1, err := b.ReadString('\n')
  88. if err == io.EOF {
  89. break
  90. }
  91. if err != nil && err != iotest.ErrTimeout {
  92. panic("GetLines: " + err.Error())
  93. }
  94. s += s1
  95. }
  96. return s
  97. }
  98. // Call Read to accumulate the text of a file
  99. func reads(buf *Reader, m int) string {
  100. var b [1000]byte
  101. nb := 0
  102. for {
  103. n, err := buf.Read(b[nb : nb+m])
  104. nb += n
  105. if err == io.EOF {
  106. break
  107. }
  108. }
  109. return string(b[0:nb])
  110. }
  111. type bufReader struct {
  112. name string
  113. fn func(*Reader) string
  114. }
  115. var bufreaders = []bufReader{
  116. {"1", func(b *Reader) string { return reads(b, 1) }},
  117. {"2", func(b *Reader) string { return reads(b, 2) }},
  118. {"3", func(b *Reader) string { return reads(b, 3) }},
  119. {"4", func(b *Reader) string { return reads(b, 4) }},
  120. {"5", func(b *Reader) string { return reads(b, 5) }},
  121. {"7", func(b *Reader) string { return reads(b, 7) }},
  122. {"bytes", readBytes},
  123. {"lines", readLines},
  124. }
  125. const minReadBufferSize = 16
  126. var bufsizes = []int{
  127. 0, minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096,
  128. }
  129. func TestReader(t *testing.T) {
  130. var texts [31]string
  131. str := ""
  132. all := ""
  133. for i := 0; i < len(texts)-1; i++ {
  134. texts[i] = str + "\n"
  135. all += texts[i]
  136. str += string(i%26 + 'a')
  137. }
  138. texts[len(texts)-1] = all
  139. for h := 0; h < len(texts); h++ {
  140. text := texts[h]
  141. for i := 0; i < len(readMakers); i++ {
  142. for j := 0; j < len(bufreaders); j++ {
  143. for k := 0; k < len(bufsizes); k++ {
  144. readmaker := readMakers[i]
  145. bufreader := bufreaders[j]
  146. bufsize := bufsizes[k]
  147. read := readmaker.fn(strings.NewReader(text))
  148. buf := NewReaderSize(read, bufsize)
  149. s := bufreader.fn(buf)
  150. if s != text {
  151. t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
  152. readmaker.name, bufreader.name, bufsize, text, s)
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. type zeroReader struct{}
  160. func (zeroReader) Read(p []byte) (int, error) {
  161. return 0, nil
  162. }
  163. func TestZeroReader(t *testing.T) {
  164. var z zeroReader
  165. r := NewReader(z)
  166. c := make(chan error)
  167. go func() {
  168. _, err := r.ReadByte()
  169. c <- err
  170. }()
  171. select {
  172. case err := <-c:
  173. if err == nil {
  174. t.Error("error expected")
  175. } else if err != io.ErrNoProgress {
  176. t.Error("unexpected error:", err)
  177. }
  178. case <-time.After(time.Second):
  179. t.Error("test timed out (endless loop in ReadByte?)")
  180. }
  181. }
  182. // A StringReader delivers its data one string segment at a time via Read.
  183. type StringReader struct {
  184. data []string
  185. step int
  186. }
  187. func (r *StringReader) Read(p []byte) (n int, err error) {
  188. if r.step < len(r.data) {
  189. s := r.data[r.step]
  190. n = copy(p, s)
  191. r.step++
  192. } else {
  193. err = io.EOF
  194. }
  195. return
  196. }
  197. func readRuneSegments(t *testing.T, segments []string) {
  198. got := ""
  199. want := strings.Join(segments, "")
  200. r := NewReader(&StringReader{data: segments})
  201. for {
  202. r, _, err := r.ReadRune()
  203. if err != nil {
  204. if err != io.EOF {
  205. return
  206. }
  207. break
  208. }
  209. got += string(r)
  210. }
  211. if got != want {
  212. t.Errorf("segments=%v got=%s want=%s", segments, got, want)
  213. }
  214. }
  215. var segmentList = [][]string{
  216. {},
  217. {""},
  218. {"日", "本語"},
  219. {"\u65e5", "\u672c", "\u8a9e"},
  220. {"\U000065e5", "\U0000672c", "\U00008a9e"},
  221. {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
  222. {"Hello", ", ", "World", "!"},
  223. {"Hello", ", ", "", "World", "!"},
  224. }
  225. func TestReadRune(t *testing.T) {
  226. for _, s := range segmentList {
  227. readRuneSegments(t, s)
  228. }
  229. }
  230. func TestUnreadRune(t *testing.T) {
  231. segments := []string{"Hello, world:", "日本語"}
  232. r := NewReader(&StringReader{data: segments})
  233. got := ""
  234. want := strings.Join(segments, "")
  235. // Normal execution.
  236. for {
  237. r1, _, err := r.ReadRune()
  238. if err != nil {
  239. if err != io.EOF {
  240. t.Error("unexpected error on ReadRune:", err)
  241. }
  242. break
  243. }
  244. got += string(r1)
  245. // Put it back and read it again.
  246. if err = r.UnreadRune(); err != nil {
  247. t.Fatal("unexpected error on UnreadRune:", err)
  248. }
  249. r2, _, err := r.ReadRune()
  250. if err != nil {
  251. t.Fatal("unexpected error reading after unreading:", err)
  252. }
  253. if r1 != r2 {
  254. t.Fatalf("incorrect rune after unread: got %c, want %c", r1, r2)
  255. }
  256. }
  257. if got != want {
  258. t.Errorf("got %q, want %q", got, want)
  259. }
  260. }
  261. func TestReaderUnreadByte(t *testing.T) {
  262. segments := []string{"Hello, ", "world"}
  263. r := NewReader(&StringReader{data: segments})
  264. got := ""
  265. want := strings.Join(segments, "")
  266. // Normal execution.
  267. for {
  268. b1, err := r.ReadByte()
  269. if err != nil {
  270. if err != io.EOF {
  271. t.Error("unexpected error on ReadByte:", err)
  272. }
  273. break
  274. }
  275. got += string(b1)
  276. // Put it back and read it again.
  277. if err = r.UnreadByte(); err != nil {
  278. t.Fatal("unexpected error on UnreadByte:", err)
  279. }
  280. b2, err := r.ReadByte()
  281. if err != nil {
  282. t.Fatal("unexpected error reading after unreading:", err)
  283. }
  284. if b1 != b2 {
  285. t.Fatalf("incorrect byte after unread: got %q, want %q", b1, b2)
  286. }
  287. }
  288. if got != want {
  289. t.Errorf("got %q, want %q", got, want)
  290. }
  291. }
  292. func TestUnreadByteMultiple(t *testing.T) {
  293. segments := []string{"Hello, ", "world"}
  294. data := strings.Join(segments, "")
  295. for n := 0; n <= len(data); n++ {
  296. r := NewReader(&StringReader{data: segments})
  297. // Read n bytes.
  298. for i := 0; i < n; i++ {
  299. b, err := r.ReadByte()
  300. if err != nil {
  301. t.Fatalf("n = %d: unexpected error on ReadByte: %v", n, err)
  302. }
  303. if b != data[i] {
  304. t.Fatalf("n = %d: incorrect byte returned from ReadByte: got %q, want %q", n, b, data[i])
  305. }
  306. }
  307. // Unread one byte if there is one.
  308. if n > 0 {
  309. if err := r.UnreadByte(); err != nil {
  310. t.Errorf("n = %d: unexpected error on UnreadByte: %v", n, err)
  311. }
  312. }
  313. // Test that we cannot unread any further.
  314. if err := r.UnreadByte(); err == nil {
  315. t.Errorf("n = %d: expected error on UnreadByte", n)
  316. }
  317. }
  318. }
  319. func TestUnreadByteOthers(t *testing.T) {
  320. // A list of readers to use in conjunction with UnreadByte.
  321. var readers = []func(*Reader, byte) ([]byte, error){
  322. (*Reader).ReadBytes,
  323. (*Reader).ReadSlice,
  324. func(r *Reader, delim byte) ([]byte, error) {
  325. data, err := r.ReadString(delim)
  326. return []byte(data), err
  327. },
  328. // ReadLine doesn't fit the data/pattern easily
  329. // so we leave it out. It should be covered via
  330. // the ReadSlice test since ReadLine simply calls
  331. // ReadSlice, and it's that function that handles
  332. // the last byte.
  333. }
  334. // Try all readers with UnreadByte.
  335. for rno, read := range readers {
  336. // Some input data that is longer than the minimum reader buffer size.
  337. const n = 10
  338. var buf bytes.Buffer
  339. for i := 0; i < n; i++ {
  340. buf.WriteString("abcdefg")
  341. }
  342. r := NewReaderSize(&buf, minReadBufferSize)
  343. readTo := func(delim byte, want string) {
  344. data, err := read(r, delim)
  345. if err != nil {
  346. t.Fatalf("#%d: unexpected error reading to %c: %v", rno, delim, err)
  347. }
  348. if got := string(data); got != want {
  349. t.Fatalf("#%d: got %q, want %q", rno, got, want)
  350. }
  351. }
  352. // Read the data with occasional UnreadByte calls.
  353. for i := 0; i < n; i++ {
  354. readTo('d', "abcd")
  355. for j := 0; j < 3; j++ {
  356. if err := r.UnreadByte(); err != nil {
  357. t.Fatalf("#%d: unexpected error on UnreadByte: %v", rno, err)
  358. }
  359. readTo('d', "d")
  360. }
  361. readTo('g', "efg")
  362. }
  363. // All data should have been read.
  364. _, err := r.ReadByte()
  365. if err != io.EOF {
  366. t.Errorf("#%d: got error %v; want EOF", rno, err)
  367. }
  368. }
  369. }
  370. // Test that UnreadRune fails if the preceding operation was not a ReadRune.
  371. func TestUnreadRuneError(t *testing.T) {
  372. buf := make([]byte, 3) // All runes in this test are 3 bytes long
  373. r := NewReader(&StringReader{data: []string{"日本語日本語日本語"}})
  374. if r.UnreadRune() == nil {
  375. t.Error("expected error on UnreadRune from fresh buffer")
  376. }
  377. _, _, err := r.ReadRune()
  378. if err != nil {
  379. t.Error("unexpected error on ReadRune (1):", err)
  380. }
  381. if err = r.UnreadRune(); err != nil {
  382. t.Error("unexpected error on UnreadRune (1):", err)
  383. }
  384. if r.UnreadRune() == nil {
  385. t.Error("expected error after UnreadRune (1)")
  386. }
  387. // Test error after Read.
  388. _, _, err = r.ReadRune() // reset state
  389. if err != nil {
  390. t.Error("unexpected error on ReadRune (2):", err)
  391. }
  392. _, err = r.Read(buf)
  393. if err != nil {
  394. t.Error("unexpected error on Read (2):", err)
  395. }
  396. if r.UnreadRune() == nil {
  397. t.Error("expected error after Read (2)")
  398. }
  399. // Test error after ReadByte.
  400. _, _, err = r.ReadRune() // reset state
  401. if err != nil {
  402. t.Error("unexpected error on ReadRune (2):", err)
  403. }
  404. for _ = range buf {
  405. _, err = r.ReadByte()
  406. if err != nil {
  407. t.Error("unexpected error on ReadByte (2):", err)
  408. }
  409. }
  410. if r.UnreadRune() == nil {
  411. t.Error("expected error after ReadByte")
  412. }
  413. // Test error after UnreadByte.
  414. _, _, err = r.ReadRune() // reset state
  415. if err != nil {
  416. t.Error("unexpected error on ReadRune (3):", err)
  417. }
  418. _, err = r.ReadByte()
  419. if err != nil {
  420. t.Error("unexpected error on ReadByte (3):", err)
  421. }
  422. err = r.UnreadByte()
  423. if err != nil {
  424. t.Error("unexpected error on UnreadByte (3):", err)
  425. }
  426. if r.UnreadRune() == nil {
  427. t.Error("expected error after UnreadByte (3)")
  428. }
  429. }
  430. func TestUnreadRuneAtEOF(t *testing.T) {
  431. // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
  432. r := NewReader(strings.NewReader("x"))
  433. r.ReadRune()
  434. r.ReadRune()
  435. r.UnreadRune()
  436. _, _, err := r.ReadRune()
  437. if err == nil {
  438. t.Error("expected error at EOF")
  439. } else if err != io.EOF {
  440. t.Error("expected EOF; got", err)
  441. }
  442. }
  443. func TestReadWriteRune(t *testing.T) {
  444. const NRune = 1000
  445. byteBuf := new(bytes.Buffer)
  446. w := NewWriter(byteBuf)
  447. // Write the runes out using WriteRune
  448. buf := make([]byte, utf8.UTFMax)
  449. for r := rune(0); r < NRune; r++ {
  450. size := utf8.EncodeRune(buf, r)
  451. nbytes, err := w.WriteRune(r)
  452. if err != nil {
  453. t.Fatalf("WriteRune(0x%x) error: %s", r, err)
  454. }
  455. if nbytes != size {
  456. t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes)
  457. }
  458. }
  459. w.Flush()
  460. r := NewReader(byteBuf)
  461. // Read them back with ReadRune
  462. for r1 := rune(0); r1 < NRune; r1++ {
  463. size := utf8.EncodeRune(buf, r1)
  464. nr, nbytes, err := r.ReadRune()
  465. if nr != r1 || nbytes != size || err != nil {
  466. t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err)
  467. }
  468. }
  469. }
  470. func TestWriter(t *testing.T) {
  471. var data [8192]byte
  472. for i := 0; i < len(data); i++ {
  473. data[i] = byte(' ' + i%('~'-' '))
  474. }
  475. w := new(bytes.Buffer)
  476. for i := 0; i < len(bufsizes); i++ {
  477. for j := 0; j < len(bufsizes); j++ {
  478. nwrite := bufsizes[i]
  479. bs := bufsizes[j]
  480. // Write nwrite bytes using buffer size bs.
  481. // Check that the right amount makes it out
  482. // and that the data is correct.
  483. w.Reset()
  484. buf := NewWriterSize(w, bs)
  485. context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs)
  486. n, e1 := buf.Write(data[0:nwrite])
  487. if e1 != nil || n != nwrite {
  488. t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1)
  489. continue
  490. }
  491. if e := buf.Flush(); e != nil {
  492. t.Errorf("%s: buf.Flush = %v", context, e)
  493. }
  494. written := w.Bytes()
  495. if len(written) != nwrite {
  496. t.Errorf("%s: %d bytes written", context, len(written))
  497. }
  498. for l := 0; l < len(written); l++ {
  499. if written[i] != data[i] {
  500. t.Errorf("wrong bytes written")
  501. t.Errorf("want=%q", data[0:len(written)])
  502. t.Errorf("have=%q", written)
  503. }
  504. }
  505. }
  506. }
  507. }
  508. // Check that write errors are returned properly.
  509. type errorWriterTest struct {
  510. n, m int
  511. err error
  512. expect error
  513. }
  514. func (w errorWriterTest) Write(p []byte) (int, error) {
  515. return len(p) * w.n / w.m, w.err
  516. }
  517. var errorWriterTests = []errorWriterTest{
  518. {0, 1, nil, io.ErrShortWrite},
  519. {1, 2, nil, io.ErrShortWrite},
  520. {1, 1, nil, nil},
  521. {0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
  522. {1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
  523. {1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
  524. }
  525. func TestWriteErrors(t *testing.T) {
  526. for _, w := range errorWriterTests {
  527. buf := NewWriter(w)
  528. _, e := buf.Write([]byte("hello world"))
  529. if e != nil {
  530. t.Errorf("Write hello to %v: %v", w, e)
  531. continue
  532. }
  533. // Two flushes, to verify the error is sticky.
  534. for i := 0; i < 2; i++ {
  535. e = buf.Flush()
  536. if e != w.expect {
  537. t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect)
  538. }
  539. }
  540. }
  541. }
  542. func TestNewReaderSizeIdempotent(t *testing.T) {
  543. const BufSize = 1000
  544. b := NewReaderSize(strings.NewReader("hello world"), BufSize)
  545. // Does it recognize itself?
  546. b1 := NewReaderSize(b, BufSize)
  547. if b1 != b {
  548. t.Error("NewReaderSize did not detect underlying Reader")
  549. }
  550. // Does it wrap if existing buffer is too small?
  551. b2 := NewReaderSize(b, 2*BufSize)
  552. if b2 == b {
  553. t.Error("NewReaderSize did not enlarge buffer")
  554. }
  555. }
  556. func TestNewWriterSizeIdempotent(t *testing.T) {
  557. const BufSize = 1000
  558. b := NewWriterSize(new(bytes.Buffer), BufSize)
  559. // Does it recognize itself?
  560. b1 := NewWriterSize(b, BufSize)
  561. if b1 != b {
  562. t.Error("NewWriterSize did not detect underlying Writer")
  563. }
  564. // Does it wrap if existing buffer is too small?
  565. b2 := NewWriterSize(b, 2*BufSize)
  566. if b2 == b {
  567. t.Error("NewWriterSize did not enlarge buffer")
  568. }
  569. }
  570. func TestWriteString(t *testing.T) {
  571. const BufSize = 8
  572. buf := new(bytes.Buffer)
  573. b := NewWriterSize(buf, BufSize)
  574. b.WriteString("0") // easy
  575. b.WriteString("123456") // still easy
  576. b.WriteString("7890") // easy after flush
  577. b.WriteString("abcdefghijklmnopqrstuvwxy") // hard
  578. b.WriteString("z")
  579. if err := b.Flush(); err != nil {
  580. t.Error("WriteString", err)
  581. }
  582. s := "01234567890abcdefghijklmnopqrstuvwxyz"
  583. if string(buf.Bytes()) != s {
  584. t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
  585. }
  586. }
  587. func TestBufferFull(t *testing.T) {
  588. const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
  589. buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
  590. line, err := buf.ReadSlice('!')
  591. if string(line) != "And now, hello, " || err != ErrBufferFull {
  592. t.Errorf("first ReadSlice(,) = %q, %v", line, err)
  593. }
  594. line, err = buf.ReadSlice('!')
  595. if string(line) != "world!" || err != nil {
  596. t.Errorf("second ReadSlice(,) = %q, %v", line, err)
  597. }
  598. }
  599. func TestPeek(t *testing.T) {
  600. p := make([]byte, 10)
  601. // string is 16 (minReadBufferSize) long.
  602. buf := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize)
  603. if s, err := buf.Peek(1); string(s) != "a" || err != nil {
  604. t.Fatalf("want %q got %q, err=%v", "a", string(s), err)
  605. }
  606. if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
  607. t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err)
  608. }
  609. if _, err := buf.Peek(-1); err != ErrNegativeCount {
  610. t.Fatalf("want ErrNegativeCount got %v", err)
  611. }
  612. if _, err := buf.Peek(32); err != ErrBufferFull {
  613. t.Fatalf("want ErrBufFull got %v", err)
  614. }
  615. if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
  616. t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)
  617. }
  618. if s, err := buf.Peek(1); string(s) != "d" || err != nil {
  619. t.Fatalf("want %q got %q, err=%v", "d", string(s), err)
  620. }
  621. if s, err := buf.Peek(2); string(s) != "de" || err != nil {
  622. t.Fatalf("want %q got %q, err=%v", "de", string(s), err)
  623. }
  624. if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil {
  625. t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err)
  626. }
  627. if s, err := buf.Peek(4); string(s) != "ghij" || err != nil {
  628. t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err)
  629. }
  630. if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil {
  631. t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err)
  632. }
  633. if s, err := buf.Peek(0); string(s) != "" || err != nil {
  634. t.Fatalf("want %q got %q, err=%v", "", string(s), err)
  635. }
  636. if _, err := buf.Peek(1); err != io.EOF {
  637. t.Fatalf("want EOF got %v", err)
  638. }
  639. // Test for issue 3022, not exposing a reader's error on a successful Peek.
  640. buf = NewReaderSize(dataAndEOFReader("abcd"), 32)
  641. if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
  642. t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
  643. }
  644. if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
  645. t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
  646. }
  647. if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
  648. t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
  649. }
  650. if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
  651. t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
  652. }
  653. }
  654. type dataAndEOFReader string
  655. func (r dataAndEOFReader) Read(p []byte) (int, error) {
  656. return copy(p, r), io.EOF
  657. }
  658. func TestPeekThenUnreadRune(t *testing.T) {
  659. // This sequence used to cause a crash.
  660. r := NewReader(strings.NewReader("x"))
  661. r.ReadRune()
  662. r.Peek(1)
  663. r.UnreadRune()
  664. r.ReadRune() // Used to panic here
  665. }
  666. var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy")
  667. var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy")
  668. 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")
  669. // TestReader wraps a []byte and returns reads of a specific length.
  670. type testReader struct {
  671. data []byte
  672. stride int
  673. }
  674. func (t *testReader) Read(buf []byte) (n int, err error) {
  675. n = t.stride
  676. if n > len(t.data) {
  677. n = len(t.data)
  678. }
  679. if n > len(buf) {
  680. n = len(buf)
  681. }
  682. copy(buf, t.data)
  683. t.data = t.data[n:]
  684. if len(t.data) == 0 {
  685. err = io.EOF
  686. }
  687. return
  688. }
  689. func testReadLine(t *testing.T, input []byte) {
  690. //for stride := 1; stride < len(input); stride++ {
  691. for stride := 1; stride < 2; stride++ {
  692. done := 0
  693. reader := testReader{input, stride}
  694. l := NewReaderSize(&reader, len(input)+1)
  695. for {
  696. line, isPrefix, err := l.ReadLine()
  697. if len(line) > 0 && err != nil {
  698. t.Errorf("ReadLine returned both data and error: %s", err)
  699. }
  700. if isPrefix {
  701. t.Errorf("ReadLine returned prefix")
  702. }
  703. if err != nil {
  704. if err != io.EOF {
  705. t.Fatalf("Got unknown error: %s", err)
  706. }
  707. break
  708. }
  709. if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) {
  710. t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line)
  711. }
  712. done += len(line)
  713. }
  714. if done != len(testOutput) {
  715. t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride)
  716. }
  717. }
  718. }
  719. func TestReadLine(t *testing.T) {
  720. testReadLine(t, testInput)
  721. testReadLine(t, testInputrn)
  722. }
  723. func TestLineTooLong(t *testing.T) {
  724. data := make([]byte, 0)
  725. for i := 0; i < minReadBufferSize*5/2; i++ {
  726. data = append(data, '0'+byte(i%10))
  727. }
  728. buf := bytes.NewReader(data)
  729. l := NewReaderSize(buf, minReadBufferSize)
  730. line, isPrefix, err := l.ReadLine()
  731. if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
  732. t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err)
  733. }
  734. data = data[len(line):]
  735. line, isPrefix, err = l.ReadLine()
  736. if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
  737. t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err)
  738. }
  739. data = data[len(line):]
  740. line, isPrefix, err = l.ReadLine()
  741. if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil {
  742. t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err)
  743. }
  744. line, isPrefix, err = l.ReadLine()
  745. if isPrefix || err == nil {
  746. t.Errorf("expected no more lines: %x %s", line, err)
  747. }
  748. }
  749. func TestReadAfterLines(t *testing.T) {
  750. line1 := "this is line1"
  751. restData := "this is line2\nthis is line 3\n"
  752. inbuf := bytes.NewReader([]byte(line1 + "\n" + restData))
  753. outbuf := new(bytes.Buffer)
  754. maxLineLength := len(line1) + len(restData)/2
  755. l := NewReaderSize(inbuf, maxLineLength)
  756. line, isPrefix, err := l.ReadLine()
  757. if isPrefix || err != nil || string(line) != line1 {
  758. t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line))
  759. }
  760. n, err := io.Copy(outbuf, l)
  761. if int(n) != len(restData) || err != nil {
  762. t.Errorf("bad result for Read: n=%d err=%v", n, err)
  763. }
  764. if outbuf.String() != restData {
  765. t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData)
  766. }
  767. }
  768. func TestReadEmptyBuffer(t *testing.T) {
  769. l := NewReaderSize(new(bytes.Buffer), minReadBufferSize)
  770. line, isPrefix, err := l.ReadLine()
  771. if err != io.EOF {
  772. t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
  773. }
  774. }
  775. func TestLinesAfterRead(t *testing.T) {
  776. l := NewReaderSize(bytes.NewReader([]byte("foo")), minReadBufferSize)
  777. _, err := ioutil.ReadAll(l)
  778. if err != nil {
  779. t.Error(err)
  780. return
  781. }
  782. line, isPrefix, err := l.ReadLine()
  783. if err != io.EOF {
  784. t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
  785. }
  786. }
  787. func TestReadLineNonNilLineOrError(t *testing.T) {
  788. r := NewReader(strings.NewReader("line 1\n"))
  789. for i := 0; i < 2; i++ {
  790. l, _, err := r.ReadLine()
  791. if l != nil && err != nil {
  792. t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both",
  793. i+1, l, err)
  794. }
  795. }
  796. }
  797. type readLineResult struct {
  798. line []byte
  799. isPrefix bool
  800. err error
  801. }
  802. var readLineNewlinesTests = []struct {
  803. input string
  804. expect []readLineResult
  805. }{
  806. {"012345678901234\r\n012345678901234\r\n", []readLineResult{
  807. {[]byte("012345678901234"), true, nil},
  808. {nil, false, nil},
  809. {[]byte("012345678901234"), true, nil},
  810. {nil, false, nil},
  811. {nil, false, io.EOF},
  812. }},
  813. {"0123456789012345\r012345678901234\r", []readLineResult{
  814. {[]byte("0123456789012345"), true, nil},
  815. {[]byte("\r012345678901234"), true, nil},
  816. {[]byte("\r"), false, nil},
  817. {nil, false, io.EOF},
  818. }},
  819. }
  820. func TestReadLineNewlines(t *testing.T) {
  821. for _, e := range readLineNewlinesTests {
  822. testReadLineNewlines(t, e.input, e.expect)
  823. }
  824. }
  825. func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) {
  826. b := NewReaderSize(strings.NewReader(input), minReadBufferSize)
  827. for i, e := range expect {
  828. line, isPrefix, err := b.ReadLine()
  829. if !bytes.Equal(line, e.line) {
  830. t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line)
  831. return
  832. }
  833. if isPrefix != e.isPrefix {
  834. t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix)
  835. return
  836. }
  837. if err != e.err {
  838. t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err)
  839. return
  840. }
  841. }
  842. }
  843. func createTestInput(n int) []byte {
  844. input := make([]byte, n)
  845. for i := range input {
  846. // 101 and 251 are arbitrary prime numbers.
  847. // The idea is to create an input sequence
  848. // which doesn't repeat too frequently.
  849. input[i] = byte(i % 251)
  850. if i%101 == 0 {
  851. input[i] ^= byte(i / 101)
  852. }
  853. }
  854. return input
  855. }
  856. func TestReaderWriteTo(t *testing.T) {
  857. input := createTestInput(8192)
  858. r := NewReader(onlyReader{bytes.NewReader(input)})
  859. w := new(bytes.Buffer)
  860. if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) {
  861. t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input))
  862. }
  863. for i, val := range w.Bytes() {
  864. if val != input[i] {
  865. t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i])
  866. }
  867. }
  868. }
  869. type errorWriterToTest struct {
  870. rn, wn int
  871. rerr, werr error
  872. expected error
  873. }
  874. func (r errorWriterToTest) Read(p []byte) (int, error) {
  875. return len(p) * r.rn, r.rerr
  876. }
  877. func (w errorWriterToTest) Write(p []byte) (int, error) {
  878. return len(p) * w.wn, w.werr
  879. }
  880. var errorWriterToTests = []errorWriterToTest{
  881. {1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe},
  882. {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
  883. {0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe},
  884. {0, 1, io.EOF, nil, nil},
  885. }
  886. func TestReaderWriteToErrors(t *testing.T) {
  887. for i, rw := range errorWriterToTests {
  888. r := NewReader(rw)
  889. if _, err := r.WriteTo(rw); err != rw.expected {
  890. t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
  891. }
  892. }
  893. }
  894. func TestWriterReadFrom(t *testing.T) {
  895. ws := []func(io.Writer) io.Writer{
  896. func(w io.Writer) io.Writer { return onlyWriter{w} },
  897. func(w io.Writer) io.Writer { return w },
  898. }
  899. rs := []func(io.Reader) io.Reader{
  900. iotest.DataErrReader,
  901. func(r io.Reader) io.Reader { return r },
  902. }
  903. for ri, rfunc := range rs {
  904. for wi, wfunc := range ws {
  905. input := createTestInput(8192)
  906. b := new(bytes.Buffer)
  907. w := NewWriter(wfunc(b))
  908. r := rfunc(bytes.NewReader(input))
  909. if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) {
  910. t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input))
  911. continue
  912. }
  913. if err := w.Flush(); err != nil {
  914. t.Errorf("Flush returned %v", err)
  915. continue
  916. }
  917. if got, want := b.String(), string(input); got != want {
  918. t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n", wi, ri, got, want)
  919. }
  920. }
  921. }
  922. }
  923. type errorReaderFromTest struct {
  924. rn, wn int
  925. rerr, werr error
  926. expected error
  927. }
  928. func (r errorReaderFromTest) Read(p []byte) (int, error) {
  929. return len(p) * r.rn, r.rerr
  930. }
  931. func (w errorReaderFromTest) Write(p []byte) (int, error) {
  932. return len(p) * w.wn, w.werr
  933. }
  934. var errorReaderFromTests = []errorReaderFromTest{
  935. {0, 1, io.EOF, nil, nil},
  936. {1, 1, io.EOF, nil, nil},
  937. {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
  938. {0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe},
  939. {1, 0, nil, io.ErrShortWrite, io.ErrShortWrite},
  940. }
  941. func TestWriterReadFromErrors(t *testing.T) {
  942. for i, rw := range errorReaderFromTests {
  943. w := NewWriter(rw)
  944. if _, err := w.ReadFrom(rw); err != rw.expected {
  945. t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
  946. }
  947. }
  948. }
  949. // TestWriterReadFromCounts tests that using io.Copy to copy into a
  950. // bufio.Writer does not prematurely flush the buffer. For example, when
  951. // buffering writes to a network socket, excessive network writes should be
  952. // avoided.
  953. func TestWriterReadFromCounts(t *testing.T) {
  954. var w0 writeCountingDiscard
  955. b0 := NewWriterSize(&w0, 1234)
  956. b0.WriteString(strings.Repeat("x", 1000))
  957. if w0 != 0 {
  958. t.Fatalf("write 1000 'x's: got %d writes, want 0", w0)
  959. }
  960. b0.WriteString(strings.Repeat("x", 200))
  961. if w0 != 0 {
  962. t.Fatalf("write 1200 'x's: got %d writes, want 0", w0)
  963. }
  964. io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))})
  965. if w0 != 0 {
  966. t.Fatalf("write 1230 'x's: got %d writes, want 0", w0)
  967. }
  968. io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))})
  969. if w0 != 1 {
  970. t.Fatalf("write 1239 'x's: got %d writes, want 1", w0)
  971. }
  972. var w1 writeCountingDiscard
  973. b1 := NewWriterSize(&w1, 1234)
  974. b1.WriteString(strings.Repeat("x", 1200))
  975. b1.Flush()
  976. if w1 != 1 {
  977. t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1)
  978. }
  979. b1.WriteString(strings.Repeat("x", 89))
  980. if w1 != 1 {
  981. t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1)
  982. }
  983. io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))})
  984. if w1 != 1 {
  985. t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1)
  986. }
  987. io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))})
  988. if w1 != 2 {
  989. t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1)
  990. }
  991. b1.Flush()
  992. if w1 != 3 {
  993. t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1)
  994. }
  995. }
  996. // A writeCountingDiscard is like ioutil.Discard and counts the number of times
  997. // Write is called on it.
  998. type writeCountingDiscard int
  999. func (w *writeCountingDiscard) Write(p []byte) (int, error) {
  1000. *w++
  1001. return len(p), nil
  1002. }
  1003. type negativeReader int
  1004. func (r *negativeReader) Read([]byte) (int, error) { return -1, nil }
  1005. func TestNegativeRead(t *testing.T) {
  1006. // should panic with a description pointing at the reader, not at itself.
  1007. // (should NOT panic with slice index error, for example.)
  1008. b := NewReader(new(negativeReader))
  1009. defer func() {
  1010. switch err := recover().(type) {
  1011. case nil:
  1012. t.Fatal("read did not panic")
  1013. case error:
  1014. if !strings.Contains(err.Error(), "reader returned negative count from Read") {
  1015. t.Fatalf("wrong panic: %v", err)
  1016. }
  1017. default:
  1018. t.Fatalf("unexpected panic value: %T(%v)", err, err)
  1019. }
  1020. }()
  1021. b.Read(make([]byte, 100))
  1022. }
  1023. var errFake = errors.New("fake error")
  1024. type errorThenGoodReader struct {
  1025. didErr bool
  1026. nread int
  1027. }
  1028. func (r *errorThenGoodReader) Read(p []byte) (int, error) {
  1029. r.nread++
  1030. if !r.didErr {
  1031. r.didErr = true
  1032. return 0, errFake
  1033. }
  1034. return len(p), nil
  1035. }
  1036. func TestReaderClearError(t *testing.T) {
  1037. r := &errorThenGoodReader{}
  1038. b := NewReader(r)
  1039. buf := make([]byte, 1)
  1040. if _, err := b.Read(nil); err != nil {
  1041. t.Fatalf("1st nil Read = %v; want nil", err)
  1042. }
  1043. if _, err := b.Read(buf); err != errFake {
  1044. t.Fatalf("1st Read = %v; want errFake", err)
  1045. }
  1046. if _, err := b.Read(nil); err != nil {
  1047. t.Fatalf("2nd nil Read = %v; want nil", err)
  1048. }
  1049. if _, err := b.Read(buf); err != nil {
  1050. t.Fatalf("3rd Read with buffer = %v; want nil", err)
  1051. }
  1052. if r.nread != 2 {
  1053. t.Errorf("num reads = %d; want 2", r.nread)
  1054. }
  1055. }
  1056. // Test for golang.org/issue/5947
  1057. func TestWriterReadFromWhileFull(t *testing.T) {
  1058. buf := new(bytes.Buffer)
  1059. w := NewWriterSize(buf, 10)
  1060. // Fill buffer exactly.
  1061. n, err := w.Write([]byte("0123456789"))
  1062. if n != 10 || err != nil {
  1063. t.Fatalf("Write returned (%v, %v), want (10, nil)", n, err)
  1064. }
  1065. // Use ReadFrom to read in some data.
  1066. n2, err := w.ReadFrom(strings.NewReader("abcdef"))
  1067. if n2 != 6 || err != nil {
  1068. t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)", n2, err)
  1069. }
  1070. }
  1071. type emptyThenNonEmptyReader struct {
  1072. r io.Reader
  1073. n int
  1074. }
  1075. func (r *emptyThenNonEmptyReader) Read(p []byte) (int, error) {
  1076. if r.n <= 0 {
  1077. return r.r.Read(p)
  1078. }
  1079. r.n--
  1080. return 0, nil
  1081. }
  1082. // Test for golang.org/issue/7611
  1083. func TestWriterReadFromUntilEOF(t *testing.T) {
  1084. buf := new(bytes.Buffer)
  1085. w := NewWriterSize(buf, 5)
  1086. // Partially fill buffer
  1087. n, err := w.Write([]byte("0123"))
  1088. if n != 4 || err != nil {
  1089. t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
  1090. }
  1091. // Use ReadFrom to read in some data.
  1092. r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 3}
  1093. n2, err := w.ReadFrom(r)
  1094. if n2 != 4 || err != nil {
  1095. t.Fatalf("ReadFrom returned (%v, %v), want (4, nil)", n2, err)
  1096. }
  1097. w.Flush()
  1098. if got, want := string(buf.Bytes()), "0123abcd"; got != want {
  1099. t.Fatalf("buf.Bytes() returned %q, want %q", got, want)
  1100. }
  1101. }
  1102. func TestWriterReadFromErrNoProgress(t *testing.T) {
  1103. buf := new(bytes.Buffer)
  1104. w := NewWriterSize(buf, 5)
  1105. // Partially fill buffer
  1106. n, err := w.Write([]byte("0123"))
  1107. if n != 4 || err != nil {
  1108. t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
  1109. }
  1110. // Use ReadFrom to read in some data.
  1111. r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 100}
  1112. n2, err := w.ReadFrom(r)
  1113. if n2 != 0 || err != io.ErrNoProgress {
  1114. t.Fatalf("buf.Bytes() returned (%v, %v), want (0, io.ErrNoProgress)", n2, err)
  1115. }
  1116. }
  1117. func TestReaderReset(t *testing.T) {
  1118. r := NewReader(strings.NewReader("foo foo"))
  1119. buf := make([]byte, 3)
  1120. r.Read(buf)
  1121. if string(buf) != "foo" {
  1122. t.Errorf("buf = %q; want foo", buf)
  1123. }
  1124. r.Reset(strings.NewReader("bar bar"))
  1125. all, err := ioutil.ReadAll(r)
  1126. if err != nil {
  1127. t.Fatal(err)
  1128. }
  1129. if string(all) != "bar bar" {
  1130. t.Errorf("ReadAll = %q; want bar bar", all)
  1131. }
  1132. }
  1133. func TestWriterReset(t *testing.T) {
  1134. var buf1, buf2 bytes.Buffer
  1135. w := NewWriter(&buf1)
  1136. w.WriteString("foo")
  1137. w.Reset(&buf2) // and not flushed
  1138. w.WriteString("bar")
  1139. w.Flush()
  1140. if buf1.String() != "" {
  1141. t.Errorf("buf1 = %q; want empty", buf1.String())
  1142. }
  1143. if buf2.String() != "bar" {
  1144. t.Errorf("buf2 = %q; want bar", buf2.String())
  1145. }
  1146. }
  1147. // An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
  1148. type onlyReader struct {
  1149. io.Reader
  1150. }
  1151. // An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have.
  1152. type onlyWriter struct {
  1153. io.Writer
  1154. }
  1155. func BenchmarkReaderCopyOptimal(b *testing.B) {
  1156. // Optimal case is where the underlying reader implements io.WriterTo
  1157. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1158. src := NewReader(srcBuf)
  1159. dstBuf := new(bytes.Buffer)
  1160. dst := onlyWriter{dstBuf}
  1161. for i := 0; i < b.N; i++ {
  1162. srcBuf.Reset()
  1163. src.Reset(srcBuf)
  1164. dstBuf.Reset()
  1165. io.Copy(dst, src)
  1166. }
  1167. }
  1168. func BenchmarkReaderCopyUnoptimal(b *testing.B) {
  1169. // Unoptimal case is where the underlying reader doesn't implement io.WriterTo
  1170. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1171. src := NewReader(onlyReader{srcBuf})
  1172. dstBuf := new(bytes.Buffer)
  1173. dst := onlyWriter{dstBuf}
  1174. for i := 0; i < b.N; i++ {
  1175. srcBuf.Reset()
  1176. src.Reset(onlyReader{srcBuf})
  1177. dstBuf.Reset()
  1178. io.Copy(dst, src)
  1179. }
  1180. }
  1181. func BenchmarkReaderCopyNoWriteTo(b *testing.B) {
  1182. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1183. srcReader := NewReader(srcBuf)
  1184. src := onlyReader{srcReader}
  1185. dstBuf := new(bytes.Buffer)
  1186. dst := onlyWriter{dstBuf}
  1187. for i := 0; i < b.N; i++ {
  1188. srcBuf.Reset()
  1189. srcReader.Reset(srcBuf)
  1190. dstBuf.Reset()
  1191. io.Copy(dst, src)
  1192. }
  1193. }
  1194. func BenchmarkReaderWriteToOptimal(b *testing.B) {
  1195. const bufSize = 16 << 10
  1196. buf := make([]byte, bufSize)
  1197. r := bytes.NewReader(buf)
  1198. srcReader := NewReaderSize(onlyReader{r}, 1<<10)
  1199. if _, ok := ioutil.Discard.(io.ReaderFrom); !ok {
  1200. b.Fatal("ioutil.Discard doesn't support ReaderFrom")
  1201. }
  1202. for i := 0; i < b.N; i++ {
  1203. r.Seek(0, 0)
  1204. srcReader.Reset(onlyReader{r})
  1205. n, err := srcReader.WriteTo(ioutil.Discard)
  1206. if err != nil {
  1207. b.Fatal(err)
  1208. }
  1209. if n != bufSize {
  1210. b.Fatalf("n = %d; want %d", n, bufSize)
  1211. }
  1212. }
  1213. }
  1214. func BenchmarkWriterCopyOptimal(b *testing.B) {
  1215. // Optimal case is where the underlying writer implements io.ReaderFrom
  1216. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1217. src := onlyReader{srcBuf}
  1218. dstBuf := new(bytes.Buffer)
  1219. dst := NewWriter(dstBuf)
  1220. for i := 0; i < b.N; i++ {
  1221. srcBuf.Reset()
  1222. dstBuf.Reset()
  1223. dst.Reset(dstBuf)
  1224. io.Copy(dst, src)
  1225. }
  1226. }
  1227. func BenchmarkWriterCopyUnoptimal(b *testing.B) {
  1228. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1229. src := onlyReader{srcBuf}
  1230. dstBuf := new(bytes.Buffer)
  1231. dst := NewWriter(onlyWriter{dstBuf})
  1232. for i := 0; i < b.N; i++ {
  1233. srcBuf.Reset()
  1234. dstBuf.Reset()
  1235. dst.Reset(onlyWriter{dstBuf})
  1236. io.Copy(dst, src)
  1237. }
  1238. }
  1239. func BenchmarkWriterCopyNoReadFrom(b *testing.B) {
  1240. srcBuf := bytes.NewBuffer(make([]byte, 8192))
  1241. src := onlyReader{srcBuf}
  1242. dstBuf := new(bytes.Buffer)
  1243. dstWriter := NewWriter(dstBuf)
  1244. dst := onlyWriter{dstWriter}
  1245. for i := 0; i < b.N; i++ {
  1246. srcBuf.Reset()
  1247. dstBuf.Reset()
  1248. dstWriter.Reset(dstBuf)
  1249. io.Copy(dst, src)
  1250. }
  1251. }
  1252. func BenchmarkReaderEmpty(b *testing.B) {
  1253. b.ReportAllocs()
  1254. str := strings.Repeat("x", 16<<10)
  1255. for i := 0; i < b.N; i++ {
  1256. br := NewReader(strings.NewReader(str))
  1257. n, err := io.Copy(ioutil.Discard, br)
  1258. if err != nil {
  1259. b.Fatal(err)
  1260. }
  1261. if n != int64(len(str)) {
  1262. b.Fatal("wrong length")
  1263. }
  1264. }
  1265. }
  1266. func BenchmarkWriterEmpty(b *testing.B) {
  1267. b.ReportAllocs()
  1268. str := strings.Repeat("x", 1<<10)
  1269. bs := []byte(str)
  1270. for i := 0; i < b.N; i++ {
  1271. bw := NewWriter(ioutil.Discard)
  1272. bw.Flush()
  1273. bw.WriteByte('a')
  1274. bw.Flush()
  1275. bw.WriteRune('B')
  1276. bw.Flush()
  1277. bw.Write(bs)
  1278. bw.Flush()
  1279. bw.WriteString(str)
  1280. bw.Flush()
  1281. }
  1282. }
  1283. func BenchmarkWriterFlush(b *testing.B) {
  1284. b.ReportAllocs()
  1285. bw := NewWriter(ioutil.Discard)
  1286. str := strings.Repeat("x", 50)
  1287. for i := 0; i < b.N; i++ {
  1288. bw.WriteString(str)
  1289. bw.Flush()
  1290. }
  1291. }