summaryrefslogtreecommitdiffstats
path: root/toolkit/components/nimbus/test/browser/browser_experimentstore_load_single_feature.js
blob: 7e9a19e21d07a4b0d4a966016693300add9d1980 (plain)
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
/* 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 { ExperimentAPI } = ChromeUtils.importESModule(
  "resource://nimbus/ExperimentAPI.sys.mjs"
);
ChromeUtils.defineESModuleGetters(this, {
  JSONFile: "resource://gre/modules/JSONFile.sys.mjs",
});

const SINGLE_FEATURE_RECIPE = {
  ...ExperimentFakes.experiment(),
  branch: {
    feature: {
      featureId: "urlbar",
      value: {
        valueThatWillDefinitelyShowUp: 42,
        quickSuggestNonSponsoredIndex: 2021,
      },
    },
    ratio: 1,
    slug: "control",
  },
  featureIds: ["urlbar"],
  slug: "browser_experimentstore_load_single_feature",
  userFacingDescription: "Smarter suggestions in the AwesomeBar",
  userFacingName: "Firefox Suggest - History vs Offline",
};

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");
}

add_task(async function test_load_from_disk_event() {
  Services.prefs.setStringPref("messaging-system.log", "all");
  const stub = sinon.stub();
  const previousSession = new JSONFile({ path: getPath() });
  await previousSession.load();
  previousSession.data[SINGLE_FEATURE_RECIPE.slug] = SINGLE_FEATURE_RECIPE;
  previousSession.saveSoon();
  await previousSession.finalize();

  // Create a store and expect to load data from previous session
  const store = new ExperimentStore();

  let apiStoreStub = sinon.stub(ExperimentAPI, "_store").get(() => store);

  store._onFeatureUpdate("urlbar", stub);

  await store.init();
  await store.ready();

  await TestUtils.waitForCondition(() => stub.called, "Stub was called");
  Assert.ok(
    store.get(SINGLE_FEATURE_RECIPE.slug)?.slug,
    "Experiment is loaded from disk"
  );
  Assert.ok(stub.firstCall.args[1], "feature-experiment-loaded");
  Assert.equal(
    NimbusFeatures.urlbar.getAllVariables().valueThatWillDefinitelyShowUp,
    SINGLE_FEATURE_RECIPE.branch.feature.value.valueThatWillDefinitelyShowUp,
    "Should match getAllVariables"
  );
  Assert.equal(
    NimbusFeatures.urlbar.getVariable("quickSuggestNonSponsoredIndex"),
    SINGLE_FEATURE_RECIPE.branch.feature.value.quickSuggestNonSponsoredIndex,
    "Should match getVariable"
  );

  registerCleanupFunction(async () => {
    // Remove the experiment from disk
    const fileStore = new JSONFile({ path: getPath() });
    await fileStore.load();
    fileStore.data = {};
    fileStore.saveSoon();
    await fileStore.finalize();
    apiStoreStub.restore();
  });
});