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) } }