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 07:41:17 -07:00
committed by GitHub
parent a1dbd758bc
commit 81e2be69e9
21 changed files with 115 additions and 116 deletions
+2 -2
View File
@@ -68,7 +68,7 @@ directive version required in `go.mod`.
| `fmt.Sprintf` + append to `[]byte` | `fmt.Appendf(buf, …)` (also `Append`, `Appendln`) | 1.18 | | `fmt.Sprintf` + append to `[]byte` | `fmt.Appendf(buf, …)` (also `Append`, `Appendln`) | 1.18 |
| `reflect.TypeOf((*T)(nil)).Elem()` | `reflect.TypeFor[T]()` | 1.22 | | `reflect.TypeOf((*T)(nil)).Elem()` | `reflect.TypeFor[T]()` | 1.22 |
| `*(*[4]byte)(slice)` unsafe cast | `[4]byte(slice)` direct conversion | 1.20 | | `*(*[4]byte)(slice)` unsafe cast | `[4]byte(slice)` direct conversion | 1.20 |
| `atomic.LoadInt64` / `StoreInt64` | `atomic.Int64` (also `Bool`, `Uint64`, `Pointer[T]`) | 1.19 | | `atomic.LoadInt64` / `AddInt64` / `StoreInt64` etc. | `atomic.Int64` (also `Int32`, `Uint32`, `Uint64`, `Bool`, `Pointer[T]`) | 1.19 |
| `crypto/rand.Read(buf)` + hex/base64 encode | `crypto/rand.Text()` (one call) | 1.24 | | `crypto/rand.Read(buf)` + hex/base64 encode | `crypto/rand.Text()` (one call) | 1.24 |
| Checking `crypto/rand.Read` error | don't: return is always nil | 1.24 | | Checking `crypto/rand.Read` error | don't: return is always nil | 1.24 |
| `time.Sleep` in tests | `testing/synctest` (deterministic fake clock) | 1.24/1.25 | | `time.Sleep` in tests | `testing/synctest` (deterministic fake clock) | 1.24/1.25 |
@@ -246,4 +246,4 @@ request.
Swiss Tables maps, Green Tea GC, PGO, faster `io.ReadAll`, Swiss Tables maps, Green Tea GC, PGO, faster `io.ReadAll`,
stack-allocated slices, reduced cgo overhead, container-aware stack-allocated slices, reduced cgo overhead, container-aware
GOMAXPROCS. Free on upgrade. GOMAXPROCS. Free on upgrade.
+6 -6
View File
@@ -122,8 +122,8 @@ func TestWorkspaceAgent(t *testing.T) {
var ( var (
admin = coderdtest.CreateFirstUser(t, client) admin = coderdtest.CreateFirstUser(t, client)
member, memberUser = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID) member, memberUser = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
called int64 called atomic.Int64
derpCalled int64 derpCalled atomic.Int64
) )
setHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 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, "very-wow-"+client.URL.String(), r.Header.Get("X-Process-Testing"))
assert.Equal(t, "more-wow", r.Header.Get("X-Process-Testing2")) assert.Equal(t, "more-wow", r.Header.Get("X-Process-Testing2"))
if strings.HasPrefix(r.URL.Path, "/derp") { if strings.HasPrefix(r.URL.Path, "/derp") {
atomic.AddInt64(&derpCalled, 1) derpCalled.Add(1)
} else { } else {
atomic.AddInt64(&called, 1) called.Add(1)
} }
} }
coderAPI.RootHandler.ServeHTTP(w, r) coderAPI.RootHandler.ServeHTTP(w, r)
@@ -178,8 +178,8 @@ func TestWorkspaceAgent(t *testing.T) {
err := clientInv.WithContext(ctx).Run() err := clientInv.WithContext(ctx).Run()
require.NoError(t, err) require.NoError(t, err)
require.Greater(t, atomic.LoadInt64(&called), int64(0), "expected coderd to be reached with custom headers") require.Greater(t, called.Load(), 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, derpCalled.Load(), int64(0), "expected /derp to be called with custom headers")
}) })
t.Run("DisabledServers", func(t *testing.T) { 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.Run("NotInfinite", func(t *testing.T) {
t.Parallel() t.Parallel()
var fetchCalled uint64 var fetchCalled atomic.Uint64
cmd := &serpent.Command{ cmd := &serpent.Command{
Handler: func(inv *serpent.Invocation) error { 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{ err := cliui.Agent(inv.Context(), &buf, uuid.Nil, cliui.AgentOptions{
FetchInterval: 10 * time.Millisecond, FetchInterval: 10 * time.Millisecond,
Fetch: func(ctx context.Context, agentID uuid.UUID) (codersdk.WorkspaceAgent, error) { Fetch: func(ctx context.Context, agentID uuid.UUID) (codersdk.WorkspaceAgent, error) {
atomic.AddUint64(&fetchCalled, 1) fetchCalled.Add(1)
return codersdk.WorkspaceAgent{ return codersdk.WorkspaceAgent{
Status: codersdk.WorkspaceAgentConnected, Status: codersdk.WorkspaceAgentConnected,
@@ -557,7 +557,7 @@ func TestAgent(t *testing.T) {
} }
require.Never(t, func() bool { require.Never(t, func() bool {
called := atomic.LoadUint64(&fetchCalled) called := fetchCalled.Load()
return called > 5 || called == 0 return called > 5 || called == 0
}, time.Second, 100*time.Millisecond) }, 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.Run("OK", func(t *testing.T) {
t.Parallel() t.Parallel()
var called int64 var called atomic.Int64
f := cliui.NewOutputFormatter( f := cliui.NewOutputFormatter(
cliui.JSONFormat(), cliui.JSONFormat(),
&format{ &format{
@@ -95,7 +95,7 @@ func Test_OutputFormatter(t *testing.T) {
}) })
}, },
formatFn: func(_ context.Context, _ any) (string, error) { formatFn: func(_ context.Context, _ any) (string, error) {
atomic.AddInt64(&called, 1) called.Add(1)
return "foo", nil return "foo", nil
}, },
}, },
@@ -121,18 +121,18 @@ func Test_OutputFormatter(t *testing.T) {
var got []string var got []string
require.NoError(t, json.Unmarshal([]byte(out), &got)) require.NoError(t, json.Unmarshal([]byte(out), &got))
require.Equal(t, data, 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")) require.NoError(t, fs.Set("output", "foo"))
out, err = f.Format(ctx, data) out, err = f.Format(ctx, data)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "foo", out) 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")) require.Error(t, fs.Set("output", "bar"))
out, err = f.Format(ctx, data) out, err = f.Format(ctx, data)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "foo", out) 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) setupCtx := testutil.Context(t, testutil.WaitLong)
client, token, pubkey := prepareTestGitSSH(setupCtx, t) client, token, pubkey := prepareTestGitSSH(setupCtx, t)
var inc int64 var inc atomic.Int64
errC := make(chan error, 1) errC := make(chan error, 1)
addr := serveSSHForGitSSH(t, func(s ssh.Session) { addr := serveSSHForGitSSH(t, func(s ssh.Session) {
atomic.AddInt64(&inc, 1) inc.Add(1)
t.Log("got authenticated session") t.Log("got authenticated session")
select { select {
case errC <- s.Exit(0): case errC <- s.Exit(0):
@@ -146,7 +146,7 @@ func TestGitSSH(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitSuperLong) ctx := testutil.Context(t, testutil.WaitSuperLong)
err := inv.WithContext(ctx).Run() err := inv.WithContext(ctx).Run()
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, inc) require.EqualValues(t, 1, inc.Load())
err = <-errC err = <-errC
require.NoError(t, err, "error in agent execute") require.NoError(t, err, "error in agent execute")
+6 -6
View File
@@ -164,9 +164,9 @@ func TestRoot(t *testing.T) {
t.Parallel() t.Parallel()
var url string var url string
var called int64 var called atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 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, "wow", r.Header.Get("X-Testing"))
assert.Equal(t, "Dean was Here!", r.Header.Get("Cool-Header")) assert.Equal(t, "Dean was Here!", r.Header.Get("Cool-Header"))
assert.Equal(t, "very-wow-"+url, r.Header.Get("X-Process-Testing")) assert.Equal(t, "very-wow-"+url, r.Header.Get("X-Process-Testing"))
@@ -193,7 +193,7 @@ func TestRoot(t *testing.T) {
err := inv.Run() err := inv.Run()
require.Error(t, err) require.Error(t, err)
require.ErrorContains(t, err, "unexpected status code 410") 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!", "Cool-Header": "Dean was Here!",
"X-Process-Testing": "very-wow", "X-Process-Testing": "very-wow",
} }
derpCalled int64 derpCalled atomic.Int64
) )
setHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { setHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/derp") { if strings.HasPrefix(r.URL.Path, "/derp") {
@@ -252,7 +252,7 @@ func TestDERPHeaders(t *testing.T) {
if ok { if ok {
// Only increment if all the headers are set, because the agent // Only increment if all the headers are set, because the agent
// calls derp also. // 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) pty.ExpectMatch("pong from " + workspace.Name)
<-cmdDone <-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) { func TestHandlersOK(t *testing.T) {
+4 -4
View File
@@ -745,13 +745,13 @@ func TestServer(t *testing.T) {
var ( var (
expectAddr string expectAddr string
dials int64 dials atomic.Int64
) )
client := codersdk.New(accessURL) client := codersdk.New(accessURL)
client.HTTPClient = &http.Client{ client.HTTPClient = &http.Client{
Transport: &http.Transport{ Transport: &http.Transport{
DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) { DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
atomic.AddInt64(&dials, 1) dials.Add(1)
assert.Equal(t, expectAddr, addr) assert.Equal(t, expectAddr, addr)
host, _, err := net.SplitHostPort(addr) host, _, err := net.SplitHostPort(addr)
@@ -786,14 +786,14 @@ func TestServer(t *testing.T) {
expectAddr = "alpaca.com:443" expectAddr = "alpaca.com:443"
_, err := client.HasFirstUser(ctx) _, err := client.HasFirstUser(ctx)
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&dials)) require.EqualValues(t, 1, dials.Load())
// Use the second certificate (wildcard) and hostname. // Use the second certificate (wildcard) and hostname.
client.URL.Host = "hi.llama.com:443" client.URL.Host = "hi.llama.com:443"
expectAddr = "hi.llama.com:443" expectAddr = "hi.llama.com:443"
_, err = client.HasFirstUser(ctx) _, err = client.HasFirstUser(ctx)
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&dials)) require.EqualValues(t, 2, dials.Load())
}) })
t.Run("TLSAndHTTP", func(t *testing.T) { 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 // Make a proxy server that will return a valid entitlements
// response, including a valid advanced scheduling entitlement. // 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) { proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/v2/entitlements" { if r.URL.Path == "/api/v2/entitlements" {
res := codersdk.Entitlements{ res := codersdk.Entitlements{
@@ -499,7 +499,7 @@ func TestTemplateEdit(t *testing.T) {
assert.EqualValues(t, req.AutostopRequirement.Weeks, 3) assert.EqualValues(t, req.AutostopRequirement.Weeks, 3)
r.Body = io.NopCloser(bytes.NewReader(body)) r.Body = io.NopCloser(bytes.NewReader(body))
atomic.AddInt64(&updateTemplateCalled, 1) updateTemplateCalled.Add(1)
// We still want to call the real route. // We still want to call the real route.
} }
@@ -534,7 +534,7 @@ func TestTemplateEdit(t *testing.T) {
err = inv.WithContext(ctx).Run() err = inv.WithContext(ctx).Run()
require.NoError(t, err) 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 // Assert that the template metadata did not change. We verify the
// correct request gets sent to the server already. // 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 // Make a proxy server that will return a valid entitlements
// response, including a valid advanced scheduling entitlement. // 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) { proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/v2/entitlements" { if r.URL.Path == "/api/v2/entitlements" {
res := codersdk.Entitlements{ res := codersdk.Entitlements{
@@ -755,7 +755,7 @@ func TestTemplateEdit(t *testing.T) {
assert.False(t, req.AllowUserAutostop) assert.False(t, req.AllowUserAutostop)
r.Body = io.NopCloser(bytes.NewReader(body)) r.Body = io.NopCloser(bytes.NewReader(body))
atomic.AddInt64(&updateTemplateCalled, 1) updateTemplateCalled.Add(1)
// We still want to call the real route. // We still want to call the real route.
} }
@@ -790,7 +790,7 @@ func TestTemplateEdit(t *testing.T) {
err = inv.WithContext(ctx).Run() err = inv.WithContext(ctx).Run()
require.NoError(t, err) 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 // Assert that the template metadata did not change. We verify the
// correct request gets sent to the server already. // correct request gets sent to the server already.
+3 -3
View File
@@ -311,7 +311,7 @@ func TestUpdateLifecycle(t *testing.T) {
dbM := dbmock.NewMockStore(gomock.NewController(t)) dbM := dbmock.NewMockStore(gomock.NewController(t))
var publishCalled int64 var publishCalled atomic.Int64
reg := prometheus.NewRegistry() reg := prometheus.NewRegistry()
metrics := agentapi.NewLifecycleMetrics(reg) metrics := agentapi.NewLifecycleMetrics(reg)
@@ -324,7 +324,7 @@ func TestUpdateLifecycle(t *testing.T) {
Log: testutil.Logger(t), Log: testutil.Logger(t),
Metrics: metrics, Metrics: metrics,
PublishWorkspaceUpdateFn: func(ctx context.Context, _ uuid.UUID, kind wspubsub.WorkspaceEventKind) error { PublishWorkspaceUpdateFn: func(ctx context.Context, _ uuid.UUID, kind wspubsub.WorkspaceEventKind) error {
atomic.AddInt64(&publishCalled, 1) publishCalled.Add(1)
return nil return nil
}, },
} }
@@ -384,7 +384,7 @@ func TestUpdateLifecycle(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, lifecycle, resp) require.Equal(t, lifecycle, resp)
require.Equal(t, int64(i+1), atomic.LoadInt64(&publishCalled)) require.Equal(t, int64(i+1), publishCalled.Load())
// For future iterations: // For future iterations:
agent.StartedAt = expectedStartedAt agent.StartedAt = expectedStartedAt
+3 -3
View File
@@ -164,14 +164,14 @@ func TestDERPForceWebSockets(t *testing.T) {
// Set the HTTP handler to a custom one that ensures all /derp calls are // Set the HTTP handler to a custom one that ensures all /derp calls are
// WebSockets and not `Upgrade: derp`. // WebSockets and not `Upgrade: derp`.
var upgradeCount int64 var upgradeCount atomic.Int64
setHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { setHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/derp") { if strings.HasPrefix(r.URL.Path, "/derp") {
up := r.Header.Get("Upgrade") up := r.Header.Get("Upgrade")
if up != "" && up != "websocket" { if up != "" && up != "websocket" {
t.Errorf("expected Upgrade: websocket, got %q", up) t.Errorf("expected Upgrade: websocket, got %q", up)
} else { } else {
atomic.AddInt64(&upgradeCount, 1) upgradeCount.Add(1)
} }
} }
@@ -224,7 +224,7 @@ func TestDERPForceWebSockets(t *testing.T) {
}() }()
conn.AwaitReachable(ctx) conn.AwaitReachable(ctx)
require.GreaterOrEqual(t, atomic.LoadInt64(&upgradeCount), int64(1), "expected at least one /derp call") require.GreaterOrEqual(t, upgradeCount.Load(), int64(1), "expected at least one /derp call")
} }
func TestDERPLatencyCheck(t *testing.T) { func TestDERPLatencyCheck(t *testing.T) {
+6 -6
View File
@@ -50,13 +50,13 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
) )
r.Header.Set(codersdk.SessionTokenHeader, token) r.Header.Set(codersdk.SessionTokenHeader, token)
var called int64 var called atomic.Int64
httpmw.ExtractAPIKeyMW(httpmw.ExtractAPIKeyConfig{ httpmw.ExtractAPIKeyMW(httpmw.ExtractAPIKeyConfig{
DB: db, DB: db,
RedirectToLogin: false, RedirectToLogin: false,
})( })(
httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1) called.Add(1)
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}))). }))).
ServeHTTP(rw, r) ServeHTTP(rw, r)
@@ -68,7 +68,7 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
t.Log(string(dump)) t.Log(string(dump))
require.Equal(t, http.StatusOK, rw.Code) require.Equal(t, http.StatusOK, rw.Code)
require.Equal(t, int64(1), atomic.LoadInt64(&called)) require.Equal(t, int64(1), called.Load())
}) })
t.Run("WorkspaceProxy", func(t *testing.T) { t.Run("WorkspaceProxy", func(t *testing.T) {
@@ -122,12 +122,12 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
) )
r.Header.Set(httpmw.WorkspaceProxyAuthTokenHeader, fmt.Sprintf("%s:%s", proxy.ID, token)) r.Header.Set(httpmw.WorkspaceProxyAuthTokenHeader, fmt.Sprintf("%s:%s", proxy.ID, token))
var called int64 var called atomic.Int64
httpmw.ExtractWorkspaceProxy(httpmw.ExtractWorkspaceProxyConfig{ httpmw.ExtractWorkspaceProxy(httpmw.ExtractWorkspaceProxyConfig{
DB: db, DB: db,
})( })(
httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1) called.Add(1)
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}))). }))).
ServeHTTP(rw, r) ServeHTTP(rw, r)
@@ -139,6 +139,6 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
t.Log(string(dump)) t.Log(string(dump))
require.Equal(t, http.StatusOK, rw.Code) require.Equal(t, http.StatusOK, rw.Code)
require.Equal(t, int64(1), atomic.LoadInt64(&called)) require.Equal(t, int64(1), called.Load())
}) })
} }
+3 -3
View File
@@ -802,9 +802,9 @@ func TestAPIKey(t *testing.T) {
r = httptest.NewRequest("GET", "/", nil) r = httptest.NewRequest("GET", "/", nil)
rw = httptest.NewRecorder() rw = httptest.NewRecorder()
count int64 count atomic.Int64
handler = http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { handler = http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&count, 1) count.Add(1)
apiKey, ok := httpmw.APIKeyOptional(r) apiKey, ok := httpmw.APIKeyOptional(r)
assert.False(t, ok) assert.False(t, ok)
@@ -823,7 +823,7 @@ func TestAPIKey(t *testing.T) {
res := rw.Result() res := rw.Result()
defer res.Body.Close() defer res.Body.Close()
require.Equal(t, http.StatusOK, res.StatusCode) require.Equal(t, http.StatusOK, res.StatusCode)
require.EqualValues(t, 1, atomic.LoadInt64(&count)) require.EqualValues(t, 1, count.Load())
}) })
t.Run("Tokens", func(t *testing.T) { t.Run("Tokens", func(t *testing.T) {
+3 -3
View File
@@ -407,7 +407,7 @@ func (failingHealthcheck) Ping(context.Context) (time.Duration, error) {
type wrappedListener struct { type wrappedListener struct {
net.Listener net.Listener
dials int32 dials atomic.Int32
} }
func (w *wrappedListener) Accept() (net.Conn, error) { func (w *wrappedListener) Accept() (net.Conn, error) {
@@ -416,12 +416,12 @@ func (w *wrappedListener) Accept() (net.Conn, error) {
return nil, err return nil, err
} }
atomic.AddInt32(&w.dials, 1) w.dials.Add(1)
return conn, nil return conn, nil
} }
func (w *wrappedListener) getDials() int { func (w *wrappedListener) getDials() int {
return int(atomic.LoadInt32(&w.dials)) return int(w.dials.Load())
} }
type agentWithID struct { type agentWithID struct {
+23 -23
View File
@@ -198,11 +198,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
t.Run("OK", func(t *testing.T) { t.Run("OK", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1) setCalled.Add(1)
require.False(t, options.UserAutostartEnabled) require.False(t, options.UserAutostartEnabled)
require.False(t, options.UserAutostopEnabled) require.False(t, options.UserAutostopEnabled)
template.AllowUserAutostart = options.UserAutostartEnabled template.AllowUserAutostart = options.UserAutostartEnabled
@@ -225,7 +225,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 1, setCalled.Load())
require.False(t, got.AllowUserAutostart) require.False(t, got.AllowUserAutostart)
require.False(t, got.AllowUserAutostop) require.False(t, got.AllowUserAutostop)
}) })
@@ -275,11 +275,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
t.Run("None", func(t *testing.T) { t.Run("None", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1) setCalled.Add(1)
assert.Zero(t, options.AutostopRequirement.DaysOfWeek) assert.Zero(t, options.AutostopRequirement.DaysOfWeek)
assert.Zero(t, options.AutostopRequirement.Weeks) assert.Zero(t, options.AutostopRequirement.Weeks)
@@ -317,7 +317,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 1, setCalled.Load())
require.Empty(t, got.AutostopRequirement.DaysOfWeek) require.Empty(t, got.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 1, got.AutostopRequirement.Weeks) require.EqualValues(t, 1, got.AutostopRequirement.Weeks)
}) })
@@ -325,11 +325,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
t.Run("OK", func(t *testing.T) { t.Run("OK", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1) setCalled.Add(1)
assert.EqualValues(t, 0b00110000, options.AutostopRequirement.DaysOfWeek) assert.EqualValues(t, 0b00110000, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 2, options.AutostopRequirement.Weeks) assert.EqualValues(t, 2, options.AutostopRequirement.Weeks)
@@ -371,7 +371,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 1, setCalled.Load())
require.Equal(t, []string{"friday", "saturday"}, got.AutostopRequirement.DaysOfWeek) require.Equal(t, []string{"friday", "saturday"}, got.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 2, got.AutostopRequirement.Weeks) require.EqualValues(t, 2, got.AutostopRequirement.Weeks)
@@ -1135,11 +1135,11 @@ func TestPatchTemplateMeta(t *testing.T) {
t.Run("OK", func(t *testing.T) { t.Run("OK", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
if atomic.AddInt64(&setCalled, 1) == 2 { if setCalled.Add(1) == 2 {
require.Equal(t, failureTTL, options.FailureTTL) require.Equal(t, failureTTL, options.FailureTTL)
require.Equal(t, inactivityTTL, options.TimeTilDormant) require.Equal(t, inactivityTTL, options.TimeTilDormant)
require.Equal(t, timeTilDormantAutoDelete, options.TimeTilDormantAutoDelete) require.Equal(t, timeTilDormantAutoDelete, options.TimeTilDormantAutoDelete)
@@ -1176,7 +1176,7 @@ func TestPatchTemplateMeta(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 2, setCalled.Load())
require.Equal(t, failureTTL.Milliseconds(), got.FailureTTLMillis) require.Equal(t, failureTTL.Milliseconds(), got.FailureTTLMillis)
require.Equal(t, inactivityTTL.Milliseconds(), got.TimeTilDormantMillis) require.Equal(t, inactivityTTL.Milliseconds(), got.TimeTilDormantMillis)
require.Equal(t, timeTilDormantAutoDelete.Milliseconds(), got.TimeTilDormantAutoDeleteMillis) require.Equal(t, timeTilDormantAutoDelete.Milliseconds(), got.TimeTilDormantAutoDeleteMillis)
@@ -1225,7 +1225,7 @@ func TestPatchTemplateMeta(t *testing.T) {
t.Parallel() t.Parallel()
var ( var (
setCalled int64 setCalled atomic.Int64
allowAutostart atomic.Bool allowAutostart atomic.Bool
allowAutostop atomic.Bool allowAutostop atomic.Bool
) )
@@ -1234,7 +1234,7 @@ func TestPatchTemplateMeta(t *testing.T) {
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1) setCalled.Add(1)
assert.Equal(t, allowAutostart.Load(), options.UserAutostartEnabled) assert.Equal(t, allowAutostart.Load(), options.UserAutostartEnabled)
assert.Equal(t, allowAutostop.Load(), options.UserAutostopEnabled) assert.Equal(t, allowAutostop.Load(), options.UserAutostopEnabled)
@@ -1271,7 +1271,7 @@ func TestPatchTemplateMeta(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 2, setCalled.Load())
require.Equal(t, allowAutostart.Load(), got.AllowUserAutostart) require.Equal(t, allowAutostart.Load(), got.AllowUserAutostart)
require.Equal(t, allowAutostop.Load(), got.AllowUserAutostop) require.Equal(t, allowAutostop.Load(), got.AllowUserAutostop)
}) })
@@ -1400,11 +1400,11 @@ func TestPatchTemplateMeta(t *testing.T) {
t.Run("OK", func(t *testing.T) { t.Run("OK", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
if atomic.AddInt64(&setCalled, 1) == 2 { if setCalled.Add(1) == 2 {
assert.EqualValues(t, 0b0110000, options.AutostopRequirement.DaysOfWeek) assert.EqualValues(t, 0b0110000, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 2, options.AutostopRequirement.Weeks) assert.EqualValues(t, 2, options.AutostopRequirement.Weeks)
} }
@@ -1434,7 +1434,7 @@ func TestPatchTemplateMeta(t *testing.T) {
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 1, setCalled.Load())
require.Empty(t, template.AutostopRequirement.DaysOfWeek) require.Empty(t, template.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 1, template.AutostopRequirement.Weeks) require.EqualValues(t, 1, template.AutostopRequirement.Weeks)
req := codersdk.UpdateTemplateMeta{ req := codersdk.UpdateTemplateMeta{
@@ -1456,7 +1456,7 @@ func TestPatchTemplateMeta(t *testing.T) {
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req) updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 2, setCalled.Load())
require.Equal(t, []string{"friday", "saturday"}, updated.AutostopRequirement.DaysOfWeek) require.Equal(t, []string{"friday", "saturday"}, updated.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 2, updated.AutostopRequirement.Weeks) require.EqualValues(t, 2, updated.AutostopRequirement.Weeks)
@@ -1471,11 +1471,11 @@ func TestPatchTemplateMeta(t *testing.T) {
t.Run("Unset", func(t *testing.T) { t.Run("Unset", func(t *testing.T) {
t.Parallel() t.Parallel()
var setCalled int64 var setCalled atomic.Int64
client := coderdtest.New(t, &coderdtest.Options{ client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{ TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) { SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
if atomic.AddInt64(&setCalled, 1) == 2 { if setCalled.Add(1) == 2 {
assert.EqualValues(t, 0, options.AutostopRequirement.DaysOfWeek) assert.EqualValues(t, 0, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 1, options.AutostopRequirement.Weeks) assert.EqualValues(t, 1, options.AutostopRequirement.Weeks)
} }
@@ -1511,7 +1511,7 @@ func TestPatchTemplateMeta(t *testing.T) {
Weeks: 2, Weeks: 2,
} }
}) })
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 1, setCalled.Load())
require.Equal(t, []string{"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}, template.AutostopRequirement.DaysOfWeek) require.Equal(t, []string{"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}, template.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 2, template.AutostopRequirement.Weeks) require.EqualValues(t, 2, template.AutostopRequirement.Weeks)
req := codersdk.UpdateTemplateMeta{ req := codersdk.UpdateTemplateMeta{
@@ -1532,7 +1532,7 @@ func TestPatchTemplateMeta(t *testing.T) {
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req) updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled)) require.EqualValues(t, 2, setCalled.Load())
require.Empty(t, updated.AutostopRequirement.DaysOfWeek) require.Empty(t, updated.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 1, updated.AutostopRequirement.Weeks) require.EqualValues(t, 1, updated.AutostopRequirement.Weeks)
+3 -3
View File
@@ -24,7 +24,7 @@ type noopTracer = noop.Tracer
type fakeTracer struct { type fakeTracer struct {
noop.TracerProvider noop.TracerProvider
noopTracer noopTracer
startCalled int64 startCalled atomic.Int64
} }
var ( var (
@@ -39,7 +39,7 @@ func (f *fakeTracer) Tracer(_ string, _ ...trace.TracerOption) trace.Tracer {
// Start implements trace.Tracer. // Start implements trace.Tracer.
func (f *fakeTracer) Start(ctx context.Context, _ string, _ ...trace.SpanStartOption) (context.Context, trace.Span) { func (f *fakeTracer) Start(ctx context.Context, _ string, _ ...trace.SpanStartOption) (context.Context, trace.Span) {
atomic.AddInt64(&f.startCalled, 1) f.startCalled.Add(1)
return ctx, tracing.NoopSpan return ctx, tracing.NoopSpan
} }
@@ -94,7 +94,7 @@ func Test_Middleware(t *testing.T) {
rw.WriteHeader(http.StatusNoContent) rw.WriteHeader(http.StatusNoContent)
})).ServeHTTP(rw, r) })).ServeHTTP(rw, r)
didRun := atomic.LoadInt64(&fake.startCalled) == 1 didRun := fake.startCalled.Load() == 1
require.Equal(t, c.runs, didRun, "expected middleware to run/not run") require.Equal(t, c.runs, didRun, "expected middleware to run/not run")
}) })
} }
+6 -6
View File
@@ -1059,10 +1059,10 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
var calls int64 var calls atomic.Int64
fakeUsageChecker := &fakeUsageChecker{ fakeUsageChecker := &fakeUsageChecker{
checkBuildUsageFunc: func(_ context.Context, _ database.Store, _ *database.TemplateVersion, _ *database.Task, _ database.WorkspaceTransition) (wsbuilder.UsageCheckResponse, error) { checkBuildUsageFunc: func(_ context.Context, _ database.Store, _ *database.TemplateVersion, _ *database.Task, _ database.WorkspaceTransition) (wsbuilder.UsageCheckResponse, error) {
atomic.AddInt64(&calls, 1) calls.Add(1)
return wsbuilder.UsageCheckResponse{Permitted: true}, nil return wsbuilder.UsageCheckResponse{Permitted: true}, nil
}, },
} }
@@ -1095,7 +1095,7 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
// nolint: dogsled // nolint: dogsled
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{}) _, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, calls) require.EqualValues(t, 1, calls.Load())
}) })
// The failure cases are mostly identical from a test perspective. // The failure cases are mostly identical from a test perspective.
@@ -1137,10 +1137,10 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
var calls int64 var calls atomic.Int64
fakeUsageChecker := &fakeUsageChecker{ fakeUsageChecker := &fakeUsageChecker{
checkBuildUsageFunc: func(_ context.Context, _ database.Store, _ *database.TemplateVersion, _ *database.Task, _ database.WorkspaceTransition) (wsbuilder.UsageCheckResponse, error) { checkBuildUsageFunc: func(_ context.Context, _ database.Store, _ *database.TemplateVersion, _ *database.Task, _ database.WorkspaceTransition) (wsbuilder.UsageCheckResponse, error) {
atomic.AddInt64(&calls, 1) calls.Add(1)
return c.response, c.responseErr return c.response, c.responseErr
}, },
} }
@@ -1158,7 +1158,7 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
// nolint: dogsled // nolint: dogsled
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{}) _, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
c.assertions(t, err) c.assertions(t, err)
require.EqualValues(t, 1, calls) require.EqualValues(t, 1, calls.Load())
}) })
} }
} }
+3 -3
View File
@@ -32,9 +32,9 @@ func Test_ProxyServer_Headers(t *testing.T) {
// We're not going to actually start a proxy, we're going to point it // We're not going to actually start a proxy, we're going to point it
// towards a fake server that returns an unexpected status code. This'll // towards a fake server that returns an unexpected status code. This'll
// cause the proxy to exit with an error that we can check for. // cause the proxy to exit with an error that we can check for.
var called int64 var called atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1) called.Add(1)
assert.Equal(t, headerVal1, r.Header.Get(headerName1)) assert.Equal(t, headerVal1, r.Header.Get(headerName1))
assert.Equal(t, headerVal2, r.Header.Get(headerName2)) assert.Equal(t, headerVal2, r.Header.Get(headerName2))
@@ -57,7 +57,7 @@ func Test_ProxyServer_Headers(t *testing.T) {
require.ErrorContains(t, err, "unexpected status code 418") require.ErrorContains(t, err, "unexpected status code 418")
require.NoError(t, pty.Close()) require.NoError(t, pty.Close())
assert.EqualValues(t, 1, atomic.LoadInt64(&called)) assert.EqualValues(t, 1, called.Load())
} }
//nolint:paralleltest,tparallel // Test uses a static port. //nolint:paralleltest,tparallel // Test uses a static port.
@@ -39,9 +39,9 @@ func Test_IssueSignedAppTokenHTML(t *testing.T) {
expectedSessionToken = "user-session-token" expectedSessionToken = "user-session-token"
expectedSignedTokenStr = "signed-app-token" expectedSignedTokenStr = "signed-app-token"
) )
var called int64 var called atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { srv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1) called.Add(1)
assert.Equal(t, r.Method, http.MethodPost) assert.Equal(t, r.Method, http.MethodPost)
assert.Equal(t, r.URL.Path, "/api/v2/workspaceproxies/me/issue-signed-app-token") assert.Equal(t, r.URL.Path, "/api/v2/workspaceproxies/me/issue-signed-app-token")
@@ -87,7 +87,7 @@ func Test_IssueSignedAppTokenHTML(t *testing.T) {
require.Equal(t, expectedSignedTokenStr, tokenRes.SignedTokenStr) require.Equal(t, expectedSignedTokenStr, tokenRes.SignedTokenStr)
require.False(t, rw.WasWritten()) require.False(t, rw.WasWritten())
require.EqualValues(t, called, 1) require.EqualValues(t, called.Load(), 1)
}) })
t.Run("Error", func(t *testing.T) { t.Run("Error", func(t *testing.T) {
@@ -98,9 +98,9 @@ func Test_IssueSignedAppTokenHTML(t *testing.T) {
expectedResponseStatus = http.StatusBadRequest expectedResponseStatus = http.StatusBadRequest
expectedResponseBody = "bad request" expectedResponseBody = "bad request"
) )
var called int64 var called atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { srv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&called, 1) called.Add(1)
assert.Equal(t, r.Method, http.MethodPost) assert.Equal(t, r.Method, http.MethodPost)
assert.Equal(t, r.URL.Path, "/api/v2/workspaceproxies/me/issue-signed-app-token") assert.Equal(t, r.URL.Path, "/api/v2/workspaceproxies/me/issue-signed-app-token")
@@ -132,7 +132,7 @@ func Test_IssueSignedAppTokenHTML(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, expectedResponseBody, string(body)) require.Equal(t, expectedResponseBody, string(body))
require.EqualValues(t, called, 1) require.EqualValues(t, called.Load(), 1)
}) })
} }
+3 -5
View File
@@ -264,14 +264,12 @@ func setupRunnerTest(t *testing.T) (client *codersdk.Client, agentID uuid.UUID)
func testServer(t *testing.T) (string, func() int64) { func testServer(t *testing.T) (string, func() int64) {
t.Helper() t.Helper()
var count int64 var count atomic.Int64
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&count, 1) count.Add(1)
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
})) }))
t.Cleanup(srv.Close) t.Cleanup(srv.Close)
return srv.URL, func() int64 { return srv.URL, count.Load
return atomic.LoadInt64(&count)
}
} }
+12 -12
View File
@@ -58,21 +58,21 @@ func Test_TestRun(t *testing.T) {
var ( var (
name, id = "test", "1" name, id = "test", "1"
runCalled int64 runCalled atomic.Int64
cleanupCalled int64 cleanupCalled atomic.Int64
collectableCalled int64 collectableCalled atomic.Int64
testFns = testFns{ testFns = testFns{
RunFn: func(ctx context.Context, id string, logs io.Writer) error { RunFn: func(ctx context.Context, id string, logs io.Writer) error {
atomic.AddInt64(&runCalled, 1) runCalled.Add(1)
return nil return nil
}, },
CleanupFn: func(ctx context.Context, id string, logs io.Writer) error { CleanupFn: func(ctx context.Context, id string, logs io.Writer) error {
atomic.AddInt64(&cleanupCalled, 1) cleanupCalled.Add(1)
return nil return nil
}, },
GetMetricsFn: func() map[string]any { GetMetricsFn: func() map[string]any {
atomic.AddInt64(&collectableCalled, 1) collectableCalled.Add(1)
return nil return nil
}, },
} }
@@ -83,12 +83,12 @@ func Test_TestRun(t *testing.T) {
err := run.Run(context.Background()) err := run.Run(context.Background())
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&runCalled)) require.EqualValues(t, 1, runCalled.Load())
require.EqualValues(t, 1, atomic.LoadInt64(&collectableCalled)) require.EqualValues(t, 1, collectableCalled.Load())
err = run.Cleanup(context.Background()) err = run.Cleanup(context.Background())
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 1, atomic.LoadInt64(&cleanupCalled)) require.EqualValues(t, 1, cleanupCalled.Load())
}) })
t.Run("Cleanup", func(t *testing.T) { t.Run("Cleanup", func(t *testing.T) {
@@ -111,20 +111,20 @@ func Test_TestRun(t *testing.T) {
t.Run("NotDone", func(t *testing.T) { t.Run("NotDone", func(t *testing.T) {
t.Parallel() t.Parallel()
var cleanupCalled int64 var cleanupCalled atomic.Int64
run := harness.NewTestRun("test", "1", testFns{ run := harness.NewTestRun("test", "1", testFns{
RunFn: func(ctx context.Context, id string, logs io.Writer) error { RunFn: func(ctx context.Context, id string, logs io.Writer) error {
return nil return nil
}, },
CleanupFn: func(ctx context.Context, id string, logs io.Writer) error { CleanupFn: func(ctx context.Context, id string, logs io.Writer) error {
atomic.AddInt64(&cleanupCalled, 1) cleanupCalled.Add(1)
return nil return nil
}, },
}) })
err := run.Cleanup(context.Background()) err := run.Cleanup(context.Background())
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 0, atomic.LoadInt64(&cleanupCalled)) require.EqualValues(t, 0, cleanupCalled.Load())
}) })
}) })
+6 -5
View File
@@ -19,12 +19,13 @@ import (
//nolint:paralleltest // this tests uses timings to determine if it's working //nolint:paralleltest // this tests uses timings to determine if it's working
func Test_LinearExecutionStrategy(t *testing.T) { func Test_LinearExecutionStrategy(t *testing.T) {
var ( var (
lastSeenI int64 = -1 lastSeenI atomic.Int64
count int64 count atomic.Int64
) )
lastSeenI.Store(-1)
runs, fns := strategyTestData(100, func(_ context.Context, i int, _ io.Writer) error { runs, fns := strategyTestData(100, func(_ context.Context, i int, _ io.Writer) error {
atomic.AddInt64(&count, 1) count.Add(1)
swapped := atomic.CompareAndSwapInt64(&lastSeenI, int64(i-1), int64(i)) swapped := lastSeenI.CompareAndSwap(int64(i-1), int64(i))
assert.True(t, swapped) assert.True(t, swapped)
time.Sleep(2 * time.Millisecond) time.Sleep(2 * time.Millisecond)
@@ -38,7 +39,7 @@ func Test_LinearExecutionStrategy(t *testing.T) {
runErrs, err := strategy.Run(context.Background(), fns) runErrs, err := strategy.Run(context.Background(), fns)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, runErrs, 50) require.Len(t, runErrs, 50)
require.EqualValues(t, 100, atomic.LoadInt64(&count)) require.EqualValues(t, 100, count.Load())
lastStartTime := time.Time{} lastStartTime := time.Time{}
for _, run := range runs { for _, run := range runs {