mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +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:
+6
-6
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user