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