1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
"use strict";
const { RemoteSettings } = ChromeUtils.importESModule(
"resource://services-settings/remote-settings.sys.mjs"
);
const { RemoteSettingsExperimentLoader } = ChromeUtils.importESModule(
"resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs"
);
const { ExperimentAPI } = ChromeUtils.importESModule(
"resource://nimbus/ExperimentAPI.sys.mjs"
);
const { ExperimentManager } = ChromeUtils.importESModule(
"resource://nimbus/lib/ExperimentManager.sys.mjs"
);
const { ExperimentFakes } = ChromeUtils.importESModule(
"resource://testing-common/NimbusTestUtils.sys.mjs"
);
let rsClient;
add_setup(async function () {
rsClient = RemoteSettings("nimbus-desktop-experiments");
await rsClient.db.importChanges({}, Date.now(), [], { clear: true });
await SpecialPowers.pushPrefEnv({
set: [
["messaging-system.log", "all"],
["datareporting.healthreport.uploadEnabled", true],
["app.shield.optoutstudies.enabled", true],
],
});
registerCleanupFunction(async () => {
await SpecialPowers.popPrefEnv();
await rsClient.db.clear();
});
});
add_task(async function test_experimentEnrollment() {
// Need to randomize the slug so subsequent test runs don't skip enrollment
// due to a conflicting slug
const recipe = ExperimentFakes.recipe("foo" + Math.random(), {
bucketConfig: {
start: 0,
// Make sure the experiment enrolls
count: 10000,
total: 10000,
namespace: "mochitest",
randomizationUnit: "normandy_id",
},
});
await rsClient.db.importChanges({}, Date.now(), [recipe], {
clear: true,
});
let waitForExperimentEnrollment = ExperimentFakes.waitForExperimentUpdate(
ExperimentAPI,
recipe.slug
);
RemoteSettingsExperimentLoader.updateRecipes("mochitest");
await waitForExperimentEnrollment;
let experiment = ExperimentAPI.getExperiment({
slug: recipe.slug,
});
Assert.ok(experiment.active, "Should be enrolled in the experiment");
let waitForExperimentUnenrollment = ExperimentFakes.waitForExperimentUpdate(
ExperimentAPI,
recipe.slug
);
ExperimentManager.unenroll(recipe.slug, "mochitest-cleanup");
await waitForExperimentUnenrollment;
experiment = ExperimentAPI.getExperiment({
slug: recipe.slug,
});
Assert.ok(!experiment.active, "Experiment is no longer active");
ExperimentAPI._store._deleteForTests(recipe.slug);
});
add_task(async function test_experimentEnrollment_startup() {
// Studies pref can turn the feature off but if the feature pref is off
// then it stays off.
await SpecialPowers.pushPrefEnv({
set: [
["messaging-system.rsexperimentloader.enabled", false],
["app.shield.optoutstudies.enabled", false],
],
});
Assert.ok(!RemoteSettingsExperimentLoader.enabled, "Should be disabled");
await SpecialPowers.pushPrefEnv({
set: [["app.shield.optoutstudies.enabled", true]],
});
Assert.ok(
!RemoteSettingsExperimentLoader.enabled,
"Should still be disabled (feature pref is off)"
);
await SpecialPowers.pushPrefEnv({
set: [["messaging-system.rsexperimentloader.enabled", true]],
});
Assert.ok(
RemoteSettingsExperimentLoader.enabled,
"Should finally be enabled"
);
});
|