diff --git a/coderd/coderd_test.go b/coderd/coderd_test.go index 83c6155e14037..c5a865222dd22 100644 --- a/coderd/coderd_test.go +++ b/coderd/coderd_test.go @@ -50,7 +50,11 @@ func TestMain(m *testing.M) { func TestBuildInfo(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - buildInfo, err := client.BuildInfo(context.Background()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + buildInfo, err := client.BuildInfo(ctx) require.NoError(t, err) require.Equal(t, buildinfo.ExternalURL(), buildInfo.ExternalURL, "external URL") require.Equal(t, buildinfo.Version(), buildInfo.Version, "version") @@ -59,10 +63,10 @@ func TestBuildInfo(t *testing.T) { // TestAuthorizeAllEndpoints will check `authorize` is called on every endpoint registered. func TestAuthorizeAllEndpoints(t *testing.T) { t.Parallel() - var ( - ctx = context.Background() - authorizer = &fakeAuthorizer{} - ) + authorizer := &fakeAuthorizer{} + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() // This function was taken from coderdtest.newWithAPI. It is intentionally // copied to avoid exposing the API to other tests in coderd. Tests should @@ -84,7 +88,7 @@ func TestAuthorizeAllEndpoints(t *testing.T) { require.NoError(t, err) db = database.New(sqlDB) - pubsub, err = database.NewPubsub(context.Background(), sqlDB, connectionURL) + pubsub, err = database.NewPubsub(ctx, sqlDB, connectionURL) require.NoError(t, err) t.Cleanup(func() { _ = pubsub.Close() @@ -94,8 +98,8 @@ func TestAuthorizeAllEndpoints(t *testing.T) { tickerCh := make(chan time.Time) t.Cleanup(func() { close(tickerCh) }) - ctx, cancelFunc := context.WithCancel(context.Background()) - defer t.Cleanup(cancelFunc) // Defer to ensure cancelFunc is executed first. + ctx, cancel := context.WithCancel(ctx) // Shadowed to avoid mixing contexts. + defer t.Cleanup(cancel) // Defer to ensure cancelFunc is executed first. lifecycleExecutor := executor.New( ctx, @@ -513,7 +517,7 @@ func TestAuthorizeAllEndpoints(t *testing.T) { route = strings.ReplaceAll(route, "{scope}", string(templateParam.Scope)) route = strings.ReplaceAll(route, "{id}", templateParam.ScopeID.String()) - resp, err := client.Request(context.Background(), method, route, nil) + resp, err := client.Request(ctx, method, route, nil) require.NoError(t, err, "do req") body, _ := io.ReadAll(resp.Body) t.Logf("Response Body: %q", string(body)) diff --git a/coderd/files_test.go b/coderd/files_test.go index 016774a030c88..28d4a33104a5a 100644 --- a/coderd/files_test.go +++ b/coderd/files_test.go @@ -9,6 +9,7 @@ import ( "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) func TestPostFiles(t *testing.T) { @@ -17,7 +18,11 @@ func TestPostFiles(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, err := client.Upload(context.Background(), "bad", []byte{'a'}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.Upload(ctx, "bad", []byte{'a'}) require.Error(t, err) }) @@ -25,7 +30,11 @@ func TestPostFiles(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, err := client.Upload(context.Background(), codersdk.ContentTypeTar, make([]byte, 1024)) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.Upload(ctx, codersdk.ContentTypeTar, make([]byte, 1024)) require.NoError(t, err) }) @@ -33,10 +42,14 @@ func TestPostFiles(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + data := make([]byte, 1024) - _, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data) + _, err := client.Upload(ctx, codersdk.ContentTypeTar, data) require.NoError(t, err) - _, err = client.Upload(context.Background(), codersdk.ContentTypeTar, data) + _, err = client.Upload(ctx, codersdk.ContentTypeTar, data) require.NoError(t, err) }) } @@ -47,7 +60,11 @@ func TestDownload(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, _, err := client.Download(context.Background(), "something") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, _, err := client.Download(ctx, "something") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -57,9 +74,13 @@ func TestDownload(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - resp, err := client.Upload(context.Background(), codersdk.ContentTypeTar, make([]byte, 1024)) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Upload(ctx, codersdk.ContentTypeTar, make([]byte, 1024)) require.NoError(t, err) - data, contentType, err := client.Download(context.Background(), resp.Hash) + data, contentType, err := client.Download(ctx, resp.Hash) require.NoError(t, err) require.Len(t, data, 1024) require.Equal(t, codersdk.ContentTypeTar, contentType) diff --git a/coderd/gitsshkey_test.go b/coderd/gitsshkey_test.go index dbbcc824074f1..2e78e43459547 100644 --- a/coderd/gitsshkey_test.go +++ b/coderd/gitsshkey_test.go @@ -12,59 +12,75 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestGitSSHKey(t *testing.T) { t.Parallel() t.Run("None", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, nil) res := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + key, err := client.GitSSHKey(ctx, res.UserID.String()) require.NoError(t, err) require.NotEmpty(t, key.PublicKey) }) t.Run("Ed25519", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{ SSHKeygenAlgorithm: gitsshkey.AlgorithmEd25519, }) res := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + key, err := client.GitSSHKey(ctx, res.UserID.String()) require.NoError(t, err) require.NotEmpty(t, key.PublicKey) }) t.Run("ECDSA", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{ SSHKeygenAlgorithm: gitsshkey.AlgorithmECDSA, }) res := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + key, err := client.GitSSHKey(ctx, res.UserID.String()) require.NoError(t, err) require.NotEmpty(t, key.PublicKey) }) t.Run("RSA4096", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{ SSHKeygenAlgorithm: gitsshkey.AlgorithmRSA4096, }) res := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + key, err := client.GitSSHKey(ctx, res.UserID.String()) require.NoError(t, err) require.NotEmpty(t, key.PublicKey) }) t.Run("Regenerate", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{ SSHKeygenAlgorithm: gitsshkey.AlgorithmEd25519, }) res := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + key1, err := client.GitSSHKey(ctx, res.UserID.String()) require.NoError(t, err) require.NotEmpty(t, key1.PublicKey) @@ -112,7 +128,10 @@ func TestAgentGitSSHKey(t *testing.T) { agentClient := codersdk.New(client.URL) agentClient.SessionToken = authToken - agentKey, err := agentClient.AgentGitSSHKey(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + agentKey, err := agentClient.AgentGitSSHKey(ctx) require.NoError(t, err) require.NotEmpty(t, agentKey.PrivateKey) } diff --git a/coderd/organizations_test.go b/coderd/organizations_test.go index d329c65d59832..a23d7921305c2 100644 --- a/coderd/organizations_test.go +++ b/coderd/organizations_test.go @@ -9,13 +9,18 @@ import ( "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) func TestOrganizationsByUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - orgs, err := client.OrganizationsByUser(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + orgs, err := client.OrganizationsByUser(ctx, codersdk.Me) require.NoError(t, err) require.NotNil(t, orgs) require.Len(t, orgs, 1) @@ -27,7 +32,11 @@ func TestOrganizationByUserAndName(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - _, err := client.OrganizationByName(context.Background(), codersdk.Me, "nothing") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.OrganizationByName(ctx, codersdk.Me, "nothing") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -38,11 +47,15 @@ func TestOrganizationByUserAndName(t *testing.T) { client := coderdtest.New(t, nil) first := coderdtest.CreateFirstUser(t, client) other := coderdtest.CreateAnotherUser(t, client, first.OrganizationID) - org, err := client.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + org, err := client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "another", }) require.NoError(t, err) - _, err = other.OrganizationByName(context.Background(), codersdk.Me, org.Name) + _, err = other.OrganizationByName(ctx, codersdk.Me, org.Name) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -52,9 +65,13 @@ func TestOrganizationByUserAndName(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - org, err := client.Organization(context.Background(), user.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + org, err := client.Organization(ctx, user.OrganizationID) require.NoError(t, err) - _, err = client.OrganizationByName(context.Background(), codersdk.Me, org.Name) + _, err = client.OrganizationByName(ctx, codersdk.Me, org.Name) require.NoError(t, err) }) } @@ -65,9 +82,13 @@ func TestPostOrganizationsByUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - org, err := client.Organization(context.Background(), user.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + org, err := client.Organization(ctx, user.OrganizationID) require.NoError(t, err) - _, err = client.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + _, err = client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: org.Name, }) var apiErr *codersdk.Error @@ -79,7 +100,11 @@ func TestPostOrganizationsByUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, err := client.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "new", }) require.NoError(t, err) diff --git a/coderd/parameters_test.go b/coderd/parameters_test.go index b0e519b938847..450e0a26242e9 100644 --- a/coderd/parameters_test.go +++ b/coderd/parameters_test.go @@ -7,6 +7,7 @@ import ( "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" "github.com/stretchr/testify/require" @@ -20,7 +21,11 @@ func TestPostParameter(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.CreateParameter(context.Background(), codersdk.ParameterScope("something"), user.OrganizationID, codersdk.CreateParameterRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateParameter(ctx, codersdk.ParameterScope("something"), user.OrganizationID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, @@ -36,7 +41,11 @@ func TestPostParameter(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - _, err := client.CreateParameter(context.Background(), codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateParameter(ctx, codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, @@ -50,7 +59,11 @@ func TestPostParameter(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - _, err := client.CreateParameter(context.Background(), codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateParameter(ctx, codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, @@ -58,7 +71,7 @@ func TestPostParameter(t *testing.T) { }) require.NoError(t, err) - _, err = client.CreateParameter(context.Background(), codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ + _, err = client.CreateParameter(ctx, codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, @@ -77,7 +90,11 @@ func TestParameters(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - _, err := client.Parameters(context.Background(), codersdk.ParameterTemplate, template.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.Parameters(ctx, codersdk.ParameterTemplate, template.ID) require.NoError(t, err) }) t.Run("List", func(t *testing.T) { @@ -85,14 +102,18 @@ func TestParameters(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - _, err := client.CreateParameter(context.Background(), codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateParameter(ctx, codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable, }) require.NoError(t, err) - params, err := client.Parameters(context.Background(), codersdk.ParameterTemplate, template.ID) + params, err := client.Parameters(ctx, codersdk.ParameterTemplate, template.ID) require.NoError(t, err) require.Len(t, params, 1) }) @@ -105,7 +126,11 @@ func TestDeleteParameter(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - err := client.DeleteParameter(context.Background(), codersdk.ParameterTemplate, template.ID, "something") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.DeleteParameter(ctx, codersdk.ParameterTemplate, template.ID, "something") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -115,14 +140,18 @@ func TestDeleteParameter(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) template := createTemplate(t, client, user) - param, err := client.CreateParameter(context.Background(), codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + param, err := client.CreateParameter(ctx, codersdk.ParameterTemplate, template.ID, codersdk.CreateParameterRequest{ Name: "example", SourceValue: "tomato", SourceScheme: codersdk.ParameterSourceSchemeData, DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable, }) require.NoError(t, err) - err = client.DeleteParameter(context.Background(), codersdk.ParameterTemplate, template.ID, param.Name) + err = client.DeleteParameter(ctx, codersdk.ParameterTemplate, template.ID, param.Name) require.NoError(t, err) }) } diff --git a/coderd/provisionerdaemons_test.go b/coderd/provisionerdaemons_test.go index 709dc2eb0c092..572ad01a3034f 100644 --- a/coderd/provisionerdaemons_test.go +++ b/coderd/provisionerdaemons_test.go @@ -27,11 +27,15 @@ func TestProvisionerDaemons(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) data := make([]byte, provisionersdk.MaxMessageSize) rand.Read(data) - resp, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Upload(ctx, codersdk.ContentTypeTar, data) require.NoError(t, err) t.Log(resp.Hash) - version, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + version, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: resp.Hash, Provisioner: codersdk.ProvisionerTypeEcho, @@ -39,7 +43,7 @@ func TestProvisionerDaemons(t *testing.T) { require.NoError(t, err) require.Eventually(t, func() bool { var err error - version, err = client.TemplateVersion(context.Background(), version.ID) + version, err = client.TemplateVersion(ctx, version.ID) return assert.NoError(t, err) && version.Job.Error != "" }, testutil.WaitShort, testutil.IntervalFast) }) @@ -50,7 +54,11 @@ func TestProvisionerDaemonsByOrganization(t *testing.T) { t.Run("NoAuth", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.ProvisionerDaemons(context.Background()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.ProvisionerDaemons(ctx) require.Error(t, err) }) @@ -58,7 +66,11 @@ func TestProvisionerDaemonsByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, err := client.ProvisionerDaemons(context.Background()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.ProvisionerDaemons(ctx) require.NoError(t, err) }) } diff --git a/coderd/provisionerjobs_test.go b/coderd/provisionerjobs_test.go index e93d9b0dc421f..07390f5699c30 100644 --- a/coderd/provisionerjobs_test.go +++ b/coderd/provisionerjobs_test.go @@ -11,6 +11,7 @@ import ( "github.com/coder/coder/coderd/database" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestProvisionerJobLogs(t *testing.T) { @@ -40,8 +41,9 @@ func TestProvisionerJobLogs(t *testing.T) { before := time.Now().UTC() coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - ctx, cancelFunc := context.WithCancel(context.Background()) - defer cancelFunc() + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + logs, err := client.WorkspaceBuildLogsAfter(ctx, workspace.LatestBuild.ID, before) require.NoError(t, err) for { @@ -76,8 +78,10 @@ func TestProvisionerJobLogs(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) before := database.Now() - ctx, cancelFunc := context.WithCancel(context.Background()) - defer cancelFunc() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + logs, err := client.WorkspaceBuildLogsAfter(ctx, workspace.LatestBuild.ID, before) require.NoError(t, err) for { @@ -111,7 +115,11 @@ func TestProvisionerJobLogs(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - logs, err := client.WorkspaceBuildLogsBefore(context.Background(), workspace.LatestBuild.ID, time.Now()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + logs, err := client.WorkspaceBuildLogsBefore(ctx, workspace.LatestBuild.ID, time.Now()) require.NoError(t, err) require.Greater(t, len(logs), 1) }) diff --git a/coderd/roles_test.go b/coderd/roles_test.go index a30daa46ba7a7..1e1b3b177fab8 100644 --- a/coderd/roles_test.go +++ b/coderd/roles_test.go @@ -10,6 +10,7 @@ import ( "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/coderd/rbac" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) func TestAuthorization(t *testing.T) { @@ -90,7 +91,11 @@ func TestAuthorization(t *testing.T) { c := c t.Run(c.Name, func(t *testing.T) { t.Parallel() - resp, err := c.Client.CheckPermissions(context.Background(), codersdk.UserAuthorizationRequest{Checks: params}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := c.Client.CheckPermissions(ctx, codersdk.UserAuthorizationRequest{Checks: params}) require.NoError(t, err, "check perms") require.Equal(t, resp, c.Check) }) @@ -100,13 +105,15 @@ func TestAuthorization(t *testing.T) { func TestListRoles(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, nil) // Create admin, member, and org admin admin := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID) orgAdmin := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, rbac.RoleOrgAdmin(admin.OrganizationID)) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + otherOrg, err := client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "other", }) @@ -119,13 +126,13 @@ func TestListRoles(t *testing.T) { testCases := []struct { Name string Client *codersdk.Client - APICall func() ([]codersdk.Role, error) + APICall func(context.Context) ([]codersdk.Role, error) ExpectedRoles []codersdk.Role AuthorizedError string }{ { Name: "MemberListSite", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { x, err := member.ListSiteRoles(ctx) return x, err }, @@ -133,14 +140,14 @@ func TestListRoles(t *testing.T) { }, { Name: "OrgMemberListOrg", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return member.ListOrganizationRoles(ctx, admin.OrganizationID) }, ExpectedRoles: orgRoles, }, { Name: "NonOrgMemberListOrg", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return member.ListOrganizationRoles(ctx, otherOrg.ID) }, AuthorizedError: forbidden, @@ -148,21 +155,21 @@ func TestListRoles(t *testing.T) { // Org admin { Name: "OrgAdminListSite", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return orgAdmin.ListSiteRoles(ctx) }, ExpectedRoles: siteRoles, }, { Name: "OrgAdminListOrg", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return orgAdmin.ListOrganizationRoles(ctx, admin.OrganizationID) }, ExpectedRoles: orgRoles, }, { Name: "OrgAdminListOtherOrg", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return orgAdmin.ListOrganizationRoles(ctx, otherOrg.ID) }, AuthorizedError: forbidden, @@ -170,14 +177,14 @@ func TestListRoles(t *testing.T) { // Admin { Name: "AdminListSite", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return client.ListSiteRoles(ctx) }, ExpectedRoles: siteRoles, }, { Name: "AdminListOrg", - APICall: func() ([]codersdk.Role, error) { + APICall: func(ctx context.Context) ([]codersdk.Role, error) { return client.ListOrganizationRoles(ctx, admin.OrganizationID) }, ExpectedRoles: orgRoles, @@ -188,7 +195,11 @@ func TestListRoles(t *testing.T) { c := c t.Run(c.Name, func(t *testing.T) { t.Parallel() - roles, err := c.APICall() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + roles, err := c.APICall(ctx) if c.AuthorizedError != "" { var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 9f54d59003e9d..c34734dd73590 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -14,6 +14,7 @@ import ( "github.com/coder/coder/coderd/rbac" "github.com/coder/coder/coderd/util/ptr" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) func TestTemplate(t *testing.T) { @@ -25,13 +26,16 @@ func TestTemplate(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - _, err := client.Template(context.Background(), template.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.Template(ctx, template.ID) require.NoError(t, err) }) t.Run("WorkspaceCount", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, user.OrganizationID, rbac.RoleAdmin()) @@ -49,13 +53,17 @@ func TestTemplate(t *testing.T) { deletedWorkspace := coderdtest.CreateWorkspace(t, memberWithDeleted, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, deletedWorkspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + build, err := client.CreateWorkspaceBuild(ctx, deletedWorkspace.ID, codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionDelete, }) require.NoError(t, err) coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID) - template, err = client.Template(context.Background(), template.ID) + template, err = client.Template(ctx, template.ID) require.NoError(t, err) require.Equal(t, 2, int(template.WorkspaceOwnerCount), "workspace count") }) @@ -71,7 +79,10 @@ func TestPostTemplateByOrganization(t *testing.T) { expected := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - got, err := client.Template(context.Background(), expected.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + got, err := client.Template(ctx, expected.ID) require.NoError(t, err) assert.Equal(t, expected.Name, got.Name) @@ -84,7 +95,11 @@ func TestPostTemplateByOrganization(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - _, err := client.CreateTemplate(context.Background(), user.OrganizationID, codersdk.CreateTemplateRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{ Name: template.Name, VersionID: version.ID, }) @@ -96,7 +111,11 @@ func TestPostTemplateByOrganization(t *testing.T) { t.Run("Unauthorized", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.CreateTemplate(context.Background(), uuid.New(), codersdk.CreateTemplateRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateTemplate(ctx, uuid.New(), codersdk.CreateTemplateRequest{ Name: "test", VersionID: uuid.New(), }) @@ -111,7 +130,11 @@ func TestPostTemplateByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.CreateTemplate(context.Background(), user.OrganizationID, codersdk.CreateTemplateRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{ Name: "test", VersionID: uuid.New(), }) @@ -127,7 +150,11 @@ func TestTemplatesByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - templates, err := client.TemplatesByOrganization(context.Background(), user.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + templates, err := client.TemplatesByOrganization(ctx, user.OrganizationID) require.NoError(t, err) require.NotNil(t, templates) require.Len(t, templates, 0) @@ -139,7 +166,11 @@ func TestTemplatesByOrganization(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - templates, err := client.TemplatesByOrganization(context.Background(), user.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + templates, err := client.TemplatesByOrganization(ctx, user.OrganizationID) require.NoError(t, err) require.Len(t, templates, 1) }) @@ -150,7 +181,11 @@ func TestTemplatesByOrganization(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - templates, err := client.TemplatesByOrganization(context.Background(), user.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + templates, err := client.TemplatesByOrganization(ctx, user.OrganizationID) require.NoError(t, err) require.Len(t, templates, 2) }) @@ -162,7 +197,11 @@ func TestTemplateByOrganizationAndName(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.TemplateByName(context.Background(), user.OrganizationID, "something") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateByName(ctx, user.OrganizationID, "something") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -174,7 +213,11 @@ func TestTemplateByOrganizationAndName(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - _, err := client.TemplateByName(context.Background(), user.OrganizationID, template.Name) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateByName(ctx, user.OrganizationID, template.Name) require.NoError(t, err) }) } @@ -184,7 +227,7 @@ func TestPatchTemplateMeta(t *testing.T) { t.Run("Modified", func(t *testing.T) { t.Parallel() - ctx := context.Background() + client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -201,6 +244,10 @@ func TestPatchTemplateMeta(t *testing.T) { // It is unfortunate we need to sleep, but the test can fail if the // updatedAt is too close together. time.Sleep(time.Millisecond * 5) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + updated, err := client.UpdateTemplateMeta(ctx, template.ID, req) require.NoError(t, err) assert.Greater(t, updated.UpdatedAt, template.UpdatedAt) @@ -219,7 +266,7 @@ func TestPatchTemplateMeta(t *testing.T) { t.Run("NotModified", func(t *testing.T) { t.Parallel() - ctx := context.Background() + client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -228,6 +275,10 @@ func TestPatchTemplateMeta(t *testing.T) { ctr.MaxTTLMillis = ptr.Ref(24 * time.Hour.Milliseconds()) ctr.MinAutostartIntervalMillis = ptr.Ref(time.Hour.Milliseconds()) }) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.UpdateTemplateMeta{ Description: template.Description, MaxTTLMillis: template.MaxTTLMillis, @@ -245,7 +296,7 @@ func TestPatchTemplateMeta(t *testing.T) { t.Run("Invalid", func(t *testing.T) { t.Parallel() - ctx := context.Background() + client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -254,6 +305,10 @@ func TestPatchTemplateMeta(t *testing.T) { ctr.MaxTTLMillis = ptr.Ref(24 * time.Hour.Milliseconds()) ctr.MinAutostartIntervalMillis = ptr.Ref(time.Hour.Milliseconds()) }) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.UpdateTemplateMeta{ MaxTTLMillis: -int64(time.Hour), MinAutostartIntervalMillis: -int64(time.Hour), @@ -284,7 +339,11 @@ func TestDeleteTemplate(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - err := client.DeleteTemplate(context.Background(), template.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.DeleteTemplate(ctx, template.ID) require.NoError(t, err) }) @@ -296,7 +355,11 @@ func TestDeleteTemplate(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - err := client.DeleteTemplate(context.Background(), template.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.DeleteTemplate(ctx, template.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index 9c6c76a927fdd..fa29c976de3ee 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -9,6 +9,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/codersdk" @@ -24,7 +25,11 @@ func TestTemplateVersion(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) - _, err := client.TemplateVersion(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersion(ctx, version.ID) require.NoError(t, err) }) } @@ -35,8 +40,12 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + templateID := uuid.New() - _, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + _, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ TemplateID: templateID, StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: "hash", @@ -51,7 +60,11 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: "hash", Provisioner: codersdk.ProvisionerTypeEcho, @@ -71,9 +84,13 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { ProvisionDryRun: echo.ProvisionComplete, }) require.NoError(t, err) - file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + file, err := client.Upload(ctx, codersdk.ContentTypeTar, data) require.NoError(t, err) - _, err = client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + _, err = client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: file.Hash, Provisioner: codersdk.ProvisionerTypeEcho, @@ -96,7 +113,11 @@ func TestPatchCancelTemplateVersion(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - err := client.CancelTemplateVersion(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.CancelTemplateVersion(ctx, version.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -113,24 +134,28 @@ func TestPatchCancelTemplateVersion(t *testing.T) { }, }}, }) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + require.Eventually(t, func() bool { var err error - version, err = client.TemplateVersion(context.Background(), version.ID) + version, err = client.TemplateVersion(ctx, version.ID) if !assert.NoError(t, err) { return false } t.Logf("Status: %s", version.Job.Status) return version.Job.Status == codersdk.ProvisionerJobRunning }, testutil.WaitShort, testutil.IntervalFast) - err := client.CancelTemplateVersion(context.Background(), version.ID) + err := client.CancelTemplateVersion(ctx, version.ID) require.NoError(t, err) - err = client.CancelTemplateVersion(context.Background(), version.ID) + err = client.CancelTemplateVersion(ctx, version.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) require.Eventually(t, func() bool { var err error - version, err = client.TemplateVersion(context.Background(), version.ID) + version, err = client.TemplateVersion(ctx, version.ID) return assert.NoError(t, err) && version.Job.Status == codersdk.ProvisionerJobFailed }, testutil.WaitShort, testutil.IntervalFast) }) @@ -148,20 +173,24 @@ func TestPatchCancelTemplateVersion(t *testing.T) { }, }}, }) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + require.Eventually(t, func() bool { var err error - version, err = client.TemplateVersion(context.Background(), version.ID) + version, err = client.TemplateVersion(ctx, version.ID) if !assert.NoError(t, err) { return false } t.Logf("Status: %s", version.Job.Status) return version.Job.Status == codersdk.ProvisionerJobRunning }, testutil.WaitShort, testutil.IntervalFast) - err := client.CancelTemplateVersion(context.Background(), version.ID) + err := client.CancelTemplateVersion(ctx, version.ID) require.NoError(t, err) require.Eventually(t, func() bool { var err error - version, err = client.TemplateVersion(context.Background(), version.ID) + version, err = client.TemplateVersion(ctx, version.ID) return assert.NoError(t, err) && // The job will never actually cancel successfully because it will never send a // provision complete response. @@ -178,7 +207,11 @@ func TestTemplateVersionSchema(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) - _, err := client.TemplateVersionSchema(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersionSchema(ctx, version.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -203,7 +236,11 @@ func TestTemplateVersionSchema(t *testing.T) { Provision: echo.ProvisionComplete, }) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - schemas, err := client.TemplateVersionSchema(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + schemas, err := client.TemplateVersionSchema(ctx, version.ID) require.NoError(t, err) require.NotNil(t, schemas) require.Len(t, schemas, 1) @@ -231,7 +268,11 @@ func TestTemplateVersionSchema(t *testing.T) { Provision: echo.ProvisionComplete, }) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - schemas, err := client.TemplateVersionSchema(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + schemas, err := client.TemplateVersionSchema(ctx, version.ID) require.NoError(t, err) require.NotNil(t, schemas) require.Len(t, schemas, 1) @@ -246,7 +287,11 @@ func TestTemplateVersionParameters(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) - _, err := client.TemplateVersionParameters(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersionParameters(ctx, version.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -289,7 +334,11 @@ func TestTemplateVersionParameters(t *testing.T) { Provision: echo.ProvisionComplete, }) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - params, err := client.TemplateVersionParameters(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + params, err := client.TemplateVersionParameters(ctx, version.ID) require.NoError(t, err) require.NotNil(t, params) require.Len(t, params, 2) @@ -305,7 +354,11 @@ func TestTemplateVersionResources(t *testing.T) { client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) - _, err := client.TemplateVersionResources(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersionResources(ctx, version.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -335,7 +388,11 @@ func TestTemplateVersionResources(t *testing.T) { }}, }) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - resources, err := client.TemplateVersionResources(context.Background(), version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.TemplateVersionResources(ctx, version.ID) require.NoError(t, err) require.NotNil(t, resources) require.Len(t, resources, 4) @@ -380,8 +437,10 @@ func TestTemplateVersionLogs(t *testing.T) { }, }}, }) - ctx, cancelFunc := context.WithCancel(context.Background()) - defer cancelFunc() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + logs, err := client.TemplateVersionLogsAfter(ctx, version.ID, before) require.NoError(t, err) for { @@ -400,7 +459,11 @@ func TestTemplateVersionsByTemplate(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - versions, err := client.TemplateVersionsByTemplate(context.Background(), codersdk.TemplateVersionsByTemplateRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + versions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ TemplateID: template.ID, }) require.NoError(t, err) @@ -416,7 +479,11 @@ func TestTemplateVersionByName(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - _, err := client.TemplateVersionByName(context.Background(), template.ID, "nothing") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersionByName(ctx, template.ID, "nothing") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -428,7 +495,11 @@ func TestTemplateVersionByName(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - _, err := client.TemplateVersionByName(context.Background(), template.ID, version.Name) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.TemplateVersionByName(ctx, template.ID, version.Name) require.NoError(t, err) }) } @@ -441,7 +512,11 @@ func TestPatchActiveTemplateVersion(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - err := client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{ ID: uuid.New(), }) var apiErr *codersdk.Error @@ -456,7 +531,11 @@ func TestPatchActiveTemplateVersion(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) - err := client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{ ID: version.ID, }) var apiErr *codersdk.Error @@ -470,7 +549,11 @@ func TestPatchActiveTemplateVersion(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - err := client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{ ID: version.ID, }) require.NoError(t, err) @@ -482,8 +565,6 @@ func TestTemplateVersionDryRun(t *testing.T) { t.Run("OK", func(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() resource := &proto.Resource{ Name: "cool-resource", @@ -511,6 +592,9 @@ func TestTemplateVersionDryRun(t *testing.T) { }) _ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Create template version dry-run after := time.Now() job, err := client.CreateTemplateVersionDryRun(ctx, version.ID, codersdk.CreateTemplateVersionDryRunRequest{ @@ -567,7 +651,10 @@ func TestTemplateVersionDryRun(t *testing.T) { }}, }) - _, err := client.CreateTemplateVersionDryRun(context.Background(), version.ID, codersdk.CreateTemplateVersionDryRunRequest{ + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateTemplateVersionDryRun(ctx, version.ID, codersdk.CreateTemplateVersionDryRunRequest{ ParameterValues: []codersdk.CreateParameterRequest{}, }) var apiErr *codersdk.Error @@ -605,14 +692,18 @@ func TestTemplateVersionDryRun(t *testing.T) { require.Equal(t, codersdk.ProvisionerJobSucceeded, version.Job.Status) closer.Close() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Create the dry-run - job, err := client.CreateTemplateVersionDryRun(context.Background(), version.ID, codersdk.CreateTemplateVersionDryRunRequest{ + job, err := client.CreateTemplateVersionDryRun(ctx, version.ID, codersdk.CreateTemplateVersionDryRunRequest{ ParameterValues: []codersdk.CreateParameterRequest{}, }) require.NoError(t, err) require.Eventually(t, func() bool { - job, err := client.TemplateVersionDryRun(context.Background(), version.ID, job.ID) + job, err := client.TemplateVersionDryRun(ctx, version.ID, job.ID) if !assert.NoError(t, err) { return false } @@ -621,11 +712,11 @@ func TestTemplateVersionDryRun(t *testing.T) { return job.Status == codersdk.ProvisionerJobPending }, testutil.WaitShort, testutil.IntervalFast) - err = client.CancelTemplateVersionDryRun(context.Background(), version.ID, job.ID) + err = client.CancelTemplateVersionDryRun(ctx, version.ID, job.ID) require.NoError(t, err) require.Eventually(t, func() bool { - job, err := client.TemplateVersionDryRun(context.Background(), version.ID, job.ID) + job, err := client.TemplateVersionDryRun(ctx, version.ID, job.ID) if !assert.NoError(t, err) { return false } @@ -642,14 +733,17 @@ func TestTemplateVersionDryRun(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Create the dry-run - job, err := client.CreateTemplateVersionDryRun(context.Background(), version.ID, codersdk.CreateTemplateVersionDryRunRequest{ + job, err := client.CreateTemplateVersionDryRun(ctx, version.ID, codersdk.CreateTemplateVersionDryRunRequest{ ParameterValues: []codersdk.CreateParameterRequest{}, }) require.NoError(t, err) require.Eventually(t, func() bool { - job, err := client.TemplateVersionDryRun(context.Background(), version.ID, job.ID) + job, err := client.TemplateVersionDryRun(ctx, version.ID, job.ID) if !assert.NoError(t, err) { return false } @@ -658,7 +752,7 @@ func TestTemplateVersionDryRun(t *testing.T) { return job.Status == codersdk.ProvisionerJobSucceeded }, testutil.WaitShort, testutil.IntervalFast) - err = client.CancelTemplateVersionDryRun(context.Background(), version.ID, job.ID) + err = client.CancelTemplateVersionDryRun(ctx, version.ID, job.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -691,16 +785,19 @@ func TestTemplateVersionDryRun(t *testing.T) { closer.Close() + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Create the dry-run - job, err := client.CreateTemplateVersionDryRun(context.Background(), version.ID, codersdk.CreateTemplateVersionDryRunRequest{ + job, err := client.CreateTemplateVersionDryRun(ctx, version.ID, codersdk.CreateTemplateVersionDryRunRequest{ ParameterValues: []codersdk.CreateParameterRequest{}, }) require.NoError(t, err) - err = client.CancelTemplateVersionDryRun(context.Background(), version.ID, job.ID) + err = client.CancelTemplateVersionDryRun(ctx, version.ID, job.ID) require.NoError(t, err) - err = client.CancelTemplateVersionDryRun(context.Background(), version.ID, job.ID) + err = client.CancelTemplateVersionDryRun(ctx, version.ID, job.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -711,7 +808,6 @@ func TestTemplateVersionDryRun(t *testing.T) { // TestPaginatedTemplateVersions creates a list of template versions and paginate. func TestPaginatedTemplateVersions(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{APIRateLimit: -1, IncludeProvisionerD: true}) // Prepare database. @@ -720,22 +816,55 @@ func TestPaginatedTemplateVersions(t *testing.T) { _ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + // This test takes longer than a long time. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong*2) + defer cancel() + // Populate database with template versions. total := 9 + eg, egCtx := errgroup.WithContext(ctx) + templateVersionIDs := make([]uuid.UUID, total) for i := 0; i < total; i++ { - data, err := echo.Tar(nil) - require.NoError(t, err) - file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data) - require.NoError(t, err) - templateVersion, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ - TemplateID: template.ID, - StorageSource: file.Hash, - StorageMethod: codersdk.ProvisionerStorageMethodFile, - Provisioner: codersdk.ProvisionerTypeEcho, - }) - require.NoError(t, err) + i := i + eg.Go(func() error { + data, err := echo.Tar(nil) + if err != nil { + return err + } + file, err := client.Upload(egCtx, codersdk.ContentTypeTar, data) + if err != nil { + return err + } + templateVersion, err := client.CreateTemplateVersion(egCtx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + TemplateID: template.ID, + StorageSource: file.Hash, + StorageMethod: codersdk.ProvisionerStorageMethodFile, + Provisioner: codersdk.ProvisionerTypeEcho, + }) + if err != nil { + return err + } + + templateVersionIDs[i] = templateVersion.ID - _ = coderdtest.AwaitTemplateVersionJob(t, client, templateVersion.ID) + return nil + }) + } + err := eg.Wait() + require.NoError(t, err, "create templates failed") + + for i := 0; i < len(templateVersionIDs); i++ { + // We don't use coderdtest.AwaitTemplateVersionJob here because + // we can't control the timeouts, the concurrent creations take + // a while. + templateVersion, err := client.TemplateVersion(ctx, templateVersionIDs[i]) + if err == nil && templateVersion.Job.CompletedAt != nil { + continue + } + require.NotErrorIs(t, err, context.DeadlineExceeded, "template version %d not created in time", i) + // Retry. + time.Sleep(testutil.IntervalMedium) + i-- } templateVersions, err := client.TemplateVersionsByTemplate(ctx, @@ -747,7 +876,6 @@ func TestPaginatedTemplateVersions(t *testing.T) { require.Len(t, templateVersions, 10, "wrong number of template versions created") type args struct { - ctx context.Context pagination codersdk.Pagination } tests := []struct { @@ -758,37 +886,37 @@ func TestPaginatedTemplateVersions(t *testing.T) { }{ { name: "Single result", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 1}}, + args: args{pagination: codersdk.Pagination{Limit: 1}}, want: templateVersions[:1], }, { name: "Single result, second page", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 1, Offset: 1}}, + args: args{pagination: codersdk.Pagination{Limit: 1, Offset: 1}}, want: templateVersions[1:2], }, { name: "Last two results", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 2, Offset: 8}}, + args: args{pagination: codersdk.Pagination{Limit: 2, Offset: 8}}, want: templateVersions[8:10], }, { name: "AfterID returns next two results", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 2, AfterID: templateVersions[1].ID}}, + args: args{pagination: codersdk.Pagination{Limit: 2, AfterID: templateVersions[1].ID}}, want: templateVersions[2:4], }, { name: "No result after last AfterID", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 2, AfterID: templateVersions[9].ID}}, + args: args{pagination: codersdk.Pagination{Limit: 2, AfterID: templateVersions[9].ID}}, want: []codersdk.TemplateVersion{}, }, { name: "No result after last Offset", - args: args{ctx: ctx, pagination: codersdk.Pagination{Limit: 2, Offset: 10}}, + args: args{pagination: codersdk.Pagination{Limit: 2, Offset: 10}}, want: []codersdk.TemplateVersion{}, }, { name: "After_id does not exist", - args: args{ctx: ctx, pagination: codersdk.Pagination{AfterID: uuid.New()}}, + args: args{pagination: codersdk.Pagination{AfterID: uuid.New()}}, expectedError: "does not exist", }, } @@ -796,7 +924,11 @@ func TestPaginatedTemplateVersions(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - got, err := client.TemplateVersionsByTemplate(tt.args.ctx, codersdk.TemplateVersionsByTemplateRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + got, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ TemplateID: template.ID, Pagination: tt.args.pagination, }) diff --git a/coderd/userauth_test.go b/coderd/userauth_test.go index a07ed2bd18038..6d4c6af34bd30 100644 --- a/coderd/userauth_test.go +++ b/coderd/userauth_test.go @@ -22,6 +22,7 @@ import ( "github.com/coder/coder/coderd" "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) type oauth2Config struct { @@ -50,7 +51,11 @@ func TestUserAuthMethods(t *testing.T) { t.Run("Password", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - methods, err := client.AuthMethods(context.Background()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + methods, err := client.AuthMethods(ctx) require.NoError(t, err) require.True(t, methods.Password) require.False(t, methods.Github) @@ -60,7 +65,11 @@ func TestUserAuthMethods(t *testing.T) { client := coderdtest.New(t, &coderdtest.Options{ GithubOAuth2Config: &coderd.GithubOAuth2Config{}, }) - methods, err := client.AuthMethods(context.Background()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + methods, err := client.AuthMethods(ctx) require.NoError(t, err) require.True(t, methods.Password) require.True(t, methods.Github) @@ -344,9 +353,12 @@ func TestUserOIDC(t *testing.T) { resp := oidcCallback(t, client) assert.Equal(t, tc.StatusCode, resp.StatusCode) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + if tc.Username != "" { client.SessionToken = resp.Cookies()[0].Value - user, err := client.User(context.Background(), "me") + user, err := client.User(ctx, "me") require.NoError(t, err) require.Equal(t, tc.Username, user.Username) } diff --git a/coderd/users_test.go b/coderd/users_test.go index 72c3ba2f99420..3e5597b98e91f 100644 --- a/coderd/users_test.go +++ b/coderd/users_test.go @@ -11,10 +11,12 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/coderd/rbac" "github.com/coder/coder/codersdk" + "github.com/coder/coder/testutil" ) func TestFirstUser(t *testing.T) { @@ -22,7 +24,11 @@ func TestFirstUser(t *testing.T) { t.Run("BadRequest", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.CreateFirstUser(context.Background(), codersdk.CreateFirstUserRequest{}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateFirstUser(ctx, codersdk.CreateFirstUserRequest{}) require.Error(t, err) }) @@ -30,7 +36,11 @@ func TestFirstUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - _, err := client.CreateFirstUser(context.Background(), codersdk.CreateFirstUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateFirstUser(ctx, codersdk.CreateFirstUserRequest{ Email: "some@email.com", Username: "exampleuser", Password: "password", @@ -53,7 +63,11 @@ func TestPostLogin(t *testing.T) { t.Run("InvalidUser", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: "my@email.org", Password: "password", }) @@ -65,15 +79,19 @@ func TestPostLogin(t *testing.T) { t.Run("BadPassword", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.CreateFirstUserRequest{ Email: "testuser@coder.com", Username: "testuser", Password: "testpass", OrganizationName: "testorg", } - _, err := client.CreateFirstUser(context.Background(), req) + _, err := client.CreateFirstUser(ctx, req) require.NoError(t, err) - _, err = client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + _, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: req.Email, Password: "badpass", }) @@ -88,21 +106,25 @@ func TestPostLogin(t *testing.T) { first := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, first.OrganizationID) - memberUser, err := member.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + memberUser, err := member.User(ctx, codersdk.Me) require.NoError(t, err, "fetch member user") - _, err = client.UpdateUserStatus(context.Background(), memberUser.Username, codersdk.UserStatusSuspended) + _, err = client.UpdateUserStatus(ctx, memberUser.Username, codersdk.UserStatusSuspended) require.NoError(t, err, "suspend member") // Test an existing session - _, err = member.User(context.Background(), codersdk.Me) + _, err = member.User(ctx, codersdk.Me) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusUnauthorized, apiErr.StatusCode()) require.Contains(t, apiErr.Message, "Contact an admin") // Test a new session - _, err = client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + _, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: memberUser.Email, Password: "testpass", }) @@ -114,15 +136,19 @@ func TestPostLogin(t *testing.T) { t.Run("Success", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.CreateFirstUserRequest{ Email: "testuser@coder.com", Username: "testuser", Password: "testpass", OrganizationName: "testorg", } - _, err := client.CreateFirstUser(context.Background(), req) + _, err := client.CreateFirstUser(ctx, req) require.NoError(t, err) - _, err = client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + _, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: req.Email, Password: req.Password, }) @@ -131,12 +157,13 @@ func TestPostLogin(t *testing.T) { t.Run("Lifetime&Expire", func(t *testing.T) { t.Parallel() - var ( - ctx = context.Background() - ) + client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + split := strings.Split(client.SessionToken, "-") key, err := client.GetAPIKey(ctx, admin.UserID.String(), split[0]) require.NoError(t, err, "fetch login key") @@ -162,11 +189,13 @@ func TestPostLogout(t *testing.T) { t.Run("Logout", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) - keyID := strings.Split(client.SessionToken, "-")[0] + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + keyID := strings.Split(client.SessionToken, "-")[0] apiKey, err := client.GetAPIKey(ctx, admin.UserID.String(), keyID) require.NoError(t, err) require.Equal(t, keyID, apiKey.ID, "API key should exist in the database") @@ -186,7 +215,7 @@ func TestPostLogout(t *testing.T) { require.Equal(t, -1, cookies[0].MaxAge, "Cookie should be set to delete") _, err = client.GetAPIKey(ctx, admin.UserID.String(), keyID) - var sdkErr = &codersdk.Error{} + sdkErr := &codersdk.Error{} require.ErrorAs(t, err, &sdkErr) require.Equal(t, http.StatusUnauthorized, sdkErr.StatusCode(), "Expecting 401") }) @@ -197,7 +226,11 @@ func TestPostUsers(t *testing.T) { t.Run("NoAuth", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateUser(ctx, codersdk.CreateUserRequest{}) require.Error(t, err) }) @@ -205,9 +238,13 @@ func TestPostUsers(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - me, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + me, err := client.User(ctx, codersdk.Me) require.NoError(t, err) - _, err = client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + _, err = client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: me.Email, Username: me.Username, Password: "password", @@ -222,7 +259,11 @@ func TestPostUsers(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - _, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ OrganizationID: uuid.New(), Email: "another@user.org", Username: "someone-else", @@ -239,12 +280,16 @@ func TestPostUsers(t *testing.T) { first := coderdtest.CreateFirstUser(t, client) notInOrg := coderdtest.CreateAnotherUser(t, client, first.OrganizationID) other := coderdtest.CreateAnotherUser(t, client, first.OrganizationID, rbac.RoleAdmin(), rbac.RoleMember()) - org, err := other.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + org, err := other.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "another", }) require.NoError(t, err) - _, err = notInOrg.CreateUser(context.Background(), codersdk.CreateUserRequest{ + _, err = notInOrg.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "some@domain.com", Username: "anotheruser", Password: "testing", @@ -259,7 +304,11 @@ func TestPostUsers(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ OrganizationID: user.OrganizationID, Email: "another@user.org", Username: "someone-else", @@ -275,7 +324,11 @@ func TestUpdateUserProfile(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - _, err := client.UpdateUserProfile(context.Background(), uuid.New().String(), codersdk.UpdateUserProfileRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.UpdateUserProfile(ctx, uuid.New().String(), codersdk.UpdateUserProfileRequest{ Username: "newusername", }) var apiErr *codersdk.Error @@ -289,14 +342,18 @@ func TestUpdateUserProfile(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - existentUser, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + existentUser, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "bruno@coder.com", Username: "bruno", Password: "password", OrganizationID: user.OrganizationID, }) require.NoError(t, err) - _, err = client.UpdateUserProfile(context.Background(), codersdk.Me, codersdk.UpdateUserProfileRequest{ + _, err = client.UpdateUserProfile(ctx, codersdk.Me, codersdk.UpdateUserProfileRequest{ Username: existentUser.Username, }) var apiErr *codersdk.Error @@ -308,8 +365,12 @@ func TestUpdateUserProfile(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - _, _ = client.User(context.Background(), codersdk.Me) - userProfile, err := client.UpdateUserProfile(context.Background(), codersdk.Me, codersdk.UpdateUserProfileRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, _ = client.User(ctx, codersdk.Me) + userProfile, err := client.UpdateUserProfile(ctx, codersdk.Me, codersdk.UpdateUserProfileRequest{ Username: "newusername", }) require.NoError(t, err) @@ -325,7 +386,11 @@ func TestUpdateUserPassword(t *testing.T) { client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID) - err := member.UpdateUserPassword(context.Background(), admin.UserID.String(), codersdk.UpdateUserPasswordRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := member.UpdateUserPassword(ctx, admin.UserID.String(), codersdk.UpdateUserPasswordRequest{ Password: "newpassword", }) require.Error(t, err, "member should not be able to update admin password") @@ -335,19 +400,23 @@ func TestUpdateUserPassword(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) - member, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + member, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "coder@coder.com", Username: "coder", Password: "password", OrganizationID: admin.OrganizationID, }) require.NoError(t, err, "create member") - err = client.UpdateUserPassword(context.Background(), member.ID.String(), codersdk.UpdateUserPasswordRequest{ + err = client.UpdateUserPassword(ctx, member.ID.String(), codersdk.UpdateUserPasswordRequest{ Password: "newpassword", }) require.NoError(t, err, "admin should be able to update member password") // Check if the member can login using the new password - _, err = client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + _, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: "coder@coder.com", Password: "newpassword", }) @@ -358,7 +427,11 @@ func TestUpdateUserPassword(t *testing.T) { client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID) - err := member.UpdateUserPassword(context.Background(), "me", codersdk.UpdateUserPasswordRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := member.UpdateUserPassword(ctx, "me", codersdk.UpdateUserPasswordRequest{ OldPassword: "testpass", Password: "newpassword", }) @@ -369,7 +442,11 @@ func TestUpdateUserPassword(t *testing.T) { client := coderdtest.New(t, nil) admin := coderdtest.CreateFirstUser(t, client) member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID) - err := member.UpdateUserPassword(context.Background(), "me", codersdk.UpdateUserPasswordRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := member.UpdateUserPassword(ctx, "me", codersdk.UpdateUserPasswordRequest{ Password: "newpassword", }) require.Error(t, err, "member should not be able to update own password without providing old password") @@ -378,7 +455,11 @@ func TestUpdateUserPassword(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - err := client.UpdateUserPassword(context.Background(), "me", codersdk.UpdateUserPasswordRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + err := client.UpdateUserPassword(ctx, "me", codersdk.UpdateUserPasswordRequest{ Password: "newpassword", }) require.NoError(t, err, "admin should be able to update own password without providing old password") @@ -397,13 +478,15 @@ func TestGrantRoles(t *testing.T) { t.Run("UpdateIncorrectRoles", func(t *testing.T) { t.Parallel() - ctx := context.Background() var err error admin := coderdtest.New(t, nil) first := coderdtest.CreateFirstUser(t, admin) member := coderdtest.CreateAnotherUser(t, admin, first.OrganizationID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + _, err = admin.UpdateUserRoles(ctx, codersdk.Me, codersdk.UpdateRoles{ Roles: []string{rbac.RoleOrgAdmin(first.OrganizationID)}, }) @@ -461,10 +544,12 @@ func TestGrantRoles(t *testing.T) { t.Run("FirstUserRoles", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, nil) first := coderdtest.CreateFirstUser(t, client) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + roles, err := client.GetUserRoles(ctx, codersdk.Me) require.NoError(t, err) require.ElementsMatch(t, roles.Roles, []string{ @@ -478,11 +563,14 @@ func TestGrantRoles(t *testing.T) { t.Run("GrantAdmin", func(t *testing.T) { t.Parallel() - ctx := context.Background() admin := coderdtest.New(t, nil) first := coderdtest.CreateFirstUser(t, admin) member := coderdtest.CreateAnotherUser(t, admin, first.OrganizationID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + roles, err := member.GetUserRoles(ctx, codersdk.Me) require.NoError(t, err) require.ElementsMatch(t, roles.Roles, []string{}, "should be a member") @@ -532,14 +620,18 @@ func TestPutUserSuspend(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) me := coderdtest.CreateFirstUser(t, client) - client.User(context.Background(), codersdk.Me) - user, _ := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + client.User(ctx, codersdk.Me) + user, _ := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "bruno@coder.com", Username: "bruno", Password: "password", OrganizationID: me.OrganizationID, }) - user, err := client.UpdateUserStatus(context.Background(), user.Username, codersdk.UserStatusSuspended) + user, err := client.UpdateUserStatus(ctx, user.Username, codersdk.UserStatusSuspended) require.NoError(t, err) require.Equal(t, user.Status, codersdk.UserStatusSuspended) }) @@ -548,8 +640,12 @@ func TestPutUserSuspend(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) coderdtest.CreateFirstUser(t, client) - client.User(context.Background(), codersdk.Me) - _, err := client.UpdateUserStatus(context.Background(), codersdk.Me, codersdk.UserStatusSuspended) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + client.User(ctx, codersdk.Me) + _, err := client.UpdateUserStatus(ctx, codersdk.Me, codersdk.UserStatusSuspended) require.ErrorContains(t, err, "suspend yourself", "cannot suspend yourself") }) @@ -564,7 +660,10 @@ func TestGetUser(t *testing.T) { client := coderdtest.New(t, nil) firstUser := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err) require.Equal(t, firstUser.UserID, user.ID) require.Equal(t, firstUser.OrganizationID, user.OrganizationIDs[0]) @@ -576,7 +675,10 @@ func TestGetUser(t *testing.T) { client := coderdtest.New(t, nil) firstUser := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), firstUser.UserID.String()) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, firstUser.UserID.String()) require.NoError(t, err) require.Equal(t, firstUser.UserID, user.ID) require.Equal(t, firstUser.OrganizationID, user.OrganizationIDs[0]) @@ -587,10 +689,14 @@ func TestGetUser(t *testing.T) { client := coderdtest.New(t, nil) firstUser := coderdtest.CreateFirstUser(t, client) - exp, err := client.User(context.Background(), firstUser.UserID.String()) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + exp, err := client.User(ctx, firstUser.UserID.String()) require.NoError(t, err) - user, err := client.User(context.Background(), exp.Username) + user, err := client.User(ctx, exp.Username) require.NoError(t, err) require.Equal(t, exp, user) }) @@ -602,7 +708,11 @@ func TestUsersFilter(t *testing.T) { client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - firstUser, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") users := make([]codersdk.User, 0) @@ -616,16 +726,16 @@ func TestUsersFilter(t *testing.T) { roles = append(roles, "auditor") } userClient := coderdtest.CreateAnotherUser(t, client, first.OrganizationID, roles...) - user, err := userClient.User(context.Background(), codersdk.Me) + user, err := userClient.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") if i%4 == 0 { - user, err = client.UpdateUserStatus(context.Background(), user.ID.String(), codersdk.UserStatusSuspended) + user, err = client.UpdateUserStatus(ctx, user.ID.String(), codersdk.UserStatusSuspended) require.NoError(t, err, "suspend user") } if i%5 == 0 { - user, err = client.UpdateUserProfile(context.Background(), user.ID.String(), codersdk.UpdateUserProfileRequest{ + user, err = client.UpdateUserProfile(ctx, user.ID.String(), codersdk.UpdateUserProfileRequest{ Username: strings.ToUpper(user.Username), }) require.NoError(t, err, "update username to uppercase") @@ -762,7 +872,11 @@ func TestUsersFilter(t *testing.T) { c := c t.Run(c.Name, func(t *testing.T) { t.Parallel() - matched, err := client.Users(context.Background(), c.Filter) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + matched, err := client.Users(ctx, c.Filter) require.NoError(t, err, "fetch workspaces") exp := make([]codersdk.User, 0) @@ -783,14 +897,18 @@ func TestGetUsers(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "alice@email.com", Username: "alice", Password: "password", OrganizationID: user.OrganizationID, }) // No params is all users - users, err := client.Users(context.Background(), codersdk.UsersRequest{}) + users, err := client.Users(ctx, codersdk.UsersRequest{}) require.NoError(t, err) require.Len(t, users, 2) require.Len(t, users[0].OrganizationIDs, 1) @@ -801,12 +919,15 @@ func TestGetUsers(t *testing.T) { client := coderdtest.New(t, nil) first := coderdtest.CreateFirstUser(t, client) - firstUser, err := client.User(context.Background(), first.UserID.String()) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + firstUser, err := client.User(ctx, first.UserID.String()) require.NoError(t, err, "") active = append(active, firstUser) // Alice will be suspended - alice, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + alice, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "alice@email.com", Username: "alice", Password: "password", @@ -814,7 +935,7 @@ func TestGetUsers(t *testing.T) { }) require.NoError(t, err) - bruno, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + bruno, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "bruno@email.com", Username: "bruno", Password: "password", @@ -823,10 +944,10 @@ func TestGetUsers(t *testing.T) { require.NoError(t, err) active = append(active, bruno) - _, err = client.UpdateUserStatus(context.Background(), alice.Username, codersdk.UserStatusSuspended) + _, err = client.UpdateUserStatus(ctx, alice.Username, codersdk.UserStatusSuspended) require.NoError(t, err) - users, err := client.Users(context.Background(), codersdk.UsersRequest{ + users, err := client.Users(ctx, codersdk.UsersRequest{ Status: codersdk.UserStatusActive, }) require.NoError(t, err) @@ -841,8 +962,11 @@ func TestPostAPIKey(t *testing.T) { client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + client.SessionToken = "" - _, err := client.CreateAPIKey(context.Background(), codersdk.Me) + _, err := client.CreateAPIKey(ctx, codersdk.Me) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusUnauthorized, apiErr.StatusCode()) @@ -852,7 +976,11 @@ func TestPostAPIKey(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - apiKey, err := client.CreateAPIKey(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + apiKey, err := client.CreateAPIKey(ctx, codersdk.Me) require.NotNil(t, apiKey) require.GreaterOrEqual(t, len(apiKey.Key), 2) require.NoError(t, err) @@ -865,7 +993,11 @@ func TestWorkspacesByUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) - workspaces, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ Owner: codersdk.Me, }) require.NoError(t, err) @@ -875,14 +1007,18 @@ func TestWorkspacesByUser(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user := coderdtest.CreateFirstUser(t, client) - newUser, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + newUser, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: "test@coder.com", Username: "someone", Password: "password", OrganizationID: user.OrganizationID, }) require.NoError(t, err) - auth, err := client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ + auth, err := client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ Email: newUser.Email, Password: "password", }) @@ -895,11 +1031,11 @@ func TestWorkspacesByUser(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - workspaces, err := newUserClient.Workspaces(context.Background(), codersdk.WorkspaceFilter{Owner: codersdk.Me}) + workspaces, err := newUserClient.Workspaces(ctx, codersdk.WorkspaceFilter{Owner: codersdk.Me}) require.NoError(t, err) require.Len(t, workspaces, 0) - workspaces, err = client.Workspaces(context.Background(), codersdk.WorkspaceFilter{Owner: codersdk.Me}) + workspaces, err = client.Workspaces(ctx, codersdk.WorkspaceFilter{Owner: codersdk.Me}) require.NoError(t, err) require.Len(t, workspaces, 1) }) @@ -911,10 +1047,13 @@ func TestWorkspacesByUser(t *testing.T) { // This is mainly to confirm the db fake has the same behavior. func TestSuspendedPagination(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{APIRateLimit: -1}) coderdtest.CreateFirstUser(t, client) - me, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + me, err := client.User(ctx, codersdk.Me) require.NoError(t, err) orgID := me.OrganizationIDs[0] @@ -924,7 +1063,7 @@ func TestSuspendedPagination(t *testing.T) { for i := 0; i < total; i++ { email := fmt.Sprintf("%d@coder.com", i) username := fmt.Sprintf("user%d", i) - user, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ + user, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ Email: email, Username: username, Password: "password", @@ -953,45 +1092,59 @@ func TestSuspendedPagination(t *testing.T) { // them using different page sizes. func TestPaginatedUsers(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{APIRateLimit: -1}) coderdtest.CreateFirstUser(t, client) - me, err := client.User(context.Background(), codersdk.Me) + + // This test takes longer than a long time. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong*2) + defer cancel() + + me, err := client.User(ctx, codersdk.Me) require.NoError(t, err) orgID := me.OrganizationIDs[0] - allUsers := make([]codersdk.User, 0) - allUsers = append(allUsers, me) - specialUsers := make([]codersdk.User, 0) - // When 100 users exist total := 100 + allUsers := make([]codersdk.User, total+1) // +1 forme + allUsers[0] = me + specialUsers := make([]codersdk.User, total/2) + + eg, egCtx := errgroup.WithContext(ctx) // Create users for i := 0; i < total; i++ { - email := fmt.Sprintf("%d@coder.com", i) - username := fmt.Sprintf("user%d", i) - if i%2 == 0 { - email = fmt.Sprintf("%d@gmail.com", i) - username = fmt.Sprintf("specialuser%d", i) - } - // One side effect of having to use the api vs the db calls directly, is you cannot - // mock time. Ideally I could pass in mocked times and space these users out. - // - // But this also serves as a good test. Postgres has microsecond precision on its timestamps. - // If 2 users share the same created_at, that could cause an issue if you are strictly paginating via - // timestamps. The pagination goes by timestamps and uuids. - newUser, err := client.CreateUser(context.Background(), codersdk.CreateUserRequest{ - Email: email, - Username: username, - Password: "password", - OrganizationID: orgID, + i := i + eg.Go(func() error { + email := fmt.Sprintf("%d@coder.com", i) + username := fmt.Sprintf("user%d", i) + if i%2 == 0 { + email = fmt.Sprintf("%d@gmail.com", i) + username = fmt.Sprintf("specialuser%d", i) + } + // One side effect of having to use the api vs the db calls directly, is you cannot + // mock time. Ideally I could pass in mocked times and space these users out. + // + // But this also serves as a good test. Postgres has microsecond precision on its timestamps. + // If 2 users share the same created_at, that could cause an issue if you are strictly paginating via + // timestamps. The pagination goes by timestamps and uuids. + newUser, err := client.CreateUser(egCtx, codersdk.CreateUserRequest{ + Email: email, + Username: username, + Password: "password", + OrganizationID: orgID, + }) + if err != nil { + return err + } + allUsers[i+1] = newUser + if i%2 == 0 { + specialUsers[i/2] = newUser + } + + return nil }) - require.NoError(t, err) - allUsers = append(allUsers, newUser) - if i%2 == 0 { - specialUsers = append(specialUsers, newUser) - } } + err = eg.Wait() + require.NoError(t, err, "create users failed") // Sorting the users will sort by (created_at, uuid). This is to handle // the off case that created_at is identical for 2 users. @@ -1000,32 +1153,51 @@ func TestPaginatedUsers(t *testing.T) { sortUsers(allUsers) sortUsers(specialUsers) - assertPagination(ctx, t, client, 10, allUsers, nil) - assertPagination(ctx, t, client, 5, allUsers, nil) - assertPagination(ctx, t, client, 3, allUsers, nil) - assertPagination(ctx, t, client, 1, allUsers, nil) - - // Try a search gmailSearch := func(request codersdk.UsersRequest) codersdk.UsersRequest { request.Search = "gmail" return request } - assertPagination(ctx, t, client, 3, specialUsers, gmailSearch) - assertPagination(ctx, t, client, 7, specialUsers, gmailSearch) - usernameSearch := func(request codersdk.UsersRequest) codersdk.UsersRequest { request.Search = "specialuser" return request } - assertPagination(ctx, t, client, 3, specialUsers, usernameSearch) - assertPagination(ctx, t, client, 1, specialUsers, usernameSearch) + + tests := []struct { + name string + limit int + allUsers []codersdk.User + opt func(request codersdk.UsersRequest) codersdk.UsersRequest + }{ + {name: "all users", limit: 10, allUsers: allUsers}, + {name: "all users", limit: 5, allUsers: allUsers}, + {name: "all users", limit: 3, allUsers: allUsers}, + {name: "all users", limit: 1, allUsers: allUsers}, + {name: "gmail search", limit: 3, allUsers: specialUsers, opt: gmailSearch}, + {name: "gmail search", limit: 7, allUsers: specialUsers, opt: gmailSearch}, + {name: "username search", limit: 3, allUsers: specialUsers, opt: usernameSearch}, + {name: "username search", limit: 3, allUsers: specialUsers, opt: usernameSearch}, + } + //nolint:paralleltest // Does not detect range value. + for _, tt := range tests { + tt := tt + t.Run(fmt.Sprintf("%s %d", tt.name, tt.limit), func(t *testing.T) { + t.Parallel() + + // This test takes longer than a long time. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong*2) + defer cancel() + + assertPagination(ctx, t, client, tt.limit, tt.allUsers, tt.opt) + }) + } } // Assert pagination will page through the list of all users using the given // limit for each page. The 'allUsers' is the expected full list to compare // against. func assertPagination(ctx context.Context, t *testing.T, client *codersdk.Client, limit int, allUsers []codersdk.User, - opt func(request codersdk.UsersRequest) codersdk.UsersRequest) { + opt func(request codersdk.UsersRequest) codersdk.UsersRequest, +) { var count int if opt == nil { opt = func(request codersdk.UsersRequest) codersdk.UsersRequest { diff --git a/coderd/workspaceagents_test.go b/coderd/workspaceagents_test.go index bbd9540c7cc01..5ec8274fecfa9 100644 --- a/coderd/workspaceagents_test.go +++ b/coderd/workspaceagents_test.go @@ -21,6 +21,7 @@ import ( "github.com/coder/coder/peer" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestWorkspaceAgent(t *testing.T) { @@ -59,10 +60,13 @@ func TestWorkspaceAgent(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - resources, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) require.Equal(t, tmpDir, resources[0].Agents[0].Directory) - _, err = client.WorkspaceAgent(context.Background(), resources[0].Agents[0].ID) + _, err = client.WorkspaceAgent(ctx, resources[0].Agents[0].ID) require.NoError(t, err) }) } @@ -111,8 +115,12 @@ func TestWorkspaceAgentListen(t *testing.T) { defer func() { _ = agentCloser.Close() }() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID) - conn, err := client.DialWorkspaceAgent(context.Background(), resources[0].Agents[0].ID, nil) + conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil) require.NoError(t, err) defer func() { _ = conn.Close() @@ -124,7 +132,6 @@ func TestWorkspaceAgentListen(t *testing.T) { t.Run("FailNonLatestBuild", func(t *testing.T) { t.Parallel() - ctx := context.Background() client := coderdtest.New(t, &coderdtest.Options{ IncludeProvisionerD: true, }) @@ -179,7 +186,10 @@ func TestWorkspaceAgentListen(t *testing.T) { }, template.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - stopBuild, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + stopBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ TemplateVersionID: version.ID, Transition: codersdk.WorkspaceTransitionStop, }) @@ -237,12 +247,16 @@ func TestWorkspaceAgentTURN(t *testing.T) { _ = agentCloser.Close() }() resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + opts := &peer.ConnOptions{ Logger: slogtest.Make(t, nil).Named("client"), } // Force a TURN connection! opts.SettingEngine.SetNetworkTypes([]webrtc.NetworkType{webrtc.NetworkTypeTCP4}) - conn, err := client.DialWorkspaceAgent(context.Background(), resources[0].Agents[0].ID, opts) + conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, opts) require.NoError(t, err) defer func() { _ = conn.Close() @@ -299,7 +313,10 @@ func TestWorkspaceAgentPTY(t *testing.T) { }() resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID) - conn, err := client.WorkspaceAgentReconnectingPTY(context.Background(), resources[0].Agents[0].ID, uuid.New(), 80, 80, "/bin/bash") + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + conn, err := client.WorkspaceAgentReconnectingPTY(ctx, resources[0].Agents[0].ID, uuid.New(), 80, 80, "/bin/bash") require.NoError(t, err) defer conn.Close() diff --git a/coderd/workspaceapps_test.go b/coderd/workspaceapps_test.go index 3dde860bed519..ea9b239fba6eb 100644 --- a/coderd/workspaceapps_test.go +++ b/coderd/workspaceapps_test.go @@ -17,6 +17,7 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestWorkspaceAppsProxyPath(t *testing.T) { @@ -92,7 +93,11 @@ func TestWorkspaceAppsProxyPath(t *testing.T) { client.HTTPClient.CheckRedirect = func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse } - resp, err := client.Request(context.Background(), http.MethodGet, "/@me/"+workspace.Name+"/apps/example", nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Request(ctx, http.MethodGet, "/@me/"+workspace.Name+"/apps/example", nil) require.NoError(t, err) defer resp.Body.Close() location, err := resp.Location() @@ -103,7 +108,11 @@ func TestWorkspaceAppsProxyPath(t *testing.T) { t.Run("RedirectsWithSlash", func(t *testing.T) { t.Parallel() - resp, err := client.Request(context.Background(), http.MethodGet, "/@me/"+workspace.Name+"/apps/example", nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Request(ctx, http.MethodGet, "/@me/"+workspace.Name+"/apps/example", nil) require.NoError(t, err) defer resp.Body.Close() require.Equal(t, http.StatusTemporaryRedirect, resp.StatusCode) @@ -111,7 +120,11 @@ func TestWorkspaceAppsProxyPath(t *testing.T) { t.Run("RedirectsWithQuery", func(t *testing.T) { t.Parallel() - resp, err := client.Request(context.Background(), http.MethodGet, "/@me/"+workspace.Name+"/apps/example/", nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Request(ctx, http.MethodGet, "/@me/"+workspace.Name+"/apps/example/", nil) require.NoError(t, err) defer resp.Body.Close() require.Equal(t, http.StatusTemporaryRedirect, resp.StatusCode) @@ -122,7 +135,11 @@ func TestWorkspaceAppsProxyPath(t *testing.T) { t.Run("Proxies", func(t *testing.T) { t.Parallel() - resp, err := client.Request(context.Background(), http.MethodGet, "/@me/"+workspace.Name+"/apps/example/?query=true", nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Request(ctx, http.MethodGet, "/@me/"+workspace.Name+"/apps/example/?query=true", nil) require.NoError(t, err) defer resp.Body.Close() body, err := io.ReadAll(resp.Body) @@ -133,7 +150,11 @@ func TestWorkspaceAppsProxyPath(t *testing.T) { t.Run("ProxyError", func(t *testing.T) { t.Parallel() - resp, err := client.Request(context.Background(), http.MethodGet, "/@me/"+workspace.Name+"/apps/fake/", nil) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resp, err := client.Request(ctx, http.MethodGet, "/@me/"+workspace.Name+"/apps/fake/", nil) require.NoError(t, err) defer resp.Body.Close() require.Equal(t, http.StatusOK, resp.StatusCode) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index 8b68cff559c94..6ce06e12736cc 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -28,7 +28,11 @@ func TestWorkspaceBuild(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.WorkspaceBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.WorkspaceBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) } @@ -38,14 +42,18 @@ func TestWorkspaceBuildByBuildNumber(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID) _, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber( - context.Background(), + ctx, user.Username, workspace.Name, strconv.FormatInt(int64(workspace.LatestBuild.BuildNumber), 10), @@ -57,14 +65,18 @@ func TestWorkspaceBuildByBuildNumber(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID) _, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber( - context.Background(), + ctx, user.Username, workspace.Name, "buildNumber", @@ -79,14 +91,18 @@ func TestWorkspaceBuildByBuildNumber(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID) _, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber( - context.Background(), + ctx, user.Username, "workspaceName", strconv.FormatInt(int64(workspace.LatestBuild.BuildNumber), 10), @@ -101,14 +117,18 @@ func TestWorkspaceBuildByBuildNumber(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID) _, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber( - context.Background(), + ctx, user.Username, workspace.Name, "200", @@ -126,13 +146,17 @@ func TestWorkspaceBuilds(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) - user, err := client.User(context.Background(), codersdk.Me) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + user, err := client.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID) - builds, err := client.WorkspaceBuilds(context.Background(), + builds, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: workspace.ID}) require.Len(t, builds, 1) require.Equal(t, int32(1), builds[0].BuildNumber) @@ -142,8 +166,6 @@ func TestWorkspaceBuilds(t *testing.T) { t.Run("PaginateNonExistentRow", func(t *testing.T) { t.Parallel() - ctx := context.Background() - client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -152,6 +174,9 @@ func TestWorkspaceBuilds(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + _, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{ WorkspaceID: workspace.ID, Pagination: codersdk.Pagination{ @@ -181,8 +206,11 @@ func TestWorkspaceBuilds(t *testing.T) { coderdtest.AwaitWorkspaceBuildJob(t, client, b.ID) } + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + pageSize := 3 - firstPage, err := client.WorkspaceBuilds(context.Background(), codersdk.WorkspaceBuildsRequest{ + firstPage, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{ WorkspaceID: workspace.ID, Pagination: codersdk.Pagination{Limit: pageSize, Offset: 0}, }) @@ -191,7 +219,7 @@ func TestWorkspaceBuilds(t *testing.T) { for i := 0; i < pageSize; i++ { require.Equal(t, expectedBuilds[extraBuilds-i-1].ID, firstPage[i].ID) } - secondPage, err := client.WorkspaceBuilds(context.Background(), codersdk.WorkspaceBuildsRequest{ + secondPage, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{ WorkspaceID: workspace.ID, Pagination: codersdk.Pagination{Limit: pageSize, Offset: pageSize}, }) @@ -219,16 +247,20 @@ func TestPatchCancelWorkspaceBuild(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) var build codersdk.WorkspaceBuild + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + require.Eventually(t, func() bool { var err error - build, err = client.WorkspaceBuild(context.Background(), workspace.LatestBuild.ID) + build, err = client.WorkspaceBuild(ctx, workspace.LatestBuild.ID) return assert.NoError(t, err) && build.Job.Status == codersdk.ProvisionerJobRunning }, testutil.WaitShort, testutil.IntervalFast) - err := client.CancelWorkspaceBuild(context.Background(), build.ID) + err := client.CancelWorkspaceBuild(ctx, build.ID) require.NoError(t, err) require.Eventually(t, func() bool { var err error - build, err = client.WorkspaceBuild(context.Background(), build.ID) + build, err = client.WorkspaceBuild(ctx, build.ID) return assert.NoError(t, err) && // The job will never actually cancel successfully because it will never send a // provision complete response. @@ -249,7 +281,11 @@ func TestWorkspaceBuildResources(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) @@ -282,7 +318,11 @@ func TestWorkspaceBuildResources(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - resources, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) require.NotNil(t, resources) require.Len(t, resources, 2) @@ -327,8 +367,10 @@ func TestWorkspaceBuildLogs(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - ctx, cancelFunc := context.WithCancel(context.Background()) - defer cancelFunc() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + logs, err := client.WorkspaceBuildLogsAfter(ctx, workspace.LatestBuild.ID, before.Add(-time.Hour)) require.NoError(t, err) for { @@ -363,7 +405,11 @@ func TestWorkspaceBuildState(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - gotState, err := client.WorkspaceBuildState(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + gotState, err := client.WorkspaceBuildState(ctx, workspace.LatestBuild.ID) require.NoError(t, err) require.Equal(t, wantState, gotState) } diff --git a/coderd/workspaceresourceauth_test.go b/coderd/workspaceresourceauth_test.go index 04374c1821dc4..58b91c16ba180 100644 --- a/coderd/workspaceresourceauth_test.go +++ b/coderd/workspaceresourceauth_test.go @@ -11,6 +11,7 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestPostWorkspaceAuthAzureInstanceIdentity(t *testing.T) { @@ -45,8 +46,11 @@ func TestPostWorkspaceAuthAzureInstanceIdentity(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + client.HTTPClient = metadataClient - _, err := client.AuthWorkspaceAzureInstanceIdentity(context.Background()) + _, err := client.AuthWorkspaceAzureInstanceIdentity(ctx) require.NoError(t, err) } @@ -84,8 +88,11 @@ func TestPostWorkspaceAuthAWSInstanceIdentity(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + client.HTTPClient = metadataClient - _, err := client.AuthWorkspaceAWSInstanceIdentity(context.Background()) + _, err := client.AuthWorkspaceAWSInstanceIdentity(ctx) require.NoError(t, err) }) } @@ -99,7 +106,11 @@ func TestPostWorkspaceAuthGoogleInstanceIdentity(t *testing.T) { client := coderdtest.New(t, &coderdtest.Options{ GoogleTokenValidator: validator, }) - _, err := client.AuthWorkspaceGoogleInstanceIdentity(context.Background(), "", metadata) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.AuthWorkspaceGoogleInstanceIdentity(ctx, "", metadata) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusUnauthorized, apiErr.StatusCode()) @@ -112,7 +123,11 @@ func TestPostWorkspaceAuthGoogleInstanceIdentity(t *testing.T) { client := coderdtest.New(t, &coderdtest.Options{ GoogleTokenValidator: validator, }) - _, err := client.AuthWorkspaceGoogleInstanceIdentity(context.Background(), "", metadata) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.AuthWorkspaceGoogleInstanceIdentity(ctx, "", metadata) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -150,7 +165,10 @@ func TestPostWorkspaceAuthGoogleInstanceIdentity(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - _, err := client.AuthWorkspaceGoogleInstanceIdentity(context.Background(), "", metadata) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.AuthWorkspaceGoogleInstanceIdentity(ctx, "", metadata) require.NoError(t, err) }) } diff --git a/coderd/workspaceresources_test.go b/coderd/workspaceresources_test.go index d1ca6517f3046..43d5f7395c7c8 100644 --- a/coderd/workspaceresources_test.go +++ b/coderd/workspaceresources_test.go @@ -10,6 +10,7 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestWorkspaceResource(t *testing.T) { @@ -44,9 +45,13 @@ func TestWorkspaceResource(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - resources, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) - resource, err := client.WorkspaceResource(context.Background(), resources[0].ID) + resource, err := client.WorkspaceResource(ctx, resources[0].ID) require.NoError(t, err) require.Len(t, resource.Agents, 2) // Ensure it's sorted alphabetically! @@ -88,9 +93,13 @@ func TestWorkspaceResource(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - resources, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) - resource, err := client.WorkspaceResource(context.Background(), resources[0].ID) + resource, err := client.WorkspaceResource(ctx, resources[0].ID) require.NoError(t, err) require.Len(t, resource.Agents, 1) agent := resource.Agents[0] @@ -141,9 +150,13 @@ func TestWorkspaceResource(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - resources, err := client.WorkspaceResourcesByBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) - resource, err := client.WorkspaceResource(context.Background(), resources[0].ID) + resource, err := client.WorkspaceResource(ctx, resources[0].ID) require.NoError(t, err) metadata := resource.Metadata require.Equal(t, []codersdk.WorkspaceResourceMetadata{{ diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index a958c260422e6..c33a485986c31 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -19,6 +19,7 @@ import ( "github.com/coder/coder/cryptorand" "github.com/coder/coder/provisioner/echo" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/testutil" ) func TestWorkspace(t *testing.T) { @@ -33,7 +34,10 @@ func TestWorkspace(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - ws, err := client.Workspace(context.Background(), workspace.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + ws, err := client.Workspace(ctx, workspace.ID) require.NoError(t, err) require.Equal(t, user.UserID, ws.LatestBuild.InitiatorID) require.Equal(t, codersdk.BuildReasonInitiator, ws.LatestBuild.Reason) @@ -49,24 +53,27 @@ func TestWorkspace(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Getting with deleted=true should still work. - _, err := client.DeletedWorkspace(context.Background(), workspace.ID) + _, err := client.DeletedWorkspace(ctx, workspace.ID) require.NoError(t, err) // Delete the workspace - build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionDelete, }) require.NoError(t, err, "delete the workspace") coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID) // Getting with deleted=true should work. - workspaceNew, err := client.DeletedWorkspace(context.Background(), workspace.ID) + workspaceNew, err := client.DeletedWorkspace(ctx, workspace.ID) require.NoError(t, err) require.Equal(t, workspace.ID, workspaceNew.ID) // Getting with deleted=false should not work. - _, err = client.Workspace(context.Background(), workspace.ID) + _, err = client.Workspace(ctx, workspace.ID) require.Error(t, err) require.ErrorContains(t, err, "410") // gone }) @@ -81,10 +88,14 @@ func TestAdminViewAllWorkspaces(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - _, err := client.Workspace(context.Background(), workspace.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.Workspace(ctx, workspace.ID) require.NoError(t, err) - otherOrg, err := client.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + otherOrg, err := client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "default-test", }) require.NoError(t, err, "create other org") @@ -92,10 +103,10 @@ func TestAdminViewAllWorkspaces(t *testing.T) { // This other user is not in the first user's org. Since other is an admin, they can // still see the "first" user's workspace. other := coderdtest.CreateAnotherUser(t, client, otherOrg.ID, rbac.RoleAdmin()) - otherWorkspaces, err := other.Workspaces(context.Background(), codersdk.WorkspaceFilter{}) + otherWorkspaces, err := other.Workspaces(ctx, codersdk.WorkspaceFilter{}) require.NoError(t, err, "(other) fetch workspaces") - firstWorkspaces, err := other.Workspaces(context.Background(), codersdk.WorkspaceFilter{}) + firstWorkspaces, err := other.Workspaces(ctx, codersdk.WorkspaceFilter{}) require.NoError(t, err, "(first) fetch workspaces") require.ElementsMatch(t, otherWorkspaces, firstWorkspaces) @@ -107,7 +118,11 @@ func TestPostWorkspacesByOrganization(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) user := coderdtest.CreateFirstUser(t, client) - _, err := client.CreateWorkspace(context.Background(), user.OrganizationID, codersdk.CreateWorkspaceRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateWorkspace(ctx, user.OrganizationID, codersdk.CreateWorkspaceRequest{ TemplateID: uuid.New(), Name: "workspace", }) @@ -123,14 +138,18 @@ func TestPostWorkspacesByOrganization(t *testing.T) { first := coderdtest.CreateFirstUser(t, client) other := coderdtest.CreateAnotherUser(t, client, first.OrganizationID, rbac.RoleMember(), rbac.RoleAdmin()) - org, err := other.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + org, err := other.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: "another", }) require.NoError(t, err) version := coderdtest.CreateTemplateVersion(t, other, org.ID, nil) template := coderdtest.CreateTemplate(t, other, org.ID, version.ID) - _, err = client.CreateWorkspace(context.Background(), first.OrganizationID, codersdk.CreateWorkspaceRequest{ + _, err = client.CreateWorkspace(ctx, first.OrganizationID, codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: "workspace", }) @@ -148,7 +167,11 @@ func TestPostWorkspacesByOrganization(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.CreateWorkspace(context.Background(), user.OrganizationID, codersdk.CreateWorkspaceRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateWorkspace(ctx, user.OrganizationID, codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: workspace.Name, }) @@ -195,12 +218,16 @@ func TestPostWorkspacesByOrganization(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: "testing", TTLMillis: ptr.Ref((59 * time.Second).Milliseconds()), } - _, err := client.CreateWorkspace(context.Background(), template.OrganizationID, req) + _, err := client.CreateWorkspace(ctx, template.OrganizationID, req) require.Error(t, err) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) @@ -217,12 +244,16 @@ func TestPostWorkspacesByOrganization(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: "testing", TTLMillis: ptr.Ref(template.MaxTTLMillis + time.Minute.Milliseconds()), } - _, err := client.CreateWorkspace(context.Background(), template.OrganizationID, req) + _, err := client.CreateWorkspace(ctx, template.OrganizationID, req) require.Error(t, err) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) @@ -240,12 +271,16 @@ func TestPostWorkspacesByOrganization(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + req := codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: "testing", AutostartSchedule: ptr.Ref("CRON_TZ=US/Central * * * * *"), } - _, err := client.CreateWorkspace(context.Background(), template.OrganizationID, req) + _, err := client.CreateWorkspace(ctx, template.OrganizationID, req) require.Error(t, err) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) @@ -261,7 +296,11 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { t.Run("NotFound", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) - _, err := client.WorkspaceByOwnerAndName(context.Background(), codersdk.Me, "something", codersdk.WorkspaceOptions{}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.WorkspaceByOwnerAndName(ctx, codersdk.Me, "something", codersdk.WorkspaceOptions{}) var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusUnauthorized, apiErr.StatusCode()) @@ -274,7 +313,11 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.WorkspaceByOwnerAndName(context.Background(), codersdk.Me, workspace.Name, codersdk.WorkspaceOptions{}) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.WorkspaceByOwnerAndName(ctx, codersdk.Me, workspace.Name, codersdk.WorkspaceOptions{}) require.NoError(t, err) }) t.Run("Deleted", func(t *testing.T) { @@ -287,9 +330,12 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // Given: // We delete the workspace - build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionDelete, }) require.NoError(t, err, "delete the workspace") @@ -297,18 +343,18 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { // Then: // When we call without includes_deleted, we don't expect to get the workspace back - _, err = client.WorkspaceByOwnerAndName(context.Background(), workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{}) + _, err = client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{}) require.ErrorContains(t, err, "404") // Then: // When we call with includes_deleted, we should get the workspace back - workspaceNew, err := client.WorkspaceByOwnerAndName(context.Background(), workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{IncludeDeleted: true}) + workspaceNew, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{IncludeDeleted: true}) require.NoError(t, err) require.Equal(t, workspace.ID, workspaceNew.ID) // Given: // We recreate the workspace with the same name - workspace, err = client.CreateWorkspace(context.Background(), user.OrganizationID, codersdk.CreateWorkspaceRequest{ + workspace, err = client.CreateWorkspace(ctx, user.OrganizationID, codersdk.CreateWorkspaceRequest{ TemplateID: workspace.TemplateID, Name: workspace.Name, AutostartSchedule: workspace.AutostartSchedule, @@ -319,13 +365,13 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { // Then: // We can fetch the most recent workspace - workspaceNew, err = client.WorkspaceByOwnerAndName(context.Background(), workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{}) + workspaceNew, err = client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{}) require.NoError(t, err) require.Equal(t, workspace.ID, workspaceNew.ID) // Given: // We delete the workspace again - build, err = client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + build, err = client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionDelete, }) require.NoError(t, err, "delete the workspace") @@ -333,7 +379,7 @@ func TestWorkspaceByOwnerAndName(t *testing.T) { // Then: // When we fetch the deleted workspace, we get the most recently deleted one - workspaceNew, err = client.WorkspaceByOwnerAndName(context.Background(), workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{IncludeDeleted: true}) + workspaceNew, err = client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{IncludeDeleted: true}) require.NoError(t, err) require.Equal(t, workspace.ID, workspaceNew.ID) }) @@ -355,20 +401,23 @@ func TestWorkspaceFilter(t *testing.T) { client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) first := coderdtest.CreateFirstUser(t, client) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + users := make([]coderUser, 0) for i := 0; i < 10; i++ { userClient := coderdtest.CreateAnotherUser(t, client, first.OrganizationID, rbac.RoleAdmin()) - user, err := userClient.User(context.Background(), codersdk.Me) + user, err := userClient.User(ctx, codersdk.Me) require.NoError(t, err, "fetch me") if i%3 == 0 { - user, err = client.UpdateUserProfile(context.Background(), user.ID.String(), codersdk.UpdateUserProfileRequest{ + user, err = client.UpdateUserProfile(ctx, user.ID.String(), codersdk.UpdateUserProfileRequest{ Username: strings.ToUpper(user.Username), }) require.NoError(t, err, "uppercase username") } - org, err := userClient.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{ + org, err := userClient.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ Name: user.Username + "-org", }) require.NoError(t, err, "create org") @@ -524,7 +573,7 @@ func TestWorkspaceFilter(t *testing.T) { c := c t.Run(c.Name, func(t *testing.T) { t.Parallel() - workspaces, err := client.Workspaces(context.Background(), c.Filter) + workspaces, err := client.Workspaces(ctx, c.Filter) require.NoError(t, err, "fetch workspaces") exp := make([]codersdk.Workspace, 0) @@ -551,8 +600,11 @@ func TestWorkspaceFilterManual(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // full match - ws, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + ws, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ Name: workspace.Name, }) require.NoError(t, err) @@ -560,7 +612,7 @@ func TestWorkspaceFilterManual(t *testing.T) { require.Equal(t, workspace.ID, ws[0].ID) // partial match - ws, err = client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + ws, err = client.Workspaces(ctx, codersdk.WorkspaceFilter{ Name: workspace.Name[1 : len(workspace.Name)-2], }) require.NoError(t, err) @@ -568,7 +620,7 @@ func TestWorkspaceFilterManual(t *testing.T) { require.Equal(t, workspace.ID, ws[0].ID) // no match - ws, err = client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + ws, err = client.Workspaces(ctx, codersdk.WorkspaceFilter{ Name: "$$$$", }) require.NoError(t, err) @@ -585,13 +637,16 @@ func TestWorkspaceFilterManual(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) _ = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template2.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // empty - ws, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{}) + ws, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{}) require.NoError(t, err) require.Len(t, ws, 2) // single template - ws, err = client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + ws, err = client.Workspaces(ctx, codersdk.WorkspaceFilter{ Template: template.Name, }) require.NoError(t, err) @@ -609,8 +664,11 @@ func TestWorkspaceFilterManual(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) _ = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template2.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + // single workspace - ws, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + ws, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ FilterQuery: fmt.Sprintf("template:%s %s/%s", template.Name, workspace.OwnerName, workspace.Name), }) require.NoError(t, err) @@ -629,7 +687,11 @@ func TestPostWorkspaceBuild(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ TemplateVersionID: uuid.New(), Transition: codersdk.WorkspaceTransitionStart, }) @@ -648,7 +710,11 @@ func TestPostWorkspaceBuild(t *testing.T) { }) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - _, err := client.CreateWorkspace(context.Background(), user.OrganizationID, codersdk.CreateWorkspaceRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateWorkspace(ctx, user.OrganizationID, codersdk.CreateWorkspaceRequest{ TemplateID: template.ID, Name: "workspace", }) @@ -669,7 +735,11 @@ func TestPostWorkspaceBuild(t *testing.T) { closer.Close() // Close here so workspace build doesn't process! workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ TemplateVersionID: template.ActiveVersionID, Transition: codersdk.WorkspaceTransitionStart, }) @@ -688,7 +758,11 @@ func TestPostWorkspaceBuild(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ TemplateVersionID: template.ActiveVersionID, Transition: codersdk.WorkspaceTransitionStart, }) @@ -708,13 +782,17 @@ func TestPostWorkspaceBuild(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) wantState := []byte("something") - build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ TemplateVersionID: template.ActiveVersionID, Transition: codersdk.WorkspaceTransitionStart, ProvisionerState: wantState, }) require.NoError(t, err) - gotState, err := client.WorkspaceBuildState(context.Background(), build.ID) + gotState, err := client.WorkspaceBuildState(ctx, build.ID) require.NoError(t, err) require.Equal(t, wantState, gotState) }) @@ -728,14 +806,18 @@ func TestPostWorkspaceBuild(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{ + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionDelete, }) require.NoError(t, err) require.Equal(t, workspace.LatestBuild.BuildNumber+1, build.BuildNumber) coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID) - workspaces, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{ + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ Owner: user.UserID.String(), }) require.NoError(t, err) @@ -753,7 +835,11 @@ func TestWorkspaceBuildByName(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - _, err := client.WorkspaceBuildByName(context.Background(), workspace.ID, "something") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + _, err := client.WorkspaceBuildByName(ctx, workspace.ID, "something") var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) @@ -767,16 +853,20 @@ func TestWorkspaceBuildByName(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - build, err := client.WorkspaceBuild(context.Background(), workspace.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + build, err := client.WorkspaceBuild(ctx, workspace.LatestBuild.ID) require.NoError(t, err) - _, err = client.WorkspaceBuildByName(context.Background(), workspace.ID, build.Name) + _, err = client.WorkspaceBuildByName(ctx, workspace.ID, build.Name) require.NoError(t, err) }) } func TestWorkspaceUpdateAutostart(t *testing.T) { t.Parallel() - var dublinLoc = mustLocation(t, "Europe/Dublin") + dublinLoc := mustLocation(t, "Europe/Dublin") testCases := []struct { name string @@ -847,7 +937,6 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { t.Parallel() var ( - ctx = context.Background() client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user = coderdtest.CreateFirstUser(t, client) version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -862,6 +951,9 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { // ensure test invariant: new workspaces have no autostart schedule. require.Empty(t, workspace.AutostartSchedule, "expected newly-minted workspace to have no autostart schedule") + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + err := client.UpdateWorkspaceAutostart(ctx, workspace.ID, codersdk.UpdateWorkspaceAutostartRequest{ Schedule: testCase.schedule, }) @@ -895,7 +987,6 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { t.Run("NotFound", func(t *testing.T) { var ( - ctx = context.Background() client = coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) wsid = uuid.New() @@ -904,6 +995,9 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { } ) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + err := client.UpdateWorkspaceAutostart(ctx, wsid, req) require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error") coderSDKErr, _ := err.(*codersdk.Error) //nolint:errorlint @@ -969,7 +1063,6 @@ func TestWorkspaceUpdateTTL(t *testing.T) { mutators = append(mutators, testCase.modifyTemplate) } var ( - ctx = context.Background() client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user = coderdtest.CreateFirstUser(t, client) version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -982,6 +1075,9 @@ func TestWorkspaceUpdateTTL(t *testing.T) { _ = coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) ) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + err := client.UpdateWorkspaceTTL(ctx, workspace.ID, codersdk.UpdateWorkspaceTTLRequest{ TTLMillis: testCase.ttlMillis, }) @@ -1002,7 +1098,6 @@ func TestWorkspaceUpdateTTL(t *testing.T) { t.Run("NotFound", func(t *testing.T) { var ( - ctx = context.Background() client = coderdtest.New(t, nil) _ = coderdtest.CreateFirstUser(t, client) wsid = uuid.New() @@ -1011,6 +1106,9 @@ func TestWorkspaceUpdateTTL(t *testing.T) { } ) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + err := client.UpdateWorkspaceTTL(ctx, wsid, req) require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error") coderSDKErr, _ := err.(*codersdk.Error) //nolint:errorlint @@ -1024,7 +1122,6 @@ func TestWorkspaceExtend(t *testing.T) { var ( ttl = 8 * time.Hour newDeadline = time.Now().Add(ttl + time.Hour).UTC() - ctx = context.Background() client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true}) user = coderdtest.CreateFirstUser(t, client) version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) @@ -1036,6 +1133,9 @@ func TestWorkspaceExtend(t *testing.T) { _ = coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) ) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + workspace, err := client.Workspace(ctx, workspace.ID) require.NoError(t, err, "fetch provisioned workspace") oldDeadline := workspace.LatestBuild.Deadline @@ -1100,11 +1200,13 @@ func TestWorkspaceWatcher(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - w, err := client.Workspace(context.Background(), workspace.ID) - require.NoError(t, err) - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() + + w, err := client.Workspace(ctx, workspace.ID) + require.NoError(t, err) + wc, err := client.WatchWorkspace(ctx, w.ID) require.NoError(t, err) for i := 0; i < 3; i++ {