veyron/runtimes/google/ipc: Add unittest and fix my mistake that it would
have caught.

Change-Id: I2542d5c12cdda47334a017555a83f0fdf55d6ac3
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index d4a1963..fc22457 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -668,8 +668,8 @@
 	for _, o := range opts {
 		switch v := o.(type) {
 		case options.ServerPublicKey:
-			if remoteKey := flow.RemoteBlessings().PublicKey(); !reflect.DeepEqual(remoteKey, v) {
-				verror.New(errAuthServerKeyNotAllowed, ctx, remoteKey, v)
+			if remoteKey, key := flow.RemoteBlessings().PublicKey(), v.PublicKey; !reflect.DeepEqual(remoteKey, key) {
+				return nil, nil, verror.New(errAuthServerKeyNotAllowed, ctx, remoteKey, key)
 			}
 		case options.AllowedServersPolicy:
 			allowed := false
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index f64dea2..abd422b 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -1746,6 +1746,59 @@
 	ParamType: vdl.TypeOf(int64(0)),
 }
 
+func TestServerPublicKeyOpt(t *testing.T) {
+	var (
+		pserver = tsecurity.NewPrincipal("server")
+		pother  = tsecurity.NewPrincipal("other")
+		pclient = tsecurity.NewPrincipal("client")
+	)
+
+	ns := tnaming.NewSimpleNamespace()
+	ctx := testContext()
+	mountName := "mountpoint/default"
+	runServer := func() stream.Manager {
+		rid, err := naming.NewRoutingID()
+		if err != nil {
+			t.Fatal(err)
+		}
+		sm := imanager.InternalNew(rid)
+		server, err := testInternalNewServer(ctx, sm, ns, vc.LocalPrincipal{pserver})
+		if err != nil {
+			t.Fatal(err)
+		}
+		if _, err := server.Listen(listenSpec); err != nil {
+			t.Fatal(err)
+		}
+		if err := server.Serve(mountName, &testServer{}, acceptAllAuthorizer{}); err != nil {
+			t.Fatal(err)
+		}
+		return sm
+	}
+
+	// Start a server with pserver.
+	defer runServer().Shutdown()
+
+	smc := imanager.InternalNew(naming.FixedRoutingID(0xc))
+	client, err := InternalNewClient(
+		smc,
+		ns,
+		vc.LocalPrincipal{pclient})
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer smc.Shutdown()
+	defer client.Close()
+
+	// 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 {
+		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.NotTrusted.ID) {
+		t.Errorf("got %v, want %v", verror.ErrorID(err), verror.NotTrusted.ID)
+	}
+}
+
 func TestMain(m *testing.M) {
 	testutil.Init()
 	security.RegisterCaveatValidator(fakeTimeCaveat, func(_ security.Context, t int64) error {