Skip to content

Commit 416d39e

Browse files
committed
add a test for locking
1 parent 62357a7 commit 416d39e

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

enterprise/coderd/workspaces_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,78 @@ func TestWorkspaceAutobuild(t *testing.T) {
508508
require.Equal(t, http.StatusGone, cerr.StatusCode())
509509
})
510510

511+
t.Run("LockedTTTooEarly", func(t *testing.T) {
512+
t.Parallel()
513+
514+
var (
515+
ticker = make(chan time.Time)
516+
statCh = make(chan autobuild.Stats)
517+
lockedTTL = time.Minute
518+
519+
client = coderdenttest.New(t, &coderdenttest.Options{
520+
Options: &coderdtest.Options{
521+
AutobuildTicker: ticker,
522+
IncludeProvisionerDaemon: true,
523+
AutobuildStats: statCh,
524+
TemplateScheduleStore: &coderd.EnterpriseTemplateScheduleStore{},
525+
},
526+
})
527+
)
528+
user := coderdtest.CreateFirstUser(t, client)
529+
_ = coderdenttest.AddFullLicense(t, client)
530+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
531+
Parse: echo.ParseComplete,
532+
ProvisionPlan: echo.ProvisionComplete,
533+
ProvisionApply: echo.ProvisionComplete,
534+
})
535+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
536+
ctr.LockedTTLMillis = ptr.Ref[int64](lockedTTL.Milliseconds())
537+
})
538+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
539+
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
540+
build := coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
541+
require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status)
542+
543+
ctx := testutil.Context(t, testutil.WaitMedium)
544+
err := client.UpdateWorkspaceLock(ctx, ws.ID, codersdk.UpdateWorkspaceLock{
545+
Lock: true,
546+
})
547+
require.NoError(t, err)
548+
549+
ws = coderdtest.MustWorkspace(t, client, ws.ID)
550+
require.NotNil(t, ws.LockedAt)
551+
552+
ticker <- time.Now()
553+
stats := <-statCh
554+
// Expect no transitions since not enough time has elapsed.
555+
require.Len(t, stats.Transitions, 0)
556+
557+
// Update the lock time to trigger a deletion.
558+
lockedTTL = time.Millisecond
559+
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
560+
Name: template.Name,
561+
DisplayName: template.DisplayName,
562+
Description: template.Description,
563+
Icon: template.Icon,
564+
AllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
565+
LockedTTLMillis: lockedTTL.Milliseconds(),
566+
})
567+
require.NoError(t, err)
568+
569+
// Wait for the workspace to breach the locked threshold.
570+
require.Eventually(t,
571+
func() bool {
572+
return database.Now().Sub(*ws.LockedAt) > lockedTTL
573+
},
574+
testutil.IntervalMedium, testutil.IntervalFast)
575+
576+
ticker <- time.Now()
577+
stats = <-statCh
578+
// Expect no transitions since not enough time has elapsed.
579+
require.Len(t, stats.Transitions, 1)
580+
require.Equal(t, database.WorkspaceTransitionDelete, stats.Transitions[ws.ID])
581+
})
582+
511583
t.Run("LockedNoAutostart", func(t *testing.T) {
512584
t.Parallel()
513585

0 commit comments

Comments
 (0)