From da01979af188f67ead481ca7c691fc6a27794131 Mon Sep 17 00:00:00 2001 From: evgeniy-scherbina Date: Thu, 24 Apr 2025 20:14:40 +0000 Subject: [PATCH 1/5] refactor: claim prebuilds test --- enterprise/coderd/prebuilds/claim_test.go | 255 ++++++---------------- 1 file changed, 72 insertions(+), 183 deletions(-) diff --git a/enterprise/coderd/prebuilds/claim_test.go b/enterprise/coderd/prebuilds/claim_test.go index 4f398724b8265..f501aaffc49f8 100644 --- a/enterprise/coderd/prebuilds/claim_test.go +++ b/enterprise/coderd/prebuilds/claim_test.go @@ -3,6 +3,7 @@ package prebuilds_test import ( "context" "database/sql" + "errors" "slices" "strings" "sync/atomic" @@ -28,6 +29,13 @@ import ( "github.com/coder/coder/v2/testutil" ) +type storeType int + +const ( + spyStoreType storeType = iota + errorStoreType +) + type storeSpy struct { database.Store @@ -105,17 +113,36 @@ func TestClaimPrebuild(t *testing.T) { presetCount = 2 ) + var unexpectedClaimingError = xerrors.New("unexpected claiming error") + cases := map[string]struct { expectPrebuildClaimed bool markPrebuildsClaimable bool + storeType storeType + storeError error // should be set only for errorStoreType }{ "no eligible prebuilds to claim": { expectPrebuildClaimed: false, markPrebuildsClaimable: false, + storeType: spyStoreType, }, "claiming an eligible prebuild should succeed": { expectPrebuildClaimed: true, markPrebuildsClaimable: true, + storeType: spyStoreType, + }, + + "no claimable prebuilt workspaces error is returned": { + expectPrebuildClaimed: false, + markPrebuildsClaimable: true, + storeType: errorStoreType, + storeError: agplprebuilds.ErrNoClaimablePrebuiltWorkspaces, + }, + "unexpected claiming error is returned": { + expectPrebuildClaimed: false, + markPrebuildsClaimable: true, + storeType: errorStoreType, + storeError: unexpectedClaimingError, }, } @@ -128,22 +155,31 @@ func TestClaimPrebuild(t *testing.T) { // Setup. ctx := testutil.Context(t, testutil.WaitSuperLong) db, pubsub := dbtestutil.NewDB(t) - spy := newStoreSpy(db) + + var wrappedStore database.Store + switch tc.storeType { + case spyStoreType: + wrappedStore = newStoreSpy(db) + case errorStoreType: + wrappedStore = newErrorStore(db, tc.storeError) + default: + t.Fatal("unknown store type") + } expectedPrebuildsCount := desiredInstances * presetCount logger := testutil.Logger(t) client, _, api, owner := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ Options: &coderdtest.Options{ IncludeProvisionerDaemon: true, - Database: spy, + Database: wrappedStore, Pubsub: pubsub, }, EntitlementsUpdateInterval: time.Second, }) - reconciler := prebuilds.NewStoreReconciler(spy, pubsub, codersdk.PrebuildsConfig{}, logger, quartz.NewMock(t)) - var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(spy) + reconciler := prebuilds.NewStoreReconciler(wrappedStore, pubsub, codersdk.PrebuildsConfig{}, logger, quartz.NewMock(t)) + var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(wrappedStore) api.AGPL.PrebuildsClaimer.Store(&claimer) version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, templateWithAgentAndPresetsWithPrebuilds(desiredInstances)) @@ -156,7 +192,7 @@ func TestClaimPrebuild(t *testing.T) { userClient, user := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleMember()) // Given: the reconciliation state is snapshot. - state, err := reconciler.SnapshotState(ctx, spy) + state, err := reconciler.SnapshotState(ctx, wrappedStore) require.NoError(t, err) require.Len(t, state.Presets, presetCount) @@ -175,7 +211,7 @@ func TestClaimPrebuild(t *testing.T) { // Given: a set of running, eligible prebuilds eventually starts up. runningPrebuilds := make(map[uuid.UUID]database.GetRunningPrebuiltWorkspacesRow, desiredInstances*presetCount) require.Eventually(t, func() bool { - rows, err := spy.GetRunningPrebuiltWorkspaces(ctx) + rows, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) if err != nil { return false } @@ -224,8 +260,36 @@ func TestClaimPrebuild(t *testing.T) { TemplateVersionPresetID: presets[0].ID, }) - require.NoError(t, err) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) + switch { + case tc.storeType == errorStoreType && errors.Is(tc.storeError, agplprebuilds.ErrNoClaimablePrebuiltWorkspaces): + require.NoError(t, err) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) + + // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed and we fallback to creating new workspace. + currentPrebuilds, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) + require.NoError(t, err) + require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) + return + + case tc.storeType == errorStoreType && errors.Is(tc.storeError, unexpectedClaimingError): + // Then: unexpected error happened and was propagated all the way to the caller + require.Error(t, err) + require.ErrorContains(t, err, unexpectedClaimingError.Error()) + + // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed. + currentPrebuilds, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) + require.NoError(t, err) + require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) + return + + default: + // tc.storeType == spyStoreType scenario + require.NoError(t, err) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) + } + + // at this point we know that wrappedStore has *storeSpy type + spy := wrappedStore.(*storeSpy) // Then: a prebuild should have been claimed. require.EqualValues(t, spy.claims.Load(), 1) @@ -314,181 +378,6 @@ func TestClaimPrebuild(t *testing.T) { } } -func TestClaimPrebuild_CheckDifferentErrors(t *testing.T) { - t.Parallel() - - if !dbtestutil.WillUsePostgres() { - t.Skip("This test requires postgres") - } - - const ( - desiredInstances = 1 - presetCount = 2 - - expectedPrebuildsCount = desiredInstances * presetCount - ) - - cases := map[string]struct { - claimingErr error - checkFn func( - t *testing.T, - ctx context.Context, - store database.Store, - userClient *codersdk.Client, - user codersdk.User, - templateVersionID uuid.UUID, - presetID uuid.UUID, - ) - }{ - "ErrNoClaimablePrebuiltWorkspaces is returned": { - claimingErr: agplprebuilds.ErrNoClaimablePrebuiltWorkspaces, - checkFn: func( - t *testing.T, - ctx context.Context, - store database.Store, - userClient *codersdk.Client, - user codersdk.User, - templateVersionID uuid.UUID, - presetID uuid.UUID, - ) { - // When: a user creates a new workspace with a preset for which prebuilds are configured. - workspaceName := strings.ReplaceAll(testutil.GetRandomName(t), "_", "-") - userWorkspace, err := userClient.CreateUserWorkspace(ctx, user.Username, codersdk.CreateWorkspaceRequest{ - TemplateVersionID: templateVersionID, - Name: workspaceName, - TemplateVersionPresetID: presetID, - }) - - require.NoError(t, err) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) - - // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed and we fallback to creating new workspace. - currentPrebuilds, err := store.GetRunningPrebuiltWorkspaces(ctx) - require.NoError(t, err) - require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) - }, - }, - "unexpected error during claim is returned": { - claimingErr: xerrors.New("unexpected error during claim"), - checkFn: func( - t *testing.T, - ctx context.Context, - store database.Store, - userClient *codersdk.Client, - user codersdk.User, - templateVersionID uuid.UUID, - presetID uuid.UUID, - ) { - // When: a user creates a new workspace with a preset for which prebuilds are configured. - workspaceName := strings.ReplaceAll(testutil.GetRandomName(t), "_", "-") - _, err := userClient.CreateUserWorkspace(ctx, user.Username, codersdk.CreateWorkspaceRequest{ - TemplateVersionID: templateVersionID, - Name: workspaceName, - TemplateVersionPresetID: presetID, - }) - - // Then: unexpected error happened and was propagated all the way to the caller - require.Error(t, err) - require.ErrorContains(t, err, "unexpected error during claim") - - // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed. - currentPrebuilds, err := store.GetRunningPrebuiltWorkspaces(ctx) - require.NoError(t, err) - require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) - }, - }, - } - - for name, tc := range cases { - t.Run(name, func(t *testing.T) { - t.Parallel() - - // Setup. - ctx := testutil.Context(t, testutil.WaitSuperLong) - db, pubsub := dbtestutil.NewDB(t) - errorStore := newErrorStore(db, tc.claimingErr) - - logger := testutil.Logger(t) - client, _, api, owner := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ - Options: &coderdtest.Options{ - IncludeProvisionerDaemon: true, - Database: errorStore, - Pubsub: pubsub, - }, - - EntitlementsUpdateInterval: time.Second, - }) - - reconciler := prebuilds.NewStoreReconciler(errorStore, pubsub, codersdk.PrebuildsConfig{}, logger, quartz.NewMock(t)) - var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(errorStore) - api.AGPL.PrebuildsClaimer.Store(&claimer) - - version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, templateWithAgentAndPresetsWithPrebuilds(desiredInstances)) - _ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - presets, err := client.TemplateVersionPresets(ctx, version.ID) - require.NoError(t, err) - require.Len(t, presets, presetCount) - - userClient, user := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleMember()) - - // Given: the reconciliation state is snapshot. - state, err := reconciler.SnapshotState(ctx, errorStore) - require.NoError(t, err) - require.Len(t, state.Presets, presetCount) - - // When: a reconciliation is setup for each preset. - for _, preset := range presets { - ps, err := state.FilterByPreset(preset.ID) - require.NoError(t, err) - require.NotNil(t, ps) - actions, err := reconciler.CalculateActions(ctx, *ps) - require.NoError(t, err) - require.NotNil(t, actions) - - require.NoError(t, reconciler.ReconcilePreset(ctx, *ps)) - } - - // Given: a set of running, eligible prebuilds eventually starts up. - runningPrebuilds := make(map[uuid.UUID]database.GetRunningPrebuiltWorkspacesRow, desiredInstances*presetCount) - require.Eventually(t, func() bool { - rows, err := errorStore.GetRunningPrebuiltWorkspaces(ctx) - if err != nil { - return false - } - - for _, row := range rows { - runningPrebuilds[row.CurrentPresetID.UUID] = row - - agents, err := db.GetWorkspaceAgentsInLatestBuildByWorkspaceID(ctx, row.ID) - if err != nil { - return false - } - - // Workspaces are eligible once its agent is marked "ready". - for _, agent := range agents { - err = db.UpdateWorkspaceAgentLifecycleStateByID(ctx, database.UpdateWorkspaceAgentLifecycleStateByIDParams{ - ID: agent.ID, - LifecycleState: database.WorkspaceAgentLifecycleStateReady, - StartedAt: sql.NullTime{Time: time.Now().Add(time.Hour), Valid: true}, - ReadyAt: sql.NullTime{Time: time.Now().Add(-1 * time.Hour), Valid: true}, - }) - if err != nil { - return false - } - } - } - - t.Logf("found %d running prebuilds so far, want %d", len(runningPrebuilds), expectedPrebuildsCount) - - return len(runningPrebuilds) == expectedPrebuildsCount - }, testutil.WaitSuperLong, testutil.IntervalSlow) - - tc.checkFn(t, ctx, errorStore, userClient, user, version.ID, presets[0].ID) - }) - } -} - func templateWithAgentAndPresetsWithPrebuilds(desiredInstances int32) *echo.Responses { return &echo.Responses{ Parse: echo.ParseComplete, From 60c29d13e0845a59890b777146558ffc998ecff2 Mon Sep 17 00:00:00 2001 From: evgeniy-scherbina Date: Thu, 24 Apr 2025 20:30:46 +0000 Subject: [PATCH 2/5] refactor: make fmt --- enterprise/coderd/prebuilds/claim_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enterprise/coderd/prebuilds/claim_test.go b/enterprise/coderd/prebuilds/claim_test.go index f501aaffc49f8..99913a80620d1 100644 --- a/enterprise/coderd/prebuilds/claim_test.go +++ b/enterprise/coderd/prebuilds/claim_test.go @@ -113,7 +113,7 @@ func TestClaimPrebuild(t *testing.T) { presetCount = 2 ) - var unexpectedClaimingError = xerrors.New("unexpected claiming error") + unexpectedClaimingError := xerrors.New("unexpected claiming error") cases := map[string]struct { expectPrebuildClaimed bool From c3b57cfc9832084246ae287e2622928a740e40b3 Mon Sep 17 00:00:00 2001 From: evgeniy-scherbina Date: Mon, 28 Apr 2025 13:03:33 +0000 Subject: [PATCH 3/5] refactor: simplify prebuild claiming test --- enterprise/coderd/prebuilds/claim_test.go | 65 +++++------------------ 1 file changed, 13 insertions(+), 52 deletions(-) diff --git a/enterprise/coderd/prebuilds/claim_test.go b/enterprise/coderd/prebuilds/claim_test.go index a8116fda017fc..d0c4fad2e2eab 100644 --- a/enterprise/coderd/prebuilds/claim_test.go +++ b/enterprise/coderd/prebuilds/claim_test.go @@ -30,34 +30,30 @@ import ( "github.com/coder/coder/v2/testutil" ) -type storeType int - -const ( - spyStoreType storeType = iota - errorStoreType -) - type storeSpy struct { database.Store claims *atomic.Int32 claimParams *atomic.Pointer[database.ClaimPrebuiltWorkspaceParams] claimedWorkspace *atomic.Pointer[database.ClaimPrebuiltWorkspaceRow] + + claimingErr error } -func newStoreSpy(db database.Store) *storeSpy { +func newStoreSpy(db database.Store, claimingErr error) *storeSpy { return &storeSpy{ Store: db, claims: &atomic.Int32{}, claimParams: &atomic.Pointer[database.ClaimPrebuiltWorkspaceParams]{}, claimedWorkspace: &atomic.Pointer[database.ClaimPrebuiltWorkspaceRow]{}, + claimingErr: claimingErr, } } func (m *storeSpy) InTx(fn func(store database.Store) error, opts *database.TxOptions) error { // Pass spy down into transaction store. return m.Store.InTx(func(store database.Store) error { - spy := newStoreSpy(store) + spy := newStoreSpy(store, m.claimingErr) spy.claims = m.claims spy.claimParams = m.claimParams spy.claimedWorkspace = m.claimedWorkspace @@ -67,6 +63,10 @@ func (m *storeSpy) InTx(fn func(store database.Store) error, opts *database.TxOp } func (m *storeSpy) ClaimPrebuiltWorkspace(ctx context.Context, arg database.ClaimPrebuiltWorkspaceParams) (database.ClaimPrebuiltWorkspaceRow, error) { + if m.claimingErr != nil { + return database.ClaimPrebuiltWorkspaceRow{}, m.claimingErr + } + m.claims.Add(1) m.claimParams.Store(&arg) result, err := m.Store.ClaimPrebuiltWorkspace(ctx, arg) @@ -76,32 +76,6 @@ func (m *storeSpy) ClaimPrebuiltWorkspace(ctx context.Context, arg database.Clai return result, err } -type errorStore struct { - claimingErr error - - database.Store -} - -func newErrorStore(db database.Store, claimingErr error) *errorStore { - return &errorStore{ - Store: db, - claimingErr: claimingErr, - } -} - -func (es *errorStore) InTx(fn func(store database.Store) error, opts *database.TxOptions) error { - // Pass failure store down into transaction store. - return es.Store.InTx(func(store database.Store) error { - newES := newErrorStore(store, es.claimingErr) - - return fn(newES) - }, opts) -} - -func (es *errorStore) ClaimPrebuiltWorkspace(ctx context.Context, arg database.ClaimPrebuiltWorkspaceParams) (database.ClaimPrebuiltWorkspaceRow, error) { - return database.ClaimPrebuiltWorkspaceRow{}, es.claimingErr -} - func TestClaimPrebuild(t *testing.T) { t.Parallel() @@ -119,30 +93,25 @@ func TestClaimPrebuild(t *testing.T) { cases := map[string]struct { expectPrebuildClaimed bool markPrebuildsClaimable bool - storeType storeType storeError error // should be set only for errorStoreType }{ "no eligible prebuilds to claim": { expectPrebuildClaimed: false, markPrebuildsClaimable: false, - storeType: spyStoreType, }, "claiming an eligible prebuild should succeed": { expectPrebuildClaimed: true, markPrebuildsClaimable: true, - storeType: spyStoreType, }, "no claimable prebuilt workspaces error is returned": { expectPrebuildClaimed: false, markPrebuildsClaimable: true, - storeType: errorStoreType, storeError: agplprebuilds.ErrNoClaimablePrebuiltWorkspaces, }, "unexpected claiming error is returned": { expectPrebuildClaimed: false, markPrebuildsClaimable: true, - storeType: errorStoreType, storeError: unexpectedClaimingError, }, } @@ -157,15 +126,7 @@ func TestClaimPrebuild(t *testing.T) { ctx := testutil.Context(t, testutil.WaitSuperLong) db, pubsub := dbtestutil.NewDB(t) - var wrappedStore database.Store - switch tc.storeType { - case spyStoreType: - wrappedStore = newStoreSpy(db) - case errorStoreType: - wrappedStore = newErrorStore(db, tc.storeError) - default: - t.Fatal("unknown store type") - } + wrappedStore := newStoreSpy(db, tc.storeError) expectedPrebuildsCount := desiredInstances * presetCount logger := testutil.Logger(t) @@ -262,7 +223,7 @@ func TestClaimPrebuild(t *testing.T) { }) switch { - case tc.storeType == errorStoreType && errors.Is(tc.storeError, agplprebuilds.ErrNoClaimablePrebuiltWorkspaces): + case tc.storeError != nil && errors.Is(tc.storeError, agplprebuilds.ErrNoClaimablePrebuiltWorkspaces): require.NoError(t, err) coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) @@ -272,7 +233,7 @@ func TestClaimPrebuild(t *testing.T) { require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) return - case tc.storeType == errorStoreType && errors.Is(tc.storeError, unexpectedClaimingError): + case tc.storeError != nil && errors.Is(tc.storeError, unexpectedClaimingError): // Then: unexpected error happened and was propagated all the way to the caller require.Error(t, err) require.ErrorContains(t, err, unexpectedClaimingError.Error()) @@ -290,7 +251,7 @@ func TestClaimPrebuild(t *testing.T) { } // at this point we know that wrappedStore has *storeSpy type - spy := wrappedStore.(*storeSpy) + spy := wrappedStore // Then: a prebuild should have been claimed. require.EqualValues(t, spy.claims.Load(), 1) From 3764adb5b7efd9191b23b61533ca16ef2f6415d9 Mon Sep 17 00:00:00 2001 From: evgeniy-scherbina Date: Mon, 28 Apr 2025 13:59:32 +0000 Subject: [PATCH 4/5] refactor: minor refactoring --- enterprise/coderd/prebuilds/claim_test.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/enterprise/coderd/prebuilds/claim_test.go b/enterprise/coderd/prebuilds/claim_test.go index d0c4fad2e2eab..fac75e1234bdf 100644 --- a/enterprise/coderd/prebuilds/claim_test.go +++ b/enterprise/coderd/prebuilds/claim_test.go @@ -126,22 +126,22 @@ func TestClaimPrebuild(t *testing.T) { ctx := testutil.Context(t, testutil.WaitSuperLong) db, pubsub := dbtestutil.NewDB(t) - wrappedStore := newStoreSpy(db, tc.storeError) + spy := newStoreSpy(db, tc.storeError) expectedPrebuildsCount := desiredInstances * presetCount logger := testutil.Logger(t) client, _, api, owner := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ Options: &coderdtest.Options{ IncludeProvisionerDaemon: true, - Database: wrappedStore, + Database: spy, Pubsub: pubsub, }, EntitlementsUpdateInterval: time.Second, }) - reconciler := prebuilds.NewStoreReconciler(wrappedStore, pubsub, codersdk.PrebuildsConfig{}, logger, quartz.NewMock(t), prometheus.NewRegistry()) - var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(wrappedStore) + reconciler := prebuilds.NewStoreReconciler(spy, pubsub, codersdk.PrebuildsConfig{}, logger, quartz.NewMock(t), prometheus.NewRegistry()) + var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(spy) api.AGPL.PrebuildsClaimer.Store(&claimer) version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, templateWithAgentAndPresetsWithPrebuilds(desiredInstances)) @@ -154,7 +154,7 @@ func TestClaimPrebuild(t *testing.T) { userClient, user := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleMember()) // Given: the reconciliation state is snapshot. - state, err := reconciler.SnapshotState(ctx, wrappedStore) + state, err := reconciler.SnapshotState(ctx, spy) require.NoError(t, err) require.Len(t, state.Presets, presetCount) @@ -173,7 +173,7 @@ func TestClaimPrebuild(t *testing.T) { // Given: a set of running, eligible prebuilds eventually starts up. runningPrebuilds := make(map[uuid.UUID]database.GetRunningPrebuiltWorkspacesRow, desiredInstances*presetCount) require.Eventually(t, func() bool { - rows, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) + rows, err := spy.GetRunningPrebuiltWorkspaces(ctx) if err != nil { return false } @@ -228,7 +228,7 @@ func TestClaimPrebuild(t *testing.T) { coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed and we fallback to creating new workspace. - currentPrebuilds, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) + currentPrebuilds, err := spy.GetRunningPrebuiltWorkspaces(ctx) require.NoError(t, err) require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) return @@ -239,7 +239,7 @@ func TestClaimPrebuild(t *testing.T) { require.ErrorContains(t, err, unexpectedClaimingError.Error()) // Then: the number of running prebuilds hasn't changed because claiming prebuild is failed. - currentPrebuilds, err := wrappedStore.GetRunningPrebuiltWorkspaces(ctx) + currentPrebuilds, err := spy.GetRunningPrebuiltWorkspaces(ctx) require.NoError(t, err) require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) return @@ -251,7 +251,6 @@ func TestClaimPrebuild(t *testing.T) { } // at this point we know that wrappedStore has *storeSpy type - spy := wrappedStore // Then: a prebuild should have been claimed. require.EqualValues(t, spy.claims.Load(), 1) From a91b915ff3c66291f9edf72bc903b6ecda33702c Mon Sep 17 00:00:00 2001 From: evgeniy-scherbina Date: Mon, 28 Apr 2025 14:37:00 +0000 Subject: [PATCH 5/5] refactor: minor refactoring --- enterprise/coderd/prebuilds/claim_test.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/enterprise/coderd/prebuilds/claim_test.go b/enterprise/coderd/prebuilds/claim_test.go index fac75e1234bdf..5d75b7463471d 100644 --- a/enterprise/coderd/prebuilds/claim_test.go +++ b/enterprise/coderd/prebuilds/claim_test.go @@ -37,6 +37,7 @@ type storeSpy struct { claimParams *atomic.Pointer[database.ClaimPrebuiltWorkspaceParams] claimedWorkspace *atomic.Pointer[database.ClaimPrebuiltWorkspaceRow] + // if claimingErr is not nil - error will be returned when ClaimPrebuiltWorkspace is called claimingErr error } @@ -93,7 +94,8 @@ func TestClaimPrebuild(t *testing.T) { cases := map[string]struct { expectPrebuildClaimed bool markPrebuildsClaimable bool - storeError error // should be set only for errorStoreType + // if claimingErr is not nil - error will be returned when ClaimPrebuiltWorkspace is called + claimingErr error }{ "no eligible prebuilds to claim": { expectPrebuildClaimed: false, @@ -107,12 +109,12 @@ func TestClaimPrebuild(t *testing.T) { "no claimable prebuilt workspaces error is returned": { expectPrebuildClaimed: false, markPrebuildsClaimable: true, - storeError: agplprebuilds.ErrNoClaimablePrebuiltWorkspaces, + claimingErr: agplprebuilds.ErrNoClaimablePrebuiltWorkspaces, }, "unexpected claiming error is returned": { expectPrebuildClaimed: false, markPrebuildsClaimable: true, - storeError: unexpectedClaimingError, + claimingErr: unexpectedClaimingError, }, } @@ -126,7 +128,7 @@ func TestClaimPrebuild(t *testing.T) { ctx := testutil.Context(t, testutil.WaitSuperLong) db, pubsub := dbtestutil.NewDB(t) - spy := newStoreSpy(db, tc.storeError) + spy := newStoreSpy(db, tc.claimingErr) expectedPrebuildsCount := desiredInstances * presetCount logger := testutil.Logger(t) @@ -223,7 +225,7 @@ func TestClaimPrebuild(t *testing.T) { }) switch { - case tc.storeError != nil && errors.Is(tc.storeError, agplprebuilds.ErrNoClaimablePrebuiltWorkspaces): + case tc.claimingErr != nil && errors.Is(tc.claimingErr, agplprebuilds.ErrNoClaimablePrebuiltWorkspaces): require.NoError(t, err) coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) @@ -233,7 +235,7 @@ func TestClaimPrebuild(t *testing.T) { require.Equal(t, expectedPrebuildsCount, len(currentPrebuilds)) return - case tc.storeError != nil && errors.Is(tc.storeError, unexpectedClaimingError): + case tc.claimingErr != nil && errors.Is(tc.claimingErr, unexpectedClaimingError): // Then: unexpected error happened and was propagated all the way to the caller require.Error(t, err) require.ErrorContains(t, err, unexpectedClaimingError.Error()) @@ -245,12 +247,12 @@ func TestClaimPrebuild(t *testing.T) { return default: - // tc.storeType == spyStoreType scenario + // tc.claimingErr is nil scenario require.NoError(t, err) coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, userWorkspace.LatestBuild.ID) } - // at this point we know that wrappedStore has *storeSpy type + // at this point we know that tc.claimingErr is nil // Then: a prebuild should have been claimed. require.EqualValues(t, spy.claims.Load(), 1)