fune/browser/components/attribution/test/xpcshell/test_MacAttribution.js
Ben Hearsum 16fe634564 Bug 1816998: Replace macOS quarantine database-based attribution with extended attribute attribution r=nalexander
With extended attribute attribution using exactly the same attribution strings as Windows (eg: no URLs), this turns out to be quite straightforward. Once we've pulled in the attribution string from the extended attribute, the existing parsing, validation, etc. just works.

The only wrinkle is that the extended attributes may have nul bytes or tabs that we need to strip away. (Tabs may be present because we use them to pad the attribution area when we prepare the DMG for attribution. Nul bytes may be present because we overwrite the entire attribution before updating the attribution data.)

Differential Revision: https://phabricator.services.mozilla.com/D189258
2023-10-05 23:30:57 +00:00

134 lines
3.6 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
"use strict";
const { MacAttribution } = ChromeUtils.importESModule(
"resource:///modules/MacAttribution.sys.mjs"
);
let extendedAttributeTestCases = [
{
raw: "__MOZCUSTOM__dlsource%3D=mozci",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "__MOZCUSTOM__dlsource%3D=mozci\0\0\0\0\0",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "__MOZCUSTOM__dlsource%3D=mozci\t\t\t\t\t",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "__MOZCUSTOM__dlsource%3D=mozci\0\0\0\t\t",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "__MOZCUSTOM__dlsource%3D=mozci\t\t\0\0",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "__MOZCUSTOM__dlsource%3D=mozci\0\t\0\t\0\t",
expected: "dlsource%3D=mozci",
error: false,
},
{
raw: "",
expected: "",
error: true,
},
{
raw: "dlsource%3D=mozci\0\t\0\t\0\t",
expected: "",
error: true,
},
];
add_task(async () => {
await setupStubs();
});
// Tests to ensure that MacAttribution.getAttributionString
// strips away the parts of the extended attribute that it should,
// and that invalid extended attribute values result in no attribution
// data.
add_task(async function testExtendedAttributeProcessing() {
for (let entry of extendedAttributeTestCases) {
await MacAttribution.setAttributionString(entry.raw);
try {
let got = await MacAttribution.getAttributionString();
if (entry.error === true) {
Assert.ok(false, "Expected error, raw code was: " + entry.raw);
}
Assert.equal(
got,
entry.expected,
"Returned code should match expected value, raw code was: " + entry.raw
);
} catch (err) {
if (entry.error === false) {
Assert.ok(
false,
"Unexpected error, raw code was: " + entry.raw + " error is: " + err
);
}
}
}
});
add_task(async function testValidAttrCodes() {
for (let entry of validAttrCodes) {
if (entry.platforms && !entry.platforms.includes("mac")) {
continue;
}
await MacAttribution.setAttributionString("__MOZCUSTOM__" + entry.code);
// Read attribution code from xattr.
await AttributionCode.deleteFileAsync();
AttributionCode._clearCache();
let result = await AttributionCode.getAttrDataAsync();
Assert.deepEqual(
result,
entry.parsed,
"Parsed code should match expected value, code was: " + entry.code
);
// Read attribution code from cache.
AttributionCode._clearCache();
result = await AttributionCode.getAttrDataAsync();
Assert.deepEqual(
result,
entry.parsed,
"Parsed code should match expected value, code was: " + entry.code
);
// Does not overwrite cached existing attribution code.
await MacAttribution.setAttributionString("__MOZCUSTOM__testcode");
result = await AttributionCode.getAttrDataAsync();
Assert.deepEqual(
result,
entry.parsed,
"Parsed code should match expected value, code was: " + entry.code
);
}
});
add_task(async function testInvalidAttrCodes() {
for (let code of invalidAttrCodes) {
await MacAttribution.setAttributionString("__MOZCUSTOM__" + code);
// Read attribution code from referrer.
await AttributionCode.deleteFileAsync();
AttributionCode._clearCache();
let result = await AttributionCode.getAttrDataAsync();
Assert.deepEqual(result, {}, "Code should have failed to parse: " + code);
}
});