1
0
Fork 0
firefox/toolkit/components/telemetry/tests/unit/test_UsageReporting.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

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