veyron/runtimes/google/namimg: allow 'addresses' to be stored in the mounttable and other 'cleanups'

It seems more natural to me to allow 'addresses' rather than 'names' to be
stored in the mount table, so that a name resolves to an address. In practice
we put endpoints in the mount table, represented as strings - i.e. not typed.
Before this CL the mount table would insist that all addresses be rooted names.
As an aside, there was bug wherebe such errors would not be reported to
the client which is fixed in this CL. This CL changes the mount table to
so that endpoint strings can be used directly without being turned into
names, there is still validation of these strings to make sure they
contain a correctly formed address.

In addition to the above, this CL 'cleans up' various inconsistent
uses of 'address' vs 'name' and changes some uses of Resolve to
ResolveX. In particular:

- the Endpoint interface now has a 'Name' method that returns a rooted
  name.
- the MountEntry type has two new methods:
  a. Names: to obtain a slice of names (endpoint plus suffix) replacing the
  ToStringSlice method
  b. MountedServers: to obtain the server addresses as rooted names
- MountEntry.Names, MountedServers or the values in MountEntry now
  cover all possible uses of the data returned by the Mount Table.
- Various 'modules' and tests have been updated to use 'names' exclusively.

We will need to push a new mount table for newly built clients to function.
Existing client/servers should work fine. I'll try this out on the new
'staging' setup if possible.

Change-Id: I4499fdf438a0e659c4fdc81ceed35c2b10fc596f
MultiPart: 1/3
diff --git a/runtimes/google/ipc/benchmark/glob/glob_test.go b/runtimes/google/ipc/benchmark/glob/glob_test.go
index 9c75c43..db032b3 100644
--- a/runtimes/google/ipc/benchmark/glob/glob_test.go
+++ b/runtimes/google/ipc/benchmark/glob/glob_test.go
@@ -90,8 +90,7 @@
 	if err := server.ServeDispatcher("", &disp{obj}); err != nil {
 		return "", nil, err
 	}
-	addr := naming.JoinAddressName(endpoints[0].String(), "")
-	return addr, func() { server.Stop() }, nil
+	return endpoints[0].Name(), func() { server.Stop() }, nil
 }
 
 type globObject struct {
diff --git a/runtimes/google/ipc/benchmark/server.go b/runtimes/google/ipc/benchmark/server.go
index 6a7963e..65926a4 100644
--- a/runtimes/google/ipc/benchmark/server.go
+++ b/runtimes/google/ipc/benchmark/server.go
@@ -6,7 +6,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/vlog"
 )
 
@@ -45,7 +44,7 @@
 	if err := server.Serve("", BenchmarkServer(&impl{}), flag.NewAuthorizerOrDie()); err != nil {
 		vlog.Fatalf("Serve failed: %v", err)
 	}
