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