services/sync/tests/unit/test_healthreport.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/services/sync/tests/unit/test_healthreport.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,194 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +"use strict";
     1.8 +
     1.9 +Cu.import("resource://gre/modules/Metrics.jsm", this);
    1.10 +Cu.import("resource://gre/modules/Preferences.jsm", this);
    1.11 +Cu.import("resource://gre/modules/Promise.jsm", this);
    1.12 +Cu.import("resource://services-sync/main.js", this);
    1.13 +Cu.import("resource://services-sync/healthreport.jsm", this);
    1.14 +Cu.import("resource://testing-common/services-common/logging.js", this);
    1.15 +Cu.import("resource://testing-common/services/healthreport/utils.jsm", this);
    1.16 +
    1.17 +function run_test() {
    1.18 +  initTestLogging();
    1.19 +
    1.20 +  run_next_test();
    1.21 +}
    1.22 +
    1.23 +add_task(function test_constructor() {
    1.24 +  let provider = new SyncProvider();
    1.25 +});
    1.26 +
    1.27 +// Provider can initialize and de-initialize properly.
    1.28 +add_task(function* test_init() {
    1.29 +  let storage = yield Metrics.Storage("init");
    1.30 +  let provider = new SyncProvider();
    1.31 +  yield provider.init(storage);
    1.32 +  yield provider.shutdown();
    1.33 +  yield storage.close();
    1.34 +});
    1.35 +
    1.36 +add_task(function* test_collect() {
    1.37 +  let storage = yield Metrics.Storage("collect");
    1.38 +  let provider = new SyncProvider();
    1.39 +  yield provider.init(storage);
    1.40 +
    1.41 +  // Initially nothing should be configured.
    1.42 +  let now = new Date();
    1.43 +  yield provider.collectDailyData();
    1.44 +
    1.45 +  let m = provider.getMeasurement("sync", 1);
    1.46 +  let values = yield m.getValues();
    1.47 +  Assert.equal(values.days.size, 1);
    1.48 +  Assert.ok(values.days.hasDay(now));
    1.49 +  let day = values.days.getDay(now);
    1.50 +  Assert.ok(day.has("enabled"));
    1.51 +  Assert.ok(day.has("activeProtocol"));
    1.52 +  Assert.ok(day.has("preferredProtocol"));
    1.53 +  Assert.equal(day.get("enabled"), 0);
    1.54 +  Assert.equal(day.get("preferredProtocol"), "1.5");
    1.55 +  Assert.equal(day.get("activeProtocol"), "1.5",
    1.56 +               "Protocol without setup should be FX Accounts version.");
    1.57 +
    1.58 +  // Now check for old Sync setup.
    1.59 +  let branch = new Preferences("services.sync.");
    1.60 +  branch.set("username", "foo");
    1.61 +  branch.reset("fxaccounts.enabled");
    1.62 +  yield provider.collectDailyData();
    1.63 +  values = yield m.getValues();
    1.64 +  Assert.equal(values.days.getDay(now).get("activeProtocol"), "1.1",
    1.65 +               "Protocol with old Sync setup is correct.");
    1.66 +
    1.67 +  Assert.equal(Weave.Status.__authManager, undefined, "Detect code changes");
    1.68 +
    1.69 +  // Let's enable Sync so we can get more useful data.
    1.70 +  // We need to do this because the FHR probe only records more info if Sync
    1.71 +  // is configured properly.
    1.72 +  Weave.Service.identity.account = "johndoe";
    1.73 +  Weave.Service.identity.basicPassword = "ilovejane";
    1.74 +  Weave.Service.identity.syncKey = Weave.Utils.generatePassphrase();
    1.75 +  Weave.Service.clusterURL = "http://localhost/";
    1.76 +  Assert.equal(Weave.Status.checkSetup(), Weave.STATUS_OK);
    1.77 +
    1.78 +  yield provider.collectDailyData();
    1.79 +  values = yield m.getValues();
    1.80 +  day = values.days.getDay(now);
    1.81 +  Assert.equal(day.get("enabled"), 1);
    1.82 +
    1.83 +  // An empty account should have 1 device: us.
    1.84 +  let dm = provider.getMeasurement("devices", 1);
    1.85 +  values = yield dm.getValues();
    1.86 +  Assert.ok(values.days.hasDay(now));
    1.87 +  day = values.days.getDay(now);
    1.88 +  Assert.equal(day.size, 1);
    1.89 +  let engine = Weave.Service.clientsEngine;
    1.90 +  Assert.ok(engine);
    1.91 +  Assert.ok(day.has(engine.localType));
    1.92 +  Assert.equal(day.get(engine.localType), 1);
    1.93 +
    1.94 +  // Add some devices and ensure they show up.
    1.95 +  engine._store._remoteClients["id1"] = {type: "mobile"};
    1.96 +  engine._store._remoteClients["id2"] = {type: "tablet"};
    1.97 +  engine._store._remoteClients["id3"] = {type: "mobile"};
    1.98 +
    1.99 +  yield provider.collectDailyData();
   1.100 +  values = yield dm.getValues();
   1.101 +  day = values.days.getDay(now);
   1.102 +
   1.103 +  let expected = {
   1.104 +    "foobar": 0,
   1.105 +    "tablet": 1,
   1.106 +    "mobile": 2,
   1.107 +    "desktop": 0,
   1.108 +  };
   1.109 +
   1.110 +  for (let type in expected) {
   1.111 +    let count = expected[type];
   1.112 +
   1.113 +    if (engine.localType == type) {
   1.114 +      count++;
   1.115 +    }
   1.116 +
   1.117 +    if (!count) {
   1.118 +      Assert.ok(!day.has(type));
   1.119 +    } else {
   1.120 +      Assert.ok(day.has(type));
   1.121 +      Assert.equal(day.get(type), count);
   1.122 +    }
   1.123 +  }
   1.124 +
   1.125 +  engine._store._remoteClients = {};
   1.126 +
   1.127 +  yield provider.shutdown();
   1.128 +  yield storage.close();
   1.129 +});
   1.130 +
   1.131 +add_task(function* test_sync_events() {
   1.132 +  let storage = yield Metrics.Storage("sync_events");
   1.133 +  let provider = new SyncProvider();
   1.134 +  yield provider.init(storage);
   1.135 +
   1.136 +  let m = provider.getMeasurement("sync", 1);
   1.137 +
   1.138 +  for (let i = 0; i < 5; i++) {
   1.139 +    Services.obs.notifyObservers(null, "weave:service:sync:start", null);
   1.140 +  }
   1.141 +
   1.142 +  for (let i = 0; i < 3; i++) {
   1.143 +    Services.obs.notifyObservers(null, "weave:service:sync:finish", null);
   1.144 +  }
   1.145 +
   1.146 +  for (let i = 0; i < 2; i++) {
   1.147 +    Services.obs.notifyObservers(null, "weave:service:sync:error", null);
   1.148 +  }
   1.149 +
   1.150 +  // Wait for storage to complete.
   1.151 +  yield m.storage.enqueueOperation(() => {
   1.152 +    return Promise.resolve();
   1.153 +  });
   1.154 +
   1.155 +  let values = yield m.getValues();
   1.156 +  let now = new Date();
   1.157 +  Assert.ok(values.days.hasDay(now));
   1.158 +  let day = values.days.getDay(now);
   1.159 +
   1.160 +  Assert.ok(day.has("syncStart"));
   1.161 +  Assert.ok(day.has("syncSuccess"));
   1.162 +  Assert.ok(day.has("syncError"));
   1.163 +  Assert.equal(day.get("syncStart"), 5);
   1.164 +  Assert.equal(day.get("syncSuccess"), 3);
   1.165 +  Assert.equal(day.get("syncError"), 2);
   1.166 +
   1.167 +  yield provider.shutdown();
   1.168 +  yield storage.close();
   1.169 +});
   1.170 +
   1.171 +add_task(function* test_healthreporter_json() {
   1.172 +  let reporter = yield getHealthReporter("healthreporter_json");
   1.173 +  yield reporter.init();
   1.174 +  try {
   1.175 +    yield reporter._providerManager.registerProvider(new SyncProvider());
   1.176 +    yield reporter.collectMeasurements();
   1.177 +    let payload = yield reporter.getJSONPayload(true);
   1.178 +    let now = new Date();
   1.179 +    let today = reporter._formatDate(now);
   1.180 +
   1.181 +    Assert.ok(today in payload.data.days);
   1.182 +    let day = payload.data.days[today];
   1.183 +
   1.184 +    Assert.ok("org.mozilla.sync.sync" in day);
   1.185 +    Assert.ok("org.mozilla.sync.devices" in day);
   1.186 +
   1.187 +    let devices = day["org.mozilla.sync.devices"];
   1.188 +    let engine = Weave.Service.clientsEngine;
   1.189 +    Assert.ok(engine);
   1.190 +    let type = engine.localType;
   1.191 +    Assert.ok(type);
   1.192 +    Assert.ok(type in devices);
   1.193 +    Assert.equal(devices[type], 1);
   1.194 +  } finally {
   1.195 +    reporter._shutdown();
   1.196 +  }
   1.197 +});

mercurial