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  }