diff --git a/server/auth/jwt_test.go b/server/auth/jwt_test.go index 27369092dd3..7d211ebf3b0 100644 --- a/server/auth/jwt_test.go +++ b/server/auth/jwt_test.go @@ -16,6 +16,7 @@ package auth import ( "context" + "errors" "fmt" "testing" "time" @@ -139,7 +140,7 @@ func testJWTInfo(t *testing.T, opts map[string]string) { } _, aerr := verify.assign(ctx, "abc", 123) - if aerr != ErrVerifyOnly { + if !errors.Is(aerr, ErrVerifyOnly) { t.Fatalf("unexpected error when attempting to sign with public key: %v", aerr) } diff --git a/server/auth/store_test.go b/server/auth/store_test.go index a05102f652f..4e1d0c4aac5 100644 --- a/server/auth/store_test.go +++ b/server/auth/store_test.go @@ -165,13 +165,13 @@ func TestUserAdd(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err) } - if err != ErrUserAlreadyExist { + if !errors.Is(err, ErrUserAlreadyExist) { t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err) } ua = &pb.AuthUserAddRequest{Name: "", Options: &authpb.UserAddOptions{NoPassword: false}} _, err = as.UserAdd(ua) // add a user with empty name - if err != ErrUserEmpty { + if !errors.Is(err, ErrUserEmpty) { t.Fatal(err) } @@ -227,7 +227,7 @@ func TestCheckPassword(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrAuthFailed, err) } - if err != ErrAuthFailed { + if !errors.Is(err, ErrAuthFailed) { t.Fatalf("expected %v, got %v", ErrAuthFailed, err) } @@ -242,7 +242,7 @@ func TestCheckPassword(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrAuthFailed, err) } - if err != ErrAuthFailed { + if !errors.Is(err, ErrAuthFailed) { t.Fatalf("expected %v, got %v", ErrAuthFailed, err) } } @@ -264,7 +264,7 @@ func TestUserDelete(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } @@ -288,7 +288,7 @@ func TestUserDeleteAndPermCache(t *testing.T) { // delete a non-existing user _, err = as.UserDelete(ud) - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } @@ -336,7 +336,7 @@ func TestUserChangePassword(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } @@ -359,7 +359,7 @@ func TestRoleAdd(t *testing.T) { // add a role with empty name _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: ""}) - if err != ErrRoleEmpty { + if !errors.Is(err, ErrRoleEmpty) { t.Fatal(err) } } @@ -379,7 +379,7 @@ func TestUserGrant(t *testing.T) { if err == nil { t.Errorf("expected %v, got %v", ErrUserNotFound, err) } - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Errorf("expected %v, got %v", ErrUserNotFound, err) } } @@ -455,7 +455,7 @@ func TestIsOpPermitted(t *testing.T) { as.rangePermCacheMu.Lock() delete(as.rangePermCache, "foo") as.rangePermCacheMu.Unlock() - if err := as.isOpPermitted("foo", as.Revision(), perm.Key, perm.RangeEnd, perm.PermType); err != ErrPermissionDenied { + if err := as.isOpPermitted("foo", as.Revision(), perm.Key, perm.RangeEnd, perm.PermType); !errors.Is(err, ErrPermissionDenied) { t.Fatal(err) } @@ -545,7 +545,7 @@ func TestRoleGrantPermission(t *testing.T) { Name: "role-test-1", }) - if err != ErrPermissionNotGiven { + if !errors.Is(err, ErrPermissionNotGiven) { t.Error(err) } @@ -887,13 +887,13 @@ func TestAuthInfoFromCtx(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: "Invalid Token"})) _, err = as.AuthInfoFromCtx(ctx) - if err != ErrInvalidAuthToken { + if !errors.Is(err, ErrInvalidAuthToken) { t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err) } ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: "Invalid.Token"})) _, err = as.AuthInfoFromCtx(ctx) - if err != ErrInvalidAuthToken { + if !errors.Is(err, ErrInvalidAuthToken) { t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err) } @@ -914,14 +914,14 @@ func TestAuthDisable(t *testing.T) { as.AuthDisable() ctx := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(2)), AuthenticateParamSimpleTokenPrefix{}, "dummy") _, err := as.Authenticate(ctx, "foo", "bar") - if err != ErrAuthNotEnabled { + if !errors.Is(err, ErrAuthNotEnabled) { t.Errorf("expected %v, got %v", ErrAuthNotEnabled, err) } // Disabling disabled auth to make sure it can return safely if store is already disabled. as.AuthDisable() _, err = as.Authenticate(ctx, "foo", "bar") - if err != ErrAuthNotEnabled { + if !errors.Is(err, ErrAuthNotEnabled) { t.Errorf("expected %v, got %v", ErrAuthNotEnabled, err) } } @@ -980,19 +980,19 @@ func TestIsAdminPermitted(t *testing.T) { // invalid user err = as.IsAdminPermitted(&AuthInfo{Username: "rooti", Revision: 1}) - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Errorf("expected %v, got %v", ErrUserNotFound, err) } // empty user err = as.IsAdminPermitted(&AuthInfo{Username: "", Revision: 1}) - if err != ErrUserEmpty { + if !errors.Is(err, ErrUserEmpty) { t.Errorf("expected %v, got %v", ErrUserEmpty, err) } // non-admin user err = as.IsAdminPermitted(&AuthInfo{Username: "foo", Revision: 1}) - if err != ErrPermissionDenied { + if !errors.Is(err, ErrPermissionDenied) { t.Errorf("expected %v, got %v", ErrPermissionDenied, err) } @@ -1013,13 +1013,13 @@ func TestRecoverFromSnapshot(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err) } - if err != ErrUserAlreadyExist { + if !errors.Is(err, ErrUserAlreadyExist) { t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err) } ua = &pb.AuthUserAddRequest{Name: "", Options: &authpb.UserAddOptions{NoPassword: false}} _, err = as.UserAdd(ua) // add a user with empty name - if err != ErrUserEmpty { + if !errors.Is(err, ErrUserEmpty) { t.Fatal(err) } @@ -1195,7 +1195,7 @@ func TestUserNoPasswordAdd(t *testing.T) { ctx := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(1)), AuthenticateParamSimpleTokenPrefix{}, "dummy") _, err = as.Authenticate(ctx, username, "") - if err != ErrAuthFailed { + if !errors.Is(err, ErrAuthFailed) { t.Fatalf("expected %v, got %v", ErrAuthFailed, err) } } @@ -1237,7 +1237,7 @@ func TestUserChangePasswordWithOldLog(t *testing.T) { if err == nil { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } - if err != ErrUserNotFound { + if !errors.Is(err, ErrUserNotFound) { t.Fatalf("expected %v, got %v", ErrUserNotFound, err) } } diff --git a/server/embed/etcd_test.go b/server/embed/etcd_test.go index e22b6d3544a..206cbb737b4 100644 --- a/server/embed/etcd_test.go +++ b/server/embed/etcd_test.go @@ -15,6 +15,7 @@ package embed import ( + "errors" "net/url" "testing" @@ -32,7 +33,7 @@ func TestEmptyClientTLSInfo_createMetricsListener(t *testing.T) { Scheme: "https", Host: "localhost:8080", } - if _, err := e.createMetricsListener(murl); err != ErrMissingClientTLSInfoForMetricsURL { + if _, err := e.createMetricsListener(murl); !errors.Is(err, ErrMissingClientTLSInfoForMetricsURL) { t.Fatalf("expected error %v, got %v", ErrMissingClientTLSInfoForMetricsURL, err) } } diff --git a/server/embed/serve_test.go b/server/embed/serve_test.go index 3e23c9ee9af..6150beeecf1 100644 --- a/server/embed/serve_test.go +++ b/server/embed/serve_test.go @@ -15,6 +15,7 @@ package embed import ( + "errors" "fmt" "net/url" "os" @@ -43,7 +44,7 @@ func TestStartEtcdWrongToken(t *testing.T) { cfg.Dir = tdir cfg.AuthToken = "wrong-token" - if _, err := StartEtcd(cfg); err != auth.ErrInvalidAuthOpts { + if _, err := StartEtcd(cfg); !errors.Is(err, auth.ErrInvalidAuthOpts) { t.Fatalf("expected %v, got %v", auth.ErrInvalidAuthOpts, err) } } diff --git a/server/etcdmain/config_test.go b/server/etcdmain/config_test.go index 21ceaafb0e5..f002102897a 100644 --- a/server/etcdmain/config_test.go +++ b/server/etcdmain/config_test.go @@ -15,6 +15,7 @@ package etcdmain import ( + "errors" "flag" "fmt" "net/url" @@ -224,7 +225,7 @@ func TestConfigParsingConflictClusteringFlags(t *testing.T) { for i, tt := range conflictArgs { cfg := newConfig() - if err := cfg.parse(tt); err != embed.ErrConflictBootstrapFlags { + if err := cfg.parse(tt); !errors.Is(err, embed.ErrConflictBootstrapFlags) { t.Errorf("%d: err = %v, want %v", i, err, embed.ErrConflictBootstrapFlags) } } @@ -267,7 +268,7 @@ func TestConfigFileConflictClusteringFlags(t *testing.T) { args := []string{fmt.Sprintf("--config-file=%s", tmpfile.Name())} cfg := newConfig() - if err := cfg.parse(args); err != embed.ErrConflictBootstrapFlags { + if err := cfg.parse(args); !errors.Is(err, embed.ErrConflictBootstrapFlags) { t.Errorf("%d: err = %v, want %v", i, err, embed.ErrConflictBootstrapFlags) } } @@ -310,7 +311,7 @@ func TestConfigParsingMissedAdvertiseClientURLsFlag(t *testing.T) { for i, tt := range tests { cfg := newConfig() - if err := cfg.parse(tt.args); err != tt.werr { + if err := cfg.parse(tt.args); !errors.Is(err, tt.werr) { t.Errorf("%d: err = %v, want %v", i, err, tt.werr) } } diff --git a/server/etcdserver/api/membership/cluster_test.go b/server/etcdserver/api/membership/cluster_test.go index e5eb210c887..c07093878c9 100644 --- a/server/etcdserver/api/membership/cluster_test.go +++ b/server/etcdserver/api/membership/cluster_test.go @@ -16,6 +16,7 @@ package membership import ( "encoding/json" + "errors" "fmt" "path" "reflect" @@ -458,7 +459,7 @@ func TestClusterValidateConfigurationChangeV2(t *testing.T) { } for i, tt := range tests { err := cl.ValidateConfigurationChange(tt.cc) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: validateConfigurationChange error = %v, want %v", i, err, tt.werr) } } diff --git a/server/etcdserver/api/rafthttp/msg_codec_test.go b/server/etcdserver/api/rafthttp/msg_codec_test.go index 9b14b45095e..cde7916fc1b 100644 --- a/server/etcdserver/api/rafthttp/msg_codec_test.go +++ b/server/etcdserver/api/rafthttp/msg_codec_test.go @@ -16,6 +16,7 @@ package rafthttp import ( "bytes" + "errors" "reflect" "testing" @@ -77,13 +78,13 @@ func TestMessage(t *testing.T) { for i, tt := range tests { b := &bytes.Buffer{} enc := &messageEncoder{w: b} - if err := enc.encode(&tt.msg); err != tt.encodeErr { + if err := enc.encode(&tt.msg); !errors.Is(err, tt.encodeErr) { t.Errorf("#%d: encode message error expected %v, got %v", i, tt.encodeErr, err) continue } dec := &messageDecoder{r: b} m, err := dec.decode() - if err != tt.decodeErr { + if !errors.Is(err, tt.decodeErr) { t.Errorf("#%d: decode message error expected %v, got %v", i, tt.decodeErr, err) continue } diff --git a/server/etcdserver/api/rafthttp/pipeline.go b/server/etcdserver/api/rafthttp/pipeline.go index 50b8c8dd3f1..0790b58d03b 100644 --- a/server/etcdserver/api/rafthttp/pipeline.go +++ b/server/etcdserver/api/rafthttp/pipeline.go @@ -165,7 +165,7 @@ func (p *pipeline) post(data []byte) (err error) { p.picker.unreachable(u) // errMemberRemoved is a critical error since a removed member should // always be stopped. So we use reportCriticalError to report it to errorc. - if err == errMemberRemoved { + if errors.Is(err, errMemberRemoved) { reportCriticalError(err, p.errorc) } return err diff --git a/server/etcdserver/api/rafthttp/snapshot_sender.go b/server/etcdserver/api/rafthttp/snapshot_sender.go index 1f0253f1465..07971cbbddc 100644 --- a/server/etcdserver/api/rafthttp/snapshot_sender.go +++ b/server/etcdserver/api/rafthttp/snapshot_sender.go @@ -17,6 +17,7 @@ package rafthttp import ( "bytes" "context" + "errors" "io" "net/http" "time" @@ -110,7 +111,7 @@ func (s *snapshotSender) send(merged snap.Message) { // errMemberRemoved is a critical error since a removed member should // always be stopped. So we use reportCriticalError to report it to errorc. - if err == errMemberRemoved { + if errors.Is(err, errMemberRemoved) { reportCriticalError(err, s.errorc) } diff --git a/server/etcdserver/api/rafthttp/stream.go b/server/etcdserver/api/rafthttp/stream.go index 63ffe8fdcbe..ed91b27bd78 100644 --- a/server/etcdserver/api/rafthttp/stream.go +++ b/server/etcdserver/api/rafthttp/stream.go @@ -16,6 +16,7 @@ package rafthttp import ( "context" + "errors" "fmt" "io" "net/http" @@ -403,7 +404,7 @@ func (cr *streamReader) run() { for { rc, err := cr.dial(t) if err != nil { - if err != errUnsupportedStreamType { + if !errors.Is(err, errUnsupportedStreamType) { cr.status.deactivate(failureType{source: t.String(), action: "dial"}, err.Error()) } } else { @@ -428,7 +429,7 @@ func (cr *streamReader) run() { } switch { // all data is read out - case err == io.EOF: + case errors.Is(err, io.EOF): // connection is closed by the remote case transport.IsClosedConnError(err): default: diff --git a/server/etcdserver/api/rafthttp/stream_test.go b/server/etcdserver/api/rafthttp/stream_test.go index 5ff4265e568..428010286d9 100644 --- a/server/etcdserver/api/rafthttp/stream_test.go +++ b/server/etcdserver/api/rafthttp/stream_test.go @@ -256,7 +256,7 @@ func TestStreamReaderDialDetectUnsupport(t *testing.T) { } _, err := sr.dial(typ) - if err != errUnsupportedStreamType { + if !errors.Is(err, errUnsupportedStreamType) { t.Errorf("#%d: error = %v, want %v", i, err, errUnsupportedStreamType) } } diff --git a/server/etcdserver/api/snap/snapshotter_test.go b/server/etcdserver/api/snap/snapshotter_test.go index 02ce02b4a13..cad3059fb18 100644 --- a/server/etcdserver/api/snap/snapshotter_test.go +++ b/server/etcdserver/api/snap/snapshotter_test.go @@ -15,6 +15,7 @@ package snap import ( + "errors" "fmt" "hash/crc32" "os" @@ -80,7 +81,7 @@ func TestBadCRC(t *testing.T) { crcTable = crc32.MakeTable(crc32.Koopman) _, err = Read(zaptest.NewLogger(t), filepath.Join(dir, fmt.Sprintf("%016x-%016x.snap", 1, 1))) - if err == nil || err != ErrCRCMismatch { + if err == nil || !errors.Is(err, ErrCRCMismatch) { t.Errorf("err = %v, want %v", err, ErrCRCMismatch) } } @@ -221,7 +222,7 @@ func TestNoSnapshot(t *testing.T) { defer os.RemoveAll(dir) ss := New(zaptest.NewLogger(t), dir) _, err = ss.Load() - if err != ErrNoSnapshot { + if !errors.Is(err, ErrNoSnapshot) { t.Errorf("err = %v, want %v", err, ErrNoSnapshot) } } @@ -240,7 +241,7 @@ func TestEmptySnapshot(t *testing.T) { } _, err = Read(zaptest.NewLogger(t), filepath.Join(dir, "1.snap")) - if err != ErrEmptySnapshot { + if !errors.Is(err, ErrEmptySnapshot) { t.Errorf("err = %v, want %v", err, ErrEmptySnapshot) } } @@ -262,7 +263,7 @@ func TestAllSnapshotBroken(t *testing.T) { ss := New(zaptest.NewLogger(t), dir) _, err = ss.Load() - if err != ErrNoSnapshot { + if !errors.Is(err, ErrNoSnapshot) { t.Errorf("err = %v, want %v", err, ErrNoSnapshot) } } diff --git a/server/etcdserver/api/v2discovery/discovery.go b/server/etcdserver/api/v2discovery/discovery.go index 5993d4458ec..039c8da7d52 100644 --- a/server/etcdserver/api/v2discovery/discovery.go +++ b/server/etcdserver/api/v2discovery/discovery.go @@ -187,7 +187,7 @@ func (d *discovery) joinCluster(config string) (string, error) { func (d *discovery) getCluster() (string, error) { nodes, size, index, err := d.checkCluster() if err != nil { - if err == ErrFullCluster { + if errors.Is(err, ErrFullCluster) { return nodesToCluster(nodes, size) } return "", err @@ -227,7 +227,7 @@ func (d *discovery) checkCluster() ([]*client.Node, uint64, uint64, error) { if eerr, ok := err.(*client.Error); ok && eerr.Code == client.ErrorCodeKeyNotFound { return nil, 0, 0, ErrSizeNotFound } - if err == client.ErrInvalidJSON { + if errors.Is(err, client.ErrInvalidJSON) { return nil, 0, 0, ErrBadDiscoveryEndpoint } if ce, ok := err.(*client.ClusterError); ok { diff --git a/server/etcdserver/api/v2discovery/discovery_test.go b/server/etcdserver/api/v2discovery/discovery_test.go index 91dbfd72aac..3b59517f999 100644 --- a/server/etcdserver/api/v2discovery/discovery_test.go +++ b/server/etcdserver/api/v2discovery/discovery_test.go @@ -212,7 +212,7 @@ func TestCheckCluster(t *testing.T) { } }() ns, size, index, err := d.checkCluster() - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, err, tt.werr) } if reflect.DeepEqual(ns, tt.nodes) { @@ -336,7 +336,7 @@ func TestCreateSelf(t *testing.T) { for i, tt := range tests { d := newTestDiscovery(t, "1000", 1, tt.c) - if err := d.createSelf(""); err != tt.werr { + if err := d.createSelf(""); !errors.Is(err, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, err, nil) } } @@ -383,7 +383,7 @@ func TestNodesToCluster(t *testing.T) { for i, tt := range tests { cluster, err := nodesToCluster(tt.nodes, tt.size) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, err, tt.werr) } if !reflect.DeepEqual(cluster, tt.wcluster) { @@ -435,7 +435,7 @@ func TestRetryFailure(t *testing.T) { fc.Advance(time.Second * (0x1 << i)) } }() - if _, _, _, err := d.checkCluster(); err != ErrTooManyRetries { + if _, _, _, err := d.checkCluster(); !errors.Is(err, ErrTooManyRetries) { t.Errorf("err = %v, want %v", err, ErrTooManyRetries) } } diff --git a/server/etcdserver/api/v3discovery/discovery_test.go b/server/etcdserver/api/v3discovery/discovery_test.go index 10d63e6486d..89b4d3cbbef 100644 --- a/server/etcdserver/api/v3discovery/discovery_test.go +++ b/server/etcdserver/api/v3discovery/discovery_test.go @@ -91,7 +91,7 @@ func TestGetClusterSize(t *testing.T) { clusterToken: "fakeToken", } - if cs, err := d.getClusterSize(); err != tc.expectedErr { + if cs, err := d.getClusterSize(); !errors.Is(err, tc.expectedErr) { t.Errorf("Unexpected error, expected: %v got: %v", tc.expectedErr, err) } else { if err == nil && cs != tc.expectedSize { @@ -387,7 +387,7 @@ func TestCheckCluster(t *testing.T) { } clsInfo, _, _, err := d.checkCluster() - if err != tc.expectedError { + if !errors.Is(err, tc.expectedError) { t.Errorf("Unexpected error, expected: %v, got: %v", tc.expectedError, err) } @@ -724,7 +724,7 @@ func TestGetInitClusterStr(t *testing.T) { } retStr, err := clsInfo.getInitClusterStr(tc.clusterSize) - if err != tc.expectedError { + if !errors.Is(err, tc.expectedError) { t.Errorf("Unexpected error, expected: %v, got: %v", tc.expectedError, err) } diff --git a/server/etcdserver/api/v3rpc/lease.go b/server/etcdserver/api/v3rpc/lease.go index 86f35113cd9..19c5973bd81 100644 --- a/server/etcdserver/api/v3rpc/lease.go +++ b/server/etcdserver/api/v3rpc/lease.go @@ -16,6 +16,7 @@ package v3rpc import ( "context" + "errors" "io" "go.uber.org/zap" @@ -61,10 +62,10 @@ func (ls *LeaseServer) LeaseRevoke(ctx context.Context, rr *pb.LeaseRevokeReques func (ls *LeaseServer) LeaseTimeToLive(ctx context.Context, rr *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { resp, err := ls.le.LeaseTimeToLive(ctx, rr) - if err != nil && err != lease.ErrLeaseNotFound { + if err != nil && !errors.Is(err, lease.ErrLeaseNotFound) { return nil, togRPCError(err) } - if err == lease.ErrLeaseNotFound { + if errors.Is(err, lease.ErrLeaseNotFound) { resp = &pb.LeaseTimeToLiveResponse{ Header: &pb.ResponseHeader{}, ID: rr.ID, @@ -80,7 +81,7 @@ func (ls *LeaseServer) LeaseLeases(ctx context.Context, rr *pb.LeaseLeasesReques if err != nil && err != lease.ErrLeaseNotFound { return nil, togRPCError(err) } - if err == lease.ErrLeaseNotFound { + if errors.Is(err, lease.ErrLeaseNotFound) { resp = &pb.LeaseLeasesResponse{ Header: &pb.ResponseHeader{}, Leases: []*pb.LeaseStatus{}, @@ -100,7 +101,7 @@ func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) (err case <-stream.Context().Done(): // the only server-side cancellation is noleader for now. err = stream.Context().Err() - if err == context.Canceled { + if errors.Is(err, context.Canceled) { err = rpctypes.ErrGRPCNoLeader } } @@ -110,7 +111,7 @@ func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) (err func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error { for { req, err := stream.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return nil } if err != nil { @@ -133,7 +134,7 @@ func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro ls.hdr.fill(resp.Header) ttl, err := ls.le.LeaseRenew(stream.Context(), lease.LeaseID(req.ID)) - if err == lease.ErrLeaseNotFound { + if errors.Is(err, lease.ErrLeaseNotFound) { err = nil ttl = 0 } diff --git a/server/etcdserver/api/v3rpc/util.go b/server/etcdserver/api/v3rpc/util.go index a31e6cbecca..2354b0cb243 100644 --- a/server/etcdserver/api/v3rpc/util.go +++ b/server/etcdserver/api/v3rpc/util.go @@ -16,6 +16,7 @@ package v3rpc import ( "context" + errorspkg "errors" "strings" "google.golang.org/grpc/codes" @@ -95,7 +96,7 @@ var toGRPCErrorMap = map[error]error{ func togRPCError(err error) error { // let gRPC server convert to codes.Canceled, codes.DeadlineExceeded - if err == context.Canceled || err == context.DeadlineExceeded { + if errorspkg.Is(err, context.Canceled) || errorspkg.Is(err, context.DeadlineExceeded) { return err } grpcErr, ok := toGRPCErrorMap[err] diff --git a/server/etcdserver/api/v3rpc/util_test.go b/server/etcdserver/api/v3rpc/util_test.go index ed686021d2b..8bd569301c4 100644 --- a/server/etcdserver/api/v3rpc/util_test.go +++ b/server/etcdserver/api/v3rpc/util_test.go @@ -38,7 +38,7 @@ func TestGRPCError(t *testing.T) { {err: errors.New("foo"), exp: status.Error(codes.Unknown, "foo")}, } for i := range tt { - if err := togRPCError(tt[i].err); err != tt[i].exp { + if err := togRPCError(tt[i].err); !errors.Is(err, tt[i].exp) { if _, ok := status.FromError(err); ok { if err.Error() == tt[i].exp.Error() { continue diff --git a/server/etcdserver/api/v3rpc/watch.go b/server/etcdserver/api/v3rpc/watch.go index 6e72b1ceb89..abb465e21d7 100644 --- a/server/etcdserver/api/v3rpc/watch.go +++ b/server/etcdserver/api/v3rpc/watch.go @@ -16,6 +16,7 @@ package v3rpc import ( "context" + "errors" "io" "math/rand" "sync" @@ -211,13 +212,13 @@ func (ws *watchServer) Watch(stream pb.Watch_WatchServer) (err error) { // revisited. select { case err = <-errc: - if err == context.Canceled { + if errors.Is(err, context.Canceled) { err = rpctypes.ErrGRPCWatchCanceled } close(sws.ctrlStream) case <-stream.Context().Done(): err = stream.Context().Err() - if err == context.Canceled { + if errors.Is(err, context.Canceled) { err = rpctypes.ErrGRPCWatchCanceled } } @@ -241,7 +242,7 @@ func (sws *serverWatchStream) isWatchPermitted(wcr *pb.WatchCreateRequest) error func (sws *serverWatchStream) recvLoop() error { for { req, err := sws.gRPCStream.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return nil } if err != nil { @@ -280,7 +281,7 @@ func (sws *serverWatchStream) recvLoop() error { case auth.ErrUserEmpty: cancelReason = rpctypes.ErrGRPCUserEmpty.Error() default: - if err != auth.ErrPermissionDenied { + if !errors.Is(err, auth.ErrPermissionDenied) { sws.lg.Error("unexpected error code", zap.Error(err)) } cancelReason = rpctypes.ErrGRPCPermissionDenied.Error() diff --git a/server/etcdserver/api/v3rpc/watch_test.go b/server/etcdserver/api/v3rpc/watch_test.go index bd3f4943b2e..e7868ddf8d2 100644 --- a/server/etcdserver/api/v3rpc/watch_test.go +++ b/server/etcdserver/api/v3rpc/watch_test.go @@ -16,6 +16,7 @@ package v3rpc import ( "bytes" + "errors" "math" "testing" @@ -69,7 +70,7 @@ func TestSendFragment(t *testing.T) { return nil } err := sendFragments(tt[i].wr, tt[i].maxRequestBytes, testSend) - if err != tt[i].werr { + if !errors.Is(err, tt[i].werr) { t.Errorf("#%d: expected error %v, got %v", i, tt[i].werr, err) } got := len(fragmentedResp) diff --git a/server/etcdserver/apply/apply_auth_test.go b/server/etcdserver/apply/apply_auth_test.go index 6516f41b52f..e7445a10aa9 100644 --- a/server/etcdserver/apply/apply_auth_test.go +++ b/server/etcdserver/apply/apply_auth_test.go @@ -16,6 +16,7 @@ package apply import ( "context" + "errors" "testing" "time" @@ -387,8 +388,8 @@ func TestAuthApplierV3_AdminPermission(t *testing.T) { tc.request.Header = &pb.RequestHeader{Username: userReadOnly} } result := authApplier.Apply(ctx, tc.request, dummyApplyFunc) - require.Equal(t, result.Err == auth.ErrPermissionDenied, tc.adminPermissionNeeded, - "Admin permission needed: got %v, expect: %v", result.Err == auth.ErrPermissionDenied, tc.adminPermissionNeeded) + require.Equal(t, errors.Is(result.Err, auth.ErrPermissionDenied), tc.adminPermissionNeeded, + "Admin permission needed: got %v, expect: %v", errors.Is(result.Err, auth.ErrPermissionDenied), tc.adminPermissionNeeded) }) } } diff --git a/server/etcdserver/server_test.go b/server/etcdserver/server_test.go index 858aa32a076..e26d6412722 100644 --- a/server/etcdserver/server_test.go +++ b/server/etcdserver/server_test.go @@ -17,6 +17,7 @@ package etcdserver import ( "context" "encoding/json" + errorspkg "errors" "fmt" "math" "net/http" @@ -388,7 +389,7 @@ func TestApplyConfChangeError(t *testing.T) { cluster: cl, } _, err := srv.applyConfChange(tt.cc, nil, true) - if err != tt.werr { + if !errorspkg.Is(err, tt.werr) { t.Errorf("#%d: applyConfChange error = %v, want %v", i, err, tt.werr) } cc := raftpb.ConfChange{Type: tt.cc.Type, NodeID: raft.None, Context: tt.cc.Context} @@ -1533,7 +1534,7 @@ func TestWaitAppliedIndex(t *testing.T) { err := s.waitAppliedIndex() - if err != tc.ExpectedError { + if !errorspkg.Is(err, tc.ExpectedError) { t.Errorf("Unexpected error, want (%v), got (%v)", tc.ExpectedError, err) } }) diff --git a/server/lease/leasehttp/http.go b/server/lease/leasehttp/http.go index 5837ac40b17..9592b63cb97 100644 --- a/server/lease/leasehttp/http.go +++ b/server/lease/leasehttp/http.go @@ -75,7 +75,7 @@ func (h *leaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } ttl, rerr := h.l.Renew(lease.LeaseID(lreq.ID)) if rerr != nil { - if rerr == lease.ErrLeaseNotFound { + if errors.Is(rerr, lease.ErrLeaseNotFound) { http.Error(w, rerr.Error(), http.StatusNotFound) return } diff --git a/server/lease/lessor_test.go b/server/lease/lessor_test.go index 0d32300abaf..f46e2b39949 100644 --- a/server/lease/lessor_test.go +++ b/server/lease/lessor_test.go @@ -16,6 +16,7 @@ package lease import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -454,7 +455,7 @@ func TestLessorExpire(t *testing.T) { donec := make(chan struct{}, 1) go func() { // expired lease cannot be renewed - if _, err := le.Renew(l.ID); err != ErrLeaseNotFound { + if _, err := le.Renew(l.ID); !errors.Is(err, ErrLeaseNotFound) { t.Errorf("unexpected renew") } donec <- struct{}{} @@ -507,7 +508,7 @@ func TestLessorExpireAndDemote(t *testing.T) { donec := make(chan struct{}, 1) go func() { // expired lease cannot be renewed - if _, err := le.Renew(l.ID); err != ErrNotPrimary { + if _, err := le.Renew(l.ID); !errors.Is(err, ErrNotPrimary) { t.Errorf("unexpected renew: %v", err) } donec <- struct{}{} @@ -539,7 +540,7 @@ func TestLessorMaxTTL(t *testing.T) { defer le.Stop() _, err := le.Grant(1, MaxLeaseTTL+1) - if err != ErrLeaseTTLTooLarge { + if !errors.Is(err, ErrLeaseTTLTooLarge) { t.Fatalf("grant unexpectedly succeeded") } } diff --git a/server/proxy/grpcproxy/lease.go b/server/proxy/grpcproxy/lease.go index fdc936ca929..dc42dc5a0d8 100644 --- a/server/proxy/grpcproxy/lease.go +++ b/server/proxy/grpcproxy/lease.go @@ -16,6 +16,7 @@ package grpcproxy import ( "context" + "errors" "io" "sync" "sync/atomic" @@ -245,7 +246,7 @@ type leaseProxyStream struct { func (lps *leaseProxyStream) recvLoop() error { for { rr, err := lps.stream.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return nil } if err != nil { diff --git a/server/proxy/grpcproxy/maintenance.go b/server/proxy/grpcproxy/maintenance.go index 50ecf67ffa0..553b66c4b73 100644 --- a/server/proxy/grpcproxy/maintenance.go +++ b/server/proxy/grpcproxy/maintenance.go @@ -16,6 +16,7 @@ package grpcproxy import ( "context" + "errors" "io" pb "go.etcd.io/etcd/api/v3/etcdserverpb" @@ -50,7 +51,7 @@ func (mp *maintenanceProxy) Snapshot(sr *pb.SnapshotRequest, stream pb.Maintenan for { rr, err := sc.Recv() if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { return nil } return err diff --git a/server/storage/mvcc/index_test.go b/server/storage/mvcc/index_test.go index 5973ecbe4be..64c5ecd407e 100644 --- a/server/storage/mvcc/index_test.go +++ b/server/storage/mvcc/index_test.go @@ -15,6 +15,7 @@ package mvcc import ( + "errors" "reflect" "testing" @@ -46,7 +47,7 @@ func TestIndexGet(t *testing.T) { } for i, tt := range tests { rev, created, ver, err := ti.Get([]byte("foo"), tt.rev) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, err, tt.werr) } if rev != tt.wrev { @@ -130,11 +131,11 @@ func TestIndexTombstone(t *testing.T) { } _, _, _, err = ti.Get([]byte("foo"), 2) - if err != ErrRevisionNotFound { + if !errors.Is(err, ErrRevisionNotFound) { t.Errorf("get error = %v, want ErrRevisionNotFound", err) } err = ti.Tombstone([]byte("foo"), Revision{Main: 3}) - if err != ErrRevisionNotFound { + if !errors.Is(err, ErrRevisionNotFound) { t.Errorf("tombstone error = %v, want %v", err, ErrRevisionNotFound) } } diff --git a/server/storage/mvcc/key_index_test.go b/server/storage/mvcc/key_index_test.go index 63436428cbd..273f06e3402 100644 --- a/server/storage/mvcc/key_index_test.go +++ b/server/storage/mvcc/key_index_test.go @@ -15,6 +15,7 @@ package mvcc import ( + "errors" "reflect" "testing" @@ -73,7 +74,7 @@ func TestKeyIndexGet(t *testing.T) { for i, tt := range tests { mod, creat, ver, err := ki.get(zaptest.NewLogger(t), tt.rev) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, err, tt.werr) } if mod != tt.wmod { @@ -213,7 +214,7 @@ func TestKeyIndexTombstone(t *testing.T) { } err = ki.tombstone(zaptest.NewLogger(t), 16, 0) - if err != ErrRevisionNotFound { + if !errors.Is(err, ErrRevisionNotFound) { t.Errorf("tombstone error = %v, want %v", err, ErrRevisionNotFound) } } diff --git a/server/storage/mvcc/kv_test.go b/server/storage/mvcc/kv_test.go index 9b8243c334c..0a3a2ad736f 100644 --- a/server/storage/mvcc/kv_test.go +++ b/server/storage/mvcc/kv_test.go @@ -16,6 +16,7 @@ package mvcc import ( "context" + "errors" "fmt" "os" "reflect" @@ -203,7 +204,7 @@ func testKVRangeBadRev(t *testing.T, f rangeFunc) { } for i, tt := range tests { _, err := f(s, []byte("foo"), []byte("foo3"), RangeOptions{Rev: tt.rev}) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: error = %v, want %v", i, err, tt.werr) } } @@ -626,7 +627,7 @@ func TestKVCompactBad(t *testing.T) { } for i, tt := range tests { _, err := s.Compact(traceutil.TODO(), tt.rev) - if err != tt.werr { + if !errors.Is(err, tt.werr) { t.Errorf("#%d: compact error = %v, want %v", i, err, tt.werr) } } diff --git a/server/storage/mvcc/kvstore_test.go b/server/storage/mvcc/kvstore_test.go index 0523dcde983..ed14cdebd68 100644 --- a/server/storage/mvcc/kvstore_test.go +++ b/server/storage/mvcc/kvstore_test.go @@ -19,6 +19,7 @@ import ( "context" "crypto/rand" "encoding/binary" + "errors" "fmt" "math" mrand "math/rand" @@ -518,7 +519,7 @@ func TestRestoreContinueUnfinishedCompaction(t *testing.T) { // wait for scheduled compaction to be finished time.Sleep(100 * time.Millisecond) - if _, err := s.Range(context.TODO(), []byte("foo"), nil, RangeOptions{Rev: 1}); err != ErrCompacted { + if _, err := s.Range(context.TODO(), []byte("foo"), nil, RangeOptions{Rev: 1}); !errors.Is(err, ErrCompacted) { t.Errorf("range on compacted rev error = %v, want %v", err, ErrCompacted) } // check the key in backend is deleted diff --git a/server/storage/mvcc/watcher_test.go b/server/storage/mvcc/watcher_test.go index 41bbb510875..a53253a08c0 100644 --- a/server/storage/mvcc/watcher_test.go +++ b/server/storage/mvcc/watcher_test.go @@ -16,6 +16,7 @@ package mvcc import ( "bytes" + "errors" "fmt" "os" "reflect" @@ -108,7 +109,7 @@ func TestWatcherRequestsCustomID(t *testing.T) { for i, tcase := range tt { id, err := w.Watch(tcase.givenID, []byte("foo"), nil, 0) if tcase.expectedErr != nil || err != nil { - if err != tcase.expectedErr { + if !errors.Is(err, tcase.expectedErr) { t.Errorf("expected get error %q in test case %q, got %q", tcase.expectedErr, i, err) } } else if tcase.expectedID != id { @@ -201,10 +202,10 @@ func TestWatcherWatchWrongRange(t *testing.T) { w := s.NewWatchStream() defer w.Close() - if _, err := w.Watch(0, []byte("foa"), []byte("foa"), 1); err != ErrEmptyWatcherRange { + if _, err := w.Watch(0, []byte("foa"), []byte("foa"), 1); !errors.Is(err, ErrEmptyWatcherRange) { t.Fatalf("key == end range given; expected ErrEmptyWatcherRange, got %+v", err) } - if _, err := w.Watch(0, []byte("fob"), []byte("foa"), 1); err != ErrEmptyWatcherRange { + if _, err := w.Watch(0, []byte("fob"), []byte("foa"), 1); !errors.Is(err, ErrEmptyWatcherRange) { t.Fatalf("key > end range given; expected ErrEmptyWatcherRange, got %+v", err) } // watch request with 'WithFromKey' has empty-byte range end @@ -278,7 +279,7 @@ func TestWatchStreamCancelWatcherByID(t *testing.T) { for i, tt := range tests { gerr := w.Cancel(tt.cancelID) - if gerr != tt.werr { + if !errors.Is(gerr, tt.werr) { t.Errorf("#%d: err = %v, want %v", i, gerr, tt.werr) } } diff --git a/server/storage/schema/actions_test.go b/server/storage/schema/actions_test.go index 4e61a0dac9a..d3cb812c11e 100644 --- a/server/storage/schema/actions_test.go +++ b/server/storage/schema/actions_test.go @@ -15,6 +15,7 @@ package schema import ( + "errors" "fmt" "testing" "time" @@ -135,7 +136,7 @@ func TestActionListRevert(t *testing.T) { UnsafeCreateMetaBucket(tx) err := tc.actions.unsafeExecute(lg, tx) - if err != tc.expectError { + if !errors.Is(err, tc.expectError) { t.Errorf("Unexpected error or lack thereof, expected: %v, got: %v", tc.expectError, err) } assertBucketState(t, tx, Meta, tc.expectState) diff --git a/server/storage/schema/migration_test.go b/server/storage/schema/migration_test.go index fccf2029689..9ebe80dcb05 100644 --- a/server/storage/schema/migration_test.go +++ b/server/storage/schema/migration_test.go @@ -15,6 +15,7 @@ package schema import ( + "errors" "fmt" "testing" "time" @@ -178,7 +179,7 @@ func TestMigrationStepExecute(t *testing.T) { step := newMigrationStep(tc.currentVersion, tc.isUpgrade, tc.changes) err := step.unsafeExecute(lg, tx) - if err != tc.expectError { + if !errors.Is(err, tc.expectError) { t.Errorf("Unexpected error or lack thereof, expected: %v, got: %v", tc.expectError, err) } v := UnsafeReadStorageVersion(tx) diff --git a/server/storage/wal/decoder.go b/server/storage/wal/decoder.go index 0f47b72fd3e..01ffbd52bd9 100644 --- a/server/storage/wal/decoder.go +++ b/server/storage/wal/decoder.go @@ -16,6 +16,7 @@ package wal import ( "encoding/binary" + "errors" "fmt" "hash" "io" @@ -114,7 +115,7 @@ func (d *decoder) decodeRecord(rec *walpb.Record) error { if _, err = io.ReadFull(fileBufReader, data); err != nil { // ReadFull returns io.EOF only if no bytes were read // the decoder should treat this as an ErrUnexpectedEOF instead. - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return err diff --git a/server/storage/wal/repair_test.go b/server/storage/wal/repair_test.go index 38e3641bd7b..a1abdcac38d 100644 --- a/server/storage/wal/repair_test.go +++ b/server/storage/wal/repair_test.go @@ -15,6 +15,7 @@ package wal import ( + "errors" "fmt" "io" "os" @@ -202,7 +203,7 @@ func TestRepairFailDeleteDir(t *testing.T) { t.Fatal(err) } _, _, _, err = w.ReadAll() - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Fatalf("err = %v, want error %v", err, io.ErrUnexpectedEOF) } w.Close() diff --git a/server/storage/wal/wal_test.go b/server/storage/wal/wal_test.go index ed3a8893df5..c739ddf0a55 100644 --- a/server/storage/wal/wal_test.go +++ b/server/storage/wal/wal_test.go @@ -101,7 +101,7 @@ func TestCreateFailFromPollutedDir(t *testing.T) { os.WriteFile(filepath.Join(p, "test.wal"), []byte("data"), os.ModeTemporary) _, err := Create(zaptest.NewLogger(t), p, []byte("data")) - if err != os.ErrExist { + if !errors.Is(err, os.ErrExist) { t.Fatalf("expected %v, got %v", os.ErrExist, err) } } @@ -152,7 +152,7 @@ func TestNewForInitedDir(t *testing.T) { p := t.TempDir() os.Create(filepath.Join(p, walName(0, 0))) - if _, err := Create(zaptest.NewLogger(t), p, nil); err == nil || err != os.ErrExist { + if _, err := Create(zaptest.NewLogger(t), p, nil); err == nil || !errors.Is(err, os.ErrExist) { t.Errorf("err = %v, want %v", err, os.ErrExist) } } @@ -663,7 +663,7 @@ func TestOpenWithMaxIndex(t *testing.T) { defer w2.Close() _, _, _, err = w2.ReadAll() - if err != ErrSliceOutOfRange { + if !errors.Is(err, ErrSliceOutOfRange) { t.Fatalf("err = %v, want ErrSliceOutOfRange", err) } } @@ -964,7 +964,7 @@ func TestReadAllFail(t *testing.T) { f.Close() // try to read without opening the WAL _, _, _, err = f.ReadAll() - if err == nil || err != ErrDecoderNotFound { + if err == nil || !errors.Is(err, ErrDecoderNotFound) { t.Fatalf("err = %v, want ErrDecoderNotFound", err) } }