Merge "rpc/...: deflake test cases for rpc errors."
diff --git a/profiles/internal/rpc/client.go b/profiles/internal/rpc/client.go
index d8f4c9b..ab268dc 100644
--- a/profiles/internal/rpc/client.go
+++ b/profiles/internal/rpc/client.go
@@ -642,17 +642,28 @@
 	suberrs := []verror.SubErr{}
 	topLevelError := verror.ErrNoServers
 	topLevelAction := verror.RetryRefetch
+	onlyErrNetwork := true
 	for _, r := range responses {
 		if r != nil && r.serverErr != nil && r.serverErr.Err != nil {
 			switch verror.ErrorID(r.serverErr.Err) {
 			case stream.ErrNotTrusted.ID, verror.ErrNotTrusted.ID, errServerAuthorizeFailed.ID:
 				topLevelError = verror.ErrNotTrusted
 				topLevelAction = verror.NoRetry
+				onlyErrNetwork = false
+			case stream.ErrNetwork.ID:
+				// do nothing
+			default:
+				onlyErrNetwork = false
 			}
 			suberrs = append(suberrs, *r.serverErr)
 		}
 	}
 
+	if onlyErrNetwork {
+		// If we only encountered network errors, then report ErrBadProtocol.
+		topLevelError = verror.ErrBadProtocol
+	}
+
 	// TODO(cnicolaou): we get system errors for things like dialing using
 	// the 'ws' protocol which can never succeed even if we retry the connection,
 	// hence we return RetryRefetch below except for the case where the servers
diff --git a/profiles/internal/rpc/stream/errors.go b/profiles/internal/rpc/stream/errors.go
index 82079e6..9d7e25b 100644
--- a/profiles/internal/rpc/stream/errors.go
+++ b/profiles/internal/rpc/stream/errors.go
@@ -22,6 +22,7 @@
 	ErrSecurity   = verror.Register(pkgPath+".errSecurity", verror.NoRetry, "{:3}")
 	ErrNotTrusted = verror.Register(pkgPath+".errNotTrusted", verror.NoRetry, "{:3}")
 	ErrNetwork    = verror.Register(pkgPath+".errNetwork", verror.NoRetry, "{:3}")
+	ErrDialFailed = verror.Register(pkgPath+".errDialFailed", verror.NoRetry, "{:3}")
 	ErrProxy      = verror.Register(pkgPath+".errProxy", verror.NoRetry, "{:3}")
 	ErrBadArg     = verror.Register(pkgPath+".errBadArg", verror.NoRetry, "{:3}")
 	ErrBadState   = verror.Register(pkgPath+".errBadState", verror.NoRetry, "{:3}")
diff --git a/profiles/internal/rpc/stream/manager/error_test.go b/profiles/internal/rpc/stream/manager/error_test.go
index 7d6e27e..ff51fe6 100644
--- a/profiles/internal/rpc/stream/manager/error_test.go
+++ b/profiles/internal/rpc/stream/manager/error_test.go
@@ -100,7 +100,7 @@
 	// bad protocol
 	ep, _ := inaming.NewEndpoint(naming.FormatEndpoint("x", "127.0.0.1:2"))
 	_, err := client.Dial(ep, pclient)
-	if verror.ErrorID(err) != stream.ErrBadArg.ID {
+	if verror.ErrorID(err) != stream.ErrDialFailed.ID {
 		t.Fatalf("wrong error: %s", err)
 	}
 	t.Log(err)
@@ -108,7 +108,7 @@
 	// no server
 	ep, _ = inaming.NewEndpoint(naming.FormatEndpoint("tcp", "127.0.0.1:2"))
 	_, err = client.Dial(ep, pclient)
-	if verror.ErrorID(err) != stream.ErrNetwork.ID {
+	if verror.ErrorID(err) != stream.ErrDialFailed.ID {
 		t.Fatalf("wrong error: %s", err)
 	}
 	t.Log(err)
diff --git a/profiles/internal/rpc/stream/manager/manager.go b/profiles/internal/rpc/stream/manager/manager.go
index 5ee4fd0..ee05736 100644
--- a/profiles/internal/rpc/stream/manager/manager.go
+++ b/profiles/internal/rpc/stream/manager/manager.go
@@ -89,11 +89,11 @@
 	if d, _, _ := rpc.RegisteredProtocol(network); d != nil {
 		conn, err := d(network, address, timeout)
 		if err != nil {
-			return nil, verror.New(stream.ErrNetwork, nil, err)
+			return nil, verror.New(stream.ErrDialFailed, nil, err)
 		}
 		return conn, nil
 	}
-	return nil, verror.New(stream.ErrBadArg, nil, verror.New(errUnknownNetwork, nil, network))
+	return nil, verror.New(stream.ErrDialFailed, nil, verror.New(errUnknownNetwork, nil, network))
 }
 
 // FindOrDialVIF returns the network connection (VIF) to the provided address
diff --git a/profiles/internal/rpc/stream/vc/vc.go b/profiles/internal/rpc/stream/vc/vc.go
index d15482d..8f4a5eb 100644
--- a/profiles/internal/rpc/stream/vc/vc.go
+++ b/profiles/internal/rpc/stream/vc/vc.go
@@ -498,7 +498,7 @@
 			select {
 			case <-remotePubKeyChan:
 			case <-vc.closeCh:
-				return verror.New(errClosedDuringHandshake, nil, vc.VCI)
+				return verror.New(stream.ErrNetwork, nil, verror.New(errClosedDuringHandshake, nil, vc.VCI))
 			}
 		}
 		return nil
@@ -530,13 +530,13 @@
 			case theirKey := <-remotePubKeyChan:
 				return theirKey, nil
 			case <-vc.closeCh:
-				return nil, verror.New(errClosedDuringHandshake, nil, vc.VCI)
+				return nil, verror.New(stream.ErrNetwork, nil, verror.New(errClosedDuringHandshake, nil, vc.VCI))
 			}
 		}
 		var err error
 		crypter, err = crypto.NewBoxCrypter(exchange, vc.pool)
 		if err != nil {
-			return vc.appendCloseReason(verror.New(stream.ErrNetwork, nil,
+			return vc.appendCloseReason(verror.New(stream.ErrSecurity, nil,
 				verror.New(errFailedToSetupEncryption, nil, err)))
 		}
 		// The version is set by FinishHandshakeDialedVC and exchange (called by
diff --git a/profiles/internal/rpc/test/client_test.go b/profiles/internal/rpc/test/client_test.go
index caf87ab..4561cc4 100644
--- a/profiles/internal/rpc/test/client_test.go
+++ b/profiles/internal/rpc/test/client_test.go
@@ -442,7 +442,7 @@
 	}
 	ns.SetRoots(brkRoot.Name())
 
-	nctx, _ := context.WithTimeout(ctx, 100*time.Millisecond)
+	nctx, _ := context.WithTimeout(ctx, time.Minute)
 	call, err := client.StartCall(nctx, "name", "noname", nil, options.NoRetry{}, options.SecurityNone)
 	if verror.ErrorID(err) != verror.ErrBadProtocol.ID {
 		t.Fatalf("wrong error: %s", err)
@@ -458,7 +458,7 @@
 	defer fn()
 
 	call, err = client.StartCall(nctx, name, "noname", nil, options.NoRetry{})
-	if verror.ErrorID(err) != verror.ErrNoServers.ID {
+	if verror.ErrorID(err) != verror.ErrBadProtocol.ID {
 		t.Fatalf("wrong error: %s", err)
 	}
 	if call != nil {