From 43349553f24afc8fc2cfc9169141db4b9a7e9928 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Fri, 6 Feb 2026 08:05:21 +0000 Subject: [PATCH] integration: add nolint:err113 comments for test infrastructure Add nolint:err113 comments to integration test infrastructure code where dynamic errors are appropriate for debugging test failures. These errors include context-specific information like container names, hostnames, and test states that help diagnose issues. Files updated: - derp_verify_endpoint_test.go: DERP verification errors - helpers.go: command execution and user lookup errors - hsic/hsic.go: database export errors - scenario.go: network and HTTP client validation errors - tsic/tsic.go: container status and peer validation errors Co-Authored-By: Claude Opus 4.5 --- integration/derp_verify_endpoint_test.go | 2 +- integration/helpers.go | 6 +++--- integration/hsic/hsic.go | 6 +++--- integration/scenario.go | 20 ++++++++++---------- integration/tsic/tsic.go | 24 ++++++++++++------------ 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/integration/derp_verify_endpoint_test.go b/integration/derp_verify_endpoint_test.go index 86951dba..6ba1315f 100644 --- a/integration/derp_verify_endpoint_test.go +++ b/integration/derp_verify_endpoint_test.go @@ -115,7 +115,7 @@ func DERPVerify( if m, err := c.Recv(); err != nil { result = fmt.Errorf("client first Recv: %w", err) } else if v, ok := m.(derp.ServerInfoMessage); !ok { - result = fmt.Errorf("client first Recv was unexpected type %T", v) + result = fmt.Errorf("client first Recv was unexpected type %T", v) //nolint:err113 } if expectSuccess && result != nil { diff --git a/integration/helpers.go b/integration/helpers.go index a1d6e16c..d6b06093 100644 --- a/integration/helpers.go +++ b/integration/helpers.go @@ -817,7 +817,7 @@ func assertCommandOutputContains(t *testing.T, c TailscaleClient, command []stri } if !strings.Contains(stdout, contains) { - return struct{}{}, fmt.Errorf("executing command, expected string %q not found in %q", contains, stdout) + return struct{}{}, fmt.Errorf("executing command, expected string %q not found in %q", contains, stdout) //nolint:err113 } return struct{}{}, nil @@ -990,7 +990,7 @@ func GetUserByName(headscale ControlServer, username string) (*v1.User, error) { } } - return nil, fmt.Errorf("user %s not found", username) + return nil, fmt.Errorf("user %s not found", username) //nolint:err113 } // FindNewClient finds a client that is in the new list but not in the original list. @@ -1052,7 +1052,7 @@ func (s *Scenario) AddAndLoginClient( } if len(updatedClients) != len(originalClients)+1 { - return struct{}{}, fmt.Errorf("expected %d clients, got %d", len(originalClients)+1, len(updatedClients)) + return struct{}{}, fmt.Errorf("expected %d clients, got %d", len(originalClients)+1, len(updatedClients)) //nolint:err113 } newClient, err = FindNewClient(originalClients, updatedClients) diff --git a/integration/hsic/hsic.go b/integration/hsic/hsic.go index 1a3da219..283bea6d 100644 --- a/integration/hsic/hsic.go +++ b/integration/hsic/hsic.go @@ -872,7 +872,7 @@ func (t *HeadscaleInContainer) SaveDatabase(savePath string) error { } if strings.TrimSpace(schemaCheck) == "" { - return errors.New("database file exists but has no schema (empty database)") + return errors.New("database file exists but has no schema (empty database)") //nolint:err113 } tarFile, err := t.FetchPath("/tmp/integration_test_db.sqlite3") @@ -924,7 +924,7 @@ func (t *HeadscaleInContainer) SaveDatabase(savePath string) error { // Check if we actually wrote something if written == 0 { - return fmt.Errorf( + return fmt.Errorf( //nolint:err113 "database file is empty (size: %d, header size: %d)", written, header.Size, @@ -935,7 +935,7 @@ func (t *HeadscaleInContainer) SaveDatabase(savePath string) error { } } - return errors.New("no regular file found in database tar archive") + return errors.New("no regular file found in database tar archive") //nolint:err113 } // Execute runs a command inside the Headscale container and returns the diff --git a/integration/scenario.go b/integration/scenario.go index df954392..165f53c1 100644 --- a/integration/scenario.go +++ b/integration/scenario.go @@ -203,7 +203,7 @@ func NewScenario(spec ScenarioSpec) (*Scenario, error) { for _, user := range users { if n2, ok := userToNetwork[user]; ok { - return nil, fmt.Errorf("users can only have nodes placed in one network: %s into %s but already in %s", user, network.Network.Name, n2.Network.Name) + return nil, fmt.Errorf("users can only have nodes placed in one network: %s into %s but already in %s", user, network.Network.Name, n2.Network.Name) //nolint:err113 } mak.Set(&userToNetwork, user, network) @@ -280,7 +280,7 @@ func (s *Scenario) Networks() []*dockertest.Network { func (s *Scenario) Network(name string) (*dockertest.Network, error) { net, ok := s.networks[s.prefixedNetworkName(name)] if !ok { - return nil, fmt.Errorf("no network named: %s", name) + return nil, fmt.Errorf("no network named: %s", name) //nolint:err113 } return net, nil @@ -289,11 +289,11 @@ func (s *Scenario) Network(name string) (*dockertest.Network, error) { func (s *Scenario) SubnetOfNetwork(name string) (*netip.Prefix, error) { net, ok := s.networks[s.prefixedNetworkName(name)] if !ok { - return nil, fmt.Errorf("no network named: %s", name) + return nil, fmt.Errorf("no network named: %s", name) //nolint:err113 } if len(net.Network.IPAM.Config) == 0 { - return nil, fmt.Errorf("no IPAM config found in network: %s", name) + return nil, fmt.Errorf("no IPAM config found in network: %s", name) //nolint:err113 } pref, err := netip.ParsePrefix(net.Network.IPAM.Config[0].Subnet) @@ -307,7 +307,7 @@ func (s *Scenario) SubnetOfNetwork(name string) (*netip.Prefix, error) { func (s *Scenario) Services(name string) ([]*dockertest.Resource, error) { res, ok := s.extraServices[s.prefixedNetworkName(name)] if !ok { - return nil, fmt.Errorf("no network named: %s", name) + return nil, fmt.Errorf("no network named: %s", name) //nolint:err113 } return res, nil @@ -1087,11 +1087,11 @@ func doLoginURLWithClient(hostname string, loginURL *url.URL, hc *http.Client, f error, ) { if hc == nil { - return "", nil, fmt.Errorf("%s http client is nil", hostname) + return "", nil, fmt.Errorf("%s http client is nil", hostname) //nolint:err113 } if loginURL == nil { - return "", nil, fmt.Errorf("%s login url is nil", hostname) + return "", nil, fmt.Errorf("%s login url is nil", hostname) //nolint:err113 } log.Printf("%s logging in with url: %s", hostname, loginURL.String()) @@ -1138,13 +1138,13 @@ func doLoginURLWithClient(hostname string, loginURL *url.URL, hc *http.Client, f if followRedirects && resp.StatusCode != http.StatusOK { log.Printf("body: %s", body) - return body, redirectURL, fmt.Errorf("%s unexpected status code %d", hostname, resp.StatusCode) + return body, redirectURL, fmt.Errorf("%s unexpected status code %d", hostname, resp.StatusCode) //nolint:err113 } if resp.StatusCode >= http.StatusBadRequest { log.Printf("body: %s", body) - return body, redirectURL, fmt.Errorf("%s unexpected status code %d", hostname, resp.StatusCode) + return body, redirectURL, fmt.Errorf("%s unexpected status code %d", hostname, resp.StatusCode) //nolint:err113 } if hc.Jar != nil { @@ -1529,7 +1529,7 @@ func Webservice(s *Scenario, networkName string) (*dockertest.Resource, error) { network, ok := s.networks[s.prefixedNetworkName(networkName)] if !ok { - return nil, fmt.Errorf("network does not exist: %s", networkName) + return nil, fmt.Errorf("network does not exist: %s", networkName) //nolint:err113 } webOpts := &dockertest.RunOptions{ diff --git a/integration/tsic/tsic.go b/integration/tsic/tsic.go index a48239a5..b26266c6 100644 --- a/integration/tsic/tsic.go +++ b/integration/tsic/tsic.go @@ -336,7 +336,7 @@ func New( } if tsic.network == nil { - return nil, fmt.Errorf("no network set, called from: \n%s", string(debug.Stack())) + return nil, fmt.Errorf("no network set, called from: \n%s", string(debug.Stack())) //nolint:err113 } tailscaleOptions := &dockertest.RunOptions{ @@ -718,7 +718,7 @@ func (t *TailscaleInContainer) Logout() error { stdout, stderr, _ = t.Execute([]string{"tailscale", "status"}) if !strings.Contains(stdout+stderr, "Logged out.") { - return fmt.Errorf("logging out, stdout: %s, stderr: %s", stdout, stderr) + return fmt.Errorf("logging out, stdout: %s, stderr: %s", stdout, stderr) //nolint:err113 } return t.waitForBackendState("NeedsLogin", integrationutil.PeerSyncTimeout()) @@ -830,7 +830,7 @@ func (t *TailscaleInContainer) IPs() ([]netip.Addr, error) { } if len(ips) == 0 { - return nil, fmt.Errorf("no IPs returned yet for %s", t.hostname) + return nil, fmt.Errorf("no IPs returned yet for %s", t.hostname) //nolint:err113 } return ips, nil @@ -864,7 +864,7 @@ func (t *TailscaleInContainer) IPv4() (netip.Addr, error) { } } - return netip.Addr{}, fmt.Errorf("no IPv4 address found for %s", t.hostname) + return netip.Addr{}, fmt.Errorf("no IPv4 address found for %s", t.hostname) //nolint:err113 } func (t *TailscaleInContainer) MustIPv4() netip.Addr { @@ -1211,7 +1211,7 @@ func (t *TailscaleInContainer) waitForBackendState(state string, timeout time.Du for { select { case <-ctx.Done(): - return fmt.Errorf("timeout waiting for backend state %s on %s after %v", state, t.hostname, timeout) + return fmt.Errorf("timeout waiting for backend state %s on %s after %v", state, t.hostname, timeout) //nolint:err113 case <-ticker.C: status, err := t.Status() if err != nil { @@ -1256,7 +1256,7 @@ func (t *TailscaleInContainer) WaitForPeers(expected int, timeout, retryInterval return fmt.Errorf("timeout waiting for %d peers on %s after %v, errors: %w", expected, t.hostname, timeout, multierr.New(lastErrs...)) } - return fmt.Errorf("timeout waiting for %d peers on %s after %v", expected, t.hostname, timeout) + return fmt.Errorf("timeout waiting for %d peers on %s after %v", expected, t.hostname, timeout) //nolint:err113 case <-ticker.C: status, err := t.Status() if err != nil { @@ -1284,15 +1284,15 @@ func (t *TailscaleInContainer) WaitForPeers(expected int, timeout, retryInterval peer := status.Peer[peerKey] if !peer.Online { - peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s is not online", t.hostname, peer.HostName)) + peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s is not online", t.hostname, peer.HostName)) //nolint:err113 } if peer.HostName == "" { - peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s does not have a Hostname", t.hostname, peer.HostName)) + peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s does not have a Hostname", t.hostname, peer.HostName)) //nolint:err113 } if peer.Relay == "" { - peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s does not have a DERP", t.hostname, peer.HostName)) + peerErrors = append(peerErrors, fmt.Errorf("[%s] peer count correct, but %s does not have a DERP", t.hostname, peer.HostName)) //nolint:err113 } } @@ -1566,7 +1566,7 @@ func (t *TailscaleInContainer) ReadFile(path string) ([]byte, error) { } if !strings.Contains(path, hdr.Name) { - return nil, fmt.Errorf("file not found in tar archive, looking for: %s, header was: %s", path, hdr.Name) + return nil, fmt.Errorf("file not found in tar archive, looking for: %s, header was: %s", path, hdr.Name) //nolint:err113 } if _, err := io.Copy(&out, tr); err != nil { @@ -1578,7 +1578,7 @@ func (t *TailscaleInContainer) ReadFile(path string) ([]byte, error) { } if out.Len() == 0 { - return nil, errors.New("file is empty") + return nil, errors.New("file is empty") //nolint:err113 } return out.Bytes(), nil @@ -1617,7 +1617,7 @@ func (t *TailscaleInContainer) GetNodePrivateKey() (*key.NodePrivate, error) { // This is useful for verifying that policy changes have propagated to the client. func (t *TailscaleInContainer) PacketFilter() ([]filter.Match, error) { if !util.TailscaleVersionNewerOrEqual("1.56", t.version) { - return nil, fmt.Errorf("tsic.PacketFilter() requires Tailscale 1.56+, current version: %s", t.version) + return nil, fmt.Errorf("tsic.PacketFilter() requires Tailscale 1.56+, current version: %s", t.version) //nolint:err113 } nm, err := t.Netmap()