forked from mirrors/gecko-dev
90 lines
2.6 KiB
JavaScript
90 lines
2.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const { ExperimentStore } = ChromeUtils.importESModule(
|
|
"resource://nimbus/lib/ExperimentStore.sys.mjs"
|
|
);
|
|
const { ExperimentFakes } = ChromeUtils.importESModule(
|
|
"resource://testing-common/NimbusTestUtils.sys.mjs"
|
|
);
|
|
const { ExperimentFeatures } = ChromeUtils.importESModule(
|
|
"resource://nimbus/ExperimentAPI.sys.mjs"
|
|
);
|
|
ChromeUtils.defineESModuleGetters(this, {
|
|
JSONFile: "resource://gre/modules/JSONFile.sys.mjs",
|
|
});
|
|
|
|
function getPath() {
|
|
const profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile).path;
|
|
// NOTE: If this test is failing because you have updated this path in `ExperimentStore`,
|
|
// users will lose their old experiment data. You should do something to migrate that data.
|
|
return PathUtils.join(profileDir, "ExperimentStoreData.json");
|
|
}
|
|
|
|
// Ensure that data persisted to disk is succesfully loaded by the store.
|
|
// We write data to the expected location in the user profile and
|
|
// instantiate an ExperimentStore that should then see the value.
|
|
add_task(async function test_loadFromFile() {
|
|
const previousSession = new JSONFile({ path: getPath() });
|
|
await previousSession.load();
|
|
previousSession.data.test = {
|
|
slug: "test",
|
|
active: true,
|
|
lastSeen: Date.now(),
|
|
};
|
|
previousSession.saveSoon();
|
|
await previousSession.finalize();
|
|
|
|
// Create a store and expect to load data from previous session
|
|
const store = new ExperimentStore();
|
|
|
|
await store.init();
|
|
await store.ready();
|
|
|
|
Assert.equal(
|
|
previousSession.path,
|
|
store._store.path,
|
|
"Should have the same path"
|
|
);
|
|
|
|
Assert.ok(
|
|
store.get("test"),
|
|
"This should pass if the correct store path loaded successfully"
|
|
);
|
|
});
|
|
|
|
add_task(async function test_load_from_disk_event() {
|
|
const experiment = ExperimentFakes.experiment("foo", {
|
|
branch: {
|
|
slug: "variant",
|
|
features: [{ featureId: "green" }],
|
|
},
|
|
lastSeen: Date.now(),
|
|
});
|
|
const stub = sinon.stub();
|
|
const previousSession = new JSONFile({ path: getPath() });
|
|
await previousSession.load();
|
|
previousSession.data.foo = experiment;
|
|
previousSession.saveSoon();
|
|
await previousSession.finalize();
|
|
|
|
// Create a store and expect to load data from previous session
|
|
const store = new ExperimentStore();
|
|
|
|
store._onFeatureUpdate("green", stub);
|
|
|
|
await store.init();
|
|
await store.ready();
|
|
|
|
Assert.equal(
|
|
previousSession.path,
|
|
store._store.path,
|
|
"Should have the same path as previousSession."
|
|
);
|
|
|
|
await TestUtils.waitForCondition(() => stub.called, "Stub was called");
|
|
|
|
Assert.ok(stub.firstCall.args[1], "feature-experiment-loaded");
|
|
});
|