diff --git a/.golangci.yml b/.golangci.yml index 8c02d880c6..a161ec03f0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,10 +1,21 @@ linters: enable: + - errorlint - gci - gofumpt - misspell linters-settings: + errorlint: + # Check whether fmt.Errorf uses the %w verb for formatting errors. + # See the https://github.com/polyfloyd/go-errorlint for caveats. + errorf: true + # Permit more than 1 %w verb, valid per Go 1.20 (Requires errorf:true) + errorf-multi: true + # Check for plain type assertions and type switches. + asserts: true + # Check for plain error comparisons. + comparison: true gci: sections: - standard diff --git a/docker.go b/docker.go index 5ed61f4ada..0ba0f98b65 100644 --- a/docker.go +++ b/docker.go @@ -794,7 +794,8 @@ func (p *DockerProvider) BuildImage(ctx context.Context, img ImageBuildInfo) (st err = backoff.Retry(func() error { resp, err = p.client.ImageBuild(ctx, buildContext, buildOptions) if err != nil { - if _, ok := err.(errdefs.ErrNotFound); ok { + var enf errdefs.ErrNotFound + if errors.As(err, &enf) { return backoff.Permanent(err) } Logger.Printf("Failed to build image: %s, will retry", err) @@ -1161,7 +1162,8 @@ func (p *DockerProvider) attemptToPullImage(ctx context.Context, tag string, pul err = backoff.Retry(func() error { pull, err = p.client.ImagePull(ctx, tag, pullOpt) if err != nil { - if _, ok := err.(errdefs.ErrNotFound); ok { + var enf errdefs.ErrNotFound + if errors.As(err, &enf) { return backoff.Permanent(err) } Logger.Printf("Failed to pull image: %s, will retry", err) diff --git a/internal/testcontainersdocker/docker_host.go b/internal/testcontainersdocker/docker_host.go index f6ee5b9a50..b343d40691 100644 --- a/internal/testcontainersdocker/docker_host.go +++ b/internal/testcontainersdocker/docker_host.go @@ -112,7 +112,7 @@ func extractDockerHost(ctx context.Context) string { for _, dockerHostFn := range dockerHostFns { dockerHost, err := dockerHostFn(ctx) if err != nil { - outerErr = fmt.Errorf("%w: %v", outerErr, err) + outerErr = fmt.Errorf("%w: %w", outerErr, err) continue } diff --git a/internal/testcontainersdocker/docker_rootless.go b/internal/testcontainersdocker/docker_rootless.go index b4c12f63b0..a030d2d12f 100644 --- a/internal/testcontainersdocker/docker_rootless.go +++ b/internal/testcontainersdocker/docker_rootless.go @@ -57,7 +57,7 @@ func rootlessDockerSocketPath(_ context.Context) (string, error) { for _, socketPathFn := range socketPathFns { s, err := socketPathFn() if err != nil { - outerErr = fmt.Errorf("%w: %v", outerErr, err) + outerErr = fmt.Errorf("%w: %w", outerErr, err) continue } diff --git a/parallel_test.go b/parallel_test.go index 7195c9f4f3..122f59a4f7 100644 --- a/parallel_test.go +++ b/parallel_test.go @@ -2,6 +2,7 @@ package testcontainers import ( "context" + "errors" "fmt" "testing" "time" @@ -100,10 +101,10 @@ func TestParallelContainers(t *testing.T) { res, err := ParallelContainers(context.Background(), tc.reqs, ParallelContainersOptions{}) if err != nil { require.NotZero(t, tc.expErrors) - e, _ := err.(ParallelContainersError) - + var e ParallelContainersError + errors.As(err, &e) if len(e.Errors) != tc.expErrors { - t.Fatalf("expected erorrs: %d, got: %d\n", tc.expErrors, len(e.Errors)) + t.Fatalf("expected errors: %d, got: %d\n", tc.expErrors, len(e.Errors)) } } @@ -157,7 +158,8 @@ func TestParallelContainersWithReuse(t *testing.T) { res, err := ParallelContainers(ctx, parallelRequest, ParallelContainersOptions{}) if err != nil { - e, _ := err.(ParallelContainersError) + var e ParallelContainersError + errors.As(err, &e) t.Fatalf("expected errors: %d, got: %d\n", 0, len(e.Errors)) } // Container is reused, only terminate first container diff --git a/wait/errors.go b/wait/errors.go index f8a02a59bf..3e3919a6fe 100644 --- a/wait/errors.go +++ b/wait/errors.go @@ -3,8 +3,11 @@ package wait -import "syscall" +import ( + "errors" + "syscall" +) func isConnRefusedErr(err error) bool { - return err == syscall.ECONNREFUSED + return errors.Is(err, syscall.ECONNREFUSED) } diff --git a/wait/exec_test.go b/wait/exec_test.go index 21a5b6c331..6c91b3a487 100644 --- a/wait/exec_test.go +++ b/wait/exec_test.go @@ -129,7 +129,7 @@ func TestExecStrategyWaitUntilReady_DeadlineExceeded(t *testing.T) { } wg := wait.NewExecStrategy([]string{"true"}) err := wg.WaitUntilReady(ctx, target) - if err != context.DeadlineExceeded { + if !errors.Is(err, context.DeadlineExceeded) { t.Fatal(err) } } diff --git a/wait/host_port.go b/wait/host_port.go index 6ef1da82bf..2d150c1c11 100644 --- a/wait/host_port.go +++ b/wait/host_port.go @@ -116,7 +116,7 @@ func (hp *HostPortStrategy) WaitUntilReady(ctx context.Context, target StrategyT select { case <-ctx.Done(): - return fmt.Errorf("%s:%w", ctx.Err(), err) + return fmt.Errorf("%w: %w", ctx.Err(), err) case <-time.After(waitInterval): if err := checkTarget(ctx, target); err != nil { return err @@ -155,8 +155,10 @@ func externalCheck(ctx context.Context, ipAddress string, port nat.Port, target } conn, err := dialer.DialContext(ctx, proto, address) if err != nil { - if v, ok := err.(*net.OpError); ok { - if v2, ok := (v.Err).(*os.SyscallError); ok { + var v *net.OpError + if errors.As(err, &v) { + var v2 *os.SyscallError + if errors.As(v.Err, &v2) { if isConnRefusedErr(v2.Err) { time.Sleep(waitInterval) continue diff --git a/wait/http.go b/wait/http.go index 39c0c155f8..94ff12bc89 100644 --- a/wait/http.go +++ b/wait/http.go @@ -150,7 +150,7 @@ func (ws *HTTPStrategy) WaitUntilReady(ctx context.Context, target StrategyTarge for err != nil { select { case <-ctx.Done(): - return fmt.Errorf("%s:%w", ctx.Err(), err) + return fmt.Errorf("%w: %w", ctx.Err(), err) case <-time.After(ws.PollInterval): if err := checkTarget(ctx, target); err != nil { return err @@ -177,7 +177,7 @@ func (ws *HTTPStrategy) WaitUntilReady(ctx context.Context, target StrategyTarge for mappedPort == "" { select { case <-ctx.Done(): - return fmt.Errorf("%s:%w", ctx.Err(), err) + return fmt.Errorf("%w: %w", ctx.Err(), err) case <-time.After(ws.PollInterval): if err := checkTarget(ctx, target); err != nil { return err diff --git a/wait/sql.go b/wait/sql.go index c24629ed94..514322a87f 100644 --- a/wait/sql.go +++ b/wait/sql.go @@ -87,7 +87,7 @@ func (w *waitForSql) WaitUntilReady(ctx context.Context, target StrategyTarget) for port == "" { select { case <-ctx.Done(): - return fmt.Errorf("%s:%w", ctx.Err(), err) + return fmt.Errorf("%w: %w", ctx.Err(), err) case <-ticker.C: if err := checkTarget(ctx, target); err != nil { return err @@ -98,7 +98,7 @@ func (w *waitForSql) WaitUntilReady(ctx context.Context, target StrategyTarget) db, err := sql.Open(w.Driver, w.URL(host, port)) if err != nil { - return fmt.Errorf("sql.Open: %v", err) + return fmt.Errorf("sql.Open: %w", err) } defer db.Close() for {