Skip to content

Commit f954f2b

Browse files
committed
tests
1 parent cc226eb commit f954f2b

File tree

4 files changed

+106
-13
lines changed

4 files changed

+106
-13
lines changed

cli/portforward.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (r *RootCmd) portForward() *serpent.Command {
137137
listeners[i] = l
138138
}
139139

140-
stopUpdating := client.UpdateWorkspaceUsageContext(ctx, workspace.ID, nil)
140+
stopUpdating := client.UpdateWorkspaceUsageContext(ctx, workspace.ID, codersdk.PostWorkspaceUsageRequest{})
141141

142142
// Wait for the context to be canceled or for a signal and close
143143
// all listeners.

coderd/workspaces_test.go

+93
Original file line numberDiff line numberDiff line change
@@ -3371,3 +3371,96 @@ func TestWorkspaceFavoriteUnfavorite(t *testing.T) {
33713371
require.ErrorAs(t, err, &sdkErr)
33723372
require.Equal(t, http.StatusForbidden, sdkErr.StatusCode())
33733373
}
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+
}

coderd/workspacestats/tracker_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -158,18 +158,18 @@ func TestTracker_MultipleInstances(t *testing.T) {
158158
}
159159

160160
// Use client A to update LastUsedAt of the first three
161-
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[0].Workspace.ID, nil))
162-
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[1].Workspace.ID, nil))
163-
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[2].Workspace.ID, nil))
161+
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[0].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
162+
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[1].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
163+
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[2].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
164164
// Use client B to update LastUsedAt of the next three
165-
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[3].Workspace.ID, nil))
166-
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[4].Workspace.ID, nil))
167-
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[5].Workspace.ID, nil))
165+
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[3].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
166+
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[4].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
167+
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[5].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
168168
// The next two will have updated from both instances
169-
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[6].Workspace.ID, nil))
170-
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[6].Workspace.ID, nil))
171-
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[7].Workspace.ID, nil))
172-
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[7].Workspace.ID, nil))
169+
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[6].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
170+
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[6].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
171+
require.NoError(t, clientA.PostWorkspaceUsage(ctx, w[7].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
172+
require.NoError(t, clientB.PostWorkspaceUsage(ctx, w[7].Workspace.ID, codersdk.PostWorkspaceUsageRequest{}))
173173
// The last two will not report any usage.
174174

175175
// Tick both with different times and wait for both flushes to complete

codersdk/workspaces.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ var AllowedAppNames = []UsageAppName{
338338
}
339339

340340
// PostWorkspaceUsage marks the workspace as having been used recently.
341-
func (c *Client) PostWorkspaceUsage(ctx context.Context, id uuid.UUID, req *PostWorkspaceUsageRequest) error {
341+
func (c *Client) PostWorkspaceUsage(ctx context.Context, id uuid.UUID, req PostWorkspaceUsageRequest) error {
342342
path := fmt.Sprintf("/api/v2/workspaces/%s/usage", id.String())
343343
res, err := c.Request(ctx, http.MethodPost, path, req)
344344
if err != nil {
@@ -355,7 +355,7 @@ func (c *Client) PostWorkspaceUsage(ctx context.Context, id uuid.UUID, req *Post
355355
// with the given id in the background.
356356
// The caller is responsible for calling the returned function to stop the background
357357
// process.
358-
func (c *Client) UpdateWorkspaceUsageContext(ctx context.Context, workspaceID uuid.UUID, req *PostWorkspaceUsageRequest) func() {
358+
func (c *Client) UpdateWorkspaceUsageContext(ctx context.Context, workspaceID uuid.UUID, req PostWorkspaceUsageRequest) func() {
359359
hbCtx, hbCancel := context.WithCancel(ctx)
360360
// Perform one initial update
361361
err := c.PostWorkspaceUsage(hbCtx, workspaceID, req)

0 commit comments

Comments
 (0)