diff --git a/clientconn.go b/clientconn.go index 5dec2dacc0ba..ed98d5072bbe 100644 --- a/clientconn.go +++ b/clientconn.go @@ -323,7 +323,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * case err == nil || !cc.dopts.returnLastError: conn, err = nil, ctx.Err() default: - conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err) + conn, err = nil, fmt.Errorf("%v: %w", err, ctx.Err()) } default: } diff --git a/dial_test.go b/dial_test.go index 7b74aac79fa6..79a87a8dbc5f 100644 --- a/dial_test.go +++ b/dial_test.go @@ -20,6 +20,7 @@ package grpc import ( "context" + "errors" "fmt" "net" "strings" @@ -162,7 +163,11 @@ func (s) TestDialWaitsForServerSettingsAndFails(t *testing.T) { client.Close() t.Fatalf("Unexpected success (err=nil) while dialing") } - expectedMsg := "server preface" + // The error should wrap context.DeadlineExceeded. + if !errors.Is(err, context.DeadlineExceeded) { + t.Errorf("DialContext() returned %v, want %v", err, context.DeadlineExceeded) + } + const expectedMsg = "error reading server preface" if !strings.Contains(err.Error(), context.DeadlineExceeded.Error()) || !strings.Contains(err.Error(), expectedMsg) { t.Fatalf("DialContext(_) = %v; want a message that includes both %q and %q", err, context.DeadlineExceeded.Error(), expectedMsg) }