cmd/vet: add subtestnames analyzer; fix all existing violations

Add a new vet analyzer that checks t.Run subtest names don't contain
characters requiring quoting when re-running via "go test -run". This
enforces the style guide rule: don't use spaces or punctuation in
subtest names.

The analyzer flags:
- Direct t.Run calls with string literal names containing spaces,
  regex metacharacters, quotes, or other problematic characters
- Table-driven t.Run(tt.name, ...) calls where tt ranges over a
  slice/map literal with bad name field values

Also fix all 978 existing violations across 81 test files, replacing
spaces with hyphens and shortening long sentence-like names to concise
hyphenated forms.

Updates #19242

Change-Id: Ib0ad96a111bd8e764582d1d4902fe2599454ab65
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2026-04-04 21:32:14 +00:00
committed by Brad Fitzpatrick
parent 0f02c20c5e
commit 5ef3713c9f
87 changed files with 1405 additions and 982 deletions
@@ -31,7 +31,7 @@ func TestResolveAuthKey(t *testing.T) {
wantErr: "",
},
{
name: "missing client id short-circuits without error",
name: "missing-client-id-noop",
clientID: "",
idToken: "token",
audience: "api://tailscale-wif",
@@ -40,7 +40,7 @@ func TestResolveAuthKey(t *testing.T) {
wantErr: "",
},
{
name: "missing id token and audience",
name: "missing-id-token-and-audience",
clientID: "client-123",
idToken: "",
audience: "",
@@ -48,7 +48,7 @@ func TestResolveAuthKey(t *testing.T) {
wantErr: "federated identity requires either an ID token or an audience",
},
{
name: "missing tags",
name: "missing-tags",
clientID: "client-123",
idToken: "token",
audience: "api://tailscale-wif",
@@ -56,7 +56,7 @@ func TestResolveAuthKey(t *testing.T) {
wantErr: "federated identity authkeys require --advertise-tags",
},
{
name: "invalid client id attributes",
name: "invalid-client-id-attrs",
clientID: "client-123?invalid=value",
idToken: "token",
audience: "api://tailscale-wif",
@@ -99,7 +99,7 @@ func TestParseOptionalAttributes(t *testing.T) {
wantErr string
}{
{
name: "default values",
name: "default-values",
clientID: "client-123",
wantClientID: "client-123",
wantEphemeral: true,
@@ -107,7 +107,7 @@ func TestParseOptionalAttributes(t *testing.T) {
wantErr: "",
},
{
name: "custom values",
name: "custom-values",
clientID: "client-123?ephemeral=false&preauthorized=true",
wantClientID: "client-123",
wantEphemeral: false,
@@ -115,7 +115,7 @@ func TestParseOptionalAttributes(t *testing.T) {
wantErr: "",
},
{
name: "unknown attribute",
name: "unknown-attribute",
clientID: "client-123?unknown=value",
wantClientID: "",
wantEphemeral: false,
@@ -123,7 +123,7 @@ func TestParseOptionalAttributes(t *testing.T) {
wantErr: `unknown optional config attribute "unknown"`,
},
{
name: "invalid value",
name: "invalid-value",
clientID: "client-123?ephemeral=invalid",
wantClientID: "",
wantEphemeral: false,
+9 -9
View File
@@ -20,42 +20,42 @@ func TestResolveAuthKey(t *testing.T) {
wantErr bool
}{
{
name: "keys without client secret prefix pass through unchanged",
name: "non-client-secret-passthrough",
clientID: "tskey-auth-regular",
tags: []string{"tag:test"},
wantAuthKey: "tskey-auth-regular",
wantErr: false,
},
{
name: "client secret without advertised tags",
name: "client-secret-no-tags",
clientID: "tskey-client-abc",
tags: nil,
wantAuthKey: "",
wantErr: true,
},
{
name: "client secret with default attributes",
name: "client-secret-default-attrs",
clientID: "tskey-client-abc",
tags: []string{"tag:test"},
wantAuthKey: "tskey-auth-xyz",
wantErr: false,
},
{
name: "client secret with custom attributes",
name: "client-secret-custom-attrs",
clientID: "tskey-client-abc?ephemeral=false&preauthorized=true",
tags: []string{"tag:test"},
wantAuthKey: "tskey-auth-xyz",
wantErr: false,
},
{
name: "client secret with unknown attribute",
name: "client-secret-unknown-attr",
clientID: "tskey-client-abc?unknown=value",
tags: []string{"tag:test"},
wantAuthKey: "",
wantErr: true,
},
{
name: "oauth client secret with invalid attribute value",
name: "client-secret-invalid-attr-value",
clientID: "tskey-client-abc?ephemeral=invalid",
tags: []string{"tag:test"},
wantAuthKey: "",
@@ -111,7 +111,7 @@ func TestResolveAuthKeyAttributes(t *testing.T) {
wantBaseURL string
}{
{
name: "default values",
name: "default-values",
clientSecret: "tskey-client-abc",
wantEphemeral: true,
wantPreauth: false,
@@ -132,14 +132,14 @@ func TestResolveAuthKeyAttributes(t *testing.T) {
wantBaseURL: "https://api.tailscale.com",
},
{
name: "baseURL=https://api.example.com",
name: "baseURL-custom",
clientSecret: "tskey-client-abc?baseURL=https://api.example.com",
wantEphemeral: true,
wantPreauth: false,
wantBaseURL: "https://api.example.com",
},
{
name: "all custom values",
name: "all-custom-values",
clientSecret: "tskey-client-abc?ephemeral=false&preauthorized=true&baseURL=https://api.example.com",
wantEphemeral: false,
wantPreauth: true,
+19 -19
View File
@@ -48,7 +48,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantEndpoints []netip.AddrPort
}{
{
name: "no changes non-nil port previously running",
name: "no-changes-non-nil-port-running",
fields: fields{
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -62,7 +62,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "set addr ports unchanged port previously running",
name: "set-addr-ports-unchanged-running",
fields: fields{
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -77,7 +77,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantEndpoints: prefsWithPortOneRelayEndpoints.RelayServerStaticEndpoints,
},
{
name: "set addr ports not previously running",
name: "set-addr-ports-not-running",
fields: fields{
port: nil,
rs: nil,
@@ -92,7 +92,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantEndpoints: prefsWithPortOneRelayEndpoints.RelayServerStaticEndpoints,
},
{
name: "clear addr ports unchanged port previously running",
name: "clear-addr-ports-unchanged-running",
fields: fields{
port: new(uint16(1)),
staticEndpoints: views.SliceOf(prefsWithPortOneRelayEndpoints.RelayServerStaticEndpoints),
@@ -108,7 +108,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantEndpoints: nil,
},
{
name: "prefs port nil",
name: "prefs-port-nil",
fields: fields{
port: new(uint16(1)),
},
@@ -121,7 +121,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "prefs port nil previously running",
name: "prefs-port-nil-running",
fields: fields{
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -135,7 +135,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "prefs port changed",
name: "prefs-port-changed",
fields: fields{
port: new(uint16(2)),
},
@@ -148,7 +148,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "prefs port changed previously running",
name: "prefs-port-changed-running",
fields: fields{
port: new(uint16(2)),
rs: mockRelayServerNotZeroVal(),
@@ -162,7 +162,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "sameNode false",
name: "sameNode-false",
fields: fields{
port: new(uint16(1)),
},
@@ -175,7 +175,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "sameNode false previously running",
name: "sameNode-false-running",
fields: fields{
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -189,7 +189,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "prefs port non-nil extension port nil",
name: "prefs-port-non-nil-ext-nil",
fields: fields{
port: nil,
},
@@ -277,7 +277,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated bool
}{
{
name: "want running",
name: "want-running",
shutdown: false,
port: new(uint16(1)),
hasNodeAttrDisableRelayServer: false,
@@ -285,7 +285,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "want running previously running",
name: "want-running-previously-running",
shutdown: false,
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -294,7 +294,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "shutdown true",
name: "shutdown-true",
shutdown: true,
port: new(uint16(1)),
hasNodeAttrDisableRelayServer: false,
@@ -302,7 +302,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "shutdown true previously running",
name: "shutdown-true-previously-running",
shutdown: true,
port: new(uint16(1)),
rs: mockRelayServerNotZeroVal(),
@@ -311,7 +311,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "port nil",
name: "port-nil",
shutdown: false,
port: nil,
hasNodeAttrDisableRelayServer: false,
@@ -319,7 +319,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "port nil previously running",
name: "port-nil-previously-running",
shutdown: false,
port: nil,
rs: mockRelayServerNotZeroVal(),
@@ -328,7 +328,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: true,
},
{
name: "hasNodeAttrDisableRelayServer true",
name: "hasNodeAttrDisableRelayServer-true",
shutdown: false,
port: nil,
hasNodeAttrDisableRelayServer: true,
@@ -336,7 +336,7 @@ func Test_extension_handleRelayServerLifetimeLocked(t *testing.T) {
wantRelayServerFieldMutated: false,
},
{
name: "hasNodeAttrDisableRelayServer true previously running",
name: "hasNodeAttrDisableRelayServer-true-running",
shutdown: false,
port: nil,
rs: mockRelayServerNotZeroVal(),