michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: const {interfaces: Ci, results: Cr, utils: Cu} = Components; michael@0: michael@0: Cu.import("resource://gre/modules/Metrics.jsm"); michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); michael@0: Cu.import("resource://testing-common/services/healthreport/utils.jsm"); michael@0: michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_constructor() { michael@0: let provider = new AppInfoProvider(); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_task(function test_collect_smoketest() { michael@0: let storage = yield Metrics.Storage("collect_smoketest"); michael@0: let provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: michael@0: let now = new Date(); michael@0: yield provider.collectConstantData(); michael@0: michael@0: let m = provider.getMeasurement("appinfo", 2); michael@0: let data = yield storage.getMeasurementValues(m.id); michael@0: let serializer = m.serializer(m.SERIALIZE_JSON); michael@0: let d = serializer.singular(data.singular); michael@0: michael@0: do_check_eq(d._v, 2); michael@0: do_check_eq(d.vendor, "Mozilla"); michael@0: do_check_eq(d.name, "xpcshell"); michael@0: do_check_eq(d.id, "xpcshell@tests.mozilla.org"); michael@0: do_check_eq(d.version, "1"); michael@0: do_check_eq(d.appBuildID, "20121107"); michael@0: do_check_eq(d.platformVersion, "p-ver"); michael@0: do_check_eq(d.platformBuildID, "20121106"); michael@0: do_check_eq(d.os, "XPCShell"); michael@0: do_check_eq(d.xpcomabi, "noarch-spidermonkey"); michael@0: michael@0: do_check_eq(data.days.size, 1); michael@0: do_check_true(data.days.hasDay(now)); michael@0: let day = data.days.getDay(now); michael@0: do_check_eq(day.size, 3); michael@0: do_check_true(day.has("isDefaultBrowser")); michael@0: do_check_true(day.has("isTelemetryEnabled")); michael@0: do_check_true(day.has("isBlocklistEnabled")); michael@0: michael@0: // TODO Bug 827189 Actually test this properly. On some local builds, this michael@0: // is always -1 (the service throws). On buildbot, it seems to always be 0. michael@0: do_check_neq(day.get("isDefaultBrowser"), 1); michael@0: michael@0: yield provider.shutdown(); michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_record_version() { michael@0: let storage = yield Metrics.Storage("record_version"); michael@0: michael@0: let provider = new AppInfoProvider(); michael@0: let now = new Date(); michael@0: yield provider.init(storage); michael@0: michael@0: // The provider records information on startup. michael@0: let m = provider.getMeasurement("versions", 2); michael@0: let data = yield m.getValues(); michael@0: michael@0: do_check_true(data.days.hasDay(now)); michael@0: let day = data.days.getDay(now); michael@0: do_check_eq(day.size, 4); michael@0: do_check_true(day.has("appVersion")); michael@0: do_check_true(day.has("platformVersion")); michael@0: do_check_true(day.has("appBuildID")); michael@0: do_check_true(day.has("platformBuildID")); michael@0: michael@0: let value = day.get("appVersion"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 1); michael@0: let ai = getAppInfo(); michael@0: do_check_eq(value[0], ai.version); michael@0: michael@0: value = day.get("platformVersion"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 1); michael@0: do_check_eq(value[0], ai.platformVersion); michael@0: michael@0: value = day.get("appBuildID"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 1); michael@0: do_check_eq(value[0], ai.appBuildID); michael@0: michael@0: value = day.get("platformBuildID"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 1); michael@0: do_check_eq(value[0], ai.platformBuildID); michael@0: michael@0: yield provider.shutdown(); michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_record_version_change() { michael@0: let storage = yield Metrics.Storage("record_version_change"); michael@0: michael@0: let provider = new AppInfoProvider(); michael@0: let now = new Date(); michael@0: yield provider.init(storage); michael@0: yield provider.shutdown(); michael@0: michael@0: let ai = getAppInfo(); michael@0: ai.version = "new app version"; michael@0: ai.platformVersion = "new platform version"; michael@0: ai.appBuildID = "new app id"; michael@0: ai.platformBuildID = "new platform id"; michael@0: updateAppInfo(ai); michael@0: michael@0: provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: michael@0: // There should be 2 records in the versions history. michael@0: let m = provider.getMeasurement("versions", 2); michael@0: let data = yield m.getValues(); michael@0: do_check_true(data.days.hasDay(now)); michael@0: let day = data.days.getDay(now); michael@0: michael@0: let value = day.get("appVersion"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 2); michael@0: do_check_eq(value[1], "new app version"); michael@0: michael@0: value = day.get("platformVersion"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 2); michael@0: do_check_eq(value[1], "new platform version"); michael@0: michael@0: // There should be 2 records in the buildID history. michael@0: value = day.get("appBuildID"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 2); michael@0: do_check_eq(value[1], "new app id"); michael@0: michael@0: value = day.get("platformBuildID"); michael@0: do_check_true(Array.isArray(value)); michael@0: do_check_eq(value.length, 2); michael@0: do_check_eq(value[1], "new platform id"); michael@0: michael@0: yield provider.shutdown(); michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_record_telemetry() { michael@0: let storage = yield Metrics.Storage("record_telemetry"); michael@0: let provider; michael@0: michael@0: let now = new Date(); michael@0: michael@0: Services.prefs.setBoolPref("toolkit.telemetry.enabled", true); michael@0: provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: yield provider.collectConstantData(); michael@0: michael@0: let m = provider.getMeasurement("appinfo", 2); michael@0: let data = yield m.getValues(); michael@0: let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(1, d.isTelemetryEnabled); michael@0: yield provider.shutdown(); michael@0: michael@0: Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); michael@0: provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: yield provider.collectConstantData(); michael@0: michael@0: m = provider.getMeasurement("appinfo", 2); michael@0: data = yield m.getValues(); michael@0: d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(0, d.isTelemetryEnabled); michael@0: yield provider.shutdown(); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_record_blocklist() { michael@0: let storage = yield Metrics.Storage("record_blocklist"); michael@0: michael@0: let now = new Date(); michael@0: michael@0: Services.prefs.setBoolPref("extensions.blocklist.enabled", true); michael@0: let provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: yield provider.collectConstantData(); michael@0: michael@0: let m = provider.getMeasurement("appinfo", 2); michael@0: let data = yield m.getValues(); michael@0: let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(d.isBlocklistEnabled, 1); michael@0: yield provider.shutdown(); michael@0: michael@0: Services.prefs.setBoolPref("extensions.blocklist.enabled", false); michael@0: provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: yield provider.collectConstantData(); michael@0: michael@0: m = provider.getMeasurement("appinfo", 2); michael@0: data = yield m.getValues(); michael@0: d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(d.isBlocklistEnabled, 0); michael@0: yield provider.shutdown(); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_record_app_update () { michael@0: let storage = yield Metrics.Storage("record_update"); michael@0: michael@0: Services.prefs.setBoolPref("app.update.enabled", true); michael@0: Services.prefs.setBoolPref("app.update.auto", true); michael@0: let provider = new AppInfoProvider(); michael@0: yield provider.init(storage); michael@0: let now = new Date(); michael@0: yield provider.collectDailyData(); michael@0: michael@0: let m = provider.getMeasurement("update", 1); michael@0: let data = yield m.getValues(); michael@0: let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(d.enabled, 1); michael@0: do_check_eq(d.autoDownload, 1); michael@0: michael@0: Services.prefs.setBoolPref("app.update.enabled", false); michael@0: Services.prefs.setBoolPref("app.update.auto", false); michael@0: michael@0: yield provider.collectDailyData(); michael@0: data = yield m.getValues(); michael@0: d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); michael@0: do_check_eq(d.enabled, 0); michael@0: do_check_eq(d.autoDownload, 0); michael@0: michael@0: yield provider.shutdown(); michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_healthreporter_integration () { michael@0: let reporter = getHealthReporter("healthreporter_integration"); michael@0: yield reporter.init(); michael@0: michael@0: try { michael@0: yield reporter._providerManager.registerProviderFromType(AppInfoProvider); michael@0: yield reporter.collectMeasurements(); michael@0: michael@0: let payload = yield reporter.getJSONPayload(true); michael@0: let days = payload['data']['days']; michael@0: michael@0: for (let [day, measurements] in Iterator(days)) { michael@0: do_check_eq(Object.keys(measurements).length, 3); michael@0: do_check_true("org.mozilla.appInfo.appinfo" in measurements); michael@0: do_check_true("org.mozilla.appInfo.update" in measurements); michael@0: do_check_true("org.mozilla.appInfo.versions" in measurements); michael@0: } michael@0: } finally { michael@0: reporter._shutdown(); michael@0: } michael@0: });