|  | // Copyright 2009 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package io_test | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | . "io" | 
|  | "os" | 
|  | "strings" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | // An version of bytes.Buffer without ReadFrom and WriteTo | 
|  | type Buffer struct { | 
|  | bytes.Buffer | 
|  | ReaderFrom // conflicts with and hides bytes.Buffer's ReaderFrom. | 
|  | WriterTo   // conflicts with and hides bytes.Buffer's WriterTo. | 
|  | } | 
|  |  | 
|  | // Simple tests, primarily to verify the ReadFrom and WriteTo callouts inside Copy and Copyn. | 
|  |  | 
|  | func TestCopy(t *testing.T) { | 
|  | rb := new(Buffer) | 
|  | wb := new(Buffer) | 
|  | rb.WriteString("hello, world.") | 
|  | Copy(wb, rb) | 
|  | if wb.String() != "hello, world." { | 
|  | t.Errorf("Copy did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestCopyReadFrom(t *testing.T) { | 
|  | rb := new(Buffer) | 
|  | wb := new(bytes.Buffer) // implements ReadFrom. | 
|  | rb.WriteString("hello, world.") | 
|  | Copy(wb, rb) | 
|  | if wb.String() != "hello, world." { | 
|  | t.Errorf("Copy did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestCopyWriteTo(t *testing.T) { | 
|  | rb := new(bytes.Buffer) // implements WriteTo. | 
|  | wb := new(Buffer) | 
|  | rb.WriteString("hello, world.") | 
|  | Copy(wb, rb) | 
|  | if wb.String() != "hello, world." { | 
|  | t.Errorf("Copy did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestCopyn(t *testing.T) { | 
|  | rb := new(Buffer) | 
|  | wb := new(Buffer) | 
|  | rb.WriteString("hello, world.") | 
|  | Copyn(wb, rb, 5) | 
|  | if wb.String() != "hello" { | 
|  | t.Errorf("Copyn did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestCopynReadFrom(t *testing.T) { | 
|  | rb := new(Buffer) | 
|  | wb := new(bytes.Buffer) // implements ReadFrom. | 
|  | rb.WriteString("hello") | 
|  | Copyn(wb, rb, 5) | 
|  | if wb.String() != "hello" { | 
|  | t.Errorf("Copyn did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestCopynWriteTo(t *testing.T) { | 
|  | rb := new(bytes.Buffer) // implements WriteTo. | 
|  | wb := new(Buffer) | 
|  | rb.WriteString("hello, world.") | 
|  | Copyn(wb, rb, 5) | 
|  | if wb.String() != "hello" { | 
|  | t.Errorf("Copyn did not work properly") | 
|  | } | 
|  | } | 
|  |  | 
|  | type noReadFrom struct { | 
|  | w Writer | 
|  | } | 
|  |  | 
|  | func (w *noReadFrom) Write(p []byte) (n int, err os.Error) { | 
|  | return w.w.Write(p) | 
|  | } | 
|  |  | 
|  | func TestCopynEOF(t *testing.T) { | 
|  | // Test that EOF behavior is the same regardless of whether | 
|  | // argument to Copyn has ReadFrom. | 
|  |  | 
|  | b := new(bytes.Buffer) | 
|  |  | 
|  | n, err := Copyn(&noReadFrom{b}, strings.NewReader("foo"), 3) | 
|  | if n != 3 || err != nil { | 
|  | t.Errorf("Copyn(noReadFrom, foo, 3) = %d, %v; want 3, nil", n, err) | 
|  | } | 
|  |  | 
|  | n, err = Copyn(&noReadFrom{b}, strings.NewReader("foo"), 4) | 
|  | if n != 3 || err != os.EOF { | 
|  | t.Errorf("Copyn(noReadFrom, foo, 4) = %d, %v; want 3, EOF", n, err) | 
|  | } | 
|  |  | 
|  | n, err = Copyn(b, strings.NewReader("foo"), 3) // b has read from | 
|  | if n != 3 || err != nil { | 
|  | t.Errorf("Copyn(bytes.Buffer, foo, 3) = %d, %v; want 3, nil", n, err) | 
|  | } | 
|  |  | 
|  | n, err = Copyn(b, strings.NewReader("foo"), 4) // b has read from | 
|  | if n != 3 || err != os.EOF { | 
|  | t.Errorf("Copyn(bytes.Buffer, foo, 4) = %d, %v; want 3, EOF", n, err) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestReadAtLeast(t *testing.T) { | 
|  | var rb bytes.Buffer | 
|  | testReadAtLeast(t, &rb) | 
|  | } | 
|  |  | 
|  | // A version of bytes.Buffer that returns n > 0, os.EOF on Read | 
|  | // when the input is exhausted. | 
|  | type dataAndEOFBuffer struct { | 
|  | bytes.Buffer | 
|  | } | 
|  |  | 
|  | func (r *dataAndEOFBuffer) Read(p []byte) (n int, err os.Error) { | 
|  | n, err = r.Buffer.Read(p) | 
|  | if n > 0 && r.Buffer.Len() == 0 && err == nil { | 
|  | err = os.EOF | 
|  | } | 
|  | return | 
|  | } | 
|  |  | 
|  | func TestReadAtLeastWithDataAndEOF(t *testing.T) { | 
|  | var rb dataAndEOFBuffer | 
|  | testReadAtLeast(t, &rb) | 
|  | } | 
|  |  | 
|  | func testReadAtLeast(t *testing.T, rb ReadWriter) { | 
|  | rb.Write([]byte("0123")) | 
|  | buf := make([]byte, 2) | 
|  | n, err := ReadAtLeast(rb, buf, 2) | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | } | 
|  | n, err = ReadAtLeast(rb, buf, 4) | 
|  | if err != ErrShortBuffer { | 
|  | t.Errorf("expected ErrShortBuffer got %v", err) | 
|  | } | 
|  | if n != 0 { | 
|  | t.Errorf("expected to have read 0 bytes, got %v", n) | 
|  | } | 
|  | n, err = ReadAtLeast(rb, buf, 1) | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | } | 
|  | if n != 2 { | 
|  | t.Errorf("expected to have read 2 bytes, got %v", n) | 
|  | } | 
|  | n, err = ReadAtLeast(rb, buf, 2) | 
|  | if err != os.EOF { | 
|  | t.Errorf("expected EOF, got %v", err) | 
|  | } | 
|  | if n != 0 { | 
|  | t.Errorf("expected to have read 0 bytes, got %v", n) | 
|  | } | 
|  | rb.Write([]byte("4")) | 
|  | n, err = ReadAtLeast(rb, buf, 2) | 
|  | if err != ErrUnexpectedEOF { | 
|  | t.Errorf("expected ErrUnexpectedEOF, got %v", err) | 
|  | } | 
|  | if n != 1 { | 
|  | t.Errorf("expected to have read 1 bytes, got %v", n) | 
|  | } | 
|  | } |