Skip to content

Commit e3428a5

Browse files
author
Kartik Raj
committed
Don't delete experiment file
1 parent 83dff6a commit e3428a5

File tree

4 files changed

+73
-32
lines changed

4 files changed

+73
-32
lines changed

experiments.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

src/client/common/experiments.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export class ExperimentsManager implements IExperimentsManager {
9191
this.initializeInBackground().ignoreErrors();
9292
}
9393

94+
@traceDecorators.error('Failed to identify if user is in experiment')
9495
public inExperiment(experimentName: string): boolean {
9596
this.sendTelemetryIfInExperiment(experimentName);
9697
return this.userExperiments.find(exp => exp.name === experimentName) ? true : false;
@@ -114,6 +115,7 @@ export class ExperimentsManager implements IExperimentsManager {
114115
}
115116
}
116117

118+
@traceDecorators.error('Failed to send telemetry when user is in experiment')
117119
public sendTelemetryIfInExperiment(experimentName: string): void {
118120
if (this.userExperiments.find(exp => exp.name === experimentName)) {
119121
sendTelemetryEvent(EventName.PYTHON_EXPERIMENTS, undefined, { expName: experimentName });
@@ -172,7 +174,7 @@ export class ExperimentsManager implements IExperimentsManager {
172174
}
173175

174176
// Step 2. Update experiment storage using local experiments file if available
175-
if (await this.fs.fileExists(configFile)) {
177+
if (!this.experimentStorage.value && (await this.fs.fileExists(configFile))) {
176178
const content = await this.fs.readFile(configFile);
177179
try {
178180
const experiments = parse(content, [], { allowTrailingComma: true, disallowComments: false });
@@ -184,7 +186,6 @@ export class ExperimentsManager implements IExperimentsManager {
184186
traceError('Failed to parse experiments configuration file to update storage', ex);
185187
return;
186188
}
187-
await this.fs.deleteFile(configFile);
188189
}
189190
}
190191

src/test/activation/activationService.unit.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { IServiceContainer } from '../../client/ioc/types';
2727

2828
// tslint:disable:no-any
2929

30-
suite('xActivation - ActivationService', () => {
30+
suite('Activation - ActivationService', () => {
3131
[true, false].forEach(jediIsEnabled => {
3232
suite(`Test activation - ${jediIsEnabled ? 'Jedi is enabled' : 'Jedi is disabled'}`, () => {
3333
let serviceContainer: TypeMoq.IMock<IServiceContainer>;

src/test/common/experiments.unit.test.ts

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { createDeferred, createDeferredFromPromise } from '../../client/common/u
2323
import { sleep } from '../common';
2424

2525
// tslint:disable-next-line: max-func-body-length
26-
suite('xA/B experiments', () => {
26+
suite('A/B experiments', () => {
2727
let workspaceService: IWorkspaceService;
2828
let httpClient: IHttpClient;
2929
let crypto: ICryptoUtils;
@@ -151,7 +151,7 @@ suite('xA/B experiments', () => {
151151
.verifiable(TypeMoq.Times.once());
152152
when(fs.fileExists(anything())).thenResolve(false);
153153
experimentStorage.setup(n => n.value).returns(() => undefined)
154-
.verifiable(TypeMoq.Times.once());
154+
.verifiable(TypeMoq.Times.exactly(2));
155155
isDownloadedStorageValid
156156
.setup(n => n.value)
157157
.returns(() => true)
@@ -257,7 +257,46 @@ suite('xA/B experiments', () => {
257257
downloadedExperimentsStorage.verifyAll();
258258
});
259259

260-
test('When no downloaded experiments are available, and if local experiments file is not valid, experiment storage is not updated', async () => {
260+
test('When no downloaded experiments are available, and experiment storage contains experiments, then experiment storage is not updated', async () => {
261+
downloadedExperimentsStorage
262+
.setup(n => n.value)
263+
.returns(() => undefined)
264+
.verifiable(TypeMoq.Times.once());
265+
downloadedExperimentsStorage
266+
.setup(n => n.updateValue(undefined))
267+
.returns(() => Promise.resolve(undefined))
268+
.verifiable(TypeMoq.Times.never());
269+
270+
// tslint:disable-next-line:no-multiline-string
271+
const fileContent = `
272+
[{ "name": "experiment1", "salt": "salt", "min": 90, "max": 100 }]
273+
`;
274+
275+
when(
276+
fs.fileExists(anything())
277+
).thenResolve(true);
278+
when(
279+
fs.readFile(anything())
280+
).thenResolve(fileContent);
281+
282+
experimentStorage
283+
.setup(n => n.value)
284+
.returns(() => [{ name: 'experiment1', salt: 'salt', min: 90, max: 100 }])
285+
.verifiable(TypeMoq.Times.once());
286+
experimentStorage
287+
.setup(n => n.updateValue(TypeMoq.It.isAny()))
288+
.returns(() => Promise.resolve(undefined))
289+
.verifiable(TypeMoq.Times.never());
290+
291+
await expManager.updateExperimentStorage();
292+
293+
verify(fs.fileExists(anything())).never();
294+
verify(fs.readFile(anything())).never();
295+
experimentStorage.verifyAll();
296+
downloadedExperimentsStorage.verifyAll();
297+
});
298+
299+
test('When no downloaded experiments are available, experiment storage is empty, but if local experiments file is not valid, experiment storage is not updated', async () => {
261300
downloadedExperimentsStorage
262301
.setup(n => n.value)
263302
.returns(() => undefined)
@@ -280,10 +319,11 @@ suite('xA/B experiments', () => {
280319
when(
281320
fs.readFile(anything())
282321
).thenResolve(fileContent);
283-
when(
284-
fs.deleteFile(anything())
285-
).thenResolve(undefined);
286322

323+
experimentStorage
324+
.setup(n => n.value)
325+
.returns(() => undefined)
326+
.verifiable(TypeMoq.Times.once());
287327
experimentStorage
288328
.setup(n => n.updateValue(TypeMoq.It.isAny()))
289329
.returns(() => Promise.resolve(undefined)).verifiable(TypeMoq.Times.never());
@@ -292,12 +332,11 @@ suite('xA/B experiments', () => {
292332

293333
verify(fs.fileExists(anything())).once();
294334
verify(fs.readFile(anything())).once();
295-
verify(fs.deleteFile(anything())).never();
296335
experimentStorage.verifyAll();
297336
downloadedExperimentsStorage.verifyAll();
298337
});
299338

300-
test('When no downloaded experiments are available, experiment storage is updated using local experiments file (which is then deleted) given experiments are valid', async () => {
339+
test('When no downloaded experiments are available, and experiment storage is empty, then experiment storage is updated using local experiments file given experiments are valid', async () => {
301340
downloadedExperimentsStorage
302341
.setup(n => n.value)
303342
.returns(() => undefined)
@@ -320,10 +359,11 @@ suite('xA/B experiments', () => {
320359
when(
321360
fs.readFile(anything())
322361
).thenResolve(fileContent);
323-
when(
324-
fs.deleteFile(anything())
325-
).thenResolve(undefined);
326362

363+
experimentStorage
364+
.setup(n => n.value)
365+
.returns(() => undefined)
366+
.verifiable(TypeMoq.Times.once());
327367
experimentStorage
328368
.setup(n => n.updateValue([{ name: 'experiment1', salt: 'salt', min: 90, max: 100 }]))
329369
.returns(() => Promise.resolve(undefined)).verifiable(TypeMoq.Times.once());
@@ -332,13 +372,12 @@ suite('xA/B experiments', () => {
332372

333373
verify(fs.fileExists(anything())).once();
334374
verify(fs.readFile(anything())).once();
335-
verify(fs.deleteFile(anything())).once();
336375
experimentStorage.verifyAll();
337376
downloadedExperimentsStorage.verifyAll();
338377
});
339378

340379
// tslint:disable-next-line:max-func-body-length
341-
suite('When no downloaded experiments are available, function updateExperimentStorage() stops execution and returns', () => {
380+
suite('When no downloaded experiments are available, and experiment storage is empty, then function updateExperimentStorage() stops execution and returns', () => {
342381
test('If checking the existence of config file fails', async () => {
343382
downloadedExperimentsStorage
344383
.setup(n => n.value)
@@ -356,10 +395,11 @@ suite('xA/B experiments', () => {
356395
when(
357396
fs.readFile(anything())
358397
).thenResolve('fileContent');
359-
when(
360-
fs.deleteFile(anything())
361-
).thenResolve(undefined);
362398

399+
experimentStorage
400+
.setup(n => n.value)
401+
.returns(() => undefined)
402+
.verifiable(TypeMoq.Times.once());
363403
experimentStorage
364404
.setup(n => n.updateValue(TypeMoq.It.isAny()))
365405
.returns(() => Promise.resolve(undefined))
@@ -369,7 +409,6 @@ suite('xA/B experiments', () => {
369409

370410
verify(fs.fileExists(anything())).once();
371411
verify(fs.readFile(anything())).never();
372-
verify(fs.deleteFile(anything())).never();
373412
experimentStorage.verifyAll();
374413
downloadedExperimentsStorage.verifyAll();
375414
});
@@ -391,10 +430,11 @@ suite('xA/B experiments', () => {
391430
when(
392431
fs.readFile(anything())
393432
).thenThrow(error);
394-
when(
395-
fs.deleteFile(anything())
396-
).thenResolve(undefined);
397433

434+
experimentStorage
435+
.setup(n => n.value)
436+
.returns(() => undefined)
437+
.verifiable(TypeMoq.Times.once());
398438
experimentStorage
399439
.setup(n => n.updateValue(TypeMoq.It.isAny()))
400440
.returns(() => Promise.resolve(undefined))
@@ -404,7 +444,6 @@ suite('xA/B experiments', () => {
404444

405445
verify(fs.fileExists(anything())).once();
406446
verify(fs.readFile(anything())).once();
407-
verify(fs.deleteFile(anything())).never();
408447
experimentStorage.verifyAll();
409448
downloadedExperimentsStorage.verifyAll();
410449
});
@@ -425,10 +464,11 @@ suite('xA/B experiments', () => {
425464
when(
426465
fs.readFile(anything())
427466
).thenResolve('fileContent');
428-
when(
429-
fs.deleteFile(anything())
430-
).thenResolve(undefined);
431467

468+
experimentStorage
469+
.setup(n => n.value)
470+
.returns(() => undefined)
471+
.verifiable(TypeMoq.Times.once());
432472
experimentStorage
433473
.setup(n => n.updateValue(TypeMoq.It.isAny()))
434474
.returns(() => Promise.resolve(undefined))
@@ -438,7 +478,6 @@ suite('xA/B experiments', () => {
438478

439479
verify(fs.fileExists(anything())).once();
440480
verify(fs.readFile(anything())).never();
441-
verify(fs.deleteFile(anything())).never();
442481
experimentStorage.verifyAll();
443482
downloadedExperimentsStorage.verifyAll();
444483
});
@@ -466,10 +505,11 @@ suite('xA/B experiments', () => {
466505
when(
467506
fs.readFile(anything())
468507
).thenResolve(fileContent);
469-
when(
470-
fs.deleteFile(anything())
471-
).thenResolve(undefined);
472508

509+
experimentStorage
510+
.setup(n => n.value)
511+
.returns(() => undefined)
512+
.verifiable(TypeMoq.Times.once());
473513
experimentStorage
474514
.setup(n => n.updateValue(TypeMoq.It.isAny()))
475515
.returns(() => Promise.reject(error))
@@ -479,7 +519,6 @@ suite('xA/B experiments', () => {
479519

480520
verify(fs.fileExists(anything())).once();
481521
verify(fs.readFile(anything())).once();
482-
verify(fs.deleteFile(anything())).never();
483522
experimentStorage.verifyAll();
484523
downloadedExperimentsStorage.verifyAll();
485524
});

0 commit comments

Comments
 (0)