@@ -3371,3 +3371,96 @@ func TestWorkspaceFavoriteUnfavorite(t *testing.T) {
3371
3371
require .ErrorAs (t , err , & sdkErr )
3372
3372
require .Equal (t , http .StatusForbidden , sdkErr .StatusCode ())
3373
3373
}
3374
+
3375
+ func TestWorkspaceUsageTracking (t * testing.T ) {
3376
+ t .Parallel ()
3377
+ t .Run ("NoExperiment" , func (t * testing.T ) {
3378
+ t .Parallel ()
3379
+ client , db := coderdtest .NewWithDatabase (t , nil )
3380
+ user := coderdtest .CreateFirstUser (t , client )
3381
+ tmpDir := t .TempDir ()
3382
+ r := dbfake .WorkspaceBuild (t , db , database.Workspace {
3383
+ OrganizationID : user .OrganizationID ,
3384
+ OwnerID : user .UserID ,
3385
+ }).WithAgent (func (agents []* proto.Agent ) []* proto.Agent {
3386
+ agents [0 ].Directory = tmpDir
3387
+ return agents
3388
+ }).Do ()
3389
+
3390
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitMedium )
3391
+ defer cancel ()
3392
+
3393
+ // continue legacy behavior
3394
+ err := client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {})
3395
+ require .NoError (t , err )
3396
+ })
3397
+ t .Run ("Experiment" , func (t * testing.T ) {
3398
+ t .Parallel ()
3399
+ dv := coderdtest .DeploymentValues (t )
3400
+ dv .Experiments = []string {string (codersdk .ExperimentWorkspaceUsage )}
3401
+ client , db := coderdtest .NewWithDatabase (t , & coderdtest.Options {
3402
+ DeploymentValues : dv ,
3403
+ })
3404
+ user := coderdtest .CreateFirstUser (t , client )
3405
+ tmpDir := t .TempDir ()
3406
+ r := dbfake .WorkspaceBuild (t , db , database.Workspace {
3407
+ OrganizationID : user .OrganizationID ,
3408
+ OwnerID : user .UserID ,
3409
+ }).WithAgent (func (agents []* proto.Agent ) []* proto.Agent {
3410
+ agents [0 ].Directory = tmpDir
3411
+ return agents
3412
+ }).Do ()
3413
+
3414
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitMedium )
3415
+ defer cancel ()
3416
+
3417
+ // continue legacy behavior
3418
+ err := client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {})
3419
+ require .NoError (t , err )
3420
+
3421
+ workspace , err := client .Workspace (ctx , r .Workspace .ID )
3422
+ require .NoError (t , err )
3423
+
3424
+ // only agent id fails
3425
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3426
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3427
+ })
3428
+ require .ErrorContains (t , err , "agent_id" )
3429
+ // only app name fails
3430
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3431
+ AppName : "ssh" ,
3432
+ })
3433
+ require .ErrorContains (t , err , "app_name" )
3434
+ // unknown app name fails
3435
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3436
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3437
+ AppName : "unknown" ,
3438
+ })
3439
+ require .ErrorContains (t , err , "app_name" )
3440
+
3441
+ // vscode works
3442
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3443
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3444
+ AppName : "vscode" ,
3445
+ })
3446
+ require .NoError (t , err )
3447
+ // jetbrains works
3448
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3449
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3450
+ AppName : "jetbrains" ,
3451
+ })
3452
+ require .NoError (t , err )
3453
+ // reconnecting-pty works
3454
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3455
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3456
+ AppName : "reconnecting-pty" ,
3457
+ })
3458
+ require .NoError (t , err )
3459
+ // ssh works
3460
+ err = client .PostWorkspaceUsage (ctx , r .Workspace .ID , codersdk.PostWorkspaceUsageRequest {
3461
+ AgentID : workspace .LatestBuild .Resources [0 ].Agents [0 ].ID ,
3462
+ AppName : "ssh" ,
3463
+ })
3464
+ require .NoError (t , err )
3465
+ })
3466
+ }
0 commit comments