@@ -242,6 +242,91 @@ func TestWorkspaceAgentStartupLogs(t *testing.T) {
242
242
require .Equal (t , "testing" , logChunk [0 ].Output )
243
243
require .Equal (t , "testing2" , logChunk [1 ].Output )
244
244
})
245
+ t .Run ("Close logs on outdated build" , func (t * testing.T ) {
246
+ t .Parallel ()
247
+ ctx := testutil .Context (t , testutil .WaitMedium )
248
+ client := coderdtest .New (t , & coderdtest.Options {
249
+ IncludeProvisionerDaemon : true ,
250
+ })
251
+ user := coderdtest .CreateFirstUser (t , client )
252
+ authToken := uuid .NewString ()
253
+ version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
254
+ Parse : echo .ParseComplete ,
255
+ ProvisionPlan : echo .PlanComplete ,
256
+ ProvisionApply : []* proto.Response {{
257
+ Type : & proto.Response_Apply {
258
+ Apply : & proto.ApplyComplete {
259
+ Resources : []* proto.Resource {{
260
+ Name : "example" ,
261
+ Type : "aws_instance" ,
262
+ Agents : []* proto.Agent {{
263
+ Id : uuid .NewString (),
264
+ Auth : & proto.Agent_Token {
265
+ Token : authToken ,
266
+ },
267
+ }},
268
+ }},
269
+ },
270
+ },
271
+ }},
272
+ })
273
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
274
+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
275
+ workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
276
+ build := coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
277
+
278
+ agentClient := agentsdk .New (client .URL )
279
+ agentClient .SetSessionToken (authToken )
280
+ err := agentClient .PatchLogs (ctx , agentsdk.PatchLogs {
281
+ Logs : []agentsdk.Log {
282
+ {
283
+ CreatedAt : database .Now (),
284
+ Output : "testing" ,
285
+ },
286
+ },
287
+ })
288
+ require .NoError (t , err )
289
+
290
+ logs , closer , err := client .WorkspaceAgentLogsAfter (ctx , build .Resources [0 ].Agents [0 ].ID , 0 , true )
291
+ require .NoError (t , err )
292
+ defer func () {
293
+ _ = closer .Close ()
294
+ }()
295
+
296
+ first := make (chan struct {})
297
+ go func () {
298
+ select {
299
+ case <- ctx .Done ():
300
+ assert .Fail (t , "context done while waiting in goroutine" )
301
+ case <- logs :
302
+ close (first )
303
+ }
304
+ }()
305
+ select {
306
+ case <- ctx .Done ():
307
+ require .FailNow (t , "context done while waiting for first log" )
308
+ case <- first :
309
+ }
310
+
311
+ _ = coderdtest .CreateWorkspaceBuild (t , client , workspace , database .WorkspaceTransitionStart )
312
+
313
+ // Send a new log message to trigger a re-check.
314
+ err = agentClient .PatchLogs (ctx , agentsdk.PatchLogs {
315
+ Logs : []agentsdk.Log {
316
+ {
317
+ CreatedAt : database .Now (),
318
+ Output : "testing2" ,
319
+ },
320
+ },
321
+ })
322
+ require .NoError (t , err )
323
+
324
+ select {
325
+ case <- ctx .Done ():
326
+ require .FailNow (t , "context done while waiting for logs close" )
327
+ case <- logs :
328
+ }
329
+ })
245
330
t .Run ("PublishesOnOverflow" , func (t * testing.T ) {
246
331
t .Parallel ()
247
332
ctx := testutil .Context (t , testutil .WaitMedium )
0 commit comments