From f794f8a29491b8467868811a3142a48e8f0a3854 Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Fri, 11 Apr 2025 10:56:05 +0200 Subject: [PATCH] chore: update linter --- .github/workflows/validate.yaml | 6 +- .golangci.yml | 575 +++++++++--------- integration/integration_test.go | 2 +- integration/tcp_test.go | 2 +- integration/udp_test.go | 2 +- pkg/middlewares/accesslog/logger.go | 5 +- pkg/middlewares/accesslog/logger_test.go | 8 +- pkg/middlewares/accesslog/parser_test.go | 2 +- pkg/middlewares/auth/forward_test.go | 2 +- pkg/middlewares/compress/compress_test.go | 14 +- .../passtlsclientcert/pass_tls_client_cert.go | 6 +- .../ratelimiter/rate_limiter_test.go | 6 +- pkg/muxer/http/mux_test.go | 2 +- pkg/muxer/tcp/mux_test.go | 2 +- pkg/provider/acme/provider_test.go | 4 +- pkg/provider/docker/docker.go | 5 +- pkg/provider/docker/swarm_test.go | 2 +- .../kubernetes/crd/kubernetes_http.go | 8 +- pkg/redactor/redactor_doOnStruct_test.go | 2 +- pkg/server/service/service_test.go | 2 +- pkg/types/domain_test.go | 2 +- pkg/udp/conn.go | 6 +- 22 files changed, 344 insertions(+), 321 deletions(-) diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml index dd20daf56..4ed5faec5 100644 --- a/.github/workflows/validate.yaml +++ b/.github/workflows/validate.yaml @@ -7,7 +7,7 @@ on: env: GO_VERSION: '1.23' - GOLANGCI_LINT_VERSION: v1.64.2 + GOLANGCI_LINT_VERSION: v2.0.2 MISSPELL_VERSION: v0.6.0 jobs: @@ -28,7 +28,7 @@ jobs: check-latest: true - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: version: "${{ env.GOLANGCI_LINT_VERSION }}" @@ -48,7 +48,7 @@ jobs: check-latest: true - name: Install misspell ${{ env.MISSPELL_VERSION }} - run: curl -sfL https://raw.githubusercontent.com/golangci/misspell/master/install-misspell.sh | sh -s -- -b $(go env GOPATH)/bin ${MISSPELL_VERSION} + run: curl -sfL https://raw.githubusercontent.com/golangci/misspell/HEAD/install-misspell.sh | sh -s -- -b $(go env GOPATH)/bin ${MISSPELL_VERSION} - name: Avoid generating webui run: touch webui/static/index.html diff --git a/.golangci.yml b/.golangci.yml index c233d4c19..dea9f5f13 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,288 +1,315 @@ -run: - timeout: 10m - relative-path-mode: cfg +version: "2" -linters-settings: - govet: - enable-all: true - disable: - - shadow - - fieldalignment - gocyclo: - min-complexity: 14 - goconst: - min-len: 3 - min-occurrences: 4 - misspell: - locale: US - funlen: - lines: -1 - statements: 120 - forbidigo: - forbid: - - ^print(ln)?$ - - ^spew\.Print(f|ln)?$ - - ^spew\.Dump$ - depguard: - rules: - main: - deny: - - pkg: "github.com/instana/testify" - desc: not allowed - - pkg: "github.com/pkg/errors" - desc: Should be replaced by standard lib errors package - godox: - keywords: - - FIXME - importas: - no-unaliased: true - alias: - - alias: composeapi - pkg: github.com/docker/compose/v2/pkg/api +formatters: + enable: + - gci + - gofumpt + exclusions: + generated: lax + paths: + - pkg/provider/kubernetes/crd/generated/ - # Standard Kubernetes rewrites: - - alias: corev1 - pkg: "k8s.io/api/core/v1" - - alias: netv1 - pkg: "k8s.io/api/networking/v1" - - alias: netv1beta1 - pkg: "k8s.io/api/networking/v1beta1" - - alias: admv1 - pkg: "k8s.io/api/admission/v1" - - alias: admv1beta1 - pkg: "k8s.io/api/admission/v1beta1" - - alias: extv1beta1 - pkg: "k8s.io/api/extensions/v1beta1" - - alias: metav1 - pkg: "k8s.io/apimachinery/pkg/apis/meta/v1" - - alias: ktypes - pkg: "k8s.io/apimachinery/pkg/types" - - alias: kerror - pkg: "k8s.io/apimachinery/pkg/api/errors" - - alias: kclientset - pkg: "k8s.io/client-go/kubernetes" - - alias: kinformers - pkg: "k8s.io/client-go/informers" - - alias: ktesting - pkg: "k8s.io/client-go/testing" - - alias: kschema - pkg: "k8s.io/apimachinery/pkg/runtime/schema" - - alias: kscheme - pkg: "k8s.io/client-go/kubernetes/scheme" - - alias: kversion - pkg: "k8s.io/apimachinery/pkg/version" - - alias: kubefake - pkg: "k8s.io/client-go/kubernetes/fake" - - alias: discoveryfake - pkg: "k8s.io/client-go/discovery/fake" - - # Kubernetes Gateway rewrites: - - alias: gateclientset - pkg: "sigs.k8s.io/gateway-api/pkg/client/clientset/gateway/versioned" - - alias: gateinformers - pkg: "sigs.k8s.io/gateway-api/pkg/client/informers/gateway/externalversions" - - alias: gatev1alpha2 - pkg: "sigs.k8s.io/gateway-api/apis/v1alpha2" - - # Traefik Kubernetes rewrites: - - alias: containousv1alpha1 - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/traefikcontainous/v1alpha1" - - alias: traefikv1alpha1 - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/traefikio/v1alpha1" - - alias: traefikclientset - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned" - - alias: traefikinformers - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/informers/externalversions" - - alias: traefikscheme - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned/scheme" - - alias: traefikcrdfake - pkg: "github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned/fake" - tagalign: - align: false - sort: true - order: - - description - - json - - toml - - yaml - - yml - - label - - label-slice-as-struct - - file - - kv - - export - revive: - rules: - - name: struct-tag - - name: blank-imports - - name: context-as-argument - - name: context-keys-type - - name: dot-imports - - name: error-return - - name: error-strings - - name: error-naming - - name: exported - disabled: true - - name: if-return - - name: increment-decrement - - name: var-naming - - name: var-declaration - - name: package-comments - disabled: true - - name: range - - name: receiver-naming - - name: time-naming - - name: unexported-return - - name: indent-error-flow - - name: errorf - - name: empty-block - - name: superfluous-else - - name: unused-parameter - disabled: true - - name: unreachable-code - - name: redefines-builtin-id - gomoddirectives: - tool-forbidden: true - toolchain-pattern: 'go1\.\d+\.\d+$' - go-version-pattern: '^1\.\d+(\.0)?$' - replace-allow-list: - - github.com/abbot/go-http-auth - - github.com/gorilla/mux - - github.com/mailgun/minheap - - github.com/mailgun/multibuf - - github.com/jaguilar/vt100 - - github.com/cucumber/godog - testifylint: - disable: - - suite-dont-use-pkg - - require-error - - go-require - errcheck: - exclude-functions: - - fmt.Fprintln linters: - enable-all: true + default: all disable: - - tenv # Deprecated - - sqlclosecheck # not relevant (SQL) - - rowserrcheck # not relevant (SQL) + - bodyclose # too many false-positive + - containedctx # too many false-positive + - contextcheck # too many false-positive - cyclop # duplicate of gocyclo - - lll # Not relevant - - gocyclo # FIXME must be fixed - - gocognit # Too strict - - nestif # Too many false-positive. - - prealloc # Too many false-positive. - - makezero # Not relevant - dupl # Too strict - - gosec # Too strict - - gochecknoinits - - gochecknoglobals - - wsl # Too strict - - nlreturn # Not relevant - - mnd # Too strict - - stylecheck # skip because report issues related to some generated files. - - testpackage # Too strict - - tparallel # Not relevant - - paralleltest # Not relevant + - err113 # Too strict - exhaustive # Not relevant - exhaustruct # Not relevant - - err113 # Too strict - - wrapcheck # Too strict - - noctx # Too strict - - bodyclose # too many false-positive - forcetypeassert # Too strict - - tagliatelle # Too strict - - varnamelen # Not relevant - - nilnil # Not relevant - - ireturn # Not relevant - - contextcheck # too many false-positive - - containedctx # too many false-positive - - maintidx # kind of duplicate of gocyclo - - nonamedreturns # Too strict + - gochecknoglobals + - gochecknoinits + - gocognit # Too strict + - gocyclo # FIXME must be fixed + - gosec # Too strict - gosmopolitan # not relevant + - ireturn # Not relevant + - lll # Not relevant + - maintidx # kind of duplicate of gocyclo + - makezero # Not relevant + - mnd # Too strict + - nestif # Too many false-positive. + - nilnil # Not relevant + - nlreturn # Not relevant + - noctx # Too strict + - nonamedreturns # Too strict + - paralleltest # Not relevant + - prealloc # Too many false-positive. + - rowserrcheck # not relevant (SQL) + - sqlclosecheck # not relevant (SQL) + - tagliatelle # Too strict + - testpackage # Too strict + - tparallel # Not relevant + - varnamelen # Not relevant + - wrapcheck # Too strict + - wsl # Too strict + + settings: + depguard: + rules: + main: + deny: + - pkg: github.com/instana/testify + desc: not allowed + - pkg: github.com/pkg/errors + desc: Should be replaced by standard lib errors package + errcheck: + exclude-functions: + - fmt.Fprintln + forbidigo: + forbid: + - pattern: ^print(ln)?$ + - pattern: ^spew\.Print(f|ln)?$ + - pattern: ^spew\.Dump$ + funlen: + lines: -1 + statements: 120 + goconst: + min-len: 3 + min-occurrences: 4 + gocyclo: + min-complexity: 14 + godox: + keywords: + - FIXME + gomoddirectives: + toolchain-pattern: go1\.\d+\.\d+$ + tool-forbidden: true + go-version-pattern: ^1\.\d+(\.0)?$ + replace-allow-list: + - github.com/abbot/go-http-auth + - github.com/gorilla/mux + - github.com/mailgun/minheap + - github.com/mailgun/multibuf + - github.com/jaguilar/vt100 + - github.com/cucumber/godog + govet: + enable-all: true + disable: + - shadow + - fieldalignment + importas: + no-unaliased: true + alias: + - pkg: github.com/docker/compose/v2/pkg/api + alias: composeapi + + # Standard Kubernetes rewrites: + - pkg: k8s.io/api/core/v1 + alias: corev1 + - pkg: k8s.io/api/networking/v1 + alias: netv1 + - pkg: k8s.io/api/networking/v1beta1 + alias: netv1beta1 + - pkg: k8s.io/api/admission/v1 + alias: admv1 + - pkg: k8s.io/api/admission/v1beta1 + alias: admv1beta1 + - pkg: k8s.io/api/extensions/v1beta1 + alias: extv1beta1 + - pkg: k8s.io/apimachinery/pkg/apis/meta/v1 + alias: metav1 + - pkg: k8s.io/apimachinery/pkg/types + alias: ktypes + - pkg: k8s.io/apimachinery/pkg/api/errors + alias: kerror + - pkg: k8s.io/client-go/kubernetes + alias: kclientset + - pkg: k8s.io/client-go/informers + alias: kinformers + - pkg: k8s.io/client-go/testing + alias: ktesting + - pkg: k8s.io/apimachinery/pkg/runtime/schema + alias: kschema + - pkg: k8s.io/client-go/kubernetes/scheme + alias: kscheme + - pkg: k8s.io/apimachinery/pkg/version + alias: kversion + - pkg: k8s.io/client-go/kubernetes/fake + alias: kubefake + - pkg: k8s.io/client-go/discovery/fake + alias: discoveryfake + + # Kubernetes Gateway rewrites: + - pkg: sigs.k8s.io/gateway-api/pkg/client/clientset/gateway/versioned + alias: gateclientset + - pkg: sigs.k8s.io/gateway-api/pkg/client/informers/gateway/externalversions + alias: gateinformers + - pkg: sigs.k8s.io/gateway-api/apis/v1alpha2 + alias: gatev1alpha2 + + # Traefik Kubernetes rewrites: + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/traefikcontainous/v1alpha1 + alias: containousv1alpha1 + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/traefikio/v1alpha1 + alias: traefikv1alpha1 + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned + alias: traefikclientset + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/informers/externalversions + alias: traefikinformers + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned/scheme + alias: traefikscheme + - pkg: github.com/traefik/traefik/v2/pkg/provider/kubernetes/crd/generated/clientset/versioned/fake + alias: traefikcrdfake + misspell: + locale: US + revive: + rules: + - name: struct-tag + - name: blank-imports + - name: context-as-argument + - name: context-keys-type + - name: dot-imports + - name: error-return + - name: error-strings + - name: error-naming + - name: exported + disabled: true + - name: if-return + - name: increment-decrement + - name: var-naming + - name: var-declaration + - name: package-comments + disabled: true + - name: range + - name: receiver-naming + - name: time-naming + - name: unexported-return + - name: indent-error-flow + - name: errorf + - name: empty-block + - name: superfluous-else + - name: unused-parameter + disabled: true + - name: unreachable-code + - name: redefines-builtin-id + tagalign: + align: false + sort: true + order: + - description + - json + - toml + - yaml + - yml + - label + - label-slice-as-struct + - file + - kv + - export + testifylint: + disable: + - suite-dont-use-pkg + - require-error + - go-require + perfsprint: + err-error: true + errorf: true + sprintf1: true + strconcat: false + staticcheck: + checks: + - all + - '-ST1000' + - '-ST1003' + - '-ST1016' + - '-ST1020' + - '-ST1021' + - '-ST1022' + - '-QF1001' + - '-QF1008' # TODO must be fixed + + exclusions: + generated: lax + presets: + - comments + - std-error-handling + rules: + - path: (.+)_test.go + linters: + - canonicalheader + - fatcontext + - funlen + - goconst + - godot + - path: (.+)_test.go + text: ' always receives ' + linters: + - unparam + - path: pkg/server/service/bufferpool.go + text: 'SA6002: argument should be pointer-like to avoid allocations' + - path: pkg/server/middleware/middlewares.go + text: Function 'buildConstructor' has too many statements + linters: + - funlen + - path: pkg/tracing/haystack/logger.go + linters: + - goprintffuncname + - path: pkg/tracing/tracing.go + text: printf-like formatting function 'SetErrorWithEvent' should be named 'SetErrorWithEventf' + linters: + - goprintffuncname + - path: pkg/tls/tlsmanager_test.go + text: 'SA1019: config.ClientCAs.Subjects has been deprecated since Go 1.18' + - path: pkg/types/tls_test.go + text: 'SA1019: tlsConfig.RootCAs.Subjects has been deprecated since Go 1.18' + - path: pkg/provider/kubernetes/(crd|gateway)/client.go + linters: + - interfacebloat + - path: pkg/metrics/metrics.go + linters: + - interfacebloat + - path: integration/healthcheck_test.go + text: Duplicate words \(wsp2,\) found + linters: + - dupword + - path: pkg/types/domain_test.go + text: Duplicate words \(sub\) found + linters: + - dupword + - path: pkg/provider/kubernetes/gateway/client_mock_test.go + text: 'unusedwrite: unused write to field' + linters: + - govet + - path: pkg/provider/acme/local_store.go + linters: + - musttag + - path: pkg/tls/certificate.go + text: the methods of "Certificates" use pointer receiver and non-pointer receiver. + linters: + - recvcheck + - path: pkg/config/static/static_config.go + source: 'errors.New\("Consul Catalog provider' + text: 'ST1005: error strings should not be capitalized' + - path: pkg/config/static/static_config.go + source: 'errors.New\("Consul provider' + text: 'ST1005: error strings should not be capitalized' + - path: pkg/config/static/static_config.go + source: 'errors.New\("Nomad provider' + text: 'ST1005: error strings should not be capitalized' + - path: (.+)\.go + text: 'struct-tag: unknown option ''inline'' in JSON tag' + linters: + - revive + - path: (.+)\.go + text: 'struct-tag: unknown option ''omitzero'' in TOML tag' + linters: + - revive + - path: (.+)\.go$ + text: 'SA1019: http.CloseNotifier has been deprecated' # FIXME must be fixed + - path: (.+)\.go$ + text: 'SA1019: cfg.(SSLRedirect|SSLTemporaryRedirect|SSLHost|SSLForceHost|FeaturePolicy) is deprecated' + - path: (.+)\.go$ + text: 'SA1019: c.Providers.(ConsulCatalog|Consul|Nomad).Namespace is deprecated' + - path: (.+)\.go$ + text: 'SA1019: dockertypes.ContainerNode is deprecated' + paths: + - pkg/provider/kubernetes/crd/generated/ issues: - exclude-use-default: false max-issues-per-linter: 0 max-same-issues: 0 - exclude-dirs: - - pkg/provider/kubernetes/crd/generated/ - exclude: - - 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' - - "should have a package comment, unless it's in another file for this package" - - 'SA1019: http.CloseNotifier has been deprecated' # FIXME must be fixed - - 'SA1019: cfg.SSLRedirect is deprecated' - - 'SA1019: cfg.SSLTemporaryRedirect is deprecated' - - 'SA1019: cfg.SSLHost is deprecated' - - 'SA1019: cfg.SSLForceHost is deprecated' - - 'SA1019: cfg.FeaturePolicy is deprecated' - - 'SA1019: c.Providers.ConsulCatalog.Namespace is deprecated' - - 'SA1019: c.Providers.Consul.Namespace is deprecated' - - 'SA1019: c.Providers.Nomad.Namespace is deprecated' - - 'fmt.Sprintf can be replaced with string' - - 'SA1019: dockertypes.ContainerNode is deprecated' - exclude-rules: - - path: '(.+)_test.go' - linters: - - goconst - - funlen - - godot - - canonicalheader - - fatcontext - - path: '(.+)_test.go' - text: ' always receives ' - linters: - - unparam - - path: '(.+)\.go' - text: 'struct-tag: unknown option ''inline'' in JSON tag' - linters: - - revive - - path: pkg/server/service/bufferpool.go - text: 'SA6002: argument should be pointer-like to avoid allocations' - - path: pkg/server/middleware/middlewares.go - text: "Function 'buildConstructor' has too many statements" - linters: - - funlen - - path: pkg/tracing/haystack/logger.go - linters: - - goprintffuncname - - path: pkg/tracing/tracing.go - text: "printf-like formatting function 'SetErrorWithEvent' should be named 'SetErrorWithEventf'" - linters: - - goprintffuncname - - path: pkg/tls/tlsmanager_test.go - text: 'SA1019: config.ClientCAs.Subjects has been deprecated since Go 1.18' - - path: pkg/types/tls_test.go - text: 'SA1019: tlsConfig.RootCAs.Subjects has been deprecated since Go 1.18' - - path: pkg/provider/kubernetes/(crd|gateway)/client.go - linters: - - interfacebloat - - path: pkg/metrics/metrics.go - linters: - - interfacebloat - - path: integration/healthcheck_test.go - text: 'Duplicate words \(wsp2,\) found' - linters: - - dupword - - path: pkg/types/domain_test.go - text: 'Duplicate words \(sub\) found' - linters: - - dupword - - path: pkg/provider/kubernetes/gateway/client_mock_test.go - text: 'unusedwrite: unused write to field' - linters: - - govet - - path: pkg/provider/acme/local_store.go - linters: - - musttag - - path: pkg/tls/certificate.go - text: 'the methods of "Certificates" use pointer receiver and non-pointer receiver.' - linters: - - recvcheck - -output: - show-stats: true - sort-results: true - sort-order: - - linter - - file diff --git a/integration/integration_test.go b/integration/integration_test.go index 0626724da..12a76064d 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -85,7 +85,7 @@ func (s *BaseSuite) displayTraefikLogFile(path string) { // fmt.Printf("%s: Traefik logs: \n", c.TestName()) fmt.Print("Traefik logs: \n") if errRead == nil { - fmt.Println(content) + fmt.Println(string(content)) } else { fmt.Println(errRead) } diff --git a/integration/tcp_test.go b/integration/tcp_test.go index 30a6e0bee..2ef58557b 100644 --- a/integration/tcp_test.go +++ b/integration/tcp_test.go @@ -278,7 +278,7 @@ func (s *TCPSuite) TestWRR() { time.Sleep(time.Second) } - assert.EqualValues(s.T(), map[string]int{"whoami-b": 3, "whoami-ab": 1}, call) + assert.Equal(s.T(), map[string]int{"whoami-b": 3, "whoami-ab": 1}, call) } func welcome(addr string) (string, error) { diff --git a/integration/udp_test.go b/integration/udp_test.go index 770785f99..9e87eb3bf 100644 --- a/integration/udp_test.go +++ b/integration/udp_test.go @@ -96,7 +96,7 @@ func (s *UDPSuite) TestWRR() { call["unknown"]++ } } - assert.EqualValues(s.T(), map[string]int{"whoami-a": 3, "whoami-b": 2, "whoami-c": 3}, call) + assert.Equal(s.T(), map[string]int{"whoami-a": 3, "whoami-b": 2, "whoami-c": 3}, call) close(stop) }() diff --git a/pkg/middlewares/accesslog/logger.go b/pkg/middlewares/accesslog/logger.go index b5a533b8c..d5271f1fd 100644 --- a/pkg/middlewares/accesslog/logger.go +++ b/pkg/middlewares/accesslog/logger.go @@ -364,9 +364,10 @@ func (h *Handler) logTheRoundTrip(logDataTable *LogData) { func (h *Handler) redactHeaders(headers http.Header, fields logrus.Fields, prefix string) { for k := range headers { v := h.config.Fields.KeepHeader(k) - if v == types.AccessLogKeep { + switch v { + case types.AccessLogKeep: fields[prefix+k] = strings.Join(headers.Values(k), ",") - } else if v == types.AccessLogRedact { + case types.AccessLogRedact: fields[prefix+k] = "REDACTED" } } diff --git a/pkg/middlewares/accesslog/logger_test.go b/pkg/middlewares/accesslog/logger_test.go index f35577109..5201070ef 100644 --- a/pkg/middlewares/accesslog/logger_test.go +++ b/pkg/middlewares/accesslog/logger_test.go @@ -271,7 +271,7 @@ func assertNotEmpty() func(t *testing.T, actual interface{}) { return func(t *testing.T, actual interface{}) { t.Helper() - assert.NotEqual(t, "", actual) + assert.NotEmpty(t, actual) } } @@ -510,7 +510,7 @@ func TestLoggerJSON(t *testing.T) { err = json.Unmarshal(logData, &jsonData) require.NoError(t, err) - assert.Equal(t, len(test.expected), len(jsonData)) + assert.Len(t, jsonData, len(test.expected)) for field, assertion := range test.expected { assertion(t, jsonData[field]) @@ -567,7 +567,7 @@ func TestLogger_AbortedRequest(t *testing.T) { err = json.Unmarshal(logData, &jsonData) require.NoError(t, err) - assert.Equal(t, len(expected), len(jsonData)) + assert.Len(t, jsonData, len(expected)) for field, assertion := range expected { assertion(t, jsonData[field]) @@ -798,7 +798,7 @@ func assertValidLogData(t *testing.T, expected string, logData []byte) { formatErrMessage := fmt.Sprintf("Expected:\t%q\nActual:\t%q", expected, string(logData)) - require.Equal(t, len(resultExpected), len(result), formatErrMessage) + require.Len(t, result, len(resultExpected), formatErrMessage) assert.Equal(t, resultExpected[ClientHost], result[ClientHost], formatErrMessage) assert.Equal(t, resultExpected[ClientUsername], result[ClientUsername], formatErrMessage) assert.Equal(t, resultExpected[RequestMethod], result[RequestMethod], formatErrMessage) diff --git a/pkg/middlewares/accesslog/parser_test.go b/pkg/middlewares/accesslog/parser_test.go index 1e194dd7e..86b0b59a7 100644 --- a/pkg/middlewares/accesslog/parser_test.go +++ b/pkg/middlewares/accesslog/parser_test.go @@ -65,7 +65,7 @@ func TestParseAccessLog(t *testing.T) { result, err := ParseAccessLog(test.value) assert.NoError(t, err) - assert.Equal(t, len(test.expected), len(result)) + assert.Len(t, result, len(test.expected)) for key, value := range test.expected { assert.Equal(t, value, result[key]) } diff --git a/pkg/middlewares/auth/forward_test.go b/pkg/middlewares/auth/forward_test.go index 4e17f7ff5..de834a802 100644 --- a/pkg/middlewares/auth/forward_test.go +++ b/pkg/middlewares/auth/forward_test.go @@ -179,7 +179,7 @@ func TestForwardAuthRemoveHopByHopHeaders(t *testing.T) { assert.Equal(t, http.StatusFound, res.StatusCode, "they should be equal") for _, header := range forward.HopHeaders { - assert.Equal(t, "", res.Header.Get(header), "hop-by-hop header '%s' mustn't be set", header) + assert.Empty(t, res.Header.Get(header), "hop-by-hop header '%s' mustn't be set", header) } location, err := res.Location() diff --git a/pkg/middlewares/compress/compress_test.go b/pkg/middlewares/compress/compress_test.go index 353174fa7..13715682e 100644 --- a/pkg/middlewares/compress/compress_test.go +++ b/pkg/middlewares/compress/compress_test.go @@ -70,7 +70,7 @@ func TestShouldNotCompressWhenContentEncodingHeader(t *testing.T) { assert.Equal(t, gzipValue, rw.Header().Get(contentEncodingHeader)) assert.Equal(t, acceptEncodingHeader, rw.Header().Get(varyHeader)) - assert.EqualValues(t, rw.Body.Bytes(), fakeCompressedBody) + assert.Equal(t, rw.Body.Bytes(), fakeCompressedBody) } func TestShouldNotCompressWhenNoAcceptEncodingHeader(t *testing.T) { @@ -90,7 +90,7 @@ func TestShouldNotCompressWhenNoAcceptEncodingHeader(t *testing.T) { handler.ServeHTTP(rw, req) assert.Empty(t, rw.Header().Get(contentEncodingHeader)) - assert.EqualValues(t, rw.Body.Bytes(), fakeBody) + assert.Equal(t, rw.Body.Bytes(), fakeBody) } func TestShouldNotCompressWhenSpecificContentType(t *testing.T) { @@ -152,7 +152,7 @@ func TestShouldNotCompressWhenSpecificContentType(t *testing.T) { assert.Empty(t, rw.Header().Get(acceptEncodingHeader)) assert.Empty(t, rw.Header().Get(contentEncodingHeader)) - assert.EqualValues(t, rw.Body.Bytes(), baseBody) + assert.Equal(t, rw.Body.Bytes(), baseBody) }) } } @@ -213,7 +213,7 @@ func TestIntegrationShouldNotCompress(t *testing.T) { body, err := io.ReadAll(resp.Body) require.NoError(t, err) - assert.EqualValues(t, fakeCompressedBody, body) + assert.Equal(t, fakeCompressedBody, body) }) } } @@ -345,12 +345,12 @@ func TestMinResponseBodyBytes(t *testing.T) { if test.expectedCompression { assert.Equal(t, gzipValue, rw.Header().Get(contentEncodingHeader)) - assert.NotEqualValues(t, rw.Body.Bytes(), fakeBody) + assert.NotEqual(t, rw.Body.Bytes(), fakeBody) return } assert.Empty(t, rw.Header().Get(contentEncodingHeader)) - assert.EqualValues(t, rw.Body.Bytes(), fakeBody) + assert.Equal(t, rw.Body.Bytes(), fakeBody) }) } } @@ -432,7 +432,7 @@ func Test1xxResponses(t *testing.T) { assert.Equal(t, gzipValue, res.Header.Get(contentEncodingHeader)) body, _ := io.ReadAll(res.Body) - assert.NotEqualValues(t, body, fakeBody) + assert.NotEqual(t, body, fakeBody) } func BenchmarkCompress(b *testing.B) { diff --git a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert.go b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert.go index f44f8e363..69b5a9359 100644 --- a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert.go +++ b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert.go @@ -227,11 +227,11 @@ func getIssuerDNInfo(ctx context.Context, options *IssuerDistinguishedNameOption content := &strings.Builder{} - // Manage non standard attributes + // Manage non-standard attributes for _, name := range cs.Names { // Domain Component - RFC 2247 if options.DomainComponent && attributeTypeNames[name.Type.String()] == "DC" { - content.WriteString(fmt.Sprintf("DC=%s%s", name.Value, subFieldSeparator)) + _, _ = fmt.Fprintf(content, "DC=%s%s", name.Value, subFieldSeparator) } } @@ -273,7 +273,7 @@ func getSubjectDNInfo(ctx context.Context, options *SubjectDistinguishedNameOpti for _, name := range cs.Names { // Domain Component - RFC 2247 if options.DomainComponent && attributeTypeNames[name.Type.String()] == "DC" { - content.WriteString(fmt.Sprintf("DC=%s%s", name.Value, subFieldSeparator)) + _, _ = fmt.Fprintf(content, "DC=%s%s", name.Value, subFieldSeparator) } } diff --git a/pkg/middlewares/ratelimiter/rate_limiter_test.go b/pkg/middlewares/ratelimiter/rate_limiter_test.go index e3ff92ec5..50c51553d 100644 --- a/pkg/middlewares/ratelimiter/rate_limiter_test.go +++ b/pkg/middlewares/ratelimiter/rate_limiter_test.go @@ -266,11 +266,7 @@ func TestRateLimit(t *testing.T) { end := start.Add(test.loadDuration) ticker := time.NewTicker(loadPeriod) defer ticker.Stop() - for { - if time.Now().After(end) { - break - } - + for !time.Now().After(end) { req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost", nil) req.RemoteAddr = "127.0.0.1:1234" w := httptest.NewRecorder() diff --git a/pkg/muxer/http/mux_test.go b/pkg/muxer/http/mux_test.go index 768c7b898..e7b770046 100644 --- a/pkg/muxer/http/mux_test.go +++ b/pkg/muxer/http/mux_test.go @@ -970,7 +970,7 @@ func TestParseDomains(t *testing.T) { require.NoError(t, err, "%s: Error while parsing domain.", test.expression) } - assert.EqualValues(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression) + assert.Equal(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression) }) } } diff --git a/pkg/muxer/tcp/mux_test.go b/pkg/muxer/tcp/mux_test.go index aa3c6b1e6..e82432a75 100644 --- a/pkg/muxer/tcp/mux_test.go +++ b/pkg/muxer/tcp/mux_test.go @@ -623,7 +623,7 @@ func TestParseHostSNI(t *testing.T) { require.NoError(t, err, "%s: Error while parsing domain.", test.expression) } - assert.EqualValues(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression) + assert.Equal(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression) }) } } diff --git a/pkg/provider/acme/provider_test.go b/pkg/provider/acme/provider_test.go index 8a72be6de..73dc785ff 100644 --- a/pkg/provider/acme/provider_test.go +++ b/pkg/provider/acme/provider_test.go @@ -182,7 +182,7 @@ func TestGetUncheckedCertificates(t *testing.T) { } domains := acmeProvider.getUncheckedDomains(context.Background(), test.domains, "default") - assert.Equal(t, len(test.expectedDomains), len(domains), "Unexpected domains.") + assert.Len(t, domains, len(test.expectedDomains), "Unexpected domains.") }) } } @@ -250,7 +250,7 @@ func TestProvider_sanitizeDomains(t *testing.T) { if len(test.expectedErr) > 0 { assert.EqualError(t, err, test.expectedErr, "Unexpected error.") } else { - assert.Equal(t, len(test.expectedDomains), len(domains), "Unexpected domains.") + assert.Len(t, domains, len(test.expectedDomains), "Unexpected domains.") } }) } diff --git a/pkg/provider/docker/docker.go b/pkg/provider/docker/docker.go index ffb2a8ac2..69780aadc 100644 --- a/pkg/provider/docker/docker.go +++ b/pkg/provider/docker/docker.go @@ -505,11 +505,12 @@ func (p *Provider) parseService(ctx context.Context, service swarmtypes.Service, dData.ExtraConf = extraConf if service.Spec.EndpointSpec != nil { - if service.Spec.EndpointSpec.Mode == swarmtypes.ResolutionModeDNSRR { + switch service.Spec.EndpointSpec.Mode { + case swarmtypes.ResolutionModeDNSRR: if dData.ExtraConf.Docker.LBSwarm { logger.Warnf("Ignored %s endpoint-mode not supported, service name: %s. Fallback to Traefik load balancing", swarmtypes.ResolutionModeDNSRR, service.Spec.Annotations.Name) } - } else if service.Spec.EndpointSpec.Mode == swarmtypes.ResolutionModeVIP { + case swarmtypes.ResolutionModeVIP: dData.NetworkSettings.Networks = make(map[string]*networkData) for _, virtualIP := range service.Endpoint.VirtualIPs { networkService := networkMap[virtualIP.NetworkID] diff --git a/pkg/provider/docker/swarm_test.go b/pkg/provider/docker/swarm_test.go index b1e51083d..05c9451f0 100644 --- a/pkg/provider/docker/swarm_test.go +++ b/pkg/provider/docker/swarm_test.go @@ -280,7 +280,7 @@ func TestListServices(t *testing.T) { serviceDockerData, err := p.listServices(context.Background(), dockerClient) assert.NoError(t, err) - assert.Equal(t, len(test.expectedServices), len(serviceDockerData)) + assert.Len(t, serviceDockerData, len(test.expectedServices)) for i, serviceName := range test.expectedServices { if len(serviceDockerData) <= i { require.Fail(t, "index", "invalid index %d", i) diff --git a/pkg/provider/kubernetes/crd/kubernetes_http.go b/pkg/provider/kubernetes/crd/kubernetes_http.go index ad84a247b..065115cdc 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_http.go +++ b/pkg/provider/kubernetes/crd/kubernetes_http.go @@ -457,8 +457,8 @@ func (c configBuilder) nameAndService(ctx context.Context, parentNamespace strin return "", nil, fmt.Errorf("service %s/%s not in the parent resource namespace %s", service.Namespace, service.Name, parentNamespace) } - switch { - case service.Kind == "" || service.Kind == "Service": + switch service.Kind { + case "", "Service": serversLB, err := c.buildServersLB(namespace, service) if err != nil { return "", nil, err @@ -467,8 +467,10 @@ func (c configBuilder) nameAndService(ctx context.Context, parentNamespace strin fullName := fullServiceName(svcCtx, namespace, service, service.Port) return fullName, serversLB, nil - case service.Kind == "TraefikService": + + case "TraefikService": return fullServiceName(svcCtx, namespace, service, intstr.FromInt(0)), nil, nil + default: return "", nil, fmt.Errorf("unsupported service kind %s", service.Kind) } diff --git a/pkg/redactor/redactor_doOnStruct_test.go b/pkg/redactor/redactor_doOnStruct_test.go index af1f1faad..a55a9f6ff 100644 --- a/pkg/redactor/redactor_doOnStruct_test.go +++ b/pkg/redactor/redactor_doOnStruct_test.go @@ -375,7 +375,7 @@ func Test_doOnStruct(t *testing.T) { err := doOnStruct(val, tagExport, test.redactByDefault) require.NoError(t, err) - assert.EqualValues(t, test.expected, test.base) + assert.Equal(t, test.expected, test.base) }) } } diff --git a/pkg/server/service/service_test.go b/pkg/server/service/service_test.go index 7e73de2d2..7bee444a3 100644 --- a/pkg/server/service/service_test.go +++ b/pkg/server/service/service_test.go @@ -342,7 +342,7 @@ func TestGetLoadBalancerServiceHandler(t *testing.T) { assert.NotNil(t, handler) req := testhelpers.MustNewRequest(http.MethodGet, "http://callme", nil) - assert.Equal(t, "", req.Header.Get("User-Agent")) + assert.Empty(t, req.Header.Get("User-Agent")) if test.userAgent != "" { req.Header.Set("User-Agent", test.userAgent) diff --git a/pkg/types/domain_test.go b/pkg/types/domain_test.go index 490e1732a..f08aacf24 100644 --- a/pkg/types/domain_test.go +++ b/pkg/types/domain_test.go @@ -41,7 +41,7 @@ func TestDomain_ToStrArray(t *testing.T) { t.Parallel() domains := test.domain.ToStrArray() - assert.EqualValues(t, test.expected, domains) + assert.Equal(t, test.expected, domains) }) } } diff --git a/pkg/udp/conn.go b/pkg/udp/conn.go index 5753a9c13..e3ad6caa9 100644 --- a/pkg/udp/conn.go +++ b/pkg/udp/conn.go @@ -110,11 +110,7 @@ func (l *Listener) Shutdown(graceTimeout time.Duration) error { } start := time.Now() end := start.Add(graceTimeout) - for { - if time.Now().After(end) { - break - } - + for !time.Now().After(end) { l.mu.RLock() if len(l.conns) == 0 { l.mu.RUnlock()