From c05895aaedefa910acf96e65d55bbc23852e8f76 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Fri, 17 Sep 2021 10:52:55 -0700 Subject: [PATCH] Fix `Python extension loading...` issue for users who have disabled telemetry (#17447) * Enable discovery experiments for all users including those who have opted out of telemetry * News entry * Oops * Ensure we still respect optInto/optOutFrom setting for discovery experiment --- news/2 Fixes/17447.md | 1 + src/client/common/experiments/service.ts | 6 +++++ .../common/experiments/service.unit.test.ts | 23 +++++++++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 news/2 Fixes/17447.md diff --git a/news/2 Fixes/17447.md b/news/2 Fixes/17447.md new file mode 100644 index 000000000000..418a8f3b253c --- /dev/null +++ b/news/2 Fixes/17447.md @@ -0,0 +1 @@ +Fix `Python extension loading...` issue for users who have disabled telemetry. diff --git a/src/client/common/experiments/service.ts b/src/client/common/experiments/service.ts index 48f09332cbb8..21444499ae28 100644 --- a/src/client/common/experiments/service.ts +++ b/src/client/common/experiments/service.ts @@ -12,6 +12,7 @@ import { IApplicationEnvironment, IWorkspaceService } from '../application/types import { PVSC_EXTENSION_ID, STANDARD_OUTPUT_CHANNEL } from '../constants'; import { GLOBAL_MEMENTO, IExperimentService, IMemento, IOutputChannel } from '../types'; import { Experiments } from '../utils/localize'; +import { DiscoveryVariants } from './groups'; import { ExperimentationTelemetry } from './telemetry'; const EXP_MEMENTO_KEY = 'VSCode.ABExp.FeatureData'; @@ -126,6 +127,11 @@ export class ExperimentService implements IExperimentService { return true; } + if (experiment === DiscoveryVariants.discoveryWithoutFileWatching) { + // Enable discovery experiment for all users. + return true; + } + // If getTreatmentVariable returns undefined, // it means that the value for this experiment was not found on the server. const treatmentVariable = this.experimentationService.getTreatmentVariable(EXP_CONFIG_ID, experiment); diff --git a/src/test/common/experiments/service.unit.test.ts b/src/test/common/experiments/service.unit.test.ts index 29f5a0af1fdc..e8c8defd4fd8 100644 --- a/src/test/common/experiments/service.unit.test.ts +++ b/src/test/common/experiments/service.unit.test.ts @@ -12,6 +12,7 @@ import { ApplicationEnvironment } from '../../../client/common/application/appli import { IApplicationEnvironment, IWorkspaceService } from '../../../client/common/application/types'; import { WorkspaceService } from '../../../client/common/application/workspace'; import { Channel } from '../../../client/common/constants'; +import { DiscoveryVariants } from '../../../client/common/experiments/groups'; import { ExperimentService } from '../../../client/common/experiments/service'; import { Experiments } from '../../../client/common/utils/localize'; import * as Telemetry from '../../../client/telemetry'; @@ -157,14 +158,14 @@ suite('Experimentation service', () => { suite('In-experiment-sync check', () => { const experiment = 'Test Experiment - experiment'; - let telemetryEvents: { eventName: string; properties: Record }[] = []; + let telemetryEvents: { eventName: string; properties: unknown }[] = []; let getTreatmentVariable: sinon.SinonStub; let sendTelemetryEventStub: sinon.SinonStub; setup(() => { sendTelemetryEventStub = sinon .stub(Telemetry, 'sendTelemetryEvent') - .callsFake((eventName: string, _, properties: Record) => { + .callsFake((eventName: string, _, properties: unknown) => { const telemetry = { eventName, properties }; telemetryEvents.push(telemetry); }); @@ -182,6 +183,20 @@ suite('Experimentation service', () => { sinon.restore(); }); + test('Enable discovery experiment without file watching for all users', async () => { + configureSettings(true, [], []); + + const experimentService = new ExperimentService( + instance(workspaceService), + instance(appEnvironment), + globalMemento, + outputChannel, + ); + const result = experimentService.inExperimentSync(DiscoveryVariants.discoveryWithoutFileWatching); + + assert.isTrue(result); + }); + test('If the opt-in and opt-out arrays are empty, return the value from the experimentation framework for a given experiment', async () => { configureSettings(true, [], []); @@ -401,13 +416,13 @@ suite('Experimentation service', () => { }); suite('Opt-in/out telemetry', () => { - let telemetryEvents: { eventName: string; properties: Record }[] = []; + let telemetryEvents: { eventName: string; properties: unknown }[] = []; let sendTelemetryEventStub: sinon.SinonStub; setup(() => { sendTelemetryEventStub = sinon .stub(Telemetry, 'sendTelemetryEvent') - .callsFake((eventName: string, _, properties: Record) => { + .callsFake((eventName: string, _, properties: unknown) => { const telemetry = { eventName, properties }; telemetryEvents.push(telemetry); });