package localrpc import ( "bufio" "bytes" "net" "net/textproto" "strings" "testing" "blitiri.com.ar/go/chasquid/internal/trace" ) func TestListenError(t *testing.T) { server := NewServer() err := server.ListenAndServe("/dev/null") if err == nil { t.Errorf("ListenAndServe(/dev/null) = nil, want error") } } // Test that the server can handle a broken client sending a bad request. func TestServerBadRequest(t *testing.T) { server := NewServer() server.Register("Echo", Echo) srvConn, cliConn := net.Pipe() defer srvConn.Close() defer cliConn.Close() // Client sends an invalid request. go cliConn.Write([]byte("Echo this is an ; invalid ; query\n")) // Servers will handle the connection, and should return an error. tr := trace.New("test", "TestBadRequest") defer tr.Finish() go server.handleConn(tr, srvConn) // Read the error that the server should have sent. code, msg, err := textproto.NewConn(cliConn).ReadResponse(0) if err != nil { t.Errorf("ReadResponse error: %q", err) } if code != 500 { t.Errorf("ReadResponse code %d, expected 500", code) } if !strings.Contains(msg, "invalid semicolon separator") { t.Errorf("ReadResponse message %q, does not contain 'invalid semicolon separator'", msg) } } func TestShortReadRequest(t *testing.T) { // This request is too short, it does not have any arguments. // This does not happen with the real client, but just in case. buf := bufio.NewReader(bytes.NewReader([]byte("Method\n"))) method, args, err := readRequest(textproto.NewReader(buf)) if err != nil { t.Errorf("readRequest error: %v", err) } if method != "Method" { t.Errorf("readRequest method %q, expected 'Method'", method) } if args != "" { t.Errorf("readRequest args %q, expected ''", args) } }