summaryrefslogtreecommitdiffstats
path: root/toolkit/components/nimbus/test/browser/browser_experimentstore_load.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/nimbus/test/browser/browser_experimentstore_load.js')
-rw-r--r--toolkit/components/nimbus/test/browser/browser_experimentstore_load.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/toolkit/components/nimbus/test/browser/browser_experimentstore_load.js b/toolkit/components/nimbus/test/browser/browser_experimentstore_load.js
new file mode 100644
index 0000000000..a6f526e764
--- /dev/null
+++ b/toolkit/components/nimbus/test/browser/browser_experimentstore_load.js
@@ -0,0 +1,90 @@
+/* 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");
+});