func TestReaderErrors(t *testing.T) { // test nil reader _, err := readahead.NewReaderSize(nil, 4, 10000) if err == nil { t.Fatal("expected error when creating, but got nil") } // invalid buffer number buf := ioutil.NopCloser(bytes.NewBufferString("Testbuffer")) _, err = readahead.NewReaderSize(buf, 0, 10000) if err == nil { t.Fatal("expected error when creating, but got nil") } _, err = readahead.NewReaderSize(buf, -1, 10000) if err == nil { t.Fatal("expected error when creating, but got nil") } // invalid buffer size _, err = readahead.NewReaderSize(buf, 4, 0) if err == nil { t.Fatal("expected error when creating, but got nil") } _, err = readahead.NewReaderSize(buf, 4, -1) if err == nil { t.Fatal("expected error when creating, but got nil") } }
func TestReader(t *testing.T) { buf := bytes.NewBufferString("Testbuffer") ar, err := readahead.NewReaderSize(buf, 4, 10000) if err != nil { t.Fatal("error when creating:", err) } var dst = make([]byte, 100) n, err := ar.Read(dst) if err != nil { t.Fatal("error when reading:", err) } if n != 10 { t.Fatal("unexpected length, expected 10, got ", n) } n, err = ar.Read(dst) if err != io.EOF { t.Fatal("expected io.EOF, got", err) } if n != 0 { t.Fatal("unexpected length, expected 0, got ", n) } // Test read after error n, err = ar.Read(dst) if err != io.EOF { t.Fatal("expected io.EOF, got", err) } if n != 0 { t.Fatal("unexpected length, expected 0, got ", n) } err = ar.Close() if err != nil { t.Fatal("error when closing:", err) } // Test Close without reading everything buf = bytes.NewBuffer(make([]byte, 50000)) ar, err = readahead.NewReaderSize(buf, 4, 100) if err != nil { t.Fatal("error when creating:", err) } err = ar.Close() if err != nil { t.Fatal("error when closing:", err) } }
func TestWriteTo(t *testing.T) { buf := bytes.NewBufferString("Testbuffer") ar, err := readahead.NewReaderSize(buf, 4, 10000) if err != nil { t.Fatal("error when creating:", err) } var dst = &bytes.Buffer{} n, err := io.Copy(dst, ar) if err != io.EOF { t.Fatal("error when reading:", err) } if n != 10 { t.Fatal("unexpected length, expected 10, got ", n) } // Should still return EOF n, err = io.Copy(dst, ar) if err != io.EOF { t.Fatal("expected io.EOF, got", err) } if n != 0 { t.Fatal("unexpected length, expected 0, got ", n) } err = ar.Close() if err != nil { t.Fatal("error when closing:", err) } }
func TestWriteTo(t *testing.T) { buf := bytes.NewBufferString("Testbuffer") ar, err := readahead.NewReaderSize(buf, 4, 10000) if err != nil { t.Fatal("error when creating:", err) } var dst = &bytes.Buffer{} n, err := io.Copy(dst, ar) // A successful Copy returns err == nil, not err == EOF. // Because Copy is defined to read from src until EOF, // it does not treat an EOF from Read as an error to be reported. if err != nil { t.Fatal("error when reading:", err) } if n != 10 { t.Fatal("unexpected length, expected 10, got ", n) } // Should still return EOF n, err = io.Copy(dst, ar) if err != io.EOF { t.Fatal("expected io.EOF, got", err) } if n != 0 { t.Fatal("unexpected length, expected 0, got ", n) } err = ar.Close() if err != nil { t.Fatal("error when closing:", err) } }
// Test various input buffer sizes, number of buffers and read sizes. func TestReaderWriteTo(t *testing.T) { var texts [31]string str := "" all := "" for i := 0; i < len(texts)-1; i++ { texts[i] = str + "\n" all += texts[i] str += string(i%26 + 'a') } texts[len(texts)-1] = all for h := 0; h < len(texts); h++ { text := texts[h] for i := 0; i < len(readMakers); i++ { for j := 0; j < len(bufreaders); j++ { for k := 0; k < len(bufsizes); k++ { for l := 1; l < 10; l++ { readmaker := readMakers[i] bufreader := bufreaders[j] bufsize := bufsizes[k] read := readmaker.fn(strings.NewReader(text)) buf := bufio.NewReaderSize(read, bufsize) ar, _ := readahead.NewReaderSize(buf, l, 100) dst := &bytes.Buffer{} wt := ar.(io.WriterTo) _, err := wt.WriteTo(dst) if err != nil && err != io.EOF && err != iotest.ErrTimeout { t.Fatal("Copy:", err) } s := dst.String() // "timeout" expects the Reader to recover, asyncReader does not. if s != text && readmaker.name != "timeout" { t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q", readmaker.name, bufreader.name, bufsize, text, s) } err = ar.Close() if err != nil { t.Fatal("Unexpected close error:", err) } } } } } } }