mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
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:
@@ -311,7 +311,7 @@ func TestUpdateLifecycle(t *testing.T) {
|
||||
|
||||
dbM := dbmock.NewMockStore(gomock.NewController(t))
|
||||
|
||||
var publishCalled int64
|
||||
var publishCalled atomic.Int64
|
||||
reg := prometheus.NewRegistry()
|
||||
metrics := agentapi.NewLifecycleMetrics(reg)
|
||||
|
||||
@@ -324,7 +324,7 @@ func TestUpdateLifecycle(t *testing.T) {
|
||||
Log: testutil.Logger(t),
|
||||
Metrics: metrics,
|
||||
PublishWorkspaceUpdateFn: func(ctx context.Context, _ uuid.UUID, kind wspubsub.WorkspaceEventKind) error {
|
||||
atomic.AddInt64(&publishCalled, 1)
|
||||
publishCalled.Add(1)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
@@ -384,7 +384,7 @@ func TestUpdateLifecycle(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
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:
|
||||
agent.StartedAt = expectedStartedAt
|
||||
|
||||
@@ -164,14 +164,14 @@ func TestDERPForceWebSockets(t *testing.T) {
|
||||
|
||||
// Set the HTTP handler to a custom one that ensures all /derp calls are
|
||||
// WebSockets and not `Upgrade: derp`.
|
||||
var upgradeCount int64
|
||||
var upgradeCount atomic.Int64
|
||||
setHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
||||
if strings.HasPrefix(r.URL.Path, "/derp") {
|
||||
up := r.Header.Get("Upgrade")
|
||||
if up != "" && up != "websocket" {
|
||||
t.Errorf("expected Upgrade: websocket, got %q", up)
|
||||
} else {
|
||||
atomic.AddInt64(&upgradeCount, 1)
|
||||
upgradeCount.Add(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,7 +224,7 @@ func TestDERPForceWebSockets(t *testing.T) {
|
||||
}()
|
||||
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) {
|
||||
|
||||
@@ -50,13 +50,13 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
|
||||
)
|
||||
r.Header.Set(codersdk.SessionTokenHeader, token)
|
||||
|
||||
var called int64
|
||||
var called atomic.Int64
|
||||
httpmw.ExtractAPIKeyMW(httpmw.ExtractAPIKeyConfig{
|
||||
DB: db,
|
||||
RedirectToLogin: false,
|
||||
})(
|
||||
httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
atomic.AddInt64(&called, 1)
|
||||
called.Add(1)
|
||||
rw.WriteHeader(http.StatusOK)
|
||||
}))).
|
||||
ServeHTTP(rw, r)
|
||||
@@ -68,7 +68,7 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
|
||||
t.Log(string(dump))
|
||||
|
||||
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) {
|
||||
@@ -122,12 +122,12 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
|
||||
)
|
||||
r.Header.Set(httpmw.WorkspaceProxyAuthTokenHeader, fmt.Sprintf("%s:%s", proxy.ID, token))
|
||||
|
||||
var called int64
|
||||
var called atomic.Int64
|
||||
httpmw.ExtractWorkspaceProxy(httpmw.ExtractWorkspaceProxyConfig{
|
||||
DB: db,
|
||||
})(
|
||||
httpmw.RequireAPIKeyOrWorkspaceProxyAuth()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
atomic.AddInt64(&called, 1)
|
||||
called.Add(1)
|
||||
rw.WriteHeader(http.StatusOK)
|
||||
}))).
|
||||
ServeHTTP(rw, r)
|
||||
@@ -139,6 +139,6 @@ func TestRequireAPIKeyOrWorkspaceProxyAuth(t *testing.T) {
|
||||
t.Log(string(dump))
|
||||
|
||||
require.Equal(t, http.StatusOK, rw.Code)
|
||||
require.Equal(t, int64(1), atomic.LoadInt64(&called))
|
||||
require.Equal(t, int64(1), called.Load())
|
||||
})
|
||||
}
|
||||
|
||||
@@ -802,9 +802,9 @@ func TestAPIKey(t *testing.T) {
|
||||
r = httptest.NewRequest("GET", "/", nil)
|
||||
rw = httptest.NewRecorder()
|
||||
|
||||
count int64
|
||||
count atomic.Int64
|
||||
handler = http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
||||
atomic.AddInt64(&count, 1)
|
||||
count.Add(1)
|
||||
|
||||
apiKey, ok := httpmw.APIKeyOptional(r)
|
||||
assert.False(t, ok)
|
||||
@@ -823,7 +823,7 @@ func TestAPIKey(t *testing.T) {
|
||||
res := rw.Result()
|
||||
defer res.Body.Close()
|
||||
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) {
|
||||
|
||||
@@ -407,7 +407,7 @@ func (failingHealthcheck) Ping(context.Context) (time.Duration, error) {
|
||||
|
||||
type wrappedListener struct {
|
||||
net.Listener
|
||||
dials int32
|
||||
dials atomic.Int32
|
||||
}
|
||||
|
||||
func (w *wrappedListener) Accept() (net.Conn, error) {
|
||||
@@ -416,12 +416,12 @@ func (w *wrappedListener) Accept() (net.Conn, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
atomic.AddInt32(&w.dials, 1)
|
||||
w.dials.Add(1)
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func (w *wrappedListener) getDials() int {
|
||||
return int(atomic.LoadInt32(&w.dials))
|
||||
return int(w.dials.Load())
|
||||
}
|
||||
|
||||
type agentWithID struct {
|
||||
|
||||
+23
-23
@@ -198,11 +198,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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.UserAutostopEnabled)
|
||||
template.AllowUserAutostart = options.UserAutostartEnabled
|
||||
@@ -225,7 +225,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
})
|
||||
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.AllowUserAutostop)
|
||||
})
|
||||
@@ -275,11 +275,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
t.Run("None", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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.Weeks)
|
||||
|
||||
@@ -317,7 +317,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
|
||||
require.EqualValues(t, 1, setCalled.Load())
|
||||
require.Empty(t, got.AutostopRequirement.DaysOfWeek)
|
||||
require.EqualValues(t, 1, got.AutostopRequirement.Weeks)
|
||||
})
|
||||
@@ -325,11 +325,11 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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, 2, options.AutostopRequirement.Weeks)
|
||||
|
||||
@@ -371,7 +371,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
|
||||
})
|
||||
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.EqualValues(t, 2, got.AutostopRequirement.Weeks)
|
||||
|
||||
@@ -1135,11 +1135,11 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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, inactivityTTL, options.TimeTilDormant)
|
||||
require.Equal(t, timeTilDormantAutoDelete, options.TimeTilDormantAutoDelete)
|
||||
@@ -1176,7 +1176,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
})
|
||||
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, inactivityTTL.Milliseconds(), got.TimeTilDormantMillis)
|
||||
require.Equal(t, timeTilDormantAutoDelete.Milliseconds(), got.TimeTilDormantAutoDeleteMillis)
|
||||
@@ -1225,7 +1225,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var (
|
||||
setCalled int64
|
||||
setCalled atomic.Int64
|
||||
allowAutostart atomic.Bool
|
||||
allowAutostop atomic.Bool
|
||||
)
|
||||
@@ -1234,7 +1234,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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, allowAutostop.Load(), options.UserAutostopEnabled)
|
||||
|
||||
@@ -1271,7 +1271,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
})
|
||||
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, allowAutostop.Load(), got.AllowUserAutostop)
|
||||
})
|
||||
@@ -1400,11 +1400,11 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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, 2, options.AutostopRequirement.Weeks)
|
||||
}
|
||||
@@ -1434,7 +1434,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
|
||||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
||||
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.EqualValues(t, 1, template.AutostopRequirement.Weeks)
|
||||
req := codersdk.UpdateTemplateMeta{
|
||||
@@ -1456,7 +1456,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
|
||||
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
|
||||
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.EqualValues(t, 2, updated.AutostopRequirement.Weeks)
|
||||
|
||||
@@ -1471,11 +1471,11 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
t.Run("Unset", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var setCalled int64
|
||||
var setCalled atomic.Int64
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
|
||||
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, 1, options.AutostopRequirement.Weeks)
|
||||
}
|
||||
@@ -1511,7 +1511,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
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.EqualValues(t, 2, template.AutostopRequirement.Weeks)
|
||||
req := codersdk.UpdateTemplateMeta{
|
||||
@@ -1532,7 +1532,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
|
||||
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled))
|
||||
require.EqualValues(t, 2, setCalled.Load())
|
||||
require.Empty(t, updated.AutostopRequirement.DaysOfWeek)
|
||||
require.EqualValues(t, 1, updated.AutostopRequirement.Weeks)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ type noopTracer = noop.Tracer
|
||||
type fakeTracer struct {
|
||||
noop.TracerProvider
|
||||
noopTracer
|
||||
startCalled int64
|
||||
startCalled atomic.Int64
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -39,7 +39,7 @@ func (f *fakeTracer) Tracer(_ string, _ ...trace.TracerOption) trace.Tracer {
|
||||
|
||||
// Start implements trace.Tracer.
|
||||
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
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ func Test_Middleware(t *testing.T) {
|
||||
rw.WriteHeader(http.StatusNoContent)
|
||||
})).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")
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1059,10 +1059,10 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
var calls int64
|
||||
var calls atomic.Int64
|
||||
fakeUsageChecker := &fakeUsageChecker{
|
||||
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
|
||||
},
|
||||
}
|
||||
@@ -1095,7 +1095,7 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
|
||||
// nolint: dogsled
|
||||
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
|
||||
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.
|
||||
@@ -1137,10 +1137,10 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
var calls int64
|
||||
var calls atomic.Int64
|
||||
fakeUsageChecker := &fakeUsageChecker{
|
||||
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
|
||||
},
|
||||
}
|
||||
@@ -1158,7 +1158,7 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
|
||||
// nolint: dogsled
|
||||
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
|
||||
c.assertions(t, err)
|
||||
require.EqualValues(t, 1, calls)
|
||||
require.EqualValues(t, 1, calls.Load())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user