The testing package does not allow t.Fatal to be called from a different goroutine; however, we do that if the testing server fails listen or accept connections. Since that is unexpected and rare, this patch turns those calls into panics.
77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package localrpc
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"io/fs"
|
|
"net"
|
|
"net/textproto"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func NewFakeServer(t *testing.T, path, output string) {
|
|
t.Helper()
|
|
lis, err := net.Listen("unix", path)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
for {
|
|
conn, err := lis.Accept()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
t.Logf("FakeServer %v: accepted ", conn)
|
|
|
|
name, inS, err := readRequest(
|
|
textproto.NewReader(bufio.NewReader(conn)))
|
|
t.Logf("FakeServer %v: readRequest: %q %q / %v", conn, name, inS, err)
|
|
|
|
n, err := conn.Write([]byte(output))
|
|
t.Logf("FakeServer %v: writeMessage(%q): %d %v",
|
|
conn, output, n, err)
|
|
|
|
t.Logf("FakeServer %v: closing", conn)
|
|
conn.Close()
|
|
}
|
|
}
|
|
|
|
func TestBadServer(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "rpc-test-*")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
socketPath := filepath.Join(tmpDir, "rpc.sock")
|
|
|
|
// textproto client expects a numeric code, this should cause ReadCodeLine
|
|
// to fail with textproto.ProtocolError.
|
|
go NewFakeServer(t, socketPath, "xxx")
|
|
waitForServer(t, socketPath)
|
|
|
|
client := NewClient(socketPath)
|
|
_, err = client.Call("Echo")
|
|
if err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
var protoErr textproto.ProtocolError
|
|
if !errors.As(err, &protoErr) {
|
|
t.Errorf("wanted textproto.ProtocolError, got: %v (%T)", err, err)
|
|
}
|
|
}
|
|
|
|
func TestBadSocket(t *testing.T) {
|
|
c := NewClient("/does/not/exist")
|
|
_, err := c.Call("Echo")
|
|
|
|
opErr, ok := err.(*net.OpError)
|
|
if !ok {
|
|
t.Fatalf("expected net.OpError, got %q (%T)", err, err)
|
|
}
|
|
if !errors.Is(err, fs.ErrNotExist) {
|
|
t.Errorf("wanted ErrNotExist, got: %q (%T)", opErr.Err, opErr.Err)
|
|
}
|
|
}
|