@@ -21,16 +21,23 @@ import { IWorkspaceService } from '../../common/application/types';
21
21
import { IConfigurationService , IDisposableRegistry , Resource } from '../../common/types' ;
22
22
import { DelayedTrigger , IDelayedTrigger } from '../../common/utils/delayTrigger' ;
23
23
import { traceVerbose } from '../../logging' ;
24
- import { sendTelemetryEvent } from '../../telemetry' ;
24
+ import { IEventNamePropertyMapping , sendTelemetryEvent } from '../../telemetry' ;
25
25
import { EventName } from '../../telemetry/constants' ;
26
26
import { PYTEST_PROVIDER , UNITTEST_PROVIDER } from '../common/constants' ;
27
27
import { DebugTestTag , getNodeByUri , RunTestTag } from './common/testItemUtilities' ;
28
28
import { ITestController , ITestFrameworkController , TestRefreshOptions } from './common/types' ;
29
29
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
+
30
35
@injectable ( )
31
36
export class PythonTestController implements ITestController , IExtensionSingleActivationService {
32
37
public readonly supportedWorkspaceTypes = { untrustedWorkspace : false , virtualWorkspace : false } ;
33
38
39
+ private readonly triggerTypes : TriggerType [ ] = [ ] ;
40
+
34
41
private readonly testController : TestController ;
35
42
36
43
private readonly refreshData : IDelayedTrigger ;
@@ -195,7 +202,7 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
195
202
}
196
203
} else {
197
204
traceVerbose ( 'Testing: Refreshing all test data' ) ;
198
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'auto' } ) ;
205
+ this . sendTriggerTelemetry ( 'auto' ) ;
199
206
const workspaces : readonly WorkspaceFolder [ ] = this . workspaceService . workspaceFolders || [ ] ;
200
207
await Promise . all ( workspaces . map ( ( workspace ) => this . refreshTestDataInternal ( workspace . uri ) ) ) ;
201
208
}
@@ -322,21 +329,21 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
322
329
this . disposables . push (
323
330
watcher . onDidChange ( ( uri ) => {
324
331
traceVerbose ( `Testing: Trigger refresh after change in ${ uri . fsPath } ` ) ;
325
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
332
+ this . sendTriggerTelemetry ( 'watching' ) ;
326
333
this . refreshData . trigger ( uri , false ) ;
327
334
} ) ,
328
335
) ;
329
336
this . disposables . push (
330
337
watcher . onDidCreate ( ( uri ) => {
331
338
traceVerbose ( `Testing: Trigger refresh after creating ${ uri . fsPath } ` ) ;
332
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
339
+ this . sendTriggerTelemetry ( 'watching' ) ;
333
340
this . refreshData . trigger ( uri , false ) ;
334
341
} ) ,
335
342
) ;
336
343
this . disposables . push (
337
344
watcher . onDidDelete ( ( uri ) => {
338
345
traceVerbose ( `Testing: Trigger refresh after deleting in ${ uri . fsPath } ` ) ;
339
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
346
+ this . sendTriggerTelemetry ( 'watching' ) ;
340
347
this . refreshData . trigger ( uri , false ) ;
341
348
} ) ,
342
349
) ;
@@ -350,24 +357,38 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
350
357
this . disposables . push (
351
358
watcher . onDidChange ( ( uri ) => {
352
359
traceVerbose ( `Testing: Trigger refresh after change in ${ uri . fsPath } ` ) ;
353
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
360
+ this . sendTriggerTelemetry ( 'watching' ) ;
354
361
// We want to invalidate tests for code change
355
362
this . refreshData . trigger ( uri , true ) ;
356
363
} ) ,
357
364
) ;
358
365
this . disposables . push (
359
366
watcher . onDidCreate ( ( uri ) => {
360
367
traceVerbose ( `Testing: Trigger refresh after creating ${ uri . fsPath } ` ) ;
361
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
368
+ this . sendTriggerTelemetry ( 'watching' ) ;
362
369
this . refreshData . trigger ( uri , false ) ;
363
370
} ) ,
364
371
) ;
365
372
this . disposables . push (
366
373
watcher . onDidDelete ( ( uri ) => {
367
374
traceVerbose ( `Testing: Trigger refresh after deleting in ${ uri . fsPath } ` ) ;
368
- sendTelemetryEvent ( EventName . UNITTEST_DISCOVERY_TRIGGER , undefined , { trigger : 'watching' } ) ;
375
+ this . sendTriggerTelemetry ( 'watching' ) ;
369
376
this . refreshData . trigger ( uri , false ) ;
370
377
} ) ,
371
378
) ;
372
379
}
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
+ }
373
394
}
0 commit comments