160 lines
5.3 KiB
JavaScript
160 lines
5.3 KiB
JavaScript
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* vim: set sts=2 sw=2 et tw=80: */
|
|
"use strict";
|
|
|
|
const { ProfileAge } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/ProfileAge.sys.mjs"
|
|
);
|
|
|
|
const { UsageReporting } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/UsageReporting.sys.mjs"
|
|
);
|
|
|
|
const { ClientEnvironmentBase } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/components-utils/ClientEnvironment.sys.mjs"
|
|
);
|
|
|
|
add_task(async function setup() {
|
|
// Trigger a proper telemetry init.
|
|
do_get_profile(true);
|
|
|
|
// Make sure we don't generate unexpected pings due to pref changes.
|
|
await setEmptyPrefWatchlist();
|
|
|
|
await TelemetryController.testSetup();
|
|
|
|
// We need to initialize FOG once, otherwise operations will be stuck in the
|
|
// pre-init queue.
|
|
Services.fog.initializeFOG();
|
|
});
|
|
|
|
// Verify that rising and falling edges are handled as expected.
|
|
add_task(async function test_prefs() {
|
|
// The default value is `true`, so this should be a no-op. But belt and braces...
|
|
Services.prefs.setBoolPref("datareporting.usage.uploadEnabled", true);
|
|
|
|
// In Firefox itself, these are set as part of browser startup. In
|
|
// tests, we need to arrange our initial state.
|
|
GleanPings.usageReporting.setEnabled(true);
|
|
GleanPings.usageDeletionRequest.setEnabled(true);
|
|
|
|
const kTestUuid = "decafdec-afde-cafd-ecaf-decafdecafde";
|
|
Glean.usage.profileId.set(kTestUuid);
|
|
Assert.equal(
|
|
kTestUuid,
|
|
Glean.usage.profileId.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
kTestUuid,
|
|
Glean.usage.profileId.testGetValue("usage-deletion-request")
|
|
);
|
|
|
|
let deletionRequestSubmitted = false;
|
|
GleanPings.usageDeletionRequest.testBeforeNextSubmit(reason => {
|
|
deletionRequestSubmitted = true;
|
|
|
|
// The deletion request needs the previous identifier.
|
|
Assert.equal(
|
|
kTestUuid,
|
|
Glean.usage.profileId.testGetValue("usage-deletion-request")
|
|
);
|
|
|
|
Assert.equal(reason, "set_upload_enabled");
|
|
});
|
|
|
|
// Disable the pref: we should witness a falling edge.
|
|
Services.prefs.setBoolPref("datareporting.usage.uploadEnabled", false);
|
|
|
|
Assert.ok(
|
|
deletionRequestSubmitted,
|
|
"'usage-deletion-request' ping submitted"
|
|
);
|
|
|
|
// We can't inspect the enablement of a ping directly (yet), so we witness
|
|
// related behaviour instead. Disabling a ping clears the stored values for
|
|
// that ping.
|
|
Assert.equal(null, Glean.usage.profileId.testGetValue("usage-reporting"));
|
|
|
|
// Enable the pref: we should witness a rising edge.
|
|
Services.prefs.setBoolPref("datareporting.usage.uploadEnabled", true);
|
|
|
|
// Collect values for additional metrics to check within the ping.
|
|
let os = ClientEnvironmentBase.os;
|
|
const testOs = Services.appinfo.OS;
|
|
const testOsVersion = os.version;
|
|
const testWindowsBuildNumber = os.windowsBuildNumber;
|
|
const testAppBuild = Services.appinfo.appBuildID;
|
|
const testAppDisplayVersion = ClientEnvironmentBase.version;
|
|
const testChannel = ClientEnvironmentBase.channel;
|
|
const testIsDefault = ClientEnvironmentBase.isDefaultBrowser;
|
|
const testDistributionId = ClientEnvironmentBase.distribution;
|
|
await UsageReporting.ensureInitialized();
|
|
let profileAccessor = await ProfileAge();
|
|
let firstUse = new Date(await profileAccessor.firstUse);
|
|
|
|
let usageReportingSubmitted = false;
|
|
GleanPings.usageReporting.testBeforeNextSubmit(_reason => {
|
|
usageReportingSubmitted = true;
|
|
|
|
// The usage reporting ping needs an identifier.
|
|
Assert.notEqual(
|
|
null,
|
|
Glean.usage.profileId.testGetValue("usage-reporting")
|
|
);
|
|
|
|
// And it should *not* be the old identifier; toggling the preference should
|
|
// abandon any existing usage reporting data.
|
|
Assert.notEqual(
|
|
kTestUuid,
|
|
Glean.usage.profileId.testGetValue("usage-reporting")
|
|
);
|
|
|
|
// Check additional metrics
|
|
Assert.equal(testOs, Glean.usage.os.testGetValue("usage-reporting"));
|
|
Assert.equal(
|
|
testOsVersion,
|
|
Glean.usage.osVersion.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testWindowsBuildNumber,
|
|
Glean.usage.windowsBuildNumber.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testAppBuild,
|
|
Glean.usage.appBuild.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testAppDisplayVersion,
|
|
Glean.usage.appDisplayVersion.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testChannel,
|
|
Glean.usage.appChannel.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testIsDefault,
|
|
Glean.usage.isDefaultBrowser.testGetValue("usage-reporting")
|
|
);
|
|
Assert.equal(
|
|
testDistributionId,
|
|
Glean.usage.distributionId.testGetValue("usage-reporting")
|
|
);
|
|
// Truncate the firstUse to the same granularity as used by the Glean
|
|
// `usage.firstRunDate` metric.
|
|
let firstUsedTruncatedToDay = new Date(firstUse);
|
|
firstUsedTruncatedToDay.setHours(0);
|
|
firstUsedTruncatedToDay.setMinutes(0);
|
|
firstUsedTruncatedToDay.setSeconds(0);
|
|
firstUsedTruncatedToDay.setMilliseconds(0);
|
|
Assert.equal(
|
|
firstUsedTruncatedToDay.getTime(),
|
|
Glean.usage.firstRunDate.testGetValue("usage-reporting").getTime()
|
|
);
|
|
});
|
|
|
|
// In Firefox itself, the usage reporting ping is sent on the baseline ping
|
|
// schedule. In testing, we have to do it by hand.
|
|
GleanPings.usageReporting.submit();
|
|
|
|
Assert.ok(usageReportingSubmitted, "'usage-reporting' ping submitted");
|
|
});
|