Skip to content

Commit 3c0f29c

Browse files
authored
Send unittest trigger event once per trigger type (#18803)
1 parent c5aabcc commit 3c0f29c

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

src/client/testing/testController/controller.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,23 @@ import { IWorkspaceService } from '../../common/application/types';
2121
import { IConfigurationService, IDisposableRegistry, Resource } from '../../common/types';
2222
import { DelayedTrigger, IDelayedTrigger } from '../../common/utils/delayTrigger';
2323
import { traceVerbose } from '../../logging';
24-
import { sendTelemetryEvent } from '../../telemetry';
24+
import { IEventNamePropertyMapping, sendTelemetryEvent } from '../../telemetry';
2525
import { EventName } from '../../telemetry/constants';
2626
import { PYTEST_PROVIDER, UNITTEST_PROVIDER } from '../common/constants';
2727
import { DebugTestTag, getNodeByUri, RunTestTag } from './common/testItemUtilities';
2828
import { ITestController, ITestFrameworkController, TestRefreshOptions } from './common/types';
2929

30+
// Types gymnastics to make sure that sendTriggerTelemetry only accepts the correct types.
31+
type EventPropertyType = IEventNamePropertyMapping[EventName.UNITTEST_DISCOVERY_TRIGGER];
32+
type TriggerKeyType = keyof EventPropertyType;
33+
type TriggerType = EventPropertyType[TriggerKeyType];
34+
3035
@injectable()
3136
export class PythonTestController implements ITestController, IExtensionSingleActivationService {
3237
public readonly supportedWorkspaceTypes = { untrustedWorkspace: false, virtualWorkspace: false };
3338

39+
private readonly triggerTypes: TriggerType[] = [];
40+
3441
private readonly testController: TestController;
3542

3643
private readonly refreshData: IDelayedTrigger;
@@ -195,7 +202,7 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
195202
}
196203
} else {
197204
traceVerbose('Testing: Refreshing all test data');
198-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'auto' });
205+
this.sendTriggerTelemetry('auto');
199206
const workspaces: readonly WorkspaceFolder[] = this.workspaceService.workspaceFolders || [];
200207
await Promise.all(workspaces.map((workspace) => this.refreshTestDataInternal(workspace.uri)));
201208
}
@@ -322,21 +329,21 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
322329
this.disposables.push(
323330
watcher.onDidChange((uri) => {
324331
traceVerbose(`Testing: Trigger refresh after change in ${uri.fsPath}`);
325-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
332+
this.sendTriggerTelemetry('watching');
326333
this.refreshData.trigger(uri, false);
327334
}),
328335
);
329336
this.disposables.push(
330337
watcher.onDidCreate((uri) => {
331338
traceVerbose(`Testing: Trigger refresh after creating ${uri.fsPath}`);
332-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
339+
this.sendTriggerTelemetry('watching');
333340
this.refreshData.trigger(uri, false);
334341
}),
335342
);
336343
this.disposables.push(
337344
watcher.onDidDelete((uri) => {
338345
traceVerbose(`Testing: Trigger refresh after deleting in ${uri.fsPath}`);
339-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
346+
this.sendTriggerTelemetry('watching');
340347
this.refreshData.trigger(uri, false);
341348
}),
342349
);
@@ -350,24 +357,38 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
350357
this.disposables.push(
351358
watcher.onDidChange((uri) => {
352359
traceVerbose(`Testing: Trigger refresh after change in ${uri.fsPath}`);
353-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
360+
this.sendTriggerTelemetry('watching');
354361
// We want to invalidate tests for code change
355362
this.refreshData.trigger(uri, true);
356363
}),
357364
);
358365
this.disposables.push(
359366
watcher.onDidCreate((uri) => {
360367
traceVerbose(`Testing: Trigger refresh after creating ${uri.fsPath}`);
361-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
368+
this.sendTriggerTelemetry('watching');
362369
this.refreshData.trigger(uri, false);
363370
}),
364371
);
365372
this.disposables.push(
366373
watcher.onDidDelete((uri) => {
367374
traceVerbose(`Testing: Trigger refresh after deleting in ${uri.fsPath}`);
368-
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, { trigger: 'watching' });
375+
this.sendTriggerTelemetry('watching');
369376
this.refreshData.trigger(uri, false);
370377
}),
371378
);
372379
}
380+
381+
/**
382+
* Send UNITTEST_DISCOVERY_TRIGGER telemetry event only once per trigger type.
383+
*
384+
* @param triggerType The trigger type to send telemetry for.
385+
*/
386+
private sendTriggerTelemetry(trigger: TriggerType): void {
387+
if (!this.triggerTypes.includes(trigger)) {
388+
sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_TRIGGER, undefined, {
389+
trigger,
390+
});
391+
this.triggerTypes.push(trigger);
392+
}
393+
}
373394
}

0 commit comments

Comments
 (0)