ipc: Get rid of vc.LocalPrincipal and vc.AnonymousPrincipal.

This involved:
(1) Getting principal from ctx in client.StartCall.
(2) This means all ipc tests need to use the fake profile.
(3) Manager Dial, InternalNewDialedVIf, and vf.Dial take a principal as well.
(4) VCMap in client.go must also be keys by the publicKey of the principal
    since the principal can vary per call.

Change-Id: I7f8ed573499376343b675b616f05f02590dfb8f0
diff --git a/profiles/internal/ipc/full_test.go b/profiles/internal/ipc/full_test.go
index f351b1d..c2a64cf 100644
--- a/profiles/internal/ipc/full_test.go
+++ b/profiles/internal/ipc/full_test.go
@@ -15,6 +15,7 @@
 	"testing"
 	"time"
 
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/ipc"
 	"v.io/v23/naming"
@@ -30,7 +31,6 @@
 	"v.io/x/ref/profiles/internal/ipc/stream"
 
 	"v.io/x/lib/netstate"
-	"v.io/x/ref/lib/flags"
 	"v.io/x/ref/lib/stats"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/ws"
@@ -41,7 +41,6 @@
 	"v.io/x/ref/profiles/internal/lib/websocket"
 	inaming "v.io/x/ref/profiles/internal/naming"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
-	ivtrace "v.io/x/ref/profiles/internal/vtrace"
 	tsecurity "v.io/x/ref/test/security"
 	"v.io/x/ref/test/testutil"
 )
@@ -74,16 +73,6 @@
 	c.Unlock()
 }
 
