github.com/dahs81/otto@v0.2.1-0.20160126165905-6400716cf085/rpc/rpc_test.go (about) 1 package rpc 2 3 import ( 4 "io" 5 "net" 6 "net/rpc" 7 "testing" 8 9 "github.com/hashicorp/otto/app" 10 ) 11 12 func testConn(t *testing.T) (net.Conn, net.Conn) { 13 l, err := net.Listen("tcp", "127.0.0.1:0") 14 if err != nil { 15 t.Fatalf("err: %s", err) 16 } 17 18 var serverConn net.Conn 19 doneCh := make(chan struct{}) 20 go func() { 21 defer close(doneCh) 22 defer l.Close() 23 var err error 24 serverConn, err = l.Accept() 25 if err != nil { 26 t.Fatalf("err: %s", err) 27 } 28 }() 29 30 clientConn, err := net.Dial("tcp", l.Addr().String()) 31 if err != nil { 32 t.Fatalf("err: %s", err) 33 } 34 <-doneCh 35 36 return clientConn, serverConn 37 } 38 39 func testClientServer(t *testing.T) (*rpc.Client, *rpc.Server) { 40 clientConn, serverConn := testConn(t) 41 42 server := rpc.NewServer() 43 go server.ServeConn(serverConn) 44 45 client := rpc.NewClient(clientConn) 46 47 return client, server 48 } 49 50 func testNewClientServer(t *testing.T) (*Client, *Server, *testStreams) { 51 clientConn, serverConn := testConn(t) 52 53 server := &Server{ 54 AppFunc: testAppFixed(new(app.Mock)), 55 } 56 streams := testNewStreams(t, server) 57 go server.ServeConn(serverConn) 58 59 client, err := NewClient(clientConn) 60 if err != nil { 61 t.Fatalf("err: %s", err) 62 } 63 64 return client, server, streams 65 } 66 67 func testNewStreams(t *testing.T, s *Server) *testStreams { 68 stdout_r, stdout_w := io.Pipe() 69 stderr_r, stderr_w := io.Pipe() 70 71 s.Stdout = stdout_r 72 s.Stderr = stderr_r 73 74 return &testStreams{ 75 Stdout: stdout_w, 76 Stderr: stderr_w, 77 } 78 } 79 80 func testAppFixed(c app.App) AppFunc { 81 return func() app.App { 82 return c 83 } 84 } 85 86 type testStreams struct { 87 Stdout io.WriteCloser 88 Stderr io.WriteCloser 89 } 90 91 func (s *testStreams) Close() error { 92 s.Stdout.Close() 93 s.Stderr.Close() 94 return nil 95 }