-	return naming.JoinAddressName(eps[0].String(), ""), func() {
+	return eps[0].Name(), func() {
 		if err := server.Stop(); err != nil {
 			vlog.Fatalf("Stop() failed: %v", err)
 		}
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index 5b3cda0..6ef039b 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -411,7 +411,7 @@
 			return nil, verror.RetryRefetch, verror.Make(verror.NoServers, ctx, name)
 		}
 		// An empty set of protocols means all protocols...
-		ordered, err := filterAndOrderServers(naming.ToStringSlice(resolved), c.preferredProtocols)
+		ordered, err := filterAndOrderServers(resolved.Names(), c.preferredProtocols)
 		if err != nil {
 			return nil, verror.RetryRefetch, verror.Make(verror.NoServers, ctx, name, err)
 		} else if len(ordered) == 0 {
diff --git a/runtimes/google/ipc/client_test.go b/runtimes/google/ipc/client_test.go
index 46b4360..ace8a6d 100644
--- a/runtimes/google/ipc/client_test.go
+++ b/runtimes/google/ipc/client_test.go
@@ -92,11 +92,11 @@
 }
 
 func numServers(t *testing.T, name string) int {
-	servers, err := veyron2.GetNamespace(gctx).Resolve(gctx, name)
+	me, err := veyron2.GetNamespace(gctx).ResolveX(gctx, name)
 	if err != nil {
 		return 0
 	}
-	return len(servers)
+	return len(me.Servers)
 }
 
 // TODO(cnicolaou): figure out how to test and see what the internals
@@ -191,8 +191,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	server.Serve("", &simple{done}, nil)
-	name := naming.JoinAddressName(eps[0].String(), "")
-	return name, deferFn
+	return eps[0].Name(), deferFn
 }
 
 func testForVerror(t *testing.T, err error, verr ...verror.IDAction) {
diff --git a/runtimes/google/ipc/debug_test.go b/runtimes/google/ipc/debug_test.go
index 1c5782c..ce4c5b1 100644
--- a/runtimes/google/ipc/debug_test.go
+++ b/runtimes/google/ipc/debug_test.go
@@ -54,8 +54,7 @@
 	ep := eps[0]
 	// Call the Foo method on ""
 	{
-		addr := naming.JoinAddressName(ep.String(), "")
-		call, err := client.StartCall(ctx, addr, "Foo", nil)
+		call, err := client.StartCall(ctx, ep.Name(), "Foo", nil)
 		if err != nil {
 			t.Fatalf("client.StartCall failed: %v", err)
 		}
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 55d4bcb..3db30e5 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -233,17 +233,18 @@
 }
 
 func verifyMount(t *testing.T, ns naming.Namespace, name string) []string {
-	addrs, err := ns.Resolve(testContext(), name)
+	me, err := ns.ResolveX(testContext(), name)
 	if err != nil {
 		t.Errorf("%s: %s not found in mounttable", loc(1), name)
 		return nil
 	}
-	return addrs
+	return me.Names()
 }
 
 func verifyMountMissing(t *testing.T, ns naming.Namespace, name string) {
-	if servers, err := ns.Resolve(testContext(), name); err == nil {
-		t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead", loc(1), name, len(servers))
+	if me, err := ns.ResolveX(testContext(), name); err == nil {
+		names := me.Names()
+		t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead: %v", loc(1), name, len(names), names)
 	}
 }
 
@@ -273,18 +274,23 @@
 	vlog.VI(1).Info("server.Stop DONE")
 }
 
-func resolveWSEndpoint(ns naming.Namespace, name string) (string, error) {
+// fakeWSName creates a name containing a endpoint address that forces
+// the use of websockets. It does so by resolving the original name
+// and choosing the 'ws' endpoint from the set of endpoints returned.
+// It must return a name since it'll be passed to StartCall.
+func fakeWSName(ns naming.Namespace, name string) (string, error) {
 	// Find the ws endpoint and use that.
-	servers, err := ns.Resolve(testContext(), name)
+	me, err := ns.ResolveX(testContext(), name)
 	if err != nil {
 		return "", err
 	}
-	for _, s := range servers {
+	names := me.Names()
+	for _, s := range names {
 		if strings.Index(s, "@ws@") != -1 {
 			return s, nil
 		}
 	}
-	return "", fmt.Errorf("No ws endpoint found %v", servers)
+	return "", fmt.Errorf("No ws endpoint found %v", names)
 }
 
 type bundle struct {
@@ -575,7 +581,7 @@
 		vname := test.name
 		if shouldUseWebsocket {
 			var err error
-			vname, err = resolveWSEndpoint(b.ns, vname)
+			vname, err = fakeWSName(b.ns, vname)
 			if err != nil && err != test.startErr {
 				t.Errorf(`%s ns.Resolve got error "%v", want "%v"`, name(test), err, test.startErr)
 				continue
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 850c601..432242e 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -161,7 +161,7 @@
 		if entry, err = s.ns.ResolveX(s.ctx, address); err != nil {
 			return "", err
 		}
-		names = naming.ToStringSlice(entry)
+		names = entry.Names()
 	} else {
 		names = append(names, address)
 	}
@@ -472,7 +472,7 @@
 	}
 	eps := make([]naming.Endpoint, len(ieps))
 	for i, iep := range ieps {
-		s.publisher.AddServer(naming.JoinAddressName(iep.String(), ""), s.servesMountTable)
+		s.publisher.AddServer(iep.String(), s.servesMountTable)
 		eps[i] = iep
 	}
 	return eps, nil
@@ -495,7 +495,7 @@
 	s.Lock()
 	s.listeners[ln] = struct{}{}
 	s.Unlock()
-	s.publisher.AddServer(naming.JoinAddressName(iep.String(), ""), s.servesMountTable)
+	s.publisher.AddServer(iep.String(), s.servesMountTable)
 	return iep, ln, nil
 }
 
@@ -524,7 +524,7 @@
 			s.listenLoop(ln, iep)
 			// The listener is done, so:
 			// (1) Unpublish its name
-			s.publisher.RemoveServer(naming.JoinAddressName(iep.String(), ""))
+			s.publisher.RemoveServer(iep.String())
 		}
 
 		s.Lock()
@@ -611,7 +611,7 @@
 	// Publish all of the addresses
 	for _, pubAddr := range dhcpl.pubAddrs {
 		ep.Address = net.JoinHostPort(pubAddr.Address().String(), dhcpl.pubPort)
-		s.publisher.AddServer(naming.JoinAddressName(ep.String(), ""), s.servesMountTable)
+		s.publisher.AddServer(ep.String(), s.servesMountTable)
 	}
 
 	for setting := range dhcpl.ch {
@@ -655,6 +655,7 @@
 }
 
 func (s *server) Serve(name string, obj interface{}, authorizer security.Authorizer) error {
+	defer vlog.LogCall()()
 	invoker, err := objectToInvoker(obj)
 	if err != nil {
 		return s.newBadArg(fmt.Sprintf("bad object: %v", err))
@@ -663,6 +664,7 @@
 }
 
 func (s *server) ServeDispatcher(name string, disp ipc.Dispatcher) error {
+	defer vlog.LogCall()()
 	s.Lock()
 	defer s.Unlock()
 	vtrace.GetSpan(s.ctx).Annotate("Serving under name: " + name)
@@ -686,6 +688,7 @@
 }
 
 func (s *server) AddName(name string) error {
+	defer vlog.LogCall()()
 	s.Lock()
 	defer s.Unlock()
 	vtrace.GetSpan(s.ctx).Annotate("Serving under name: " + name)
@@ -706,6 +709,7 @@
 }
 
 func (s *server) RemoveName(name string) error {
+	defer vlog.LogCall()()
 	s.Lock()
 	defer s.Unlock()
 	vtrace.GetSpan(s.ctx).Annotate("Removed name: " + name)
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index ed8f611..9a2975c 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -102,7 +102,7 @@
 	session := expect.NewSession(t, server.Stdout(), time.Minute)
 	session.ReadLine()
 	serverName := session.ExpectVar("NAME")
-	serverEP := session.ExpectVar("ADDR")
+	serverEP, _ := naming.SplitAddressName(serverName)
 	ep, _ := inaming.NewEndpoint(serverEP)
 	makeCall := func() (string, error) {
 		ctx, _ := context.WithDeadline(testContext(), time.Now().Add(10*time.Second))
@@ -168,7 +168,6 @@
 	h.proxy = p
 	s := expect.NewSession(t, p.Stdout(), time.Minute)
 	s.ReadLine()
-	s.ReadLine()
 	h.name = s.ExpectVar("PROXY_NAME")
 	if len(h.name) == 0 {
 		t.Fatalf("failed to get PROXY_NAME from proxyd")
@@ -263,8 +262,8 @@
 	waitfor := func(expect int) {
 		then := time.Now().Add(time.Minute)
 		for {
-			addrs, _ := ns.Resolve(testContext(), name)
-			if len(addrs) == expect {
+			me, err := ns.ResolveX(testContext(), name)
+			if err == nil && len(me.Servers) == expect {
 				close(ch)
 				return
 			}
@@ -280,14 +279,14 @@
 		t.Fatalf("unexpected error for %q: %s", proxyEP, err)
 	}
 	proxiedEP.RID = naming.FixedRoutingID(0x555555555)
-	expectedEndpoints := []string{proxiedEP.String()}
+	expectedNames := []string{naming.JoinAddressName(proxiedEP.String(), "suffix")}
 	if hasLocalListener {
-		expectedEndpoints = append(expectedEndpoints, eps[0].String())
+		expectedNames = append(expectedNames, naming.JoinAddressName(eps[0].String(), "suffix"))
 	}
 
 	// Proxy connetions are created asynchronously, so we wait for the
 	// expected number of endpoints to appear for the specified service name.
-	go waitfor(len(expectedEndpoints))
+	go waitfor(len(expectedNames))
 	select {
 	case <-time.After(time.Minute):
 		t.Fatalf("timedout waiting for two entries in the mount table")
@@ -296,13 +295,12 @@
 
 	got := []string{}
 	for _, s := range verifyMount(t, ns, name) {
-		addr, _ := naming.SplitAddressName(s)
-		got = append(got, addr)
+		got = append(got, s)
 	}
 	sort.Strings(got)
-	sort.Strings(expectedEndpoints)
-	if !reflect.DeepEqual(got, expectedEndpoints) {
-		t.Errorf("got %v, want %v", got, expectedEndpoints)
+	sort.Strings(expectedNames)
+	if !reflect.DeepEqual(got, expectedNames) {
+		t.Errorf("got %v, want %v", got, expectedNames)
 	}
 
 	if hasLocalListener {
@@ -311,13 +309,12 @@
 		// the local endpoint from the mount table entry!  We have to remove both
 		// the tcp and the websocket address.
 		sep := eps[0].String()
-		//wsep := strings.Replace(sep, "@tcp@", "@ws@", 1)
-		ns.Unmount(testContext(), "mountpoint/server", naming.JoinAddressName(sep, ""))
+		ns.Unmount(testContext(), "mountpoint/server", sep)
 	}
 
 	addrs = verifyMount(t, ns, name)
 	if len(addrs) != 1 {
-		t.Fatalf("failed to lookup proxy")
+		t.Fatalf("failed to lookup proxy: addrs %v", addrs)
 	}
 
 	// Proxied endpoint should be published and RPC should succeed (through proxy)
@@ -329,12 +326,13 @@
 	if err := proxy.Stop(); err != nil {
 		t.Fatal(err)
 	}
+
 	if result, err := makeCall(); err == nil || (!strings.HasPrefix(err.Error(), "RESOLVE") && !strings.Contains(err.Error(), "EOF")) {
 		t.Fatalf(`Got (%v, %v) want ("", "RESOLVE: <err>" or "EOF") as proxy is down`, result, err)
 	}
 
 	for {
-		if _, err := ns.Resolve(testContext(), name); err != nil {
+		if _, err := ns.ResolveX(testContext(), name); err != nil {
 			break
 		}
 		time.Sleep(10 * time.Millisecond)
diff --git a/runtimes/google/ipc/stream/vc/vc_test.go b/runtimes/google/ipc/stream/vc/vc_test.go
index 3c05f16..aa6e129 100644
--- a/runtimes/google/ipc/stream/vc/vc_test.go
+++ b/runtimes/google/ipc/stream/vc/vc_test.go
@@ -529,6 +529,7 @@
 func (e endpoint) Network() string             { return "test" }
 func (e endpoint) VersionedString(int) string  { return e.String() }
 func (e endpoint) String() string              { return naming.RoutingID(e).String() }
+func (e endpoint) Name() string                { return naming.JoinAddressName(e.String(), "") }
 func (e endpoint) RoutingID() naming.RoutingID { return naming.RoutingID(e) }
 func (e endpoint) Addr() net.Addr              { return nil }
 func (e endpoint) ServesMountTable() bool      { return false }
diff --git a/runtimes/google/lib/publisher/publisher_test.go b/runtimes/google/lib/publisher/publisher_test.go
index 7169025..c0d0c4d 100644
--- a/runtimes/google/lib/publisher/publisher_test.go
+++ b/runtimes/google/lib/publisher/publisher_test.go
@@ -40,11 +40,11 @@
 	pub := publisher.New(testContext(), ns, time.Second)
 	pub.AddName("foo")
 	pub.AddServer("foo-addr", false)
-	if got, want := resolve(t, ns, "foo"), []string{"foo-addr"}; !reflect.DeepEqual(got, want) {
+	if got, want := resolve(t, ns, "foo"), []string{"/foo-addr"}; !reflect.DeepEqual(got, want) {
 		t.Errorf("got %q, want %q", got, want)
 	}
 	pub.AddServer("bar-addr", false)
-	got, want := resolve(t, ns, "foo"), []string{"bar-addr", "foo-addr"}
+	got, want := resolve(t, ns, "foo"), []string{"/bar-addr", "/foo-addr"}
 	sort.Strings(got)
 	if !reflect.DeepEqual(got, want) {
 		t.Errorf("got %q, want %q", got, want)
diff --git a/runtimes/google/naming/endpoint.go b/runtimes/google/naming/endpoint.go
index 31d4db1..b5f20a8 100644
--- a/runtimes/google/naming/endpoint.go
+++ b/runtimes/google/naming/endpoint.go
@@ -204,6 +204,11 @@
 	return ep.VersionedString(defaultVersion)
 }
 
+func (ep *Endpoint) Name() string {
+	//nologcall
+	return naming.JoinAddressName(ep.String(), "")
+}
+
 func (ep *Endpoint) Addr() net.Addr {
 	//nologcall
 	return &addr{network: ep.Protocol, address: ep.Address}
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index b63b54d..406a884 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -140,28 +140,28 @@
 	}
 }
 
-func doResolveTest(t *testing.T, fname string, f func(*context.T, string, ...naming.ResolveOpt) ([]string, error), ctx *context.T, name string, want []string, opts ...naming.ResolveOpt) {
-	servers, err := f(ctx, name, opts...)
+func doResolveTest(t *testing.T, fname string, f func(*context.T, string, ...naming.ResolveOpt) (*naming.MountEntry, error), ctx *context.T, name string, want []string, opts ...naming.ResolveOpt) {
+	me, err := f(ctx, name, opts...)
 	if err != nil {
 		boom(t, "Failed to %s %s: %s", fname, name, err)
 	}
-	compare(t, fname, name, servers, want)
+	compare(t, fname, name, me.Names(), want)
 }
 
 func testResolveToMountTable(t *testing.T, ctx *context.T, ns naming.Namespace, name string, want ...string) {
-	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTable, ctx, name, want)
+	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTableX, ctx, name, want)
 }
 
 func testResolveToMountTableWithPattern(t *testing.T, ctx *context.T, ns naming.Namespace, name string, pattern naming.ResolveOpt, want ...string) {
-	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTable, ctx, name, want, pattern)
+	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTableX, ctx, name, want, pattern)
 }
 
 func testResolve(t *testing.T, ctx *context.T, ns naming.Namespace, name string, want ...string) {
-	doResolveTest(t, "Resolve", ns.Resolve, ctx, name, want)
+	doResolveTest(t, "Resolve", ns.ResolveX, ctx, name, want)
 }
 
 func testResolveWithPattern(t *testing.T, ctx *context.T, ns naming.Namespace, name string, pattern naming.ResolveOpt, want ...string) {
-	doResolveTest(t, "Resolve", ns.Resolve, ctx, name, want, pattern)
+	doResolveTest(t, "Resolve", ns.ResolveX, ctx, name, want, pattern)
 }
 
 type serverEntry struct {
@@ -197,8 +197,7 @@
 	if err := s.ServeDispatcher(mountPoint, disp); err != nil {
 		boom(t, "Failed to serve mount table at %s: %s", mountPoint, err)
 	}
-	name := naming.JoinAddressName(eps[0].String(), "")
-	return &serverEntry{mountPoint: mountPoint, server: s, endpoint: eps[0], name: name}
+	return &serverEntry{mountPoint: mountPoint, server: s, endpoint: eps[0], name: eps[0].Name()}
 }
 
 const (
@@ -306,8 +305,7 @@
 	}
 }
 
-// TestNamespaceDetails tests more detailed use of the Namespace library,
-// including the intricacies of // meaning and placement.
+// TestNamespaceDetails tests more detailed use of the Namespace library.
 func TestNamespaceDetails(t *testing.T) {
 	sc, c, cleanup := createRuntimes(t)
 	defer cleanup()
@@ -564,7 +562,7 @@
 	for i := 0; i < 40; i++ {
 		cycle += "/c3/c4"
 	}
-	if _, err := ns.Resolve(c, "c1/"+cycle); !verror.Is(err, naming.ErrResolutionDepthExceeded.ID) {
+	if _, err := ns.ResolveX(c, "c1/"+cycle); !verror.Is(err, naming.ErrResolutionDepthExceeded.ID) {
 		boom(t, "Failed to detect cycle")
 	}
 
diff --git a/runtimes/google/naming/namespace/glob.go b/runtimes/google/naming/namespace/glob.go
index 40a3951..0b85a21 100644
--- a/runtimes/google/naming/namespace/glob.go
+++ b/runtimes/google/naming/namespace/glob.go
@@ -56,7 +56,9 @@
 
 		// Don't further resolve s.Server.
 		callCtx, _ := context.WithTimeout(ctx, callTimeout)
-		call, err := client.StartCall(callCtx, s.Server, ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
+		// Make sure that we turn the s.Server address or name into a rooted name.
+		serverName := naming.JoinAddressName(s.Server, "")
+		call, err := client.StartCall(callCtx, serverName, ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
 		if err != nil {
 			lastErr = err
 			continue // try another instance
diff --git a/runtimes/google/naming/namespace/mount.go b/runtimes/google/naming/namespace/mount.go
index 7af3cf2..9b7d186 100644
--- a/runtimes/google/naming/namespace/mount.go
+++ b/runtimes/google/naming/namespace/mount.go
@@ -27,7 +27,7 @@
 	if err != nil {
 		return
 	}
-	if ierr := call.Finish(&err); ierr != nil {
+	if ierr := call.Finish(&s.err); ierr != nil {
 		s.err = ierr
 	}
 	return
diff --git a/runtimes/google/naming/namespace/resolve.go b/runtimes/google/naming/namespace/resolve.go
index 61631b7..bc79cc8 100644
--- a/runtimes/google/naming/namespace/resolve.go
+++ b/runtimes/google/naming/namespace/resolve.go
@@ -125,7 +125,7 @@
 	if err != nil {
 		return nil, err
 	}
-	return naming.ToStringSlice(e), nil
+	return e.Names(), nil
 }
 
 // ResolveToMountTableX implements veyron2/naming.Namespace.
@@ -186,7 +186,7 @@
 	if err != nil {
 		return nil, err
 	}
-	return naming.ToStringSlice(e), nil
+	return e.Names(), nil
 }
 
 // FlushCache flushes the most specific entry found for name.  It returns true if anything was
diff --git a/runtimes/google/rt/mgmt.go b/runtimes/google/rt/mgmt.go
index 4599eee..e617410 100644
--- a/runtimes/google/rt/mgmt.go
+++ b/runtimes/google/rt/mgmt.go
@@ -8,7 +8,6 @@
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/mgmt"
-	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/options"
 
 	"v.io/core/veyron/lib/exec"
@@ -51,7 +50,7 @@
 		server.Stop()
 		return nil, err
 	}
-	err = rt.callbackToParent(parentName, naming.JoinAddressName(eps[0].String(), ""))
+	err = rt.callbackToParent(parentName, eps[0].Name())
 	if err != nil {
 		server.Stop()
 		return nil, err
diff --git a/runtimes/google/rt/mgmt_test.go b/runtimes/google/rt/mgmt_test.go
index 450f23b..d735fe3 100644
--- a/runtimes/google/rt/mgmt_test.go
+++ b/runtimes/google/rt/mgmt_test.go
@@ -298,7 +298,7 @@
 	if err := server.Serve("", device.ConfigServer(&configServer{ch}), vflag.NewAuthorizerOrDie()); err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
-	return server, naming.JoinAddressName(eps[0].String(), ""), ch
+	return server, eps[0].Name(), ch
 }
 
 func setupRemoteAppCycleMgr(t *testing.T) (*context.T, modules.Handle, appcycle.AppCycleClientMethods, func()) {
diff --git a/runtimes/google/testing/mocks/naming/namespace.go b/runtimes/google/testing/mocks/naming/namespace.go
index 3665bb2..c46eca8 100644
--- a/runtimes/google/testing/mocks/naming/namespace.go
+++ b/runtimes/google/testing/mocks/naming/namespace.go
@@ -77,7 +77,7 @@
 			suffix := strings.TrimLeft(strings.TrimPrefix(name, prefix), "/")
 			var ret []string
 			for _, s := range servers {
-				ret = append(ret, naming.Join(s, suffix))
+				ret = append(ret, naming.JoinAddressName(s, suffix))
 			}
 			return ret, nil
 		}