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.
15 func checkWrite(t *testing.T, w Writer, data []byte, c chan int) {
16 n, err := w.Write(data)
18 t.Errorf("write: %v", err)
21 t.Errorf("short write: %d != %d", n, len(data))
26 // Test a single read/write pair.
27 func TestPipe1(t *testing.T) {
30 var buf = make([]byte, 64)
31 go checkWrite(t, w, []byte("hello, world"), c)
34 t.Errorf("read: %v", err)
35 } else if n != 12 || string(buf[0:12]) != "hello, world" {
36 t.Errorf("bad read: got %q", buf[0:n])
43 func reader(t *testing.T, r Reader, c chan int) {
44 var buf = make([]byte, 64)
52 t.Errorf("read: %v", err)
58 // Test a sequence of read/write pairs.
59 func TestPipe2(t *testing.T) {
63 var buf = make([]byte, 64)
64 for i := 0; i < 5; i++ {
68 t.Errorf("wrote %d, got %d", len(p), n)
71 t.Errorf("write: %v", err)
75 t.Errorf("wrote %d, read got %d", n, nn)
81 t.Errorf("final read got %d", nn)
85 type pipeReturn struct {
90 // Test a large write that requires multiple reads to satisfy.
91 func writer(w WriteCloser, buf []byte, c chan pipeReturn) {
92 n, err := w.Write(buf)
94 c <- pipeReturn{n, err}
97 func TestPipe3(t *testing.T) {
98 c := make(chan pipeReturn)
100 var wdat = make([]byte, 128)
101 for i := 0; i < len(wdat); i++ {
104 go writer(w, wdat, c)
105 var rdat = make([]byte, 1024)
107 for n := 1; n <= 256; n *= 2 {
108 nn, err := r.Read(rdat[tot : tot+n])
109 if err != nil && err != os.EOF {
110 t.Fatalf("read: %v", err)
113 // only final two reads should be short - 1 byte, then 0
120 t.Fatalf("read at end: %v", err)
124 t.Fatalf("read %d, expected %d, got %d", n, expect, nn)
129 if pr.n != 128 || pr.err != nil {
130 t.Fatalf("write 128: %d, %v", pr.n, pr.err)
133 t.Fatalf("total read %d != 128", tot)
135 for i := 0; i < 128; i++ {
136 if rdat[i] != byte(i) {
137 t.Fatalf("rdat[%d] = %d", i, rdat[i])
142 // Test read after/before writer close.
144 type closer interface {
145 CloseWithError(os.Error) os.Error
149 type pipeTest struct {
155 func (p pipeTest) String() string {
156 return fmt.Sprintf("async=%v err=%v closeWithError=%v", p.async, p.err, p.closeWithError)
159 var pipeTests = []pipeTest{
162 {true, ErrShortWrite, true},
165 {false, ErrShortWrite, true},
168 func delayClose(t *testing.T, cl closer, ch chan int, tt pipeTest) {
169 time.Sleep(1e6) // 1 ms
171 if tt.closeWithError {
172 err = cl.CloseWithError(tt.err)
177 t.Errorf("delayClose: %v", err)
182 func TestPipeReadClose(t *testing.T) {
183 for _, tt := range pipeTests {
184 c := make(chan int, 1)
187 go delayClose(t, w, c, tt)
189 delayClose(t, w, c, tt)
191 var buf = make([]byte, 64)
192 n, err := r.Read(buf)
199 t.Errorf("read from closed pipe: %v want %v", err, want)
202 t.Errorf("read on closed pipe returned %d", n)
204 if err = r.Close(); err != nil {
205 t.Errorf("r.Close: %v", err)
210 // Test close on Read side during Read.
211 func TestPipeReadClose2(t *testing.T) {
212 c := make(chan int, 1)
214 go delayClose(t, r, c, pipeTest{})
215 n, err := r.Read(make([]byte, 64))
217 if n != 0 || err != os.EINVAL {
218 t.Errorf("read from closed pipe: %v, %v want %v, %v", n, err, 0, os.EINVAL)
222 // Test write after/before reader close.
224 func TestPipeWriteClose(t *testing.T) {
225 for _, tt := range pipeTests {
226 c := make(chan int, 1)
229 go delayClose(t, r, c, tt)
231 delayClose(t, r, c, tt)
233 n, err := WriteString(w, "hello, world")
240 t.Errorf("write on closed pipe: %v want %v", err, expect)
243 t.Errorf("write on closed pipe returned %d", n)
245 if err = w.Close(); err != nil {
246 t.Errorf("w.Close: %v", err)
251 func TestWriteEmpty(t *testing.T) {
262 func TestWriteNil(t *testing.T) {