Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android' OR appname == 'thunderbird'
- Manifest: toolkit/components/nimbus/test/browser/browser.toml
"use strict";
const { RemoteSettings } = ChromeUtils.importESModule(
);
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(
);
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"
);
});