@@ -3568,4 +3568,113 @@ func TestDevcontainerDiscovery(t *testing.T) {
3568
3568
// This is implicitly handled by `testutil.Logger` failing when it
3569
3569
// detects an error has been logged.
3570
3570
})
3571
+
3572
+ t .Run ("AutoStart" , func (t * testing.T ) {
3573
+ t .Parallel ()
3574
+
3575
+ tests := []struct {
3576
+ name string
3577
+ agentDir string
3578
+ fs map [string ]string
3579
+ setupMocks func (mDCCLI * acmock.MockDevcontainerCLI )
3580
+ }{
3581
+ {
3582
+ name : "SingleEnabled" ,
3583
+ agentDir : "/home/coder" ,
3584
+ fs : map [string ]string {
3585
+ "/home/coder/.git/HEAD" : "" ,
3586
+ "/home/coder/.devcontainer/devcontainer.json" : "" ,
3587
+ },
3588
+ setupMocks : func (mDCCLI * acmock.MockDevcontainerCLI ) {
3589
+ gomock .InOrder (
3590
+ mDCCLI .EXPECT ().ReadConfig (gomock .Any (),
3591
+ "/home/coder" ,
3592
+ "/home/coder/.devcontainer/devcontainer.json" ,
3593
+ []string {},
3594
+ ).Return (agentcontainers.DevcontainerConfig {
3595
+ Configuration : agentcontainers.DevcontainerConfiguration {
3596
+ Customizations : agentcontainers.DevcontainerCustomizations {
3597
+ Coder : agentcontainers.CoderCustomization {
3598
+ AutoStart : true ,
3599
+ },
3600
+ },
3601
+ },
3602
+ }, nil ),
3603
+ mDCCLI .EXPECT ().Up (gomock .Any (),
3604
+ "/home/coder" ,
3605
+ "/home/coder/.devcontainer/devcontainer.json" ,
3606
+ gomock .Any (),
3607
+ ).Return ("" , nil ),
3608
+ )
3609
+ },
3610
+ },
3611
+ {
3612
+ name : "SingleDisabled" ,
3613
+ agentDir : "/home/coder" ,
3614
+ fs : map [string ]string {
3615
+ "/home/coder/.git/HEAD" : "" ,
3616
+ "/home/coder/.devcontainer/devcontainer.json" : "" ,
3617
+ },
3618
+ setupMocks : func (mDCCLI * acmock.MockDevcontainerCLI ) {
3619
+ gomock .InOrder (
3620
+ mDCCLI .EXPECT ().ReadConfig (gomock .Any (),
3621
+ "/home/coder" ,
3622
+ "/home/coder/.devcontainer/devcontainer.json" ,
3623
+ []string {},
3624
+ ).Return (agentcontainers.DevcontainerConfig {
3625
+ Configuration : agentcontainers.DevcontainerConfiguration {
3626
+ Customizations : agentcontainers.DevcontainerCustomizations {
3627
+ Coder : agentcontainers.CoderCustomization {
3628
+ AutoStart : false ,
3629
+ },
3630
+ },
3631
+ },
3632
+ }, nil ),
3633
+ )
3634
+ },
3635
+ },
3636
+ }
3637
+
3638
+ for _ , tt := range tests {
3639
+ t .Run (tt .name , func (t * testing.T ) {
3640
+ t .Parallel ()
3641
+
3642
+ var (
3643
+ ctx = testutil .Context (t , testutil .WaitShort )
3644
+ logger = testutil .Logger (t )
3645
+ mClock = quartz .NewMock (t )
3646
+ mDCCLI = acmock .NewMockDevcontainerCLI (gomock .NewController (t ))
3647
+
3648
+ r = chi .NewRouter ()
3649
+ )
3650
+
3651
+ tt .setupMocks (mDCCLI )
3652
+
3653
+ api := agentcontainers .NewAPI (logger ,
3654
+ agentcontainers .WithClock (mClock ),
3655
+ agentcontainers .WithWatcher (watcher .NewNoop ()),
3656
+ agentcontainers .WithFileSystem (initFS (t , tt .fs )),
3657
+ agentcontainers .WithManifestInfo ("owner" , "workspace" , "parent-agent" , "/home/coder" ),
3658
+ agentcontainers .WithContainerCLI (& fakeContainerCLI {}),
3659
+ agentcontainers .WithDevcontainerCLI (mDCCLI ),
3660
+ agentcontainers .WithProjectDiscovery (true ),
3661
+ )
3662
+ api .Start ()
3663
+ defer api .Close ()
3664
+ r .Mount ("/" , api .Routes ())
3665
+
3666
+ require .Eventuallyf (t , func () bool {
3667
+ req := httptest .NewRequest (http .MethodGet , "/" , nil ).WithContext (ctx )
3668
+ rec := httptest .NewRecorder ()
3669
+ r .ServeHTTP (rec , req )
3670
+
3671
+ got := codersdk.WorkspaceAgentListContainersResponse {}
3672
+ err := json .NewDecoder (rec .Body ).Decode (& got )
3673
+ require .NoError (t , err )
3674
+
3675
+ return len (got .Devcontainers ) >= 1
3676
+ }, testutil .WaitShort , testutil .IntervalFast , "dev containers never found" )
3677
+ })
3678
+ }
3679
+ })
3571
3680
}
0 commit comments