@@ -1216,6 +1216,32 @@ func TestWorkspaceBuildTimings(t *testing.T) {
1216
1216
CreatedBy : owner .UserID ,
1217
1217
})
1218
1218
1219
+ // Create a build to attach timings
1220
+ makeBuild := func () database.WorkspaceBuild {
1221
+ ws := dbgen .Workspace (t , db , database.Workspace {
1222
+ OwnerID : owner .UserID ,
1223
+ OrganizationID : owner .OrganizationID ,
1224
+ TemplateID : template .ID ,
1225
+ // Generate unique name for the workspace
1226
+ Name : "test-workspace-" + uuid .New ().String (),
1227
+ })
1228
+ jobID := uuid .New ()
1229
+ job := dbgen .ProvisionerJob (t , db , pubsub , database.ProvisionerJob {
1230
+ ID : jobID ,
1231
+ OrganizationID : owner .OrganizationID ,
1232
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
1233
+ Tags : database.StringMap {jobID .String (): "true" },
1234
+ })
1235
+ return dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
1236
+ WorkspaceID : ws .ID ,
1237
+ TemplateVersionID : version .ID ,
1238
+ BuildNumber : 1 ,
1239
+ Transition : database .WorkspaceTransitionStart ,
1240
+ InitiatorID : owner .UserID ,
1241
+ JobID : job .ID ,
1242
+ })
1243
+ }
1244
+
1219
1245
makeProvisionerTimings := func (build database.WorkspaceBuild , count int ) []database.ProvisionerJobTiming {
1220
1246
// Use the database.ProvisionerJobTiming struct to mock timings data instead
1221
1247
// of directly creating database.InsertProvisionerJobTimingsParams. This
@@ -1250,8 +1276,86 @@ func TestWorkspaceBuildTimings(t *testing.T) {
1250
1276
return dbgen .ProvisionerJobTimings (t , db , insertParams )
1251
1277
}
1252
1278
1253
- makeAgentScriptTimings := func (build database.WorkspaceBuild , count int ) []database.WorkspaceAgentScriptTiming {
1254
- // Create a resource, agent, and script to test the timing of agent scripts
1279
+ makeAgentScriptTimings := func (script database.WorkspaceAgentScript , count int ) []database.WorkspaceAgentScriptTiming {
1280
+ newTimings := make ([]database.InsertWorkspaceAgentScriptTimingsParams , count )
1281
+ now := time .Now ()
1282
+ for i := range count {
1283
+ startedAt := now .Add (- time .Hour + time .Duration (i )* time .Minute )
1284
+ endedAt := startedAt .Add (time .Minute )
1285
+ newTimings [i ] = database.InsertWorkspaceAgentScriptTimingsParams {
1286
+ StartedAt : startedAt ,
1287
+ EndedAt : endedAt ,
1288
+ Stage : database .WorkspaceAgentScriptTimingStageStart ,
1289
+ ScriptID : script .ID ,
1290
+ ExitCode : 0 ,
1291
+ Status : database .WorkspaceAgentScriptTimingStatusOk ,
1292
+ }
1293
+ }
1294
+
1295
+ timings := make ([]database.WorkspaceAgentScriptTiming , 0 )
1296
+ for _ , newTiming := range newTimings {
1297
+ timing := dbgen .WorkspaceAgentScriptTiming (t , db , newTiming )
1298
+ timings = append (timings , timing )
1299
+ }
1300
+
1301
+ return timings
1302
+ }
1303
+
1304
+ t .Run ("NonExistentBuild" , func (t * testing.T ) {
1305
+ t .Parallel ()
1306
+
1307
+ // When: fetching an inexistent build
1308
+ buildID := uuid .New ()
1309
+ _ , err := client .WorkspaceBuildTimings (context .Background (), buildID )
1310
+
1311
+ // Then: expect a not found error
1312
+ require .Error (t , err )
1313
+ require .Contains (t , err .Error (), "not found" )
1314
+ })
1315
+
1316
+ t .Run ("EmptyTimings" , func (t * testing.T ) {
1317
+ t .Parallel ()
1318
+
1319
+ // When: fetching timings for a build with no timings
1320
+ build := makeBuild ()
1321
+ res , err := client .WorkspaceBuildTimings (context .Background (), build .ID )
1322
+
1323
+ // Then: return a response with empty timings
1324
+ require .NoError (t , err )
1325
+ require .Empty (t , res .ProvisionerTimings )
1326
+ require .Empty (t , res .AgentScriptTimings )
1327
+ })
1328
+
1329
+ t .Run ("ProvisionerTimings" , func (t * testing.T ) {
1330
+ t .Parallel ()
1331
+
1332
+ // When: fetching timings for a build with provisioner timings
1333
+ build := makeBuild ()
1334
+ provisionerTimings := makeProvisionerTimings (build , 5 )
1335
+
1336
+ // Then: return a response with the expected timings
1337
+ res , err := client .WorkspaceBuildTimings (context .Background (), build .ID )
1338
+ require .NoError (t , err )
1339
+ require .Len (t , res .ProvisionerTimings , 5 )
1340
+
1341
+ for i := range res .ProvisionerTimings {
1342
+ timingRes := res .ProvisionerTimings [i ]
1343
+ genTiming := provisionerTimings [i ]
1344
+ require .Equal (t , genTiming .Resource , timingRes .Resource )
1345
+ require .Equal (t , genTiming .Action , timingRes .Action )
1346
+ require .Equal (t , string (genTiming .Stage ), timingRes .Stage )
1347
+ require .Equal (t , genTiming .JobID .String (), timingRes .JobID .String ())
1348
+ require .Equal (t , genTiming .Source , timingRes .Source )
1349
+ require .Equal (t , genTiming .StartedAt .UnixMilli (), timingRes .StartedAt .UnixMilli ())
1350
+ require .Equal (t , genTiming .EndedAt .UnixMilli (), timingRes .EndedAt .UnixMilli ())
1351
+ }
1352
+ })
1353
+
1354
+ t .Run ("AgentScriptTimings" , func (t * testing.T ) {
1355
+ t .Parallel ()
1356
+
1357
+ // When: fetching timings for a build with agent script timings
1358
+ build := makeBuild ()
1255
1359
resource := dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1256
1360
JobID : build .JobID ,
1257
1361
})
@@ -1276,101 +1380,55 @@ func TestWorkspaceBuildTimings(t *testing.T) {
1276
1380
uuid .New (),
1277
1381
},
1278
1382
})
1383
+ agentScriptTimings := makeAgentScriptTimings (scripts [0 ], 5 )
1279
1384
1280
- newTimings := make ([]database. InsertWorkspaceAgentScriptTimingsParams , count )
1281
- now := time . Now ( )
1282
- for i := range count {
1283
- startedAt := now . Add ( - time . Hour + time . Duration ( i ) * time . Minute )
1284
- endedAt := startedAt . Add ( time . Minute )
1285
- newTimings [ i ] = database. InsertWorkspaceAgentScriptTimingsParams {
1286
- StartedAt : startedAt ,
1287
- EndedAt : endedAt ,
1288
- Stage : database . WorkspaceAgentScriptTimingStageStart ,
1289
- ScriptID : scripts [ 0 ]. ID ,
1290
- ExitCode : 0 ,
1291
- Status : database . WorkspaceAgentScriptTimingStatusOk ,
1292
- }
1385
+ // Then: return a response with the expected timings
1386
+ res , err := client . WorkspaceBuildTimings ( context . Background (), build . ID )
1387
+ require . NoError ( t , err )
1388
+ require . Len ( t , res . AgentScriptTimings , 5 )
1389
+
1390
+ for i := range res . AgentScriptTimings {
1391
+ timingRes := res . AgentScriptTimings [ i ]
1392
+ genTiming := agentScriptTimings [ i ]
1393
+ require . Equal ( t , genTiming . ExitCode , timingRes . ExitCode )
1394
+ require . Equal ( t , string ( genTiming . Status ), timingRes . Status )
1395
+ require . Equal ( t , string ( genTiming . Stage ), timingRes . Stage )
1396
+ require . Equal ( t , genTiming . StartedAt . UnixMilli (), timingRes . StartedAt . UnixMilli ())
1397
+ require . Equal ( t , genTiming . EndedAt . UnixMilli (), timingRes . EndedAt . UnixMilli ())
1293
1398
}
1399
+ })
1294
1400
1295
- timings := make ([]database.WorkspaceAgentScriptTiming , 0 )
1296
- for _ , newTiming := range newTimings {
1297
- timing := dbgen .WorkspaceAgentScriptTiming (t , db , newTiming )
1298
- timings = append (timings , timing )
1299
- }
1401
+ t .Run ("NoAgentScripts" , func (t * testing.T ) {
1402
+ t .Parallel ()
1300
1403
1301
- return timings
1302
- }
1404
+ // When: fetching timings for a build with no agent scripts
1405
+ build := makeBuild ()
1406
+ resource := dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1407
+ JobID : build .JobID ,
1408
+ })
1409
+ dbgen .WorkspaceAgent (t , db , database.WorkspaceAgent {
1410
+ ResourceID : resource .ID ,
1411
+ })
1303
1412
1304
- // Given
1305
- testCases := []struct {
1306
- name string
1307
- provisionerTimings int
1308
- actionScriptTimings int
1309
- }{
1310
- {name : "with empty provisioner timings" , provisionerTimings : 0 },
1311
- {name : "with provisioner timings" , provisionerTimings : 5 },
1312
- {name : "with empty agent script timings" , actionScriptTimings : 0 },
1313
- {name : "with agent script timings" , actionScriptTimings : 5 },
1314
- }
1413
+ // Then: return a response with empty agent script timings
1414
+ res , err := client .WorkspaceBuildTimings (context .Background (), build .ID )
1415
+ require .NoError (t , err )
1416
+ require .Empty (t , res .AgentScriptTimings )
1417
+ })
1315
1418
1316
- for _ , tc := range testCases {
1317
- tc := tc
1318
- t .Run (tc .name , func (t * testing.T ) {
1319
- t .Parallel ()
1320
-
1321
- // Create a build to attach provisioner timings
1322
- ws := dbgen .Workspace (t , db , database.Workspace {
1323
- OwnerID : owner .UserID ,
1324
- OrganizationID : owner .OrganizationID ,
1325
- TemplateID : template .ID ,
1326
- // Generate unique name for the workspace
1327
- Name : "test-workspace-" + uuid .New ().String (),
1328
- })
1329
- jobID := uuid .New ()
1330
- job := dbgen .ProvisionerJob (t , db , pubsub , database.ProvisionerJob {
1331
- ID : jobID ,
1332
- OrganizationID : owner .OrganizationID ,
1333
- Type : database .ProvisionerJobTypeWorkspaceBuild ,
1334
- Tags : database.StringMap {jobID .String (): "true" },
1335
- })
1336
- build := dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
1337
- WorkspaceID : ws .ID ,
1338
- TemplateVersionID : version .ID ,
1339
- BuildNumber : 1 ,
1340
- Transition : database .WorkspaceTransitionStart ,
1341
- InitiatorID : owner .UserID ,
1342
- JobID : job .ID ,
1343
- })
1344
-
1345
- // Generate timings based on test config
1346
- genProvisionerTimings := makeProvisionerTimings (build , tc .provisionerTimings )
1347
- genAgentScriptTimings := makeAgentScriptTimings (build , tc .provisionerTimings )
1348
-
1349
- res , err := client .WorkspaceBuildTimings (context .Background (), build .ID )
1350
- require .NoError (t , err )
1351
- require .Len (t , res .ProvisionerTimings , tc .provisionerTimings )
1352
-
1353
- for i := range res .ProvisionerTimings {
1354
- timingRes := res .ProvisionerTimings [i ]
1355
- genTiming := genProvisionerTimings [i ]
1356
- require .Equal (t , genTiming .Resource , timingRes .Resource )
1357
- require .Equal (t , genTiming .Action , timingRes .Action )
1358
- require .Equal (t , string (genTiming .Stage ), timingRes .Stage )
1359
- require .Equal (t , genTiming .JobID .String (), timingRes .JobID .String ())
1360
- require .Equal (t , genTiming .Source , timingRes .Source )
1361
- require .Equal (t , genTiming .StartedAt .UnixMilli (), timingRes .StartedAt .UnixMilli ())
1362
- require .Equal (t , genTiming .EndedAt .UnixMilli (), timingRes .EndedAt .UnixMilli ())
1363
- }
1419
+ // Some workspaces might not have agents. It is improbable, but possible.
1420
+ t .Run ("NoAgents" , func (t * testing.T ) {
1421
+ t .Parallel ()
1364
1422
1365
- for i := range res .AgentScriptTimings {
1366
- timingRes := res .AgentScriptTimings [i ]
1367
- genTiming := genAgentScriptTimings [i ]
1368
- require .Equal (t , genTiming .ExitCode , timingRes .ExitCode )
1369
- require .Equal (t , string (genTiming .Status ), timingRes .Status )
1370
- require .Equal (t , string (genTiming .Stage ), timingRes .Stage )
1371
- require .Equal (t , genTiming .StartedAt .UnixMilli (), timingRes .StartedAt .UnixMilli ())
1372
- require .Equal (t , genTiming .EndedAt .UnixMilli (), timingRes .EndedAt .UnixMilli ())
1373
- }
1423
+ // When: fetching timings for a build with no agents
1424
+ build := makeBuild ()
1425
+ dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1426
+ JobID : build .JobID ,
1374
1427
})
1375
- }
1428
+
1429
+ // Then: return a response with empty agent script timings
1430
+ res , err := client .WorkspaceBuildTimings (context .Background (), build .ID )
1431
+ require .NoError (t , err )
1432
+ require .Empty (t , res .AgentScriptTimings )
1433
+ })
1376
1434
}
0 commit comments