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++ { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy