test: use typed atomics in test files (#25071)

Use typed atomics (atomic.Int64, atomic.Int32, etc.) in test files to prevent
mixing atomic and non-atomic access on the same value, guarantee 64-bit
alignment on 32-bit platforms, and provide a cleaner API.
This commit is contained in:
Zach
2026-05-11 08:41:17 -06:00
committed by GitHub
parent a1dbd758bc
commit 81e2be69e9
21 changed files with 115 additions and 116 deletions
+6 -6
View File
@@ -122,8 +122,8 @@ func TestWorkspaceAgent(t *testing.T) {
var (
admin = coderdtest.CreateFirstUser(t, client)
member, memberUser = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
called int64
derpCalled int64
called atomic.Int64
derpCalled atomic.Int64
)
setHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -133,9 +133,9 @@ func TestWorkspaceAgent(t *testing.T) {
assert.Equal(t, "very-wow-"+client.URL.String(), r.Header.Get("X-Process-Testing"))
assert.Equal(t, "more-wow", r.Header.Get("X-Process-Testing2"))
if strings.HasPrefix(r.URL.Path, "/derp") {
atomic.AddInt64(&derpCalled, 1)
derpCalled.Add(1)
} else {
atomic.AddInt64(&called, 1)
called.Add(1)
}
}
coderAPI.RootHandler.ServeHTTP(w, r)
@@ -178,8 +178,8 @@ func TestWorkspaceAgent(t *testing.T) {
err := clientInv.WithContext(ctx).Run()
require.NoError(t, err)
require.Greater(t, atomic.LoadInt64(&called), int64(0), "expected coderd to be reached with custom headers")
require.Greater(t, atomic.LoadInt64(&derpCalled), int64(0), "expected /derp to be called with custom headers")
require.Greater(t, called.Load(), int64(0), "expected coderd to be reached with custom headers")
require.Greater(t, derpCalled.Load(), int64(0), "expected /derp to be called with custom headers")
})
t.Run("DisabledServers", func(t *testing.T) {
+3 -3
View File
@@ -536,7 +536,7 @@ func TestAgent(t *testing.T) {
t.Run("NotInfinite", func(t *testing.T) {
t.Parallel()
var fetchCalled uint64
var fetchCalled atomic.Uint64
cmd := &serpent.Command{
Handler: func(inv *serpent.Invocation) error {
@@ -544,7 +544,7 @@ func TestAgent(t *testing.T) {
err := cliui.Agent(inv.Context(), &buf, uuid.Nil, cliui.AgentOptions{
FetchInterval: 10 * time.Millisecond,
Fetch: func(ctx context.Context, agentID uuid.UUID) (codersdk.WorkspaceAgent, error) {
atomic.AddUint64(&fetchCalled, 1)
fetchCalled.Add(1)
return codersdk.WorkspaceAgent{
Status: codersdk.WorkspaceAgentConnected,
@@ -557,7 +557,7 @@ func TestAgent(t *testing.T) {
}
require.Never(t, func() bool {
called := atomic.LoadUint64(&fetchCalled)
called := fetchCalled.Load()
return called > 5 || called == 0
}, time.Second, 100*time.Millisecond)
+5 -5
View File
@@ -80,7 +80,7 @@ func Test_OutputFormatter(t *testing.T) {
t.Run("OK", func(t *testing.T) {
t.Parallel()
var called int64
var called atomic.Int64
f := cliui.NewOutputFormatter(
cliui.JSONFormat(),
&format{
@@ -95,7 +95,7 @@ func Test_OutputFormatter(t *testing.T) {
})
},
formatFn: func(_ context.Context, _ any) (string, error) {
atomic.AddInt64(&called, 1)
called.Add(1)
return "foo", nil
},
},
@@ -121,18 +121,18 @@ func Test_OutputFormatter(t *testing.T) {
var got []string
require.NoError(t, json.Unmarshal([]byte(out), &got))
require.Equal(t, data, got)
require.EqualValues(t, 0, atomic.LoadInt64(&called))
require.EqualValues(t, 0, called.Load())
require.NoError(t, fs.Set("output", "foo"))
out, err = f.Format(ctx, data)
require.NoError(t, err)
require.Equal(t, "foo", out)
require.EqualValues(t, 1, atomic.LoadInt64(&called))
require.EqualValues(t, 1, called.Load())
require.Error(t, fs.Set("output", "bar"))
out, err = f.Format(ctx, data)
require.NoError(t, err)
require.Equal(t, "foo", out)
require.EqualValues(t, 2, atomic.LoadInt64(&called))
require.EqualValues(t, 2, called.Load())
})
}
+3 -3
View File
@@ -118,10 +118,10 @@ func TestGitSSH(t *testing.T) {
setupCtx := testutil.Context(t, testutil.WaitLong)
client, token, pubkey := prepareTestGitSSH(setupCtx, t)
var inc int64
var inc atomic.Int64
errC := make(chan error, 1)
addr := serveSSHForGitSSH(t, func(s ssh.Session) {
atomic.AddInt64(&inc, 1)
inc.Add(1)
t.Log("got authenticated session")
select {
case errC <- s.Exit(0):
@@ -146,7 +146,7 @@ func TestGitSSH(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitSuperLong)
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
require.EqualValues(t, 1, inc)
require.EqualValues(t, 1, inc.Load())
err = <-errC
require.NoError(t, err, "error in agent execute")
+6 -6
View File
@@ -164,9 +164,9 @@ func TestRoot(t *testing.T) {
t.Parallel()
var url string
var called int64
var called atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1)
called.Add(1)
assert.Equal(t, "wow", r.Header.Get("X-Testing"))
assert.Equal(t, "Dean was Here!", r.Header.Get("Cool-Header"))
assert.Equal(t, "very-wow-"+url, r.Header.Get("X-Process-Testing"))
@@ -193,7 +193,7 @@ func TestRoot(t *testing.T) {
err := inv.Run()
require.Error(t, err)
require.ErrorContains(t, err, "unexpected status code 410")
require.EqualValues(t, 1, atomic.LoadInt64(&called), "called exactly once")
require.EqualValues(t, 1, called.Load(), "called exactly once")
})
}
@@ -238,7 +238,7 @@ func TestDERPHeaders(t *testing.T) {
"Cool-Header": "Dean was Here!",
"X-Process-Testing": "very-wow",
}
derpCalled int64
derpCalled atomic.Int64
)
setHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/derp") {
@@ -252,7 +252,7 @@ func TestDERPHeaders(t *testing.T) {
if ok {
// Only increment if all the headers are set, because the agent
// calls derp also.
atomic.AddInt64(&derpCalled, 1)
derpCalled.Add(1)
}
}
@@ -289,7 +289,7 @@ func TestDERPHeaders(t *testing.T) {
pty.ExpectMatch("pong from " + workspace.Name)
<-cmdDone
require.Greater(t, atomic.LoadInt64(&derpCalled), int64(0), "expected /derp to be called at least once")
require.Greater(t, derpCalled.Load(), int64(0), "expected /derp to be called at least once")
}
func TestHandlersOK(t *testing.T) {
+4 -4
View File
@@ -745,13 +745,13 @@ func TestServer(t *testing.T) {
var (
expectAddr string
dials int64
dials atomic.Int64
)
client := codersdk.New(accessURL)
client.HTTPClient = &http.Client{
Transport: &http.Transport{
DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
atomic.AddInt64(&dials, 1)
dials.Add(1)
assert.Equal(t, expectAddr, addr)
host, _, err := net.SplitHostPort(addr)
@@ -786,14 +786,14 @@ func TestServer(t *testing.T) {
expectAddr = "alpaca.com:443"
_, err := client.HasFirstUser(ctx)
require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&dials))
require.EqualValues(t, 1, dials.Load())
// Use the second certificate (wildcard) and hostname.
client.URL.Host = "hi.llama.com:443"
expectAddr = "hi.llama.com:443"
_, err = client.HasFirstUser(ctx)
require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&dials))
require.EqualValues(t, 2, dials.Load())
})
t.Run("TLSAndHTTP", func(t *testing.T) {
+6 -6
View File
@@ -464,7 +464,7 @@ func TestTemplateEdit(t *testing.T) {
// Make a proxy server that will return a valid entitlements
// response, including a valid advanced scheduling entitlement.
var updateTemplateCalled int64
var updateTemplateCalled atomic.Int64
proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/v2/entitlements" {
res := codersdk.Entitlements{
@@ -499,7 +499,7 @@ func TestTemplateEdit(t *testing.T) {
assert.EqualValues(t, req.AutostopRequirement.Weeks, 3)
r.Body = io.NopCloser(bytes.NewReader(body))
atomic.AddInt64(&updateTemplateCalled, 1)
updateTemplateCalled.Add(1)
// We still want to call the real route.
}
@@ -534,7 +534,7 @@ func TestTemplateEdit(t *testing.T) {
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&updateTemplateCalled))
require.EqualValues(t, 1, updateTemplateCalled.Load())
// Assert that the template metadata did not change. We verify the
// correct request gets sent to the server already.
@@ -720,7 +720,7 @@ func TestTemplateEdit(t *testing.T) {
// Make a proxy server that will return a valid entitlements
// response, including a valid advanced scheduling entitlement.
var updateTemplateCalled int64
var updateTemplateCalled atomic.Int64
proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/v2/entitlements" {
res := codersdk.Entitlements{
@@ -755,7 +755,7 @@ func TestTemplateEdit(t *testing.T) {
assert.False(t, req.AllowUserAutostop)
r.Body = io.NopCloser(bytes.NewReader(body))
atomic.AddInt64(&updateTemplateCalled, 1)
updateTemplateCalled.Add(1)
// We still want to call the real route.
}
@@ -790,7 +790,7 @@ func TestTemplateEdit(t *testing.T) {
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&updateTemplateCalled))
require.EqualValues(t, 1, updateTemplateCalled.Load())
// Assert that the template metadata did not change. We verify the
// correct request gets sent to the server already.