Skip to content

Commit 69e0508

Browse files
committed
experiments: add ability to hide versions with old schema
1 parent 7302c88 commit 69e0508

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/vs/workbench/contrib/experiments/common/experimentService.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,16 @@ interface IExperimentStorageState {
8383
lastEditedDate?: string;
8484
}
8585

86+
/**
87+
* Current version of the experiment schema in this VS Code build. This *must*
88+
* be incremented when adding a condition, otherwise experiments might activate
89+
* on older versions of VS Code where not intended.
90+
*/
91+
export const currentSchemaVersion = 1;
92+
8693
interface IRawExperiment {
8794
id: string;
95+
schemaVersion: number;
8896
enabled?: boolean;
8997
condition?: {
9098
insidersOnly?: boolean;
@@ -220,8 +228,8 @@ export class ExperimentService extends Disposable implements IExperimentService
220228
if (context.res.statusCode !== 200) {
221229
return null;
222230
}
223-
const result: any = await asJson(context);
224-
return result && Array.isArray(result['experiments']) ? result['experiments'] : [];
231+
const result = await asJson<{ experiments?: IRawExperiment }>(context);
232+
return result && Array.isArray(result.experiments) ? result.experiments : [];
225233
} catch (_e) {
226234
// Bad request or invalid JSON
227235
return null;
@@ -249,6 +257,10 @@ export class ExperimentService extends Disposable implements IExperimentService
249257
return Promise.resolve(null);
250258
}
251259

260+
// Don't look at experiments with newer schema versions. We can't
261+
// understand them, trying to process them might even cause errors.
262+
rawExperiments = rawExperiments.filter(e => (e.schemaVersion || 0) <= currentSchemaVersion);
263+
252264
// Clear disbaled/deleted experiments from storage
253265
const allExperimentIdsFromStorage = safeParse(this.storageService.get('allExperiments', StorageScope.GLOBAL), []);
254266
const enabledExperiments = rawExperiments.filter(experiment => !!experiment.enabled).map(experiment => experiment.id.toLowerCase());

src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as assert from 'assert';
77
import * as sinon from 'sinon';
8-
import { ExperimentActionType, ExperimentState, IExperiment, ExperimentService, getCurrentActivationRecord } from 'vs/workbench/contrib/experiments/common/experimentService';
8+
import { ExperimentActionType, ExperimentState, IExperiment, ExperimentService, getCurrentActivationRecord, currentSchemaVersion } from 'vs/workbench/contrib/experiments/common/experimentService';
99
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
1010
import { TestLifecycleService, TestExtensionService } from 'vs/workbench/test/browser/workbenchTestServices';
1111
import {
@@ -167,6 +167,36 @@ suite('Experiment Service', () => {
167167
});
168168
});
169169

170+
test('filters out experiments with newer schema versions', async () => {
171+
experimentData = {
172+
experiments: [
173+
{
174+
id: 'experiment1',
175+
// no version == 0
176+
},
177+
{
178+
id: 'experiment2',
179+
schemaVersion: currentSchemaVersion,
180+
},
181+
{
182+
id: 'experiment3',
183+
schemaVersion: currentSchemaVersion + 1,
184+
},
185+
]
186+
};
187+
188+
testObject = instantiationService.createInstance(TestExperimentService);
189+
const actual = await Promise.all([
190+
testObject.getExperimentById('experiment1'),
191+
testObject.getExperimentById('experiment2'),
192+
testObject.getExperimentById('experiment3'),
193+
]);
194+
195+
assert.equal(actual[0]?.id, 'experiment1');
196+
assert.equal(actual[1]?.id, 'experiment2');
197+
assert.equal(actual[2], undefined);
198+
});
199+
170200
test('Insiders only experiment shouldnt be enabled in stable', () => {
171201
experimentData = {
172202
experiments: [

0 commit comments

Comments
 (0)