veyron/runtimes/google/ipc: fix handling of proxy address
This change makes it so that the proxy must be specified with a veyron
address or object name.
Fixes: https://github.com/veyron/release-issues/issues/588
Change-Id: Id17d470c0c45ee08a2b22d919d558274b6d505c1
diff --git a/runtimes/google/ipc/resolve_internal_test.go b/runtimes/google/ipc/resolve_internal_test.go
new file mode 100644
index 0000000..86ac229
--- /dev/null
+++ b/runtimes/google/ipc/resolve_internal_test.go
@@ -0,0 +1,9 @@
+package ipc
+
+import (
+ "veyron.io/veyron/veyron2/ipc"
+)
+
+func InternalServerResolveToEndpoint(s ipc.Server, name string) (string, error) {
+ return s.(*server).resolveToEndpoint(name)
+}
diff --git a/runtimes/google/ipc/resolve_test.go b/runtimes/google/ipc/resolve_test.go
new file mode 100644
index 0000000..6d97e6a
--- /dev/null
+++ b/runtimes/google/ipc/resolve_test.go
@@ -0,0 +1,83 @@
+package ipc_test
+
+import (
+ "fmt"
+ "testing"
+ "time"
+
+ "veyron.io/veyron/veyron2/naming"
+ "veyron.io/veyron/veyron2/rt"
+
+ "veyron.io/veyron/veyron/lib/expect"
+ "veyron.io/veyron/veyron/lib/modules"
+ "veyron.io/veyron/veyron/lib/modules/core"
+ iipc "veyron.io/veyron/veyron/runtimes/google/ipc"
+ inaming "veyron.io/veyron/veyron/runtimes/google/naming"
+)
+
+func startMT(t *testing.T, sh *modules.Shell) string {
+ h, err := sh.Start(core.RootMTCommand, nil, "--", "--veyron.tcp.address=127.0.0.1:0")
+ if err != nil {
+ t.Fatalf("unexpected error for root mt: %s", err)
+ }
+ s := expect.NewSession(t, h.Stdout(), time.Minute)
+ s.ExpectVar("PID")
+ return s.ExpectVar("MT_NAME")
+}
+
+func TestResolveToEndpoint(t *testing.T) {
+ sh, err := modules.NewShell(nil)
+ if err != nil {
+ t.Fatalf("modules.NewShell failed: %s", err)
+ }
+ defer sh.Cleanup(nil, nil)
+ root := startMT(t, sh)
+
+ runtime, err := rt.New()
+ if err != nil {
+ t.Fatalf("rt.New failed: %s", err)
+ }
+ defer runtime.Cleanup()
+ ns := runtime.Namespace()
+ ns.SetRoots(root)
+
+ proxyEp, _ := inaming.NewEndpoint("proxy.v.io:123")
+ proxyEpStr := proxyEp.String()
+ proxyAddr := naming.JoinAddressName(proxyEpStr, "")
+ if err := ns.Mount(runtime.NewContext(), "proxy", proxyAddr, time.Hour); err != nil {
+ t.Fatalf("ns.Mount failed: %s", err)
+ }
+
+ server, err := runtime.NewServer()
+ if err != nil {
+ t.Fatalf("runtime.NewServer failed: %s", err)
+ }
+
+ notfound := fmt.Errorf("not found")
+ testcases := []struct {
+ address string
+ result string
+ err error
+ }{
+ {"/proxy.v.io:123", proxyEpStr, nil},
+ {"proxy.v.io:123", "", notfound},
+ {"proxy", proxyEpStr, nil},
+ {naming.JoinAddressName(root, "proxy"), proxyEpStr, nil},
+ {proxyAddr, proxyEpStr, nil},
+ {proxyEpStr, "", notfound},
+ {"unknown", "", notfound},
+ }
+ for _, tc := range testcases {
+ result, err := iipc.InternalServerResolveToEndpoint(server, tc.address)
+ if (err == nil) != (tc.err == nil) {
+ t.Errorf("Unexpected err for %q. Got %v, expected %v", tc.address, err, tc.err)
+ }
+ if result != tc.result {
+ t.Errorf("Unexpected result for %q. Got %q, expected %q", tc.address, result, tc.result)
+ }
+ }
+ if t.Failed() {
+ t.Logf("proxyEpStr: %v", proxyEpStr)
+ t.Logf("proxyAddr: %v", proxyAddr)
+ }
+}
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 3462d38..ba7258a 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -145,12 +145,8 @@
return s.publisher.Published(), nil
}
-// resolveToAddress will try to resolve the input to an address using the
-// mount table, if the input is not already an address.
-func (s *server) resolveToAddress(address string) (string, error) {
- if _, err := inaming.NewEndpoint(address); err == nil {
- return address, nil
- }
+// resolveToEndpoint resolves an object name or address to an endpoint.
+func (s *server) resolveToEndpoint(address string) (string, error) {
var names []string
if s.ns != nil {
var entry *naming.MountEntry
@@ -476,7 +472,7 @@
}
func (s *server) reconnectAndPublishProxy(proxy string) (*inaming.Endpoint, stream.Listener, error) {
- resolved, err := s.resolveToAddress(proxy)
+ resolved, err := s.resolveToEndpoint(proxy)
if err != nil {
return nil, nil, fmt.Errorf("Failed to resolve proxy %q (%v)", proxy, err)
}