summaryrefslogtreecommitdiffstats
path: root/services/sync/tests/unit/test_healthreport_migration.js
diff options
context:
space:
mode:
Diffstat (limited to 'services/sync/tests/unit/test_healthreport_migration.js')
-rw-r--r--services/sync/tests/unit/test_healthreport_migration.js155
1 files changed, 155 insertions, 0 deletions
diff --git a/services/sync/tests/unit/test_healthreport_migration.js b/services/sync/tests/unit/test_healthreport_migration.js
new file mode 100644
index 000000000..23f756748
--- /dev/null
+++ b/services/sync/tests/unit/test_healthreport_migration.js
@@ -0,0 +1,155 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+Cu.import("resource://gre/modules/Metrics.jsm", this);
+Cu.import("resource://gre/modules/Preferences.jsm", this);
+Cu.import("resource://gre/modules/Promise.jsm", this);
+Cu.import("resource://services-sync/healthreport.jsm", this);
+Cu.import("resource://services-sync/FxaMigrator.jsm", this);
+Cu.import("resource://testing-common/services/common/logging.js", this);
+Cu.import("resource://testing-common/services/healthreport/utils.jsm", this);
+
+
+function run_test() {
+ initTestLogging();
+
+ run_next_test();
+}
+
+add_task(function* test_no_data() {
+ let storage = yield Metrics.Storage("collect");
+ let provider = new SyncProvider();
+ yield provider.init(storage);
+
+ try {
+ // Initially nothing should be configured.
+ let now = new Date();
+ yield provider.collectDailyData();
+
+ let m = provider.getMeasurement("migration", 1);
+ let values = yield m.getValues();
+ Assert.equal(values.days.size, 0);
+ Assert.ok(!values.days.hasDay(now));
+ } finally {
+ yield provider.shutdown();
+ yield storage.close();
+ }
+});
+
+function checkCorrectStateRecorded(provider, state) {
+ // Wait for storage to complete.
+ yield m.storage.enqueueOperation(() => {
+ return Promise.resolve();
+ });
+
+ let m = provider.getMeasurement("migration", 1);
+ let values = yield m.getValues();
+ Assert.equal(values.days.size, 1);
+ Assert.ok(values.days.hasDay(now));
+ let day = values.days.getDay(now);
+
+ Assert.ok(day.has("state"));
+ Assert.equal(day.get("state"), state);
+}
+
+add_task(function* test_state() {
+ let storage = yield Metrics.Storage("collect");
+ let provider = new SyncProvider();
+ yield provider.init(storage);
+
+ try {
+ // Initially nothing should be configured.
+ let now = new Date();
+
+ // We record both a "user" and "internal" state in the same field.
+ // So simulate a "user" state first.
+ Services.obs.notifyObservers(null, "fxa-migration:state-changed",
+ fxaMigrator.STATE_USER_FXA_VERIFIED);
+ checkCorrectStateRecorded(provider, fxaMigrator.STATE_USER_FXA_VERIFIED);
+
+ // And an internal state.
+ Services.obs.notifyObservers(null, "fxa-migration:internal-state-changed",
+ fxaMigrator.STATE_INTERNAL_WAITING_SYNC_COMPLETE);
+ checkCorrectStateRecorded(provider, fxaMigrator.STATE_INTERNAL_WAITING_SYNC_COMPLETE);
+ } finally {
+ yield provider.shutdown();
+ yield storage.close();
+ }
+});
+
+add_task(function* test_flags() {
+ let storage = yield Metrics.Storage("collect");
+ let provider = new SyncProvider();
+ yield provider.init(storage);
+
+ try {
+ // Initially nothing should be configured.
+ let now = new Date();
+
+ let m = provider.getMeasurement("migration", 1);
+
+ let record = function*(what) {
+ Services.obs.notifyObservers(null, "fxa-migration:internal-telemetry", what);
+ // Wait for storage to complete.
+ yield m.storage.enqueueOperation(Promise.resolve);
+ let values = yield m.getValues();
+ Assert.equal(values.days.size, 1);
+ return values.days.getDay(now);
+ }
+
+ let values = yield m.getValues();
+ Assert.equal(values.days.size, 1);
+ let day = values.days.getDay(now);
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_UNLINKED));
+
+ // let's send an unknown value to ensure our error mitigation works.
+ day = yield record("unknown");
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_UNLINKED));
+
+ // record an fxaMigrator.TELEMETRY_ACCEPTED state.
+ day = yield record(fxaMigrator.TELEMETRY_ACCEPTED);
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_UNLINKED));
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_ACCEPTED), 1);
+
+ // and again - it should get 2.
+ day = yield record(fxaMigrator.TELEMETRY_ACCEPTED);
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_ACCEPTED), 2);
+
+ // record fxaMigrator.TELEMETRY_DECLINED - also a counter.
+ day = yield record(fxaMigrator.TELEMETRY_DECLINED);
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_UNLINKED));
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_ACCEPTED), 2);
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_DECLINED), 1);
+
+ day = yield record(fxaMigrator.TELEMETRY_DECLINED);
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(!day.has(fxaMigrator.TELEMETRY_UNLINKED));
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_ACCEPTED), 2);
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_DECLINED), 2);
+
+ // and fxaMigrator.TELEMETRY_UNLINKED - this is conceptually a "daily bool".
+ // (ie, it's DAILY_LAST_NUMERIC_FIELD and only ever has |1| written to it)
+ day = yield record(fxaMigrator.TELEMETRY_UNLINKED);
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_ACCEPTED));
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_DECLINED));
+ Assert.ok(day.has(fxaMigrator.TELEMETRY_UNLINKED));
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_UNLINKED), 1);
+ // and doing it again still leaves us with |1|
+ day = yield record(fxaMigrator.TELEMETRY_UNLINKED);
+ Assert.equal(day.get(fxaMigrator.TELEMETRY_UNLINKED), 1);
+ } finally {
+ yield provider.shutdown();
+ yield storage.close();
+ }
+});