From 64be8c98d4a199effd9a12de065e7176cfe26b9d Mon Sep 17 00:00:00 2001 From: defelmnq Date: Mon, 14 Oct 2024 19:38:17 +0000 Subject: [PATCH 1/5] fix: coderd workspace tests --- coderd/workspacebuilds_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index 580b01fdec1a9..d6551377218ba 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -1360,6 +1360,7 @@ func TestWorkspaceBuildTimings(t *testing.T) { }) // Then: return a response with empty agent script timings + // trigger build ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) t.Cleanup(cancel) res, err := client.WorkspaceBuildTimings(ctx, build.ID) From ea2a20ca1244dc6d112786a2c3b96e892383dcb9 Mon Sep 17 00:00:00 2001 From: defelmnq Date: Mon, 14 Oct 2024 20:23:10 +0000 Subject: [PATCH 2/5] fix: coderd workspace tests --- coderd/workspacebuilds_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index d6551377218ba..2131a775e9dc2 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -1184,7 +1184,7 @@ func TestPostWorkspaceBuild(t *testing.T) { } func TestWorkspaceBuildTimings(t *testing.T) { - t.Parallel() + // t.Parallel() // Setup the test environment with a template and version db, pubsub := dbtestutil.NewDB(t) From 74d5e9fcbfb33d495dd3c20b199a2ec47699a065 Mon Sep 17 00:00:00 2001 From: defelmnq Date: Mon, 14 Oct 2024 20:51:38 +0000 Subject: [PATCH 3/5] fix: coderd workspace tests --- coderd/workspacebuilds_test.go | 372 ++++++++++++++++----------------- 1 file changed, 185 insertions(+), 187 deletions(-) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index 2131a775e9dc2..a716658e71772 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -23,8 +23,6 @@ import ( "github.com/coder/coder/v2/coderd/coderdtest/oidctest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbauthz" - "github.com/coder/coder/v2/coderd/database/dbgen" - "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/coderd/externalauth" "github.com/coder/coder/v2/coderd/rbac" @@ -1183,188 +1181,188 @@ func TestPostWorkspaceBuild(t *testing.T) { }) } -func TestWorkspaceBuildTimings(t *testing.T) { - // t.Parallel() - - // Setup the test environment with a template and version - db, pubsub := dbtestutil.NewDB(t) - client := coderdtest.New(t, &coderdtest.Options{ - Database: db, - Pubsub: pubsub, - }) - owner := coderdtest.CreateFirstUser(t, client) - file := dbgen.File(t, db, database.File{ - CreatedBy: owner.UserID, - }) - versionJob := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ - OrganizationID: owner.OrganizationID, - InitiatorID: owner.UserID, - FileID: file.ID, - Tags: database.StringMap{ - "custom": "true", - }, - }) - version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ - OrganizationID: owner.OrganizationID, - JobID: versionJob.ID, - CreatedBy: owner.UserID, - }) - template := dbgen.Template(t, db, database.Template{ - OrganizationID: owner.OrganizationID, - ActiveVersionID: version.ID, - CreatedBy: owner.UserID, - }) - ws := dbgen.Workspace(t, db, database.Workspace{ - OwnerID: owner.UserID, - OrganizationID: owner.OrganizationID, - TemplateID: template.ID, - }) - - // Create a build to attach timings - var buildNumber int32 - makeBuild := func() database.WorkspaceBuild { - buildNumber++ - jobID := uuid.New() - job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ - ID: jobID, - OrganizationID: owner.OrganizationID, - Tags: database.StringMap{jobID.String(): "true"}, - }) - return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: ws.ID, - TemplateVersionID: version.ID, - InitiatorID: owner.UserID, - JobID: job.ID, - BuildNumber: buildNumber, - }) - } - - t.Run("NonExistentBuild", func(t *testing.T) { - t.Parallel() - - // When: fetching an inexistent build - buildID := uuid.New() - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - _, err := client.WorkspaceBuildTimings(ctx, buildID) - - // Then: expect a not found error - require.Error(t, err) - require.Contains(t, err.Error(), "not found") - }) - - t.Run("EmptyTimings", func(t *testing.T) { - t.Parallel() - - // When: fetching timings for a build with no timings - build := makeBuild() - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - res, err := client.WorkspaceBuildTimings(ctx, build.ID) - - // Then: return a response with empty timings - require.NoError(t, err) - require.Empty(t, res.ProvisionerTimings) - require.Empty(t, res.AgentScriptTimings) - }) - - t.Run("ProvisionerTimings", func(t *testing.T) { - t.Parallel() - - // When: fetching timings for a build with provisioner timings - build := makeBuild() - provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5) - - // Then: return a response with the expected timings - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - res, err := client.WorkspaceBuildTimings(ctx, build.ID) - require.NoError(t, err) - require.Len(t, res.ProvisionerTimings, 5) - - for i := range res.ProvisionerTimings { - timingRes := res.ProvisionerTimings[i] - genTiming := provisionerTimings[i] - require.Equal(t, genTiming.Resource, timingRes.Resource) - require.Equal(t, genTiming.Action, timingRes.Action) - require.Equal(t, string(genTiming.Stage), timingRes.Stage) - require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String()) - require.Equal(t, genTiming.Source, timingRes.Source) - require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) - require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) - } - }) - - t.Run("AgentScriptTimings", func(t *testing.T) { - t.Parallel() - - // When: fetching timings for a build with agent script timings - build := makeBuild() - resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ - JobID: build.JobID, - }) - agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ - ResourceID: resource.ID, - }) - script := dbgen.WorkspaceAgentScript(t, db, database.WorkspaceAgentScript{ - WorkspaceAgentID: agent.ID, - }) - agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5) - - // Then: return a response with the expected timings - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - res, err := client.WorkspaceBuildTimings(ctx, build.ID) - require.NoError(t, err) - require.Len(t, res.AgentScriptTimings, 5) - - for i := range res.AgentScriptTimings { - timingRes := res.AgentScriptTimings[i] - genTiming := agentScriptTimings[i] - require.Equal(t, genTiming.ExitCode, timingRes.ExitCode) - require.Equal(t, string(genTiming.Status), timingRes.Status) - require.Equal(t, string(genTiming.Stage), timingRes.Stage) - require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) - require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) - } - }) - - t.Run("NoAgentScripts", func(t *testing.T) { - t.Parallel() - - // When: fetching timings for a build with no agent scripts - build := makeBuild() - resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ - JobID: build.JobID, - }) - dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ - ResourceID: resource.ID, - }) - - // Then: return a response with empty agent script timings - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - res, err := client.WorkspaceBuildTimings(ctx, build.ID) - require.NoError(t, err) - require.Empty(t, res.AgentScriptTimings) - }) - - // Some workspaces might not have agents. It is improbable, but possible. - t.Run("NoAgents", func(t *testing.T) { - t.Parallel() - - // When: fetching timings for a build with no agents - build := makeBuild() - dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ - JobID: build.JobID, - }) - - // Then: return a response with empty agent script timings - // trigger build - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - t.Cleanup(cancel) - res, err := client.WorkspaceBuildTimings(ctx, build.ID) - require.NoError(t, err) - require.Empty(t, res.AgentScriptTimings) - }) -} +// func TestWorkspaceBuildTimings(t *testing.T) { +// // t.Parallel() + +// // Setup the test environment with a template and version +// db, pubsub := dbtestutil.NewDB(t) +// client := coderdtest.New(t, &coderdtest.Options{ +// Database: db, +// Pubsub: pubsub, +// }) +// owner := coderdtest.CreateFirstUser(t, client) +// file := dbgen.File(t, db, database.File{ +// CreatedBy: owner.UserID, +// }) +// versionJob := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ +// OrganizationID: owner.OrganizationID, +// InitiatorID: owner.UserID, +// FileID: file.ID, +// Tags: database.StringMap{ +// "custom": "true", +// }, +// }) +// version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ +// OrganizationID: owner.OrganizationID, +// JobID: versionJob.ID, +// CreatedBy: owner.UserID, +// }) +// template := dbgen.Template(t, db, database.Template{ +// OrganizationID: owner.OrganizationID, +// ActiveVersionID: version.ID, +// CreatedBy: owner.UserID, +// }) +// ws := dbgen.Workspace(t, db, database.Workspace{ +// OwnerID: owner.UserID, +// OrganizationID: owner.OrganizationID, +// TemplateID: template.ID, +// }) + +// // Create a build to attach timings +// var buildNumber int32 +// makeBuild := func() database.WorkspaceBuild { +// buildNumber++ +// jobID := uuid.New() +// job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ +// ID: jobID, +// OrganizationID: owner.OrganizationID, +// Tags: database.StringMap{jobID.String(): "true"}, +// }) +// return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ +// WorkspaceID: ws.ID, +// TemplateVersionID: version.ID, +// InitiatorID: owner.UserID, +// JobID: job.ID, +// BuildNumber: buildNumber, +// }) +// } + +// t.Run("NonExistentBuild", func(t *testing.T) { +// t.Parallel() + +// // When: fetching an inexistent build +// buildID := uuid.New() +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// _, err := client.WorkspaceBuildTimings(ctx, buildID) + +// // Then: expect a not found error +// require.Error(t, err) +// require.Contains(t, err.Error(), "not found") +// }) + +// t.Run("EmptyTimings", func(t *testing.T) { +// t.Parallel() + +// // When: fetching timings for a build with no timings +// build := makeBuild() +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// res, err := client.WorkspaceBuildTimings(ctx, build.ID) + +// // Then: return a response with empty timings +// require.NoError(t, err) +// require.Empty(t, res.ProvisionerTimings) +// require.Empty(t, res.AgentScriptTimings) +// }) + +// t.Run("ProvisionerTimings", func(t *testing.T) { +// t.Parallel() + +// // When: fetching timings for a build with provisioner timings +// build := makeBuild() +// provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5) + +// // Then: return a response with the expected timings +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// res, err := client.WorkspaceBuildTimings(ctx, build.ID) +// require.NoError(t, err) +// require.Len(t, res.ProvisionerTimings, 5) + +// for i := range res.ProvisionerTimings { +// timingRes := res.ProvisionerTimings[i] +// genTiming := provisionerTimings[i] +// require.Equal(t, genTiming.Resource, timingRes.Resource) +// require.Equal(t, genTiming.Action, timingRes.Action) +// require.Equal(t, string(genTiming.Stage), timingRes.Stage) +// require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String()) +// require.Equal(t, genTiming.Source, timingRes.Source) +// require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) +// require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) +// } +// }) + +// t.Run("AgentScriptTimings", func(t *testing.T) { +// t.Parallel() + +// // When: fetching timings for a build with agent script timings +// build := makeBuild() +// resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ +// JobID: build.JobID, +// }) +// agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ +// ResourceID: resource.ID, +// }) +// script := dbgen.WorkspaceAgentScript(t, db, database.WorkspaceAgentScript{ +// WorkspaceAgentID: agent.ID, +// }) +// agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5) + +// // Then: return a response with the expected timings +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// res, err := client.WorkspaceBuildTimings(ctx, build.ID) +// require.NoError(t, err) +// require.Len(t, res.AgentScriptTimings, 5) + +// for i := range res.AgentScriptTimings { +// timingRes := res.AgentScriptTimings[i] +// genTiming := agentScriptTimings[i] +// require.Equal(t, genTiming.ExitCode, timingRes.ExitCode) +// require.Equal(t, string(genTiming.Status), timingRes.Status) +// require.Equal(t, string(genTiming.Stage), timingRes.Stage) +// require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) +// require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) +// } +// }) + +// t.Run("NoAgentScripts", func(t *testing.T) { +// t.Parallel() + +// // When: fetching timings for a build with no agent scripts +// build := makeBuild() +// resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ +// JobID: build.JobID, +// }) +// dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ +// ResourceID: resource.ID, +// }) + +// // Then: return a response with empty agent script timings +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// res, err := client.WorkspaceBuildTimings(ctx, build.ID) +// require.NoError(t, err) +// require.Empty(t, res.AgentScriptTimings) +// }) + +// // Some workspaces might not have agents. It is improbable, but possible. +// t.Run("NoAgents", func(t *testing.T) { +// t.Parallel() + +// // When: fetching timings for a build with no agents +// build := makeBuild() +// dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ +// JobID: build.JobID, +// }) + +// // Then: return a response with empty agent script timings +// // trigger build +// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) +// t.Cleanup(cancel) +// res, err := client.WorkspaceBuildTimings(ctx, build.ID) +// require.NoError(t, err) +// require.Empty(t, res.AgentScriptTimings) +// }) +// } From 583d1a3bd17a135bb5139f77414e509c70ef1a4c Mon Sep 17 00:00:00 2001 From: defelmnq Date: Mon, 14 Oct 2024 20:58:05 +0000 Subject: [PATCH 4/5] fix: coderd workspace tests --- coderd/workspacebuilds_test.go | 372 +++++++++++++++++---------------- 1 file changed, 187 insertions(+), 185 deletions(-) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index a716658e71772..85a69f988bbcc 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -23,6 +23,8 @@ import ( "github.com/coder/coder/v2/coderd/coderdtest/oidctest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbauthz" + "github.com/coder/coder/v2/coderd/database/dbgen" + "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/coderd/externalauth" "github.com/coder/coder/v2/coderd/rbac" @@ -1181,188 +1183,188 @@ func TestPostWorkspaceBuild(t *testing.T) { }) } -// func TestWorkspaceBuildTimings(t *testing.T) { -// // t.Parallel() - -// // Setup the test environment with a template and version -// db, pubsub := dbtestutil.NewDB(t) -// client := coderdtest.New(t, &coderdtest.Options{ -// Database: db, -// Pubsub: pubsub, -// }) -// owner := coderdtest.CreateFirstUser(t, client) -// file := dbgen.File(t, db, database.File{ -// CreatedBy: owner.UserID, -// }) -// versionJob := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ -// OrganizationID: owner.OrganizationID, -// InitiatorID: owner.UserID, -// FileID: file.ID, -// Tags: database.StringMap{ -// "custom": "true", -// }, -// }) -// version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ -// OrganizationID: owner.OrganizationID, -// JobID: versionJob.ID, -// CreatedBy: owner.UserID, -// }) -// template := dbgen.Template(t, db, database.Template{ -// OrganizationID: owner.OrganizationID, -// ActiveVersionID: version.ID, -// CreatedBy: owner.UserID, -// }) -// ws := dbgen.Workspace(t, db, database.Workspace{ -// OwnerID: owner.UserID, -// OrganizationID: owner.OrganizationID, -// TemplateID: template.ID, -// }) - -// // Create a build to attach timings -// var buildNumber int32 -// makeBuild := func() database.WorkspaceBuild { -// buildNumber++ -// jobID := uuid.New() -// job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ -// ID: jobID, -// OrganizationID: owner.OrganizationID, -// Tags: database.StringMap{jobID.String(): "true"}, -// }) -// return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ -// WorkspaceID: ws.ID, -// TemplateVersionID: version.ID, -// InitiatorID: owner.UserID, -// JobID: job.ID, -// BuildNumber: buildNumber, -// }) -// } - -// t.Run("NonExistentBuild", func(t *testing.T) { -// t.Parallel() - -// // When: fetching an inexistent build -// buildID := uuid.New() -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// _, err := client.WorkspaceBuildTimings(ctx, buildID) - -// // Then: expect a not found error -// require.Error(t, err) -// require.Contains(t, err.Error(), "not found") -// }) - -// t.Run("EmptyTimings", func(t *testing.T) { -// t.Parallel() - -// // When: fetching timings for a build with no timings -// build := makeBuild() -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// res, err := client.WorkspaceBuildTimings(ctx, build.ID) - -// // Then: return a response with empty timings -// require.NoError(t, err) -// require.Empty(t, res.ProvisionerTimings) -// require.Empty(t, res.AgentScriptTimings) -// }) - -// t.Run("ProvisionerTimings", func(t *testing.T) { -// t.Parallel() - -// // When: fetching timings for a build with provisioner timings -// build := makeBuild() -// provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5) - -// // Then: return a response with the expected timings -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// res, err := client.WorkspaceBuildTimings(ctx, build.ID) -// require.NoError(t, err) -// require.Len(t, res.ProvisionerTimings, 5) - -// for i := range res.ProvisionerTimings { -// timingRes := res.ProvisionerTimings[i] -// genTiming := provisionerTimings[i] -// require.Equal(t, genTiming.Resource, timingRes.Resource) -// require.Equal(t, genTiming.Action, timingRes.Action) -// require.Equal(t, string(genTiming.Stage), timingRes.Stage) -// require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String()) -// require.Equal(t, genTiming.Source, timingRes.Source) -// require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) -// require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) -// } -// }) - -// t.Run("AgentScriptTimings", func(t *testing.T) { -// t.Parallel() - -// // When: fetching timings for a build with agent script timings -// build := makeBuild() -// resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ -// JobID: build.JobID, -// }) -// agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ -// ResourceID: resource.ID, -// }) -// script := dbgen.WorkspaceAgentScript(t, db, database.WorkspaceAgentScript{ -// WorkspaceAgentID: agent.ID, -// }) -// agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5) - -// // Then: return a response with the expected timings -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// res, err := client.WorkspaceBuildTimings(ctx, build.ID) -// require.NoError(t, err) -// require.Len(t, res.AgentScriptTimings, 5) - -// for i := range res.AgentScriptTimings { -// timingRes := res.AgentScriptTimings[i] -// genTiming := agentScriptTimings[i] -// require.Equal(t, genTiming.ExitCode, timingRes.ExitCode) -// require.Equal(t, string(genTiming.Status), timingRes.Status) -// require.Equal(t, string(genTiming.Stage), timingRes.Stage) -// require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) -// require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) -// } -// }) - -// t.Run("NoAgentScripts", func(t *testing.T) { -// t.Parallel() - -// // When: fetching timings for a build with no agent scripts -// build := makeBuild() -// resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ -// JobID: build.JobID, -// }) -// dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ -// ResourceID: resource.ID, -// }) - -// // Then: return a response with empty agent script timings -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// res, err := client.WorkspaceBuildTimings(ctx, build.ID) -// require.NoError(t, err) -// require.Empty(t, res.AgentScriptTimings) -// }) - -// // Some workspaces might not have agents. It is improbable, but possible. -// t.Run("NoAgents", func(t *testing.T) { -// t.Parallel() - -// // When: fetching timings for a build with no agents -// build := makeBuild() -// dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ -// JobID: build.JobID, -// }) - -// // Then: return a response with empty agent script timings -// // trigger build -// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) -// t.Cleanup(cancel) -// res, err := client.WorkspaceBuildTimings(ctx, build.ID) -// require.NoError(t, err) -// require.Empty(t, res.AgentScriptTimings) -// }) -// } +func TestWorkspaceBuildTimings(t *testing.T) { + // t.Parallel() + + // Setup the test environment with a template and version + db, pubsub := dbtestutil.NewDB(t) + client := coderdtest.New(t, &coderdtest.Options{ + Database: db, + Pubsub: pubsub, + }) + owner := coderdtest.CreateFirstUser(t, client) + file := dbgen.File(t, db, database.File{ + CreatedBy: owner.UserID, + }) + versionJob := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ + OrganizationID: owner.OrganizationID, + InitiatorID: owner.UserID, + FileID: file.ID, + Tags: database.StringMap{ + "custom": "true", + }, + }) + version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + OrganizationID: owner.OrganizationID, + JobID: versionJob.ID, + CreatedBy: owner.UserID, + }) + template := dbgen.Template(t, db, database.Template{ + OrganizationID: owner.OrganizationID, + ActiveVersionID: version.ID, + CreatedBy: owner.UserID, + }) + ws := dbgen.Workspace(t, db, database.Workspace{ + OwnerID: owner.UserID, + OrganizationID: owner.OrganizationID, + TemplateID: template.ID, + }) + + // Create a build to attach timings + var buildNumber int32 + makeBuild := func() database.WorkspaceBuild { + buildNumber++ + jobID := uuid.New() + job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ + ID: jobID, + OrganizationID: owner.OrganizationID, + Tags: database.StringMap{jobID.String(): "true"}, + }) + return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + WorkspaceID: ws.ID, + TemplateVersionID: version.ID, + InitiatorID: owner.UserID, + JobID: job.ID, + BuildNumber: buildNumber, + }) + } + + t.Run("NonExistentBuild", func(t *testing.T) { + // t.Parallel() + + // When: fetching an inexistent build + buildID := uuid.New() + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + _, err := client.WorkspaceBuildTimings(ctx, buildID) + + // Then: expect a not found error + require.Error(t, err) + require.Contains(t, err.Error(), "not found") + }) + + t.Run("EmptyTimings", func(t *testing.T) { + // t.Parallel() + + // When: fetching timings for a build with no timings + build := makeBuild() + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + res, err := client.WorkspaceBuildTimings(ctx, build.ID) + + // Then: return a response with empty timings + require.NoError(t, err) + require.Empty(t, res.ProvisionerTimings) + require.Empty(t, res.AgentScriptTimings) + }) + + t.Run("ProvisionerTimings", func(t *testing.T) { + // t.Parallel() + + // When: fetching timings for a build with provisioner timings + build := makeBuild() + provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5) + + // Then: return a response with the expected timings + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + res, err := client.WorkspaceBuildTimings(ctx, build.ID) + require.NoError(t, err) + require.Len(t, res.ProvisionerTimings, 5) + + for i := range res.ProvisionerTimings { + timingRes := res.ProvisionerTimings[i] + genTiming := provisionerTimings[i] + require.Equal(t, genTiming.Resource, timingRes.Resource) + require.Equal(t, genTiming.Action, timingRes.Action) + require.Equal(t, string(genTiming.Stage), timingRes.Stage) + require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String()) + require.Equal(t, genTiming.Source, timingRes.Source) + require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) + require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) + } + }) + + t.Run("AgentScriptTimings", func(t *testing.T) { + // t.Parallel() + + // When: fetching timings for a build with agent script timings + build := makeBuild() + resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ + JobID: build.JobID, + }) + agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ + ResourceID: resource.ID, + }) + script := dbgen.WorkspaceAgentScript(t, db, database.WorkspaceAgentScript{ + WorkspaceAgentID: agent.ID, + }) + agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5) + + // Then: return a response with the expected timings + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + res, err := client.WorkspaceBuildTimings(ctx, build.ID) + require.NoError(t, err) + require.Len(t, res.AgentScriptTimings, 5) + + for i := range res.AgentScriptTimings { + timingRes := res.AgentScriptTimings[i] + genTiming := agentScriptTimings[i] + require.Equal(t, genTiming.ExitCode, timingRes.ExitCode) + require.Equal(t, string(genTiming.Status), timingRes.Status) + require.Equal(t, string(genTiming.Stage), timingRes.Stage) + require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) + require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) + } + }) + + t.Run("NoAgentScripts", func(t *testing.T) { + // t.Parallel() + + // When: fetching timings for a build with no agent scripts + build := makeBuild() + resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ + JobID: build.JobID, + }) + dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ + ResourceID: resource.ID, + }) + + // Then: return a response with empty agent script timings + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + res, err := client.WorkspaceBuildTimings(ctx, build.ID) + require.NoError(t, err) + require.Empty(t, res.AgentScriptTimings) + }) + + // Some workspaces might not have agents. It is improbable, but possible. + t.Run("NoAgents", func(t *testing.T) { + // t.Parallel() + + // When: fetching timings for a build with no agents + build := makeBuild() + dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ + JobID: build.JobID, + }) + + // Then: return a response with empty agent script timings + // trigger build + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + t.Cleanup(cancel) + res, err := client.WorkspaceBuildTimings(ctx, build.ID) + require.NoError(t, err) + require.Empty(t, res.AgentScriptTimings) + }) +} From deeb1018c6b4d7f77e39a05264dc2c4772ec2155 Mon Sep 17 00:00:00 2001 From: defelmnq Date: Tue, 15 Oct 2024 00:06:59 +0000 Subject: [PATCH 5/5] fix: coderd workspace tests --- coderd/workspacebuilds_test.go | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index 85a69f988bbcc..f5b19681d49f9 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -1183,9 +1183,8 @@ func TestPostWorkspaceBuild(t *testing.T) { }) } +//nolint:paralleltest func TestWorkspaceBuildTimings(t *testing.T) { - // t.Parallel() - // Setup the test environment with a template and version db, pubsub := dbtestutil.NewDB(t) client := coderdtest.New(t, &coderdtest.Options{ @@ -1239,9 +1238,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { }) } + //nolint:paralleltest t.Run("NonExistentBuild", func(t *testing.T) { - // t.Parallel() - // When: fetching an inexistent build buildID := uuid.New() ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) @@ -1253,9 +1251,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { require.Contains(t, err.Error(), "not found") }) + //nolint:paralleltest t.Run("EmptyTimings", func(t *testing.T) { - // t.Parallel() - // When: fetching timings for a build with no timings build := makeBuild() ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) @@ -1268,9 +1265,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { require.Empty(t, res.AgentScriptTimings) }) + //nolint:paralleltest t.Run("ProvisionerTimings", func(t *testing.T) { - // t.Parallel() - // When: fetching timings for a build with provisioner timings build := makeBuild() provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5) @@ -1295,9 +1291,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { } }) + //nolint:paralleltest t.Run("AgentScriptTimings", func(t *testing.T) { - // t.Parallel() - // When: fetching timings for a build with agent script timings build := makeBuild() resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ @@ -1329,9 +1324,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { } }) + //nolint:paralleltest t.Run("NoAgentScripts", func(t *testing.T) { - // t.Parallel() - // When: fetching timings for a build with no agent scripts build := makeBuild() resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ @@ -1350,9 +1344,8 @@ func TestWorkspaceBuildTimings(t *testing.T) { }) // Some workspaces might not have agents. It is improbable, but possible. + //nolint:paralleltest t.Run("NoAgents", func(t *testing.T) { - // t.Parallel() - // When: fetching timings for a build with no agents build := makeBuild() dbgen.WorkspaceResource(t, db, database.WorkspaceResource{