@@ -559,6 +559,8 @@ func NewWithAPI(t testing.TB, options *Options) (*codersdk.Client, io.Closer, *c
559
559
var provisionerCloser io.Closer = nopcloser {}
560
560
if options .IncludeProvisionerDaemon {
561
561
provisionerCloser = NewTaggedProvisionerDaemon (t , coderAPI , "test" , options .ProvisionerDaemonTags )
562
+ // Wait for the provisioner daemon to be ready before continuing.
563
+ AwaitProvisionerDaemonsConnected (t , coderAPI )
562
564
}
563
565
client := codersdk .New (serverURL )
564
566
t .Cleanup (func () {
@@ -570,6 +572,36 @@ func NewWithAPI(t testing.TB, options *Options) (*codersdk.Client, io.Closer, *c
570
572
return client , provisionerCloser , coderAPI
571
573
}
572
574
575
+ // AwaitProvisionerDaemonsConnected waits for the provisioner daemon to connect.
576
+ func AwaitProvisionerDaemonsConnected (t testing.TB , api * coderd.API ) {
577
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitShort )
578
+ defer cancel ()
579
+ for {
580
+ select {
581
+ case <- ctx .Done ():
582
+ t .Fatal ("provisioner daemon did not connect in time" )
583
+ case <- time .After (testutil .IntervalFast ):
584
+ // nolint:gocritic // used for testing only
585
+ daemons , err := api .Database .GetProvisionerDaemons (dbauthz .AsSystemReadProvisionerDaemons (ctx ))
586
+ if err != nil {
587
+ if errors .Is (err , sql .ErrNoRows ) {
588
+ t .Logf ("no provisioner daemons found yet" )
589
+ continue
590
+ }
591
+ require .NoError (t , err )
592
+ }
593
+ if len (daemons ) == 0 {
594
+ t .Logf ("no provisioner daemons found yet" )
595
+ continue
596
+ }
597
+ for _ , daemon := range daemons {
598
+ t .Logf ("found provisioner daemon %q" , daemon .Name )
599
+ }
600
+ return
601
+ }
602
+ }
603
+ }
604
+
573
605
// ProvisionerdCloser wraps a provisioner daemon as an io.Closer that can be called multiple times
574
606
type ProvisionerdCloser struct {
575
607
mu sync.Mutex
0 commit comments