|  | // Copyright 2010 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 net | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | "io" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | func checkPipeWrite(t *testing.T, w io.Writer, data []byte, c chan int) { | 
|  | n, err := w.Write(data) | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | } | 
|  | if n != len(data) { | 
|  | t.Errorf("short write: %d != %d", n, len(data)) | 
|  | } | 
|  | c <- 0 | 
|  | } | 
|  |  | 
|  | func checkPipeRead(t *testing.T, r io.Reader, data []byte, wantErr error) { | 
|  | buf := make([]byte, len(data)+10) | 
|  | n, err := r.Read(buf) | 
|  | if err != wantErr { | 
|  | t.Error(err) | 
|  | return | 
|  | } | 
|  | if n != len(data) || !bytes.Equal(buf[0:n], data) { | 
|  | t.Errorf("bad read: got %q", buf[0:n]) | 
|  | return | 
|  | } | 
|  | } | 
|  |  | 
|  | // TestPipe tests a simple read/write/close sequence. | 
|  | // Assumes that the underlying io.Pipe implementation | 
|  | // is solid and we're just testing the net wrapping. | 
|  | func TestPipe(t *testing.T) { | 
|  | c := make(chan int) | 
|  | cli, srv := Pipe() | 
|  | go checkPipeWrite(t, cli, []byte("hello, world"), c) | 
|  | checkPipeRead(t, srv, []byte("hello, world"), nil) | 
|  | <-c | 
|  | go checkPipeWrite(t, srv, []byte("line 2"), c) | 
|  | checkPipeRead(t, cli, []byte("line 2"), nil) | 
|  | <-c | 
|  | go checkPipeWrite(t, cli, []byte("a third line"), c) | 
|  | checkPipeRead(t, srv, []byte("a third line"), nil) | 
|  | <-c | 
|  | go srv.Close() | 
|  | checkPipeRead(t, cli, nil, io.EOF) | 
|  | cli.Close() | 
|  | } |