@@ -1583,3 +1583,47 @@ func mustWorkspaceParameters(t *testing.T, client *codersdk.Client, workspaceID
1583
1583
func TestMain (m * testing.M ) {
1584
1584
goleak .VerifyTestMain (m , testutil .GoleakOptions ... )
1585
1585
}
1586
+
1587
+ func TestExecutorAutostartSkipsWhenNoProvisionersAvailable (t * testing.T ) {
1588
+ t .Parallel ()
1589
+
1590
+ var (
1591
+ sched = mustSchedule (t , "CRON_TZ=UTC 0 * * * *" )
1592
+ tickCh = make (chan time.Time )
1593
+ statsCh = make (chan autobuild.Stats )
1594
+ )
1595
+
1596
+ // Create client with provisioner daemon
1597
+ client , provisionerCloser := coderdtest .NewWithProvisionerCloser (t , & coderdtest.Options {
1598
+ AutobuildTicker : tickCh ,
1599
+ IncludeProvisionerDaemon : true ,
1600
+ AutobuildStats : statsCh ,
1601
+ })
1602
+
1603
+ // Create workspace with autostart enabled
1604
+ workspace := mustProvisionWorkspace (t , client , func (cwr * codersdk.CreateWorkspaceRequest ) {
1605
+ cwr .AutostartSchedule = ptr .Ref (sched .String ())
1606
+ })
1607
+
1608
+ // Stop the workspace while provisioner is available
1609
+ workspace = coderdtest .MustTransitionWorkspace (t , client , workspace .ID ,
1610
+ codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
1611
+
1612
+ // Now shut down the provisioner daemon
1613
+ err := provisionerCloser .Close ()
1614
+ require .NoError (t , err )
1615
+
1616
+ // Trigger autobuild after scheduled time
1617
+ go func () {
1618
+ tickCh <- sched .Next (workspace .LatestBuild .CreatedAt )
1619
+ close (tickCh )
1620
+ }()
1621
+
1622
+ // Wait for executor to run
1623
+ stats := <- statsCh
1624
+ require .Len (t , stats .Errors , 0 , "should not have errors" )
1625
+
1626
+ // Verify workspace is still stopped
1627
+ workspace = coderdtest .MustWorkspace (t , client , workspace .ID )
1628
+ require .Equal (t , codersdk .WorkspaceTransitionStop , workspace .LatestBuild .Transition )
1629
+ }
0 commit comments