@@ -1529,28 +1529,34 @@ func TestWorkspaceWatcher(t *testing.T) {
1529
1529
1530
1530
// Wait events are easier to debug with timestamped logs.
1531
1531
logger := slogtest .Make (t , nil ).Named (t .Name ()).Leveled (slog .LevelDebug )
1532
- wait := func (event string ) {
1533
- select {
1534
- case <- ctx .Done ():
1535
- require .FailNow (t , "timed out waiting for event" , event )
1536
- case <- wc :
1537
- logger .Info (ctx , "done waiting for event" , slog .F ("event" , event ))
1532
+ wait := func (event string , ready func (w codersdk.Workspace ) bool ) {
1533
+ for {
1534
+ select {
1535
+ case <- ctx .Done ():
1536
+ require .FailNow (t , "timed out waiting for event" , event )
1537
+ case w , ok := <- wc :
1538
+ require .True (t , ok , "watch channel closed: %s" , event )
1539
+ if ready == nil || ready (w ) {
1540
+ logger .Info (ctx , "done waiting for event" , slog .F ("event" , event ))
1541
+ return
1542
+ }
1543
+ }
1538
1544
}
1539
1545
}
1540
1546
1541
1547
coderdtest .CreateWorkspaceBuild (t , client , workspace , database .WorkspaceTransitionStart )
1542
- wait ("workspace build being created" )
1543
- wait ("workspace build being acquired" )
1544
- wait ("workspace build completing" )
1548
+ wait ("workspace build being created" , nil )
1549
+ wait ("workspace build being acquired" , nil )
1550
+ wait ("workspace build completing" , nil )
1545
1551
1546
1552
// Unfortunately, this will add ~1s to the test due to the granularity
1547
1553
// of agent timeout seconds. However, if we don't do this we won't know
1548
1554
// which trigger we received when waiting for connection.
1549
1555
//
1550
1556
// Note that the first timeout is from `coderdtest.CreateWorkspace` and
1551
1557
// the latter is from `coderdtest.CreateWorkspaceBuild`.
1552
- wait ("agent timeout after create" )
1553
- wait ("agent timeout after start" )
1558
+ wait ("agent timeout after create" , nil )
1559
+ wait ("agent timeout after start" , nil )
1554
1560
1555
1561
agentClient := agentsdk .New (client .URL )
1556
1562
agentClient .SetSessionToken (authToken )
@@ -1562,28 +1568,33 @@ func TestWorkspaceWatcher(t *testing.T) {
1562
1568
_ = agentCloser .Close ()
1563
1569
}()
1564
1570
1565
- wait ("agent connected" )
1571
+ wait ("agent connected/ready" , func (w codersdk.Workspace ) bool {
1572
+ return w .LatestBuild .Resources [0 ].Agents [0 ].Status == codersdk .WorkspaceAgentConnected &&
1573
+ w .LatestBuild .Resources [0 ].Agents [0 ].LifecycleState == codersdk .WorkspaceAgentLifecycleReady
1574
+ })
1566
1575
agentCloser .Close ()
1567
- wait ("agent disconnected" )
1576
+ wait ("agent disconnected" , func (w codersdk.Workspace ) bool {
1577
+ return w .LatestBuild .Resources [0 ].Agents [0 ].Status == codersdk .WorkspaceAgentDisconnected
1578
+ })
1568
1579
1569
1580
closeFunc .Close ()
1570
1581
build := coderdtest .CreateWorkspaceBuild (t , client , workspace , database .WorkspaceTransitionStart )
1571
- wait ("first is for the workspace build itself" )
1582
+ wait ("first is for the workspace build itself" , nil )
1572
1583
err = client .CancelWorkspaceBuild (ctx , build .ID )
1573
1584
require .NoError (t , err )
1574
- wait ("second is for the build cancel" )
1585
+ wait ("second is for the build cancel" , nil )
1575
1586
1576
1587
err = client .UpdateWorkspace (ctx , workspace .ID , codersdk.UpdateWorkspaceRequest {
1577
1588
Name : "another" ,
1578
1589
})
1579
1590
require .NoError (t , err )
1580
- wait ("update workspace name" )
1591
+ wait ("update workspace name" , nil )
1581
1592
1582
1593
err = client .UpdateActiveTemplateVersion (ctx , template .ID , codersdk.UpdateActiveTemplateVersion {
1583
1594
ID : template .ActiveVersionID ,
1584
1595
})
1585
1596
require .NoError (t , err )
1586
- wait ("update active template version" )
1597
+ wait ("update active template version" , nil )
1587
1598
1588
1599
cancel ()
1589
1600
}
0 commit comments