diff options
Diffstat (limited to 'src/pkg/bufio/bufio_test.go')
-rw-r--r-- | src/pkg/bufio/bufio_test.go | 193 |
1 files changed, 100 insertions, 93 deletions
diff --git a/src/pkg/bufio/bufio_test.go b/src/pkg/bufio/bufio_test.go index 38213ffe7..6463bbb9c 100644 --- a/src/pkg/bufio/bufio_test.go +++ b/src/pkg/bufio/bufio_test.go @@ -10,11 +10,10 @@ import ( "fmt" "io" "io/ioutil" - "os" "strings" "testing" "testing/iotest" - "utf8" + "unicode/utf8" ) // Reads from a reader and rot13s the result. @@ -28,7 +27,7 @@ func newRot13Reader(r io.Reader) *rot13Reader { return r13 } -func (r13 *rot13Reader) Read(p []byte) (int, os.Error) { +func (r13 *rot13Reader) Read(p []byte) (int, error) { n, e := r13.r.Read(p) if e != nil { return n, e @@ -50,14 +49,14 @@ func readBytes(buf *Reader) string { nb := 0 for { c, e := buf.ReadByte() - if e == os.EOF { + if e == io.EOF { break } if e == nil { b[nb] = c nb++ } else if e != iotest.ErrTimeout { - panic("Data: " + e.String()) + panic("Data: " + e.Error()) } } return string(b[0:nb]) @@ -95,11 +94,11 @@ func readLines(b *Reader) string { s := "" for { s1, e := b.ReadString('\n') - if e == os.EOF { + if e == io.EOF { break } if e != nil && e != iotest.ErrTimeout { - panic("GetLines: " + e.String()) + panic("GetLines: " + e.Error()) } s += s1 } @@ -113,7 +112,7 @@ func reads(buf *Reader, m int) string { for { n, e := buf.Read(b[nb : nb+m]) nb += n - if e == os.EOF { + if e == io.EOF { break } } @@ -136,9 +135,10 @@ var bufreaders = []bufReader{ {"lines", readLines}, } +const minReadBufferSize = 16 + var bufsizes = []int{ - 2, 3, 4, 5, 6, 7, 8, 9, 10, - 23, 32, 46, 64, 93, 128, 1024, 4096, + minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096, } func TestReader(t *testing.T) { @@ -179,13 +179,13 @@ type StringReader struct { step int } -func (r *StringReader) Read(p []byte) (n int, err os.Error) { +func (r *StringReader) Read(p []byte) (n int, err error) { if r.step < len(r.data) { s := r.data[r.step] n = copy(p, s) r.step++ } else { - err = os.EOF + err = io.EOF } return } @@ -195,14 +195,14 @@ func readRuneSegments(t *testing.T, segments []string) { want := strings.Join(segments, "") r := NewReader(&StringReader{data: segments}) for { - rune, _, err := r.ReadRune() + r, _, err := r.ReadRune() if err != nil { - if err != os.EOF { + if err != io.EOF { return } break } - got += string(rune) + got += string(r) } if got != want { t.Errorf("segments=%v got=%s want=%s", segments, got, want) @@ -233,24 +233,24 @@ func TestUnreadRune(t *testing.T) { r := NewReader(&StringReader{data: segments}) // Normal execution. for { - rune, _, err := r.ReadRune() + r1, _, err := r.ReadRune() if err != nil { - if err != os.EOF { + if err != io.EOF { t.Error("unexpected EOF") } break } - got += string(rune) + got += string(r1) // Put it back and read it again if err = r.UnreadRune(); err != nil { t.Error("unexpected error on UnreadRune:", err) } - rune1, _, err := r.ReadRune() + r2, _, err := r.ReadRune() if err != nil { t.Error("unexpected error reading after unreading:", err) } - if rune != rune1 { - t.Errorf("incorrect rune after unread: got %c wanted %c", rune1, rune) + if r1 != r2 { + t.Errorf("incorrect rune after unread: got %c wanted %c", r1, r2) } } if got != data { @@ -328,7 +328,7 @@ func TestUnreadRuneAtEOF(t *testing.T) { _, _, err := r.ReadRune() if err == nil { t.Error("expected error at EOF") - } else if err != os.EOF { + } else if err != io.EOF { t.Error("expected EOF; got", err) } } @@ -339,25 +339,25 @@ func TestReadWriteRune(t *testing.T) { w := NewWriter(byteBuf) // Write the runes out using WriteRune buf := make([]byte, utf8.UTFMax) - for rune := 0; rune < NRune; rune++ { - size := utf8.EncodeRune(buf, rune) - nbytes, err := w.WriteRune(rune) + for r := rune(0); r < NRune; r++ { + size := utf8.EncodeRune(buf, r) + nbytes, err := w.WriteRune(r) if err != nil { - t.Fatalf("WriteRune(0x%x) error: %s", rune, err) + t.Fatalf("WriteRune(0x%x) error: %s", r, err) } if nbytes != size { - t.Fatalf("WriteRune(0x%x) expected %d, got %d", rune, size, nbytes) + t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes) } } w.Flush() r := NewReader(byteBuf) // Read them back with ReadRune - for rune := 0; rune < NRune; rune++ { - size := utf8.EncodeRune(buf, rune) + for r1 := rune(0); r1 < NRune; r1++ { + size := utf8.EncodeRune(buf, r1) nr, nbytes, err := r.ReadRune() - if nr != rune || nbytes != size || err != nil { - t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r, nr, nbytes, r, size, err) + if nr != r1 || nbytes != size || err != nil { + t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err) } } } @@ -413,11 +413,11 @@ func TestWriter(t *testing.T) { type errorWriterTest struct { n, m int - err os.Error - expect os.Error + err error + expect error } -func (w errorWriterTest) Write(p []byte) (int, os.Error) { +func (w errorWriterTest) Write(p []byte) (int, error) { return len(p) * w.n / w.m, w.err } @@ -425,9 +425,9 @@ var errorWriterTests = []errorWriterTest{ {0, 1, nil, io.ErrShortWrite}, {1, 2, nil, io.ErrShortWrite}, {1, 1, nil, nil}, - {0, 1, os.EPIPE, os.EPIPE}, - {1, 2, os.EPIPE, os.EPIPE}, - {1, 1, os.EPIPE, os.EPIPE}, + {0, 1, io.ErrClosedPipe, io.ErrClosedPipe}, + {1, 2, io.ErrClosedPipe, io.ErrClosedPipe}, + {1, 1, io.ErrClosedPipe, io.ErrClosedPipe}, } func TestWriteErrors(t *testing.T) { @@ -515,27 +515,32 @@ func TestWriteString(t *testing.T) { } func TestBufferFull(t *testing.T) { - buf, _ := NewReaderSize(strings.NewReader("hello, world"), 5) - line, err := buf.ReadSlice(',') - if string(line) != "hello" || err != ErrBufferFull { + const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party" + buf, err := NewReaderSize(strings.NewReader(longString), minReadBufferSize) + if err != nil { + t.Fatal("NewReaderSize:", err) + } + line, err := buf.ReadSlice('!') + if string(line) != "And now, hello, " || err != ErrBufferFull { t.Errorf("first ReadSlice(,) = %q, %v", line, err) } - line, err = buf.ReadSlice(',') - if string(line) != "," || err != nil { + line, err = buf.ReadSlice('!') + if string(line) != "world!" || err != nil { t.Errorf("second ReadSlice(,) = %q, %v", line, err) } } func TestPeek(t *testing.T) { p := make([]byte, 10) - buf, _ := NewReaderSize(strings.NewReader("abcdefghij"), 4) + // string is 16 (minReadBufferSize) long. + buf, _ := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize) if s, err := buf.Peek(1); string(s) != "a" || err != nil { t.Fatalf("want %q got %q, err=%v", "a", string(s), err) } if s, err := buf.Peek(4); string(s) != "abcd" || err != nil { t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err) } - if _, err := buf.Peek(5); err != ErrBufferFull { + if _, err := buf.Peek(32); err != ErrBufferFull { t.Fatalf("want ErrBufFull got %v", err) } if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil { @@ -553,13 +558,13 @@ func TestPeek(t *testing.T) { if s, err := buf.Peek(4); string(s) != "ghij" || err != nil { t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err) } - if _, err := buf.Read(p[0:4]); string(p[0:4]) != "ghij" || err != nil { - t.Fatalf("want %q got %q, err=%v", "ghij", string(p[0:3]), err) + if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil { + t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err) } if s, err := buf.Peek(0); string(s) != "" || err != nil { t.Fatalf("want %q got %q, err=%v", "", string(s), err) } - if _, err := buf.Peek(1); err != os.EOF { + if _, err := buf.Peek(1); err != io.EOF { t.Fatalf("want EOF got %v", err) } } @@ -583,7 +588,7 @@ type testReader struct { stride int } -func (t *testReader) Read(buf []byte) (n int, err os.Error) { +func (t *testReader) Read(buf []byte) (n int, err error) { n = t.stride if n > len(t.data) { n = len(t.data) @@ -594,7 +599,7 @@ func (t *testReader) Read(buf []byte) (n int, err os.Error) { copy(buf, t.data) t.data = t.data[n:] if len(t.data) == 0 { - err = os.EOF + err = io.EOF } return } @@ -614,7 +619,7 @@ func testReadLine(t *testing.T, input []byte) { t.Errorf("ReadLine returned prefix") } if err != nil { - if err != os.EOF { + if err != io.EOF { t.Fatalf("Got unknown error: %s", err) } break @@ -636,19 +641,25 @@ func TestReadLine(t *testing.T) { } func TestLineTooLong(t *testing.T) { - buf := bytes.NewBuffer([]byte("aaabbbcc\n")) - l, _ := NewReaderSize(buf, 3) + data := make([]byte, 0) + for i := 0; i < minReadBufferSize*5/2; i++ { + data = append(data, '0'+byte(i%10)) + } + buf := bytes.NewBuffer(data) + l, _ := NewReaderSize(buf, minReadBufferSize) line, isPrefix, err := l.ReadLine() - if !isPrefix || !bytes.Equal(line, []byte("aaa")) || err != nil { - t.Errorf("bad result for first line: %x %s", line, err) + if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil { + t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err) } + data = data[len(line):] line, isPrefix, err = l.ReadLine() - if !isPrefix || !bytes.Equal(line, []byte("bbb")) || err != nil { - t.Errorf("bad result for second line: %x", line) + if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil { + t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err) } + data = data[len(line):] line, isPrefix, err = l.ReadLine() - if isPrefix || !bytes.Equal(line, []byte("cc")) || err != nil { - t.Errorf("bad result for third line: %x", line) + if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil { + t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err) } line, isPrefix, err = l.ReadLine() if isPrefix || err == nil { @@ -657,8 +668,8 @@ func TestLineTooLong(t *testing.T) { } func TestReadAfterLines(t *testing.T) { - line1 := "line1" - restData := "line2\nline 3\n" + line1 := "this is line1" + restData := "this is line2\nthis is line 3\n" inbuf := bytes.NewBuffer([]byte(line1 + "\n" + restData)) outbuf := new(bytes.Buffer) maxLineLength := len(line1) + len(restData)/2 @@ -677,15 +688,15 @@ func TestReadAfterLines(t *testing.T) { } func TestReadEmptyBuffer(t *testing.T) { - l, _ := NewReaderSize(bytes.NewBuffer(nil), 10) + l, _ := NewReaderSize(bytes.NewBuffer(nil), minReadBufferSize) line, isPrefix, err := l.ReadLine() - if err != os.EOF { + if err != io.EOF { t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err) } } func TestLinesAfterRead(t *testing.T) { - l, _ := NewReaderSize(bytes.NewBuffer([]byte("foo")), 10) + l, _ := NewReaderSize(bytes.NewBuffer([]byte("foo")), minReadBufferSize) _, err := ioutil.ReadAll(l) if err != nil { t.Error(err) @@ -693,59 +704,55 @@ func TestLinesAfterRead(t *testing.T) { } line, isPrefix, err := l.ReadLine() - if err != os.EOF { + if err != io.EOF { t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err) } } +func TestReadLineNonNilLineOrError(t *testing.T) { + r := NewReader(strings.NewReader("line 1\n")) + for i := 0; i < 2; i++ { + l, _, err := r.ReadLine() + if l != nil && err != nil { + t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both", + i+1, l, err) + } + } +} + type readLineResult struct { line []byte isPrefix bool - err os.Error + err error } var readLineNewlinesTests = []struct { - input string - bufSize int - expect []readLineResult + input string + expect []readLineResult }{ - {"h\r\nb\r\n", 2, []readLineResult{ - {[]byte("h"), true, nil}, - {nil, false, nil}, - {[]byte("b"), true, nil}, - {nil, false, nil}, - {nil, false, os.EOF}, - }}, - {"hello\r\nworld\r\n", 6, []readLineResult{ - {[]byte("hello"), true, nil}, + {"012345678901234\r\n012345678901234\r\n", []readLineResult{ + {[]byte("012345678901234"), true, nil}, {nil, false, nil}, - {[]byte("world"), true, nil}, + {[]byte("012345678901234"), true, nil}, {nil, false, nil}, - {nil, false, os.EOF}, + {nil, false, io.EOF}, }}, - {"hello\rworld\r", 6, []readLineResult{ - {[]byte("hello"), true, nil}, - {[]byte("\rworld"), true, nil}, - {[]byte("\r"), false, nil}, - {nil, false, os.EOF}, - }}, - {"h\ri\r\n\r", 2, []readLineResult{ - {[]byte("h"), true, nil}, - {[]byte("\ri"), true, nil}, - {nil, false, nil}, + {"0123456789012345\r012345678901234\r", []readLineResult{ + {[]byte("0123456789012345"), true, nil}, + {[]byte("\r012345678901234"), true, nil}, {[]byte("\r"), false, nil}, - {nil, false, os.EOF}, + {nil, false, io.EOF}, }}, } func TestReadLineNewlines(t *testing.T) { for _, e := range readLineNewlinesTests { - testReadLineNewlines(t, e.input, e.bufSize, e.expect) + testReadLineNewlines(t, e.input, e.expect) } } -func testReadLineNewlines(t *testing.T, input string, bufSize int, expect []readLineResult) { - b, err := NewReaderSize(strings.NewReader(input), bufSize) +func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) { + b, err := NewReaderSize(strings.NewReader(input), minReadBufferSize) if err != nil { t.Fatal(err) } |