Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
*/
const { BrowserUsageTelemetry } = ChromeUtils.importESModule(
"resource:///modules/BrowserUsageTelemetry.sys.mjs"
);
const { TelemetryTestUtils } = ChromeUtils.importESModule(
);
const TIMESTAMP_TEST_VALUE = "007357735773577357";
let jsonPath = Services.dirsvc.get("XREExeF", Ci.nsIFile).parent;
jsonPath.append("installation_telemetry.json");
let scalarSnapshot = null;
let testDataJSON = null;
if (Services.sysinfo.getProperty("hasWinPackageId")) {
// On MSIX the test data is only used for
// verification purposes, it isn't written anywhere.
testDataJSON = {
installer_type: "msix",
version: AppConstants.MOZ_APP_VERSION,
build_id: AppConstants.MOZ_BULIDID,
admin_user: false,
// The undefined fields are not recorded on MSIX.
silent: undefined,
from_msi: undefined,
default_path: undefined,
install_existed: false,
other_inst: false,
other_msix_inst: false,
profdir_existed: false,
};
} else {
testDataJSON = {
version: "000.0a1",
build_id: "00000000000000",
admin_user: true,
install_existed: false,
profdir_existed: false,
installer_type: "full",
other_inst: false,
other_msix_inst: false,
silent: false,
from_msi: false,
default_path: true,
install_timestamp: TIMESTAMP_TEST_VALUE,
};
}
async function createTestInstallationTelemetry() {
// Only write the file on non-MSIX
if (Services.sysinfo.getProperty("hasWinPackageId")) {
return;
}
let utf16Array = new Uint16Array(
[...JSON.stringify(testDataJSON)].map(char => char.charCodeAt(0))
);
let byteArray = new Uint8Array(utf16Array.buffer);
await IOUtils.write(jsonPath.path, byteArray);
registerCleanupFunction(async () => {
await IOUtils.remove(jsonPath.path, { ignoreAbsent: true });
});
}
add_setup(
{
skip_if: () =>
Services.prefs.getBoolPref("telemetry.fog.artifact_build", false),
},
function () {
do_get_profile();
Services.fog.initializeFOG();
}
);
add_setup(async function () {
Services.telemetry.clearScalars();
await createTestInstallationTelemetry();
await BrowserUsageTelemetry.reportInstallationTelemetry();
scalarSnapshot = Services.telemetry.getSnapshotForScalars(
"new-profile",
false
).parent;
});
add_task(async function test_new_profile_ping() {
Object.entries(testDataJSON).forEach(([key, value]) => {
// We don't log "build_id" as a scalar
if (key == "build_id") {
return;
}
// We must not log install_timestamp as a scalar due
// to fingerprinting risk. Verify that we don't.
if (key == "install_timestamp") {
Assert.ok(
!(`installation.firstSeen.${key}` in scalarSnapshot),
"Must not record " + key + " as a scalar"
);
return;
}
TelemetryTestUtils.assertScalar(
scalarSnapshot,
`installation.firstSeen.${key}`,
value
);
});
});
add_task(
{
skip_if: () =>
Services.prefs.getBoolPref("telemetry.fog.artifact_build", false),
},
async function test_new_profile_gifft_mirror() {
Assert.equal(
testDataJSON.installer_type,
Glean.installationFirstSeen.installerType.testGetValue()
);
Assert.equal(
testDataJSON.version,
Glean.installationFirstSeen.version.testGetValue()
);
Assert.equal(
testDataJSON.admin_user,
Glean.installationFirstSeen.adminUser.testGetValue()
);
Assert.equal(
testDataJSON.install_existed,
Glean.installationFirstSeen.installExisted.testGetValue()
);
Assert.equal(
testDataJSON.profdir_existed,
Glean.installationFirstSeen.profdirExisted.testGetValue()
);
Assert.equal(
testDataJSON.other_inst,
Glean.installationFirstSeen.otherInst.testGetValue()
);
Assert.equal(
testDataJSON.other_msix_inst,
Glean.installationFirstSeen.otherMsixInst.testGetValue()
);
// These fields are only recorded on the full installer.
if (!Services.sysinfo.getProperty("hasWinPackageId")) {
Assert.equal(
testDataJSON.silent,
Glean.installationFirstSeen.silent.testGetValue()
);
Assert.equal(
testDataJSON.from_msi,
Glean.installationFirstSeen.fromMsi.testGetValue()
);
Assert.equal(
testDataJSON.default_path,
Glean.installationFirstSeen.defaultPath.testGetValue()
);
}
}
);