-func testContextWithoutDeadline() *context.T {
-	ctx, _ := context.RootContext()
-	ctx, err := ivtrace.Init(ctx, flags.VtraceFlags{})
-	if err != nil {
-		panic(err)
-	}
-	ctx, _ = vtrace.SetNewTrace(ctx)
-	return ctx
-}
-
 func testInternalNewServer(ctx *context.T, streamMgr stream.Manager, ns ns.Namespace, principal security.Principal, opts ...ipc.ServerOpt) (ipc.Server, error) {
 	client, err := InternalNewClient(streamMgr, ns)
 	if err != nil {
@@ -229,8 +218,8 @@
 	return call.LocalPrincipal().MintDischarge(cav, expiry)
 }
 
-func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
-	return startServerWS(t, principal, sm, ns, name, disp, noWebsocket, opts...)
+func startServer(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+	return startServerWS(t, ctx, principal, sm, ns, name, disp, noWebsocket, opts...)
 }
 
 func endpointsToStrings(eps []naming.Endpoint) []string {
@@ -242,9 +231,8 @@
 	return r
 }
 
-func startServerWS(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+func startServerWS(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
 	vlog.VI(1).Info("InternalNewServer")
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -279,8 +267,8 @@
 	return fmt.Sprintf("%s:%d", filepath.Base(file), line)
 }
 
-func verifyMount(t *testing.T, ns ns.Namespace, name string) []string {
-	me, err := ns.Resolve(testContext(), name)
+func verifyMount(t *testing.T, ctx *context.T, ns ns.Namespace, name string) []string {
+	me, err := ns.Resolve(ctx, name)
 	if err != nil {
 		t.Errorf("%s: %s not found in mounttable", loc(1), name)
 		return nil
@@ -288,30 +276,30 @@
 	return me.Names()
 }
 
-func verifyMountMissing(t *testing.T, ns ns.Namespace, name string) {
-	if me, err := ns.Resolve(testContext(), name); err == nil {
+func verifyMountMissing(t *testing.T, ctx *context.T, ns ns.Namespace, name string) {
+	if me, err := ns.Resolve(ctx, name); err == nil {
 		names := me.Names()
 		t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead: %v (%+v)", loc(1), name, len(names), names, me)
 	}
 }
 
-func stopServer(t *testing.T, server ipc.Server, ns ns.Namespace, name string) {
+func stopServer(t *testing.T, ctx *context.T, server ipc.Server, ns ns.Namespace, name string) {
 	vlog.VI(1).Info("server.Stop")
 	new_name := "should_appear_in_mt/server"
-	verifyMount(t, ns, name)
+	verifyMount(t, ctx, ns, name)
 
 	// publish a second name
 	if err := server.AddName(new_name); err != nil {
 		t.Errorf("server.Serve failed: %v", err)
 	}
-	verifyMount(t, ns, new_name)
+	verifyMount(t, ctx, ns, new_name)
 
 	if err := server.Stop(); err != nil {
 		t.Errorf("server.Stop failed: %v", err)
 	}
 
-	verifyMountMissing(t, ns, name)
-	verifyMountMissing(t, ns, new_name)
+	verifyMountMissing(t, ctx, ns, name)
+	verifyMountMissing(t, ctx, ns, new_name)
 
 	// Check that we can no longer serve after Stop.
 	err := server.AddName("name doesn't matter")
@@ -325,9 +313,9 @@
 // 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 ns.Namespace, name string) (string, error) {
+func fakeWSName(ctx *context.T, ns ns.Namespace, name string) (string, error) {
 	// Find the ws endpoint and use that.
-	me, err := ns.Resolve(testContext(), name)
+	me, err := ns.Resolve(ctx, name)
 	if err != nil {
 		return "", err
 	}
@@ -349,31 +337,29 @@
 	name   string
 }
 
-func (b bundle) cleanup(t *testing.T) {
+func (b bundle) cleanup(t *testing.T, ctx *context.T) {
 	if b.server != nil {
-		stopServer(t, b.server, b.ns, b.name)
+		stopServer(t, ctx, b.server, b.ns, b.name)
 	}
 	if b.client != nil {
 		b.client.Close()
 	}
 }
 
-func createBundle(t *testing.T, client, server security.Principal, ts interface{}) (b bundle) {
-	return createBundleWS(t, client, server, ts, noWebsocket)
+func createBundle(t *testing.T, ctx *context.T, server security.Principal, ts interface{}) (b bundle) {
+	return createBundleWS(t, ctx, server, ts, noWebsocket)
 }
 
-func createBundleWS(t *testing.T, client, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
+func createBundleWS(t *testing.T, ctx *context.T, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
 	b.sm = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	b.ns = tnaming.NewSimpleNamespace()
 	b.name = "mountpoint/server"
 	if server != nil {
-		b.ep, b.server = startServerWS(t, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
+		b.ep, b.server = startServerWS(t, ctx, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
 	}
-	if client != nil {
-		var err error
-		if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{client}); err != nil {
-			t.Fatalf("InternalNewClient failed: %v", err)
-		}
+	var err error
+	if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
+		t.Fatalf("InternalNewClient failed: %v", err)
 	}
 	return
 }
@@ -388,13 +374,13 @@
 	return verror.Is(err, id.ID)
 }
 
-func runServer(t *testing.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
+func runServer(t *testing.T, ctx *context.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
 	rid, err := naming.NewRoutingID()
 	if err != nil {
 		t.Fatal(err)
 	}
 	sm := imanager.InternalNew(rid)
-	server, err := testInternalNewServer(testContext(), sm, ns, principal, opts...)
+	server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -410,7 +396,8 @@
 func TestMultipleCallsToServeAndName(t *testing.T) {
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -430,7 +417,7 @@
 	n3 := "should_appear_in_mt/server"
 	n4 := "should_not_appear_in_mt/server"
 
-	verifyMount(t, ns, n1)
+	verifyMount(t, ctx, ns, n1)
 
 	if server.ServeDispatcher(n2, disp) == nil {
 		t.Errorf("server.ServeDispatcher should have failed")
@@ -447,26 +434,26 @@
 	if err := server.AddName(n3); err != nil {
 		t.Errorf("server.AddName failed: %v", err)
 	}
-	verifyMount(t, ns, n2)
-	verifyMount(t, ns, n3)
+	verifyMount(t, ctx, ns, n2)
+	verifyMount(t, ctx, ns, n3)
 
 	server.RemoveName(n1)
-	verifyMountMissing(t, ns, n1)
+	verifyMountMissing(t, ctx, ns, n1)
 
 	server.RemoveName("some randome name")
 
 	if err := server.ServeDispatcher(n4, &testServerDisp{&testServer{}}); err == nil {
 		t.Errorf("server.ServeDispatcher should have failed")
 	}
-	verifyMountMissing(t, ns, n4)
+	verifyMountMissing(t, ctx, ns, n4)
 
 	if err := server.Stop(); err != nil {
 		t.Errorf("server.Stop failed: %v", err)
 	}
 
-	verifyMountMissing(t, ns, n1)
-	verifyMountMissing(t, ns, n2)
-	verifyMountMissing(t, ns, n3)
+	verifyMountMissing(t, ctx, ns, n1)
+	verifyMountMissing(t, ctx, ns, n2)
+	verifyMountMissing(t, ctx, ns, n3)
 }
 
 func TestRPCServerAuthorization(t *testing.T) {
@@ -544,12 +531,15 @@
 		}
 	)
 
-	_, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, "mountpoint/server")
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
+	_, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, "mountpoint/server")
 
 	// Start the discharge server.
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
 
 	// Make the client and server principals trust root certificates from
 	// pprovider
@@ -568,12 +558,13 @@
 			t.Fatalf("Set failed on server's BlessingStore: %v", err)
 		}
 		// Recreate client in each test (so as to not re-use VCs to the server).
-		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(mgr, ns)
 		if err != nil {
 			t.Errorf("%s: failed to create client: %v", name, err)
 			continue
 		}
-		ctx, cancel := context.WithTimeout(testContextWithoutDeadline(), 10*time.Second)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		ctx, cancel := context.WithCancel(ctx)
 		call, err := client.StartCall(ctx, test.name, "Method", nil, test.opt)
 		if !matchesErrorPattern(err, test.errID, test.err) {
 			t.Errorf(`%s: client.StartCall: got error "%v", want to match "%v"`, name, err, test.err)
@@ -598,10 +589,12 @@
 func TestServerManInTheMiddleAttack(t *testing.T) {
 	// Test scenario: A server mounts itself, but then some other service
 	// somehow "takes over" the endpoint, thus trying to steal traffic.
+	ctx, shutdown := initForTest()
+	defer shutdown()
 
 	// Start up the attacker's server.
 	attacker, err := testInternalNewServer(
-		testContext(),
+		ctx,
 		imanager.InternalNew(naming.FixedRoutingID(0xaaaaaaaaaaaaaaaa)),
 		// (To prevent the attacker for legitimately mounting on the
 		// namespace that the client will use, provide it with a
@@ -627,7 +620,7 @@
 	// The legitimate server would have mounted the same endpoint on the
 	// namespace.
 	ns := tnaming.NewSimpleNamespace()
-	if err := ns.Mount(testContext(), "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
+	if err := ns.Mount(ctx, "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
 		t.Fatal(err)
 	}
 
@@ -637,17 +630,18 @@
 	client, err := InternalNewClient(
 		imanager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc)),
 		ns,
-		vc.LocalPrincipal{tsecurity.NewPrincipal("client")})
+	)
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer client.Close()
-	if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
 		t.Errorf("Got error %v (errorid=%v), want errorid=%v", err, verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 	// But the RPC should succeed if the client explicitly
 	// decided to skip server authorization.
-	if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
+	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
 		t.Errorf("Unexpected error(%v) when skipping server authorization", err)
 	}
 }
@@ -715,9 +709,13 @@
 		pserver = tsecurity.NewPrincipal("server")
 		pclient = tsecurity.NewPrincipal("client")
 
-		b = createBundleWS(t, pclient, pserver, &testServer{}, shouldUseWebsocket)
+		ctx, shutdown = initForTest()
+
+		b = createBundleWS(t, ctx, pserver, &testServer{}, shouldUseWebsocket)
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	// The server needs to recognize the client's root certificate.
 	pserver.AddToRoots(pclient.BlessingStore().Default())
 	for _, test := range tests {
@@ -725,13 +723,13 @@
 		vname := test.name
 		if shouldUseWebsocket {
 			var err error
-			vname, err = fakeWSName(b.ns, vname)
+			vname, err = fakeWSName(ctx, 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
 			}
 		}
-		call, err := b.client.StartCall(testContext(), vname, test.method, test.args)
+		call, err := b.client.StartCall(ctx, vname, test.method, test.args)
 		if err != test.startErr {
 			t.Errorf(`%s client.StartCall got error "%v", want "%v"`, name(test), err, test.startErr)
 			continue
@@ -778,10 +776,13 @@
 }
 
 func TestMultipleFinish(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	type v []interface{}
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
-	defer b.cleanup(t)
-	call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Echo", v{"foo"})
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+	defer b.cleanup(t, ctx)
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Echo", v{"foo"})
 	if err != nil {
 		t.Fatalf(`client.StartCall got error "%v"`, err)
 	}
@@ -807,11 +808,15 @@
 
 func TestGranter(t *testing.T) {
 	var (
-		pclient = tsecurity.NewPrincipal("client")
-		pserver = tsecurity.NewPrincipal("server")
-		b       = createBundle(t, pclient, pserver, &testServer{})
+		pclient       = tsecurity.NewPrincipal("client")
+		pserver       = tsecurity.NewPrincipal("server")
+		ctx, shutdown = initForTest()
+		b             = createBundle(t, ctx, pserver, &testServer{})
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 
 	tests := []struct {
 		granter                       ipc.Granter
@@ -824,7 +829,7 @@
 		{granter: granter{b: pclient.BlessingStore().Default()}, finishErrID: verror.ErrNoAccess, finisherr: "blessing granted not bound to this server"},
 	}
 	for i, test := range tests {
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
+		call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
 		if !matchesErrorPattern(err, test.startErrID, test.starterr) {
 			t.Errorf("%d: %+v: StartCall returned error %v", i, test, err)
 		}
@@ -872,7 +877,7 @@
 		sm          = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 		ns          = tnaming.NewSimpleNamespace()
 
-		mkClient = func(req security.ThirdPartyRequirements) vc.LocalPrincipal {
+		mkClient = func(req security.ThirdPartyRequirements) security.Principal {
 			// Setup the client so that it shares a blessing with a third-party caveat with the server.
 			cav, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
 			if err != nil {
@@ -883,9 +888,11 @@
 				t.Fatalf("BlessSelf failed: %v", err)
 			}
 			pclient.BlessingStore().Set(b, "server")
-			return vc.LocalPrincipal{pclient}
+			return pclient
 		}
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Initialize the client principal.
 	// It trusts both the application server and the discharger.
 	pclient.AddToRoots(pserver.BlessingStore().Default())
@@ -902,7 +909,6 @@
 
 	// Setup the discharge server.
 	var tester dischargeTestServer
-	ctx := testContext()
 	dischargeServer, err := testInternalNewServer(ctx, sm, ns, pdischarger)
 	if err != nil {
 		t.Fatal(err)
@@ -964,12 +970,12 @@
 
 	for _, test := range tests {
 		pclient := mkClient(test.Requirements)
-		client, err := InternalNewClient(sm, ns, pclient)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		client, err := InternalNewClient(sm, ns)
 		if err != nil {
 			t.Fatalf("InternalNewClient(%+v) failed: %v", test.Requirements, err)
 		}
 		defer client.Close()
-		ctx := testContext()
 		tid := vtrace.GetSpan(ctx).Trace()
 		// StartCall should fetch the discharge, do not worry about finishing the RPC - do not care about that for this test.
 		if _, err := client.StartCall(ctx, object, "Method", []interface{}{"argument"}); err != nil {
@@ -1093,13 +1099,16 @@
 			{bServerClientTPValid, "mountpoint/server/suffix", "Unauthorized", nil, v{""}, false},
 		}
 	)
+
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Start the main server.
-	_, server := startServer(t, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, serverName)
+	_, server := startServer(t, ctx, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, serverName)
 
 	// Start the discharge server.
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, dischargeServerName)
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, dischargeServerName)
 
 	// The server should recognize the client principal as an authority on "client" and "random" blessings.
 	pserver.AddToRoots(bClient)
@@ -1115,14 +1124,15 @@
 
 	for i, test := range tests {
 		name := fmt.Sprintf("#%d: %q.%s(%v) by %v", i, test.name, test.method, test.args, test.blessings)
-		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(mgr, ns)
 		if err != nil {
 			t.Fatalf("InternalNewClient failed: %v", err)
 		}
 		defer client.Close()
 
 		pclient.BlessingStore().Set(test.blessings, "server")
-		call, err := client.StartCall(testContext(), test.name, test.method, test.args)
+		ctx, _ := v23.SetPrincipal(ctx, pclient)
+		call, err := client.StartCall(ctx, test.name, test.method, test.args)
 		if err != nil {
 			t.Errorf(`%s client.StartCall got unexpected error: "%v"`, name, err)
 			continue
@@ -1192,9 +1202,13 @@
 		bclient = bless(pprovider, pclient, "client")
 		bvictim = bless(pprovider, tsecurity.NewPrincipal("victim"), "victim")
 
-		b = createBundle(t, pclient, pserver, &testServer{})
+		ctx, shutdown = initForTest()
+		b             = createBundle(t, ctx, pserver, &testServer{})
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 
 	// Make the client and server trust blessings from pprovider.
 	pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1219,7 +1233,7 @@
 
 		pclient.BlessingStore().Set(test.blessings, "root")
 
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Closure", nil)
+		call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Closure", nil)
 		if err != nil {
 			t.Errorf("%v: StartCall failed: %v", name, err)
 			continue
@@ -1244,6 +1258,10 @@
 		bserver = bless(pprovider, pserver, "server", tpCav)
 		bclient = bless(pprovider, pclient, "client")
 	)
+
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
 	// Make the client and server principals trust root certificates from
 	// pprovider.
 	pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1253,23 +1271,24 @@
 	pserver.BlessingStore().SetDefault(bserver)
 
 	// Start the server and the discharger.
-	_, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, "mountpoint/server")
+	_, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, "mountpoint/server")
 
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
 
 	// Make the client present bclient to all servers that are blessed
 	// by pprovider.
 	pclient.BlessingStore().Set(bclient, "root")
 
-	client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+	client, err := InternalNewClient(mgr, ns)
 	if err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
 	defer client.Close()
 
-	call, err := client.StartCall(testContext(), "mountpoint/server/suffix", "EchoBlessings", nil)
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
+	call, err := client.StartCall(ctx, "mountpoint/server/suffix", "EchoBlessings", nil)
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
 	}
@@ -1297,15 +1316,19 @@
 	pclient.AddToRoots(pserver.BlessingStore().Default())
 	pclient.BlessingStore().Set(bclient, "server")
 
-	b := createBundle(t, nil, pserver, &testServer{})
-	defer b.cleanup(t)
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
+	b := createBundle(t, ctx, pserver, &testServer{})
+	defer b.cleanup(t, ctx)
 
 	var err error
-	if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{pclient}); err != nil {
+	if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	call := func() error {
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
+		call, err := b.client.StartCall(ctx, "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
 		if err != nil {
 			return err //fmt.Errorf("client.StartCall failed: %v", err)
 		}
@@ -1377,11 +1400,14 @@
 
 // TestCancel tests cancellation while the server is reading from a stream.
 func TestCancel(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ts := newCancelTestServer(t)
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+	defer b.cleanup(t, ctx)
 
-	ctx, cancel := context.WithCancel(testContext())
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	ctx, cancel := context.WithCancel(ctx)
 	_, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
@@ -1392,11 +1418,14 @@
 // TestCancelWithFullBuffers tests that even if the writer has filled the buffers and
 // the server is not reading that the cancel message gets through.
 func TestCancelWithFullBuffers(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ts := newCancelTestServer(t)
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+	defer b.cleanup(t, ctx)
 
-	ctx, cancel := context.WithCancel(testContext())
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	ctx, cancel := context.WithCancel(ctx)
 	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
@@ -1429,11 +1458,14 @@
 }
 
 func TestStreamReadTerminatedByServer(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	s := &streamRecvInGoroutineServer{c: make(chan error, 1)}
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), s)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), s)
+	defer b.cleanup(t, ctx)
 
-	call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
 	}
@@ -1462,20 +1494,21 @@
 
 // TestConnectWithIncompatibleServers tests that clients ignore incompatible endpoints.
 func TestConnectWithIncompatibleServers(t *testing.T) {
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
-	defer b.cleanup(t)
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+	defer b.cleanup(t, ctx)
 
 	// Publish some incompatible endpoints.
-	publisher := publisher.New(testContext(), b.ns, publishPeriod)
+	publisher := publisher.New(ctx, b.ns, publishPeriod)
 	defer publisher.WaitForStop()
 	defer publisher.Stop()
 	publisher.AddName("incompatible")
 	publisher.AddServer("/@2@tcp@localhost:10000@@1000000@2000000@@", false)
 	publisher.AddServer("/@2@tcp@localhost:10001@@2000000@3000000@@", false)
 
-	ctx, _ := context.WithTimeout(testContext(), 100*time.Millisecond)
-
-	_, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	_, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"}, options.NoRetry{})
 	if !verror.Is(err, verror.ErrNoServers.ID) {
 		t.Errorf("Expected error %s, found: %v", verror.ErrNoServers, err)
 	}
@@ -1484,7 +1517,7 @@
 	publisher.AddServer("/"+b.ep.String(), false)
 	publisher.AddName("incompatible")
 
-	call, err := b.client.StartCall(testContext(), "incompatible/suffix", "Echo", []interface{}{"foo"})
+	call, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -1499,6 +1532,8 @@
 }
 
 func TestPreferredAddress(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
@@ -1507,7 +1542,6 @@
 		a.IP = net.ParseIP("1.1.1.1")
 		return []ipc.Address{&netstate.AddrIfc{Addr: a}}, nil
 	}
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -1543,13 +1577,14 @@
 }
 
 func TestPreferredAddressErrors(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
 	paerr := func(_ string, a []ipc.Address) ([]ipc.Address, error) {
 		return nil, fmt.Errorf("oops")
 	}
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -1575,10 +1610,11 @@
 }
 
 func TestSecurityNone(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x66666666))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, nil, options.VCSecurityNone)
 	if err != nil {
 		t.Fatalf("InternalNewServer failed: %v", err)
@@ -1632,6 +1668,8 @@
 		pclient   = tsecurity.NewPrincipal("client")
 		batman, _ = pserver.BlessSelf("batman")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Client and server recognize the servers blessings
 	for _, p := range []security.Principal{pserver, pclient} {
 		if err := p.AddToRoots(pserver.BlessingStore().Default()); err != nil {
@@ -1645,8 +1683,8 @@
 	// to act as batman (as opposed to using the default blessing).
 	ns := tnaming.NewSimpleNamespace()
 
-	defer runServer(t, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
-	defer runServer(t, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
 
 	// And finally, make an RPC and see that the client sees "batman"
 	runClient := func(server string) ([]string, error) {
@@ -1654,13 +1692,13 @@
 		defer smc.Shutdown()
 		client, err := InternalNewClient(
 			smc,
-			ns,
-			vc.LocalPrincipal{pclient})
+			ns)
 		if err != nil {
 			return nil, err
 		}
 		defer client.Close()
-		call, err := client.StartCall(testContext(), server, "Closure", nil)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		call, err := client.StartCall(ctx, server, "Closure", nil)
 		if err != nil {
 			return nil, err
 		}
@@ -1684,6 +1722,8 @@
 		pserver     = tsecurity.NewPrincipal("server")
 		pclient     = tsecurity.NewPrincipal("client")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Make the client recognize all server blessings
 	if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
 		t.Fatal(err)
@@ -1706,8 +1746,8 @@
 
 	// Setup the disharger and test server.
 	discharger := &dischargeServer{}
-	defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
-	defer runServer(t, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
 
 	runClient := func(noDischarges bool) {
 		rid, err := naming.NewRoutingID()
@@ -1716,7 +1756,7 @@
 		}
 		smc := imanager.InternalNew(rid)
 		defer smc.Shutdown()
-		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(smc, ns)
 		if err != nil {
 			t.Fatalf("failed to create client: %v", err)
 		}
@@ -1725,7 +1765,8 @@
 		if noDischarges {
 			opts = append(opts, NoDischarges{})
 		}
-		if _, err = client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil, opts...); err != nil {
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		if _, err = client.StartCall(ctx, "mountpoint/testServer", "Closure", nil, opts...); err != nil {
 			t.Fatalf("failed to StartCall: %v", err)
 		}
 	}
@@ -1748,7 +1789,8 @@
 		pdischarger2     = tsecurity.NewPrincipal("discharger2")
 		pdischargeClient = tsecurity.NewPrincipal("dischargeClient")
 	)
-
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Bless the client with a ThirdPartyCaveat from discharger1.
 	tpcav1 := mkThirdPartyCaveat(pdischarger1.PublicKey(), "mountpoint/discharger1", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
 	blessings, err := pdischarger1.Bless(pdischargeClient.PublicKey(), pdischarger1.BlessingStore().Default(), "tpcav1", tpcav1)
@@ -1764,8 +1806,8 @@
 	// Setup the disharger and test server.
 	discharger1 := &dischargeServer{}
 	discharger2 := &dischargeServer{}
-	defer runServer(t, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
-	defer runServer(t, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
 
 	rid, err := naming.NewRoutingID()
 	if err != nil {
@@ -1773,7 +1815,7 @@
 	}
 	sm := imanager.InternalNew(rid)
 
-	c, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pdischargeClient})
+	c, err := InternalNewClient(sm, ns)
 	if err != nil {
 		t.Fatalf("failed to create client: %v", err)
 	}
@@ -1782,7 +1824,8 @@
 	if err != nil {
 		t.Error(err)
 	}
-	dc.PrepareDischarges(testContext(), []security.Caveat{tpcav2}, security.DischargeImpetus{})
+	ctx, _ = v23.SetPrincipal(ctx, pdischargeClient)
+	dc.PrepareDischarges(ctx, []security.Caveat{tpcav2}, security.DischargeImpetus{})
 
 	// Ensure that discharger1 was not called and discharger2 was called.
 	if discharger1.called {
@@ -1800,6 +1843,8 @@
 		pserver = tsecurity.NewPrincipal("server")
 		pclient = tsecurity.NewPrincipal("client")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Make the client recognize all server blessings
 	if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
 		t.Fatal(err)
@@ -1807,10 +1852,12 @@
 
 	ns := tnaming.NewSimpleNamespace()
 
-	serverSM := runServer(t, ns, pserver, "mountpoint/testServer", &testServer{})
+	serverSM := runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{})
 	defer serverSM.Shutdown()
 	rid := serverSM.RoutingID()
 
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
+
 	newClient := func() ipc.Client {
 		rid, err := naming.NewRoutingID()
 		if err != nil {
@@ -1818,7 +1865,7 @@
 		}
 		smc := imanager.InternalNew(rid)
 		defer smc.Shutdown()
-		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(smc, ns)
 		if err != nil {
 			t.Fatalf("failed to create client: %v", err)
 		}
@@ -1826,7 +1873,7 @@
 	}
 
 	runClient := func(client ipc.Client) {
-		if call, err := client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil); err != nil {
+		if call, err := client.StartCall(ctx, "mountpoint/testServer", "Closure", nil); err != nil {
 			t.Fatalf("failed to StartCall: %v", err)
 		} else if err := call.Finish(); err != nil {
 			t.Fatal(err)
@@ -1887,30 +1934,29 @@
 		pother  = tsecurity.NewPrincipal("other")
 		pclient = tsecurity.NewPrincipal("client")
 	)
-
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ns := tnaming.NewSimpleNamespace()
 	mountName := "mountpoint/default"
 
 	// Start a server with pserver.
-	defer runServer(t, ns, pserver, mountName, &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, mountName, &testServer{}).Shutdown()
 
 	smc := imanager.InternalNew(naming.FixedRoutingID(0xc))
-	client, err := InternalNewClient(
-		smc,
-		ns,
-		vc.LocalPrincipal{pclient})
+	client, err := InternalNewClient(smc, ns)
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer smc.Shutdown()
 	defer client.Close()
 
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	// The call should succeed when the server presents the same public as the opt...
-	if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
+	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
 		t.Errorf("Expected call to succeed but got %v", err)
 	}
 	// ...but fail if they differ.
-	if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
 		t.Errorf("got %v, want %v", verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 }
@@ -1947,16 +1993,17 @@
 	var (
 		pdischarger = tsecurity.NewPrincipal("discharger")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 
 	// Bless the client with a ThirdPartyCaveat.
 	tpcav := mkThirdPartyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
 
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
 
 	// Setup the disharge server.
 	discharger := &expiryDischarger{}
-	defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
 
 	// Create a discharge client.
 	rid, err := naming.NewRoutingID()