* cp-tree.h (build_noexcept_spec, add_exception_specifier): Adjust
[official-gcc.git] / libgo / go / bytes / buffer_test.go
blobe4bbc12f6a13524f6009c805468a5d7574b1a276
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.
5 package bytes_test
7 import (
8 . "bytes"
9 "io"
10 "math/rand"
11 "runtime"
12 "testing"
13 "unicode/utf8"
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 }
24 func init() {
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) {
34 bytes := buf.Bytes()
35 str := buf.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)
58 for ; n > 0; n-- {
59 m, err := buf.WriteString(fus)
60 if m != len(fus) {
61 t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fus))
63 if err != nil {
64 t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
66 s += fus
67 check(t, testname+" (fill 4)", buf, s)
69 return 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)
77 for ; n > 0; n-- {
78 m, err := buf.Write(fub)
79 if m != len(fub) {
80 t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fub))
82 if err != nil {
83 t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
85 s += string(fub)
86 check(t, testname+" (fill 4)", buf, s)
88 return 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)
106 for {
107 n, err := buf.Read(fub)
108 if n == 0 {
109 break
111 if err != nil {
112 t.Errorf(testname+" (empty 2): err should always be nil, found err == %s", err)
114 s = s[n:]
115 check(t, testname+" (empty 3)", buf, s)
118 check(t, testname+" (empty 4)", buf, "")
121 func TestBasicOperations(t *testing.T) {
122 var buf Buffer
124 for i := 0; i < 5; i++ {
125 check(t, "TestBasicOperations (1)", &buf, "")
127 buf.Reset()
128 check(t, "TestBasicOperations (2)", &buf, "")
130 buf.Truncate(0)
131 check(t, "TestBasicOperations (3)", &buf, "")
133 n, err := buf.Write(testBytes[0:1])
134 if n != 1 {
135 t.Errorf("wrote 1 byte, but n == %d", n)
137 if err != nil {
138 t.Errorf("err should always be nil, but err == %s", err)
140 check(t, "TestBasicOperations (4)", &buf, "a")
142 buf.WriteByte(testString[1])
143 check(t, "TestBasicOperations (5)", &buf, "ab")
145 n, err = buf.Write(testBytes[2:26])
146 if n != 24 {
147 t.Errorf("wrote 24 bytes, but n == %d", n)
149 check(t, "TestBasicOperations (6)", &buf, testString[0:26])
151 buf.Truncate(26)
152 check(t, "TestBasicOperations (7)", &buf, testString[0:26])
154 buf.Truncate(20)
155 check(t, "TestBasicOperations (8)", &buf, testString[0:20])
157 empty(t, "TestBasicOperations (9)", &buf, testString[0:20], make([]byte, 5))
158 empty(t, "TestBasicOperations (10)", &buf, "", make([]byte, 100))
160 buf.WriteByte(testString[1])
161 c, err := buf.ReadByte()
162 if err != nil {
163 t.Error("ReadByte unexpected eof")
165 if c != testString[1] {
166 t.Errorf("ReadByte wrong value c=%v", c)
168 c, err = buf.ReadByte()
169 if err == nil {
170 t.Error("ReadByte unexpected not eof")
175 func TestLargeStringWrites(t *testing.T) {
176 var buf Buffer
177 limit := 30
178 if testing.Short() {
179 limit = 9
181 for i := 3; i < limit; i += 3 {
182 s := fillString(t, "TestLargeWrites (1)", &buf, "", 5, testString)
183 empty(t, "TestLargeStringWrites (2)", &buf, s, make([]byte, len(testString)/i))
185 check(t, "TestLargeStringWrites (3)", &buf, "")
188 func TestLargeByteWrites(t *testing.T) {
189 var buf Buffer
190 limit := 30
191 if testing.Short() {
192 limit = 9
194 for i := 3; i < limit; i += 3 {
195 s := fillBytes(t, "TestLargeWrites (1)", &buf, "", 5, testBytes)
196 empty(t, "TestLargeByteWrites (2)", &buf, s, make([]byte, len(testString)/i))
198 check(t, "TestLargeByteWrites (3)", &buf, "")
201 func TestLargeStringReads(t *testing.T) {
202 var buf Buffer
203 for i := 3; i < 30; i += 3 {
204 s := fillString(t, "TestLargeReads (1)", &buf, "", 5, testString[0:len(testString)/i])
205 empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(testString)))
207 check(t, "TestLargeStringReads (3)", &buf, "")
210 func TestLargeByteReads(t *testing.T) {
211 var buf Buffer
212 for i := 3; i < 30; i += 3 {
213 s := fillBytes(t, "TestLargeReads (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
214 empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(testString)))
216 check(t, "TestLargeByteReads (3)", &buf, "")
219 func TestMixedReadsAndWrites(t *testing.T) {
220 var buf Buffer
221 s := ""
222 for i := 0; i < 50; i++ {
223 wlen := rand.Intn(len(testString))
224 if i%2 == 0 {
225 s = fillString(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, testString[0:wlen])
226 } else {
227 s = fillBytes(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, testBytes[0:wlen])
230 rlen := rand.Intn(len(testString))
231 fub := make([]byte, rlen)
232 n, _ := buf.Read(fub)
233 s = s[n:]
235 empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len()))
238 func TestCapWithPreallocatedSlice(t *testing.T) {
239 buf := NewBuffer(make([]byte, 10))
240 n := buf.Cap()
241 if n != 10 {
242 t.Errorf("expected 10, got %d", n)
246 func TestCapWithSliceAndWrittenData(t *testing.T) {
247 buf := NewBuffer(make([]byte, 0, 10))
248 buf.Write([]byte("test"))
249 n := buf.Cap()
250 if n != 10 {
251 t.Errorf("expected 10, got %d", n)
255 func TestNil(t *testing.T) {
256 var b *Buffer
257 if b.String() != "<nil>" {
258 t.Errorf("expected <nil>; got %q", b.String())
262 func TestReadFrom(t *testing.T) {
263 var buf Buffer
264 for i := 3; i < 30; i += 3 {
265 s := fillBytes(t, "TestReadFrom (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
266 var b Buffer
267 b.ReadFrom(&buf)
268 empty(t, "TestReadFrom (2)", &b, s, make([]byte, len(testString)))
272 func TestReadFromNegativeReader(t *testing.T) {
273 var b Buffer
274 defer func() {
275 switch err := recover().(type) {
276 case nil:
277 t.Fatal("bytes.Buffer.ReadFrom didn't panic")
278 case error:
279 // this is the error string of errNegativeRead
280 wantError := "bytes.Buffer: reader returned negative count from Read"
281 if err.Error() != wantError {
282 t.Fatalf("recovered panic: got %v, want %v", err.Error(), wantError)
284 default:
285 t.Fatalf("unexpected panic value: %#v", err)
289 b.ReadFrom(new(negativeReader))
292 func TestWriteTo(t *testing.T) {
293 var buf Buffer
294 for i := 3; i < 30; i += 3 {
295 s := fillBytes(t, "TestWriteTo (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
296 var b Buffer
297 buf.WriteTo(&b)
298 empty(t, "TestWriteTo (2)", &b, s, make([]byte, len(testString)))
302 func TestRuneIO(t *testing.T) {
303 const NRune = 1000
304 // Built a test slice while we write the data
305 b := make([]byte, utf8.UTFMax*NRune)
306 var buf Buffer
307 n := 0
308 for r := rune(0); r < NRune; r++ {
309 size := utf8.EncodeRune(b[n:], r)
310 nbytes, err := buf.WriteRune(r)
311 if err != nil {
312 t.Fatalf("WriteRune(%U) error: %s", r, err)
314 if nbytes != size {
315 t.Fatalf("WriteRune(%U) expected %d, got %d", r, size, nbytes)
317 n += size
319 b = b[0:n]
321 // Check the resulting bytes
322 if !Equal(buf.Bytes(), b) {
323 t.Fatalf("incorrect result from WriteRune: %q not %q", buf.Bytes(), b)
326 p := make([]byte, utf8.UTFMax)
327 // Read it back with ReadRune
328 for r := rune(0); r < NRune; r++ {
329 size := utf8.EncodeRune(p, r)
330 nr, nbytes, err := buf.ReadRune()
331 if nr != r || nbytes != size || err != nil {
332 t.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r, nr, nbytes, r, size, err)
336 // Check that UnreadRune works
337 buf.Reset()
339 // check at EOF
340 if err := buf.UnreadRune(); err == nil {
341 t.Fatal("UnreadRune at EOF: got no error")
343 if _, _, err := buf.ReadRune(); err == nil {
344 t.Fatal("ReadRune at EOF: got no error")
346 if err := buf.UnreadRune(); err == nil {
347 t.Fatal("UnreadRune after ReadRune at EOF: got no error")
350 // check not at EOF
351 buf.Write(b)
352 for r := rune(0); r < NRune; r++ {
353 r1, size, _ := buf.ReadRune()
354 if err := buf.UnreadRune(); err != nil {
355 t.Fatalf("UnreadRune(%U) got error %q", r, err)
357 r2, nbytes, err := buf.ReadRune()
358 if r1 != r2 || r1 != r || nbytes != size || err != nil {
359 t.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r, r2, nbytes, r, size, err)
364 func TestNext(t *testing.T) {
365 b := []byte{0, 1, 2, 3, 4}
366 tmp := make([]byte, 5)
367 for i := 0; i <= 5; i++ {
368 for j := i; j <= 5; j++ {
369 for k := 0; k <= 6; k++ {
370 // 0 <= i <= j <= 5; 0 <= k <= 6
371 // Check that if we start with a buffer
372 // of length j at offset i and ask for
373 // Next(k), we get the right bytes.
374 buf := NewBuffer(b[0:j])
375 n, _ := buf.Read(tmp[0:i])
376 if n != i {
377 t.Fatalf("Read %d returned %d", i, n)
379 bb := buf.Next(k)
380 want := k
381 if want > j-i {
382 want = j - i
384 if len(bb) != want {
385 t.Fatalf("in %d,%d: len(Next(%d)) == %d", i, j, k, len(bb))
387 for l, v := range bb {
388 if v != byte(l+i) {
389 t.Fatalf("in %d,%d: Next(%d)[%d] = %d, want %d", i, j, k, l, v, l+i)
397 var readBytesTests = []struct {
398 buffer string
399 delim byte
400 expected []string
401 err error
403 {"", 0, []string{""}, io.EOF},
404 {"a\x00", 0, []string{"a\x00"}, nil},
405 {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
406 {"hello\x01world", 1, []string{"hello\x01"}, nil},
407 {"foo\nbar", 0, []string{"foo\nbar"}, io.EOF},
408 {"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil},
409 {"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, io.EOF},
412 func TestReadBytes(t *testing.T) {
413 for _, test := range readBytesTests {
414 buf := NewBufferString(test.buffer)
415 var err error
416 for _, expected := range test.expected {
417 var bytes []byte
418 bytes, err = buf.ReadBytes(test.delim)
419 if string(bytes) != expected {
420 t.Errorf("expected %q, got %q", expected, bytes)
422 if err != nil {
423 break
426 if err != test.err {
427 t.Errorf("expected error %v, got %v", test.err, err)
432 func TestReadString(t *testing.T) {
433 for _, test := range readBytesTests {
434 buf := NewBufferString(test.buffer)
435 var err error
436 for _, expected := range test.expected {
437 var s string
438 s, err = buf.ReadString(test.delim)
439 if s != expected {
440 t.Errorf("expected %q, got %q", expected, s)
442 if err != nil {
443 break
446 if err != test.err {
447 t.Errorf("expected error %v, got %v", test.err, err)
452 func BenchmarkReadString(b *testing.B) {
453 const n = 32 << 10
455 data := make([]byte, n)
456 data[n-1] = 'x'
457 b.SetBytes(int64(n))
458 for i := 0; i < b.N; i++ {
459 buf := NewBuffer(data)
460 _, err := buf.ReadString('x')
461 if err != nil {
462 b.Fatal(err)
467 func TestGrow(t *testing.T) {
468 x := []byte{'x'}
469 y := []byte{'y'}
470 tmp := make([]byte, 72)
471 for _, startLen := range []int{0, 100, 1000, 10000, 100000} {
472 xBytes := Repeat(x, startLen)
473 for _, growLen := range []int{0, 100, 1000, 10000, 100000} {
474 buf := NewBuffer(xBytes)
475 // If we read, this affects buf.off, which is good to test.
476 readBytes, _ := buf.Read(tmp)
477 buf.Grow(growLen)
478 yBytes := Repeat(y, growLen)
479 // Check no allocation occurs in write, as long as we're single-threaded.
480 var m1, m2 runtime.MemStats
481 runtime.ReadMemStats(&m1)
482 buf.Write(yBytes)
483 runtime.ReadMemStats(&m2)
484 if runtime.GOMAXPROCS(-1) == 1 && m1.Mallocs != m2.Mallocs {
485 t.Errorf("allocation occurred during write")
487 // Check that buffer has correct data.
488 if !Equal(buf.Bytes()[0:startLen-readBytes], xBytes[readBytes:]) {
489 t.Errorf("bad initial data at %d %d", startLen, growLen)
491 if !Equal(buf.Bytes()[startLen-readBytes:startLen-readBytes+growLen], yBytes) {
492 t.Errorf("bad written data at %d %d", startLen, growLen)
498 func TestGrowOverflow(t *testing.T) {
499 defer func() {
500 if err := recover(); err != ErrTooLarge {
501 t.Errorf("after too-large Grow, recover() = %v; want %v", err, ErrTooLarge)
505 buf := NewBuffer(make([]byte, 1))
506 const maxInt = int(^uint(0) >> 1)
507 buf.Grow(maxInt)
510 // Was a bug: used to give EOF reading empty slice at EOF.
511 func TestReadEmptyAtEOF(t *testing.T) {
512 b := new(Buffer)
513 slice := make([]byte, 0)
514 n, err := b.Read(slice)
515 if err != nil {
516 t.Errorf("read error: %v", err)
518 if n != 0 {
519 t.Errorf("wrong count; got %d want 0", n)
523 func TestUnreadByte(t *testing.T) {
524 b := new(Buffer)
526 // check at EOF
527 if err := b.UnreadByte(); err == nil {
528 t.Fatal("UnreadByte at EOF: got no error")
530 if _, err := b.ReadByte(); err == nil {
531 t.Fatal("ReadByte at EOF: got no error")
533 if err := b.UnreadByte(); err == nil {
534 t.Fatal("UnreadByte after ReadByte at EOF: got no error")
537 // check not at EOF
538 b.WriteString("abcdefghijklmnopqrstuvwxyz")
540 // after unsuccessful read
541 if n, err := b.Read(nil); n != 0 || err != nil {
542 t.Fatalf("Read(nil) = %d,%v; want 0,nil", n, err)
544 if err := b.UnreadByte(); err == nil {
545 t.Fatal("UnreadByte after Read(nil): got no error")
548 // after successful read
549 if _, err := b.ReadBytes('m'); err != nil {
550 t.Fatalf("ReadBytes: %v", err)
552 if err := b.UnreadByte(); err != nil {
553 t.Fatalf("UnreadByte: %v", err)
555 c, err := b.ReadByte()
556 if err != nil {
557 t.Fatalf("ReadByte: %v", err)
559 if c != 'm' {
560 t.Errorf("ReadByte = %q; want %q", c, 'm')
564 // Tests that we occasionally compact. Issue 5154.
565 func TestBufferGrowth(t *testing.T) {
566 var b Buffer
567 buf := make([]byte, 1024)
568 b.Write(buf[0:1])
569 var cap0 int
570 for i := 0; i < 5<<10; i++ {
571 b.Write(buf)
572 b.Read(buf)
573 if i == 0 {
574 cap0 = b.Cap()
577 cap1 := b.Cap()
578 // (*Buffer).grow allows for 2x capacity slop before sliding,
579 // so set our error threshold at 3x.
580 if cap1 > cap0*3 {
581 t.Errorf("buffer cap = %d; too big (grew from %d)", cap1, cap0)
585 func BenchmarkWriteByte(b *testing.B) {
586 const n = 4 << 10
587 b.SetBytes(n)
588 buf := NewBuffer(make([]byte, n))
589 for i := 0; i < b.N; i++ {
590 buf.Reset()
591 for i := 0; i < n; i++ {
592 buf.WriteByte('x')
597 func BenchmarkWriteRune(b *testing.B) {
598 const n = 4 << 10
599 const r = '☺'
600 b.SetBytes(int64(n * utf8.RuneLen(r)))
601 buf := NewBuffer(make([]byte, n*utf8.UTFMax))
602 for i := 0; i < b.N; i++ {
603 buf.Reset()
604 for i := 0; i < n; i++ {
605 buf.WriteRune(r)
610 // From Issue 5154.
611 func BenchmarkBufferNotEmptyWriteRead(b *testing.B) {
612 buf := make([]byte, 1024)
613 for i := 0; i < b.N; i++ {
614 var b Buffer
615 b.Write(buf[0:1])
616 for i := 0; i < 5<<10; i++ {
617 b.Write(buf)
618 b.Read(buf)
623 // Check that we don't compact too often. From Issue 5154.
624 func BenchmarkBufferFullSmallReads(b *testing.B) {
625 buf := make([]byte, 1024)
626 for i := 0; i < b.N; i++ {
627 var b Buffer
628 b.Write(buf)
629 for b.Len()+20 < b.Cap() {
630 b.Write(buf[:10])
632 for i := 0; i < 5<<10; i++ {
633 b.Read(buf[:1])
634 b.Write(buf[:1])