@@ -3,6 +3,7 @@ package agentapi_test
3
3
import (
4
4
"cmp"
5
5
"context"
6
+ "database/sql"
6
7
"slices"
7
8
"sync/atomic"
8
9
"testing"
@@ -23,7 +24,7 @@ import (
23
24
"github.com/coder/quartz"
24
25
)
25
26
26
- func devContainerAgentAPI (t * testing.T ,log slog.Logger )* agentapi.DevContainerAgentAPI {
27
+ func devContainerAgentAPI (t * testing.T ,log slog.Logger )( * agentapi.DevContainerAgentAPI , database. WorkspaceResource ) {
27
28
db ,_ := dbtestutil .NewDB (t )
28
29
29
30
user := dbgen .User (t ,db , database.User {})
@@ -72,99 +73,153 @@ func devContainerAgentAPI(t *testing.T, log slog.Logger) *agentapi.DevContainerA
72
73
},
73
74
Clock :clock ,
74
75
Database :dbauthz .New (db ,auth ,log ,accessControlStore ),
75
- }
76
+ }, resource
76
77
}
77
78
78
79
func TestDevContainerAgentAPI (t * testing.T ) {
79
80
t .Parallel ()
80
81
81
- log := testutil .Logger (t )
82
- ctx := testutil .Context (t ,testutil .WaitShort )
83
- api := devContainerAgentAPI (t ,log )
84
-
85
- // Given: There are no dev container agents.
86
- listResp ,err := api .ListDevContainerAgents (ctx ,& proto.ListDevContainerAgentsRequest {})
87
- require .NoError (t ,err )
88
- require .Len (t ,listResp .Agents ,0 )
89
-
90
- // When: We create two dev container agents.
91
- createResp ,err := api .CreateDevContainerAgent (ctx ,& proto.CreateDevContainerAgentRequest {
92
- Name :"some-child-agent" ,
93
- Directory :"/workspaces/wibble" ,
94
- Architecture :"amd64" ,
95
- OperatingSystem :"linux" ,
96
- })
97
- require .NoError (t ,err )
82
+ t .Run ("CanCreateDevContainerAgent" ,func (t * testing.T ) {
83
+ t .Parallel ()
98
84
99
- childAgentOneID ,err := uuid .FromBytes (createResp .Id )
100
- require .NoError (t ,err )
85
+ log := testutil .Logger (t )
86
+ ctx := testutil .Context (t ,testutil .WaitShort )
87
+ api ,_ := devContainerAgentAPI (t ,log )
101
88
102
- createResp ,err = api .CreateDevContainerAgent (ctx ,& proto.CreateDevContainerAgentRequest {
103
- Name :"some-other-child-agent" ,
104
- Directory :"/workspaces/wobble" ,
105
- Architecture :"amd64" ,
106
- OperatingSystem :"linux" ,
107
- })
108
- require .NoError (t ,err )
109
-
110
- childAgentTwoID ,err := uuid .FromBytes (createResp .Id )
111
- require .NoError (t ,err )
112
-
113
- // Then: We expect these dev container agents to be created.
114
- agentOne ,err := api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),childAgentOneID )//nolint:gocritic // this is a test
115
- require .NoError (t ,err )
116
- require .Equal (t ,"/workspaces/wibble" ,agentOne .Directory )
117
- require .Equal (t ,"amd64" ,agentOne .Architecture )
118
- require .Equal (t ,"linux" ,agentOne .OperatingSystem )
119
- require .Equal (t ,"some-child-agent" ,agentOne .Name )
120
-
121
- agentTwo ,err := api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),childAgentTwoID )//nolint:gocritic // this is a test
122
- require .NoError (t ,err )
123
- require .Equal (t ,"/workspaces/wobble" ,agentTwo .Directory )
124
- require .Equal (t ,"amd64" ,agentTwo .Architecture )
125
- require .Equal (t ,"linux" ,agentTwo .OperatingSystem )
126
- require .Equal (t ,"some-other-child-agent" ,agentTwo .Name )
127
-
128
- // Then: We expect to be able to list these dev container agents.
129
- createdAgents := []database.WorkspaceAgent {agentOne ,agentTwo }
130
- slices .SortFunc (createdAgents ,func (a ,b database.WorkspaceAgent )int {
131
- return cmp .Compare (a .ID .String (),b .ID .String ())
132
- })
89
+ createResp ,err := api .CreateDevContainerAgent (ctx ,& proto.CreateDevContainerAgentRequest {
90
+ Name :"some-child-agent" ,
91
+ Directory :"/workspaces/wibble" ,
92
+ Architecture :"amd64" ,
93
+ OperatingSystem :"linux" ,
94
+ })
95
+ require .NoError (t ,err )
133
96
134
- listResp ,err = api .ListDevContainerAgents (ctx ,& proto.ListDevContainerAgentsRequest {})
135
- require .NoError (t ,err )
136
- require .Len (t ,listResp .Agents ,len (createdAgents ))
97
+ agentID ,err := uuid .FromBytes (createResp .Id )
98
+ require .NoError (t ,err )
137
99
138
- listedAgents := listResp .Agents
139
- slices .SortFunc (listedAgents ,func (a ,b * proto.ListDevContainerAgentsResponse_DevContainerAgent )int {
140
- return cmp .Compare (string (a .Id ),string (b .Id ))
141
- })
100
+ //nolint:gocritic // this is a test.
101
+ agent ,err := api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),agentID )
102
+ require .NoError (t ,err )
142
103
143
- for i ,agent := range listedAgents {
144
- require .Equal (t ,createdAgents [i ].ID [:],agent .Id )
145
- require .Equal (t ,createdAgents [i ].Name ,agent .Name )
146
- }
147
-
148
- // When: We delete a dev container agent.
149
- _ ,err = api .DeleteDevContainerAgent (ctx ,& proto.DeleteDevContainerAgentRequest {
150
- Id :agentOne .ID [:],
104
+ require .Equal (t ,"some-child-agent" ,agent .Name )
105
+ require .Equal (t ,"/workspaces/wibble" ,agent .Directory )
106
+ require .Equal (t ,"amd64" ,agent .Architecture )
107
+ require .Equal (t ,"linux" ,agent .OperatingSystem )
151
108
})
152
- require .NoError (t ,err )
153
109
154
- // Then: We expect this dev container agent to be deleted.
155
- listResp ,err = api .ListDevContainerAgents (ctx ,& proto.ListDevContainerAgentsRequest {})
156
- require .NoError (t ,err )
157
- require .Len (t ,listResp .Agents ,1 )
158
- require .Equal (t ,agentTwo .ID [:],listResp .Agents [0 ].Id )
110
+ t .Run ("CanDeleteDevContainerAgent" ,func (t * testing.T ) {
111
+ t .Parallel ()
112
+
113
+ log := testutil .Logger (t )
114
+ ctx := testutil .Context (t ,testutil .WaitShort )
115
+ api ,res := devContainerAgentAPI (t ,log )
116
+
117
+ // Given: A dev container agent.
118
+ agent := dbgen .WorkspaceAgent (t ,api .Database , database.WorkspaceAgent {
119
+ ParentID : uuid.NullUUID {Valid :true ,UUID :api .AgentID },
120
+ ResourceID :res .ID ,
121
+ Name :"some-child-agent" ,
122
+ Directory :"/workspaces/wibble" ,
123
+ Architecture :"amd64" ,
124
+ OperatingSystem :"linux" ,
125
+ })
126
+
127
+ // When: We delete the dev container agent.
128
+ _ ,err := api .DeleteDevContainerAgent (ctx ,& proto.DeleteDevContainerAgentRequest {
129
+ Id :agent .ID [:],
130
+ })
131
+ require .NoError (t ,err )
132
+
133
+ // Then: It is deleted.
134
+ _ ,err = api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),agent .ID )
135
+ require .ErrorIs (t ,err ,sql .ErrNoRows )
136
+ })
159
137
160
- // When: We delete the other dev container agent.
161
- _ ,err = api .DeleteDevContainerAgent (ctx ,& proto.DeleteDevContainerAgentRequest {
162
- Id :agentTwo .ID [:],
138
+ t .Run ("CanDeleteOneDevContainerAgentOfMany" ,func (t * testing.T ) {
139
+ t .Parallel ()
140
+
141
+ log := testutil .Logger (t )
142
+ ctx := testutil .Context (t ,testutil .WaitShort )
143
+ api ,res := devContainerAgentAPI (t ,log )
144
+
145
+ // Given: Multiple dev container agents.
146
+ agentOne := dbgen .WorkspaceAgent (t ,api .Database , database.WorkspaceAgent {
147
+ ParentID : uuid.NullUUID {Valid :true ,UUID :api .AgentID },
148
+ ResourceID :res .ID ,
149
+ Name :"child-agent-one" ,
150
+ Directory :"/workspaces/wibble" ,
151
+ Architecture :"amd64" ,
152
+ OperatingSystem :"linux" ,
153
+ })
154
+
155
+ agentTwo := dbgen .WorkspaceAgent (t ,api .Database , database.WorkspaceAgent {
156
+ ParentID : uuid.NullUUID {Valid :true ,UUID :api .AgentID },
157
+ ResourceID :res .ID ,
158
+ Name :"child-agent-two" ,
159
+ Directory :"/workspaces/wobble" ,
160
+ Architecture :"amd64" ,
161
+ OperatingSystem :"linux" ,
162
+ })
163
+
164
+ // When: We delete one of the dev container agents.
165
+ _ ,err := api .DeleteDevContainerAgent (ctx ,& proto.DeleteDevContainerAgentRequest {
166
+ Id :agentOne .ID [:],
167
+ })
168
+ require .NoError (t ,err )
169
+
170
+ // Then: The correct one is deleted.
171
+ _ ,err = api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),agentOne .ID )
172
+ require .ErrorIs (t ,err ,sql .ErrNoRows )
173
+
174
+ _ ,err = api .Database .GetWorkspaceAgentByID (dbauthz .AsSystemRestricted (ctx ),agentTwo .ID )
175
+ require .NoError (t ,err )
163
176
})
164
- require .NoError (t ,err )
165
177
166
- // Then: We expect this other dev container agent to be deleted.
167
- listResp ,err = api .ListDevContainerAgents (ctx ,& proto.ListDevContainerAgentsRequest {})
168
- require .NoError (t ,err )
169
- require .Len (t ,listResp .Agents ,0 )
178
+ t .Run ("CanListDevContainerAgents" ,func (t * testing.T ) {
179
+ t .Parallel ()
180
+
181
+ log := testutil .Logger (t )
182
+ ctx := testutil .Context (t ,testutil .WaitShort )
183
+ api ,res := devContainerAgentAPI (t ,log )
184
+
185
+ // Given: Multiple dev container agents.
186
+ agentOne := dbgen .WorkspaceAgent (t ,api .Database , database.WorkspaceAgent {
187
+ ParentID : uuid.NullUUID {Valid :true ,UUID :api .AgentID },
188
+ ResourceID :res .ID ,
189
+ Name :"child-agent-one" ,
190
+ Directory :"/workspaces/wibble" ,
191
+ Architecture :"amd64" ,
192
+ OperatingSystem :"linux" ,
193
+ })
194
+
195
+ agentTwo := dbgen .WorkspaceAgent (t ,api .Database , database.WorkspaceAgent {
196
+ ParentID : uuid.NullUUID {Valid :true ,UUID :api .AgentID },
197
+ ResourceID :res .ID ,
198
+ Name :"child-agent-two" ,
199
+ Directory :"/workspaces/wobble" ,
200
+ Architecture :"amd64" ,
201
+ OperatingSystem :"linux" ,
202
+ })
203
+
204
+ agents := []database.WorkspaceAgent {agentOne ,agentTwo }
205
+ slices .SortFunc (agents ,func (a ,b database.WorkspaceAgent )int {
206
+ return cmp .Compare (a .ID .String (),b .ID .String ())
207
+ })
208
+
209
+ // When: We list the dev container agents.
210
+ listResp ,err := api .ListDevContainerAgents (ctx ,& proto.ListDevContainerAgentsRequest {})
211
+ require .NoError (t ,err )
212
+
213
+ listedAgents := listResp .Agents
214
+ slices .SortFunc (listedAgents ,func (a ,b * proto.ListDevContainerAgentsResponse_DevContainerAgent )int {
215
+ return cmp .Compare (string (a .Id ),string (b .Id ))
216
+ })
217
+
218
+ // Then: We expect to see all the agents listed.
219
+ require .Len (t ,listedAgents ,len (agents ))
220
+ for i ,agent := range listedAgents {
221
+ require .Equal (t ,agents [i ].ID [:],agent .Id )
222
+ require .Equal (t ,agents [i ].Name ,agent .Name )
223
+ }
224
+ })
170
225
}