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.
16 const N
= 10000 // make this bigger for a larger (and slower) test
17 var testString
string // test data for write tests
18 var testBytes
[]byte // test data; same as testString but as a slice.
20 type negativeReader
struct{}
22 func (r
*negativeReader
) Read([]byte) (int, error
) { return -1, nil }
25 testBytes
= make([]byte, N
)
26 for i
:= 0; i
< N
; i
++ {
27 testBytes
[i
] = 'a' + byte(i%26
)
29 testString
= string(testBytes
)
32 // Verify that contents of buf match the string s.
33 func check(t
*testing
.T
, testname
string, buf
*Buffer
, s
string) {
36 if buf
.Len() != len(bytes
) {
37 t
.Errorf("%s: buf.Len() == %d, len(buf.Bytes()) == %d", testname
, buf
.Len(), len(bytes
))
40 if buf
.Len() != len(str
) {
41 t
.Errorf("%s: buf.Len() == %d, len(buf.String()) == %d", testname
, buf
.Len(), len(str
))
44 if buf
.Len() != len(s
) {
45 t
.Errorf("%s: buf.Len() == %d, len(s) == %d", testname
, buf
.Len(), len(s
))
48 if string(bytes
) != s
{
49 t
.Errorf("%s: string(buf.Bytes()) == %q, s == %q", testname
, string(bytes
), s
)
53 // Fill buf through n writes of string fus.
54 // The initial contents of buf corresponds to the string s;
55 // the result is the final contents of buf returned as a string.
56 func fillString(t
*testing
.T
, testname
string, buf
*Buffer
, s
string, n
int, fus
string) string {
57 check(t
, testname
+" (fill 1)", buf
, s
)
59 m
, err
:= buf
.WriteString(fus
)
61 t
.Errorf(testname
+" (fill 2): m == %d, expected %d", m
, len(fus
))
64 t
.Errorf(testname
+" (fill 3): err should always be nil, found err == %s", err
)
67 check(t
, testname
+" (fill 4)", buf
, s
)
72 // Fill buf through n writes of byte slice fub.
73 // The initial contents of buf corresponds to the string s;
74 // the result is the final contents of buf returned as a string.
75 func fillBytes(t
*testing
.T
, testname
string, buf
*Buffer
, s
string, n
int, fub
[]byte) string {
76 check(t
, testname
+" (fill 1)", buf
, s
)
78 m
, err
:= buf
.Write(fub
)
80 t
.Errorf(testname
+" (fill 2): m == %d, expected %d", m
, len(fub
))
83 t
.Errorf(testname
+" (fill 3): err should always be nil, found err == %s", err
)
86 check(t
, testname
+" (fill 4)", buf
, s
)
91 func TestNewBuffer(t
*testing
.T
) {
92 buf
:= NewBuffer(testBytes
)
93 check(t
, "NewBuffer", buf
, testString
)
96 func TestNewBufferString(t
*testing
.T
) {
97 buf
:= NewBufferString(testString
)
98 check(t
, "NewBufferString", buf
, testString
)
101 // Empty buf through repeated reads into fub.
102 // The initial contents of buf corresponds to the string s.
103 func empty(t
*testing
.T
, testname
string, buf
*Buffer
, s
string, fub
[]byte) {
104 check(t
, testname
+" (empty 1)", buf
, s
)
107 n
, err
:= buf
.Read(fub
)
112 t
.Errorf(testname
+" (empty 2): err should always be nil, found err == %s", err
)
115 check(t
, testname
+" (empty 3)", buf
, s
)
118 check(t
, testname
+" (empty 4)", buf
, "")
121 func TestBasicOperations(t
*testing
.T
) {
124 for i
:= 0; i
< 5; i
++ {
125 check(t
, "TestBasicOperations (1)", &buf
, "")
128 check(t
, "TestBasicOperations (2)", &buf
, "")
131 check(t
, "TestBasicOperations (3)", &buf
, "")
133 n
, err
:= buf
.Write(testBytes
[0:1])
134 if want
:= 1; err
!= nil || n
!= want
{
135 t
.Errorf("Write: got (%d, %v), want (%d, %v)", n
, err
, want
, nil)
137 check(t
, "TestBasicOperations (4)", &buf
, "a")
139 buf
.WriteByte(testString
[1])
140 check(t
, "TestBasicOperations (5)", &buf
, "ab")
142 n
, err
= buf
.Write(testBytes
[2:26])
143 if want
:= 24; err
!= nil || n
!= want
{
144 t
.Errorf("Write: got (%d, %v), want (%d, %v)", n
, err
, want
, nil)
146 check(t
, "TestBasicOperations (6)", &buf
, testString
[0:26])
149 check(t
, "TestBasicOperations (7)", &buf
, testString
[0:26])
152 check(t
, "TestBasicOperations (8)", &buf
, testString
[0:20])
154 empty(t
, "TestBasicOperations (9)", &buf
, testString
[0:20], make([]byte, 5))
155 empty(t
, "TestBasicOperations (10)", &buf
, "", make([]byte, 100))
157 buf
.WriteByte(testString
[1])
158 c
, err
:= buf
.ReadByte()
159 if want
:= testString
[1]; err
!= nil || c
!= want
{
160 t
.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c
, err
, want
, nil)
162 c
, err
= buf
.ReadByte()
164 t
.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c
, err
, byte(0), io
.EOF
)
169 func TestLargeStringWrites(t
*testing
.T
) {
175 for i
:= 3; i
< limit
; i
+= 3 {
176 s
:= fillString(t
, "TestLargeWrites (1)", &buf
, "", 5, testString
)
177 empty(t
, "TestLargeStringWrites (2)", &buf
, s
, make([]byte, len(testString
)/i
))
179 check(t
, "TestLargeStringWrites (3)", &buf
, "")
182 func TestLargeByteWrites(t
*testing
.T
) {
188 for i
:= 3; i
< limit
; i
+= 3 {
189 s
:= fillBytes(t
, "TestLargeWrites (1)", &buf
, "", 5, testBytes
)
190 empty(t
, "TestLargeByteWrites (2)", &buf
, s
, make([]byte, len(testString
)/i
))
192 check(t
, "TestLargeByteWrites (3)", &buf
, "")
195 func TestLargeStringReads(t
*testing
.T
) {
197 for i
:= 3; i
< 30; i
+= 3 {
198 s
:= fillString(t
, "TestLargeReads (1)", &buf
, "", 5, testString
[0:len(testString
)/i
])
199 empty(t
, "TestLargeReads (2)", &buf
, s
, make([]byte, len(testString
)))
201 check(t
, "TestLargeStringReads (3)", &buf
, "")
204 func TestLargeByteReads(t
*testing
.T
) {
206 for i
:= 3; i
< 30; i
+= 3 {
207 s
:= fillBytes(t
, "TestLargeReads (1)", &buf
, "", 5, testBytes
[0:len(testBytes
)/i
])
208 empty(t
, "TestLargeReads (2)", &buf
, s
, make([]byte, len(testString
)))
210 check(t
, "TestLargeByteReads (3)", &buf
, "")
213 func TestMixedReadsAndWrites(t
*testing
.T
) {
216 for i
:= 0; i
< 50; i
++ {
217 wlen
:= rand
.Intn(len(testString
))
219 s
= fillString(t
, "TestMixedReadsAndWrites (1)", &buf
, s
, 1, testString
[0:wlen
])
221 s
= fillBytes(t
, "TestMixedReadsAndWrites (1)", &buf
, s
, 1, testBytes
[0:wlen
])
224 rlen
:= rand
.Intn(len(testString
))
225 fub
:= make([]byte, rlen
)
226 n
, _
:= buf
.Read(fub
)
229 empty(t
, "TestMixedReadsAndWrites (2)", &buf
, s
, make([]byte, buf
.Len()))
232 func TestCapWithPreallocatedSlice(t
*testing
.T
) {
233 buf
:= NewBuffer(make([]byte, 10))
236 t
.Errorf("expected 10, got %d", n
)
240 func TestCapWithSliceAndWrittenData(t
*testing
.T
) {
241 buf
:= NewBuffer(make([]byte, 0, 10))
242 buf
.Write([]byte("test"))
245 t
.Errorf("expected 10, got %d", n
)
249 func TestNil(t
*testing
.T
) {
251 if b
.String() != "<nil>" {
252 t
.Errorf("expected <nil>; got %q", b
.String())
256 func TestReadFrom(t
*testing
.T
) {
258 for i
:= 3; i
< 30; i
+= 3 {
259 s
:= fillBytes(t
, "TestReadFrom (1)", &buf
, "", 5, testBytes
[0:len(testBytes
)/i
])
262 empty(t
, "TestReadFrom (2)", &b
, s
, make([]byte, len(testString
)))
266 type panicReader
struct{ panic bool }
268 func (r panicReader
) Read(p
[]byte) (int, error
) {
275 // Make sure that an empty Buffer remains empty when
276 // it is "grown" before a Read that panics
277 func TestReadFromPanicReader(t
*testing
.T
) {
279 // First verify non-panic behaviour
281 i
, err
:= buf
.ReadFrom(panicReader
{})
286 t
.Fatalf("unexpected return from bytes.ReadFrom (1): got: %d, want %d", i
, 0)
288 check(t
, "TestReadFromPanicReader (1)", &buf
, "")
290 // Confirm that when Reader panics, the empty buffer remains empty
294 check(t
, "TestReadFromPanicReader (2)", &buf2
, "")
296 buf2
.ReadFrom(panicReader
{panic: true})
299 func TestReadFromNegativeReader(t
*testing
.T
) {
302 switch err
:= recover().(type) {
304 t
.Fatal("bytes.Buffer.ReadFrom didn't panic")
306 // this is the error string of errNegativeRead
307 wantError
:= "bytes.Buffer: reader returned negative count from Read"
308 if err
.Error() != wantError
{
309 t
.Fatalf("recovered panic: got %v, want %v", err
.Error(), wantError
)
312 t
.Fatalf("unexpected panic value: %#v", err
)
316 b
.ReadFrom(new(negativeReader
))
319 func TestWriteTo(t
*testing
.T
) {
321 for i
:= 3; i
< 30; i
+= 3 {
322 s
:= fillBytes(t
, "TestWriteTo (1)", &buf
, "", 5, testBytes
[0:len(testBytes
)/i
])
325 empty(t
, "TestWriteTo (2)", &b
, s
, make([]byte, len(testString
)))
329 func TestRuneIO(t
*testing
.T
) {
331 // Built a test slice while we write the data
332 b
:= make([]byte, utf8
.UTFMax
*NRune
)
335 for r
:= rune(0); r
< NRune
; r
++ {
336 size
:= utf8
.EncodeRune(b
[n
:], r
)
337 nbytes
, err
:= buf
.WriteRune(r
)
339 t
.Fatalf("WriteRune(%U) error: %s", r
, err
)
342 t
.Fatalf("WriteRune(%U) expected %d, got %d", r
, size
, nbytes
)
348 // Check the resulting bytes
349 if !Equal(buf
.Bytes(), b
) {
350 t
.Fatalf("incorrect result from WriteRune: %q not %q", buf
.Bytes(), b
)
353 p
:= make([]byte, utf8
.UTFMax
)
354 // Read it back with ReadRune
355 for r
:= rune(0); r
< NRune
; r
++ {
356 size
:= utf8
.EncodeRune(p
, r
)
357 nr
, nbytes
, err
:= buf
.ReadRune()
358 if nr
!= r || nbytes
!= size || err
!= nil {
359 t
.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r
, nr
, nbytes
, r
, size
, err
)
363 // Check that UnreadRune works
367 if err
:= buf
.UnreadRune(); err
== nil {
368 t
.Fatal("UnreadRune at EOF: got no error")
370 if _
, _
, err
:= buf
.ReadRune(); err
== nil {
371 t
.Fatal("ReadRune at EOF: got no error")
373 if err
:= buf
.UnreadRune(); err
== nil {
374 t
.Fatal("UnreadRune after ReadRune at EOF: got no error")
379 for r
:= rune(0); r
< NRune
; r
++ {
380 r1
, size
, _
:= buf
.ReadRune()
381 if err
:= buf
.UnreadRune(); err
!= nil {
382 t
.Fatalf("UnreadRune(%U) got error %q", r
, err
)
384 r2
, nbytes
, err
:= buf
.ReadRune()
385 if r1
!= r2 || r1
!= r || nbytes
!= size || err
!= nil {
386 t
.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r
, r2
, nbytes
, r
, size
, err
)
391 func TestWriteInvalidRune(t
*testing
.T
) {
392 // Invalid runes, including negative ones, should be written as
394 for _
, r
:= range []rune
{-1, utf8
.MaxRune
+ 1} {
397 check(t
, fmt
.Sprintf("TestWriteInvalidRune (%d)", r
), &buf
, "\uFFFD")
401 func TestNext(t
*testing
.T
) {
402 b
:= []byte{0, 1, 2, 3, 4}
403 tmp
:= make([]byte, 5)
404 for i
:= 0; i
<= 5; i
++ {
405 for j
:= i
; j
<= 5; j
++ {
406 for k
:= 0; k
<= 6; k
++ {
407 // 0 <= i <= j <= 5; 0 <= k <= 6
408 // Check that if we start with a buffer
409 // of length j at offset i and ask for
410 // Next(k), we get the right bytes.
411 buf
:= NewBuffer(b
[0:j
])
412 n
, _
:= buf
.Read(tmp
[0:i
])
414 t
.Fatalf("Read %d returned %d", i
, n
)
422 t
.Fatalf("in %d,%d: len(Next(%d)) == %d", i
, j
, k
, len(bb
))
424 for l
, v
:= range bb
{
426 t
.Fatalf("in %d,%d: Next(%d)[%d] = %d, want %d", i
, j
, k
, l
, v
, l
+i
)
434 var readBytesTests
= []struct {
440 {"", 0, []string{""}, io
.EOF
},
441 {"a\x00", 0, []string{"a\x00"}, nil},
442 {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
443 {"hello\x01world", 1, []string{"hello\x01"}, nil},
444 {"foo\nbar", 0, []string{"foo\nbar"}, io
.EOF
},
445 {"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil},
446 {"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, io
.EOF
},
449 func TestReadBytes(t
*testing
.T
) {
450 for _
, test
:= range readBytesTests
{
451 buf
:= NewBufferString(test
.buffer
)
453 for _
, expected
:= range test
.expected
{
455 bytes
, err
= buf
.ReadBytes(test
.delim
)
456 if string(bytes
) != expected
{
457 t
.Errorf("expected %q, got %q", expected
, bytes
)
464 t
.Errorf("expected error %v, got %v", test
.err
, err
)
469 func TestReadString(t
*testing
.T
) {
470 for _
, test
:= range readBytesTests
{
471 buf
:= NewBufferString(test
.buffer
)
473 for _
, expected
:= range test
.expected
{
475 s
, err
= buf
.ReadString(test
.delim
)
477 t
.Errorf("expected %q, got %q", expected
, s
)
484 t
.Errorf("expected error %v, got %v", test
.err
, err
)
489 func BenchmarkReadString(b
*testing
.B
) {
492 data
:= make([]byte, n
)
495 for i
:= 0; i
< b
.N
; i
++ {
496 buf
:= NewBuffer(data
)
497 _
, err
:= buf
.ReadString('x')
504 func TestGrow(t
*testing
.T
) {
507 tmp
:= make([]byte, 72)
508 for _
, growLen
:= range []int{0, 100, 1000, 10000, 100000} {
509 for _
, startLen
:= range []int{0, 100, 1000, 10000, 100000} {
510 xBytes
:= Repeat(x
, startLen
)
512 buf
:= NewBuffer(xBytes
)
513 // If we read, this affects buf.off, which is good to test.
514 readBytes
, _
:= buf
.Read(tmp
)
515 yBytes
:= Repeat(y
, growLen
)
516 allocs
:= testing
.AllocsPerRun(100, func() {
520 // Check no allocation occurs in write, as long as we're single-threaded.
522 t
.Errorf("allocation occurred during write")
524 // Check that buffer has correct data.
525 if !Equal(buf
.Bytes()[0:startLen
-readBytes
], xBytes
[readBytes
:]) {
526 t
.Errorf("bad initial data at %d %d", startLen
, growLen
)
528 if !Equal(buf
.Bytes()[startLen
-readBytes
:startLen
-readBytes
+growLen
], yBytes
) {
529 t
.Errorf("bad written data at %d %d", startLen
, growLen
)
535 func TestGrowOverflow(t
*testing
.T
) {
537 if err
:= recover(); err
!= ErrTooLarge
{
538 t
.Errorf("after too-large Grow, recover() = %v; want %v", err
, ErrTooLarge
)
542 buf
:= NewBuffer(make([]byte, 1))
543 const maxInt
= int(^uint(0) >> 1)
547 // Was a bug: used to give EOF reading empty slice at EOF.
548 func TestReadEmptyAtEOF(t
*testing
.T
) {
550 slice
:= make([]byte, 0)
551 n
, err
:= b
.Read(slice
)
553 t
.Errorf("read error: %v", err
)
556 t
.Errorf("wrong count; got %d want 0", n
)
560 func TestUnreadByte(t
*testing
.T
) {
564 if err
:= b
.UnreadByte(); err
== nil {
565 t
.Fatal("UnreadByte at EOF: got no error")
567 if _
, err
:= b
.ReadByte(); err
== nil {
568 t
.Fatal("ReadByte at EOF: got no error")
570 if err
:= b
.UnreadByte(); err
== nil {
571 t
.Fatal("UnreadByte after ReadByte at EOF: got no error")
575 b
.WriteString("abcdefghijklmnopqrstuvwxyz")
577 // after unsuccessful read
578 if n
, err
:= b
.Read(nil); n
!= 0 || err
!= nil {
579 t
.Fatalf("Read(nil) = %d,%v; want 0,nil", n
, err
)
581 if err
:= b
.UnreadByte(); err
== nil {
582 t
.Fatal("UnreadByte after Read(nil): got no error")
585 // after successful read
586 if _
, err
:= b
.ReadBytes('m'); err
!= nil {
587 t
.Fatalf("ReadBytes: %v", err
)
589 if err
:= b
.UnreadByte(); err
!= nil {
590 t
.Fatalf("UnreadByte: %v", err
)
592 c
, err
:= b
.ReadByte()
594 t
.Fatalf("ReadByte: %v", err
)
597 t
.Errorf("ReadByte = %q; want %q", c
, 'm')
601 // Tests that we occasionally compact. Issue 5154.
602 func TestBufferGrowth(t
*testing
.T
) {
604 buf
:= make([]byte, 1024)
607 for i
:= 0; i
< 5<<10; i
++ {
615 // (*Buffer).grow allows for 2x capacity slop before sliding,
616 // so set our error threshold at 3x.
618 t
.Errorf("buffer cap = %d; too big (grew from %d)", cap1
, cap0
)
622 func BenchmarkWriteByte(b
*testing
.B
) {
625 buf
:= NewBuffer(make([]byte, n
))
626 for i
:= 0; i
< b
.N
; i
++ {
628 for i
:= 0; i
< n
; i
++ {
634 func BenchmarkWriteRune(b
*testing
.B
) {
637 b
.SetBytes(int64(n
* utf8
.RuneLen(r
)))
638 buf
:= NewBuffer(make([]byte, n
*utf8
.UTFMax
))
639 for i
:= 0; i
< b
.N
; i
++ {
641 for i
:= 0; i
< n
; i
++ {
648 func BenchmarkBufferNotEmptyWriteRead(b
*testing
.B
) {
649 buf
:= make([]byte, 1024)
650 for i
:= 0; i
< b
.N
; i
++ {
653 for i
:= 0; i
< 5<<10; i
++ {
660 // Check that we don't compact too often. From Issue 5154.
661 func BenchmarkBufferFullSmallReads(b
*testing
.B
) {
662 buf
:= make([]byte, 1024)
663 for i
:= 0; i
< b
.N
; i
++ {
666 for b
.Len()+20 < b
.Cap() {
669 for i
:= 0; i
< 5<<10; i
++ {