Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
add_setup(clickTestSetup);
async function verifyDetectedCMPTelemetry(expected) {
// Ensure we have all data from the content process.
await Services.fog.testFlushAllChildren();
let LABELS = [
"trustarcbar",
"quantcast",
"borlabs",
"consentmanagernet",
"cookiebot",
"complianz",
"onetrust",
"didomi",
"sourcepoint",
];
let testMetricState = doAssert => {
for (let label of LABELS) {
let expectedValue = expected[label] ?? null;
if (doAssert) {
is(
Glean.cookieBannersCmp.detectedCmp[label].testGetValue(),
expectedValue,
`Counter for label '${label}' has correct state.`
);
} else if (
Glean.cookieBannersCmp.detectedCmp[label].testGetValue() !==
expectedValue
) {
return false;
}
}
return true;
};
// Wait for the labeled counter to match the expected state. Returns greedy on
// mismatch.
try {
await TestUtils.waitForCondition(
testMetricState,
"Waiting for cookieBannersClick.result metric to match."
);
} finally {
// Test again but this time with assertions and test all labels.
testMetricState(true);
}
}
async function verifyRatioTelemetry(expected) {
// Ensure we have all data from the content process.
await Services.fog.testFlushAllChildren();
let cmpMetric = Glean.cookieBannersCmp.ratioHandledByCmpRule;
let testMetricState = doAssert => {
let cmpValue = cmpMetric.testGetValue();
if (!cmpValue) {
return false;
}
if (!doAssert) {
return (
cmpValue.numerator == expected.cmp.numerator &&
cmpValue.denominator == expected.cmp.denominator
);
}
is(
cmpValue.numerator,
expected.cmp.numerator,
"The numerator of rateHandledByCmpRule is expected"
);
is(
cmpValue.denominator,
expected.cmp.denominator,
"The denominator of rateHandledByCmpRule is expected"
);
return true;
};
// Wait for matching the expected state.
try {
await TestUtils.waitForCondition(
testMetricState,
"Waiting for metric to match."
);
} finally {
// Test again but this time with assertions and test all labels.
testMetricState(true);
}
}
add_task(async function test_cmp_telemetry() {
await SpecialPowers.pushPrefEnv({
set: [
["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
["cookiebanners.service.enableGlobalRules", true],
["cookiebanners.bannerClicking.maxTriesPerSiteAndSession", 0],
],
});
info("Clearing existing rules");
Services.cookieBanners.resetRules(false);
info("Inserting global test rules.");
info(
"Add global ruleA with a predefined identifier. This rule will handle the banner."
);
let ruleA = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
Ci.nsICookieBannerRule
);
ruleA.id = "trustarcbar";
ruleA.domains = [];
ruleA.addClickRule(
"div#banner",
false,
Ci.nsIClickRule.RUN_TOP,
null,
"button#optOut",
"button#optIn"
);
Services.cookieBanners.insertRule(ruleA);
info("Add global ruleC with another predefined identifier.");
let ruleC = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
Ci.nsICookieBannerRule
);
ruleC.id = "quantcast";
ruleC.domains = [];
ruleC.addClickRule(
"div#banner",
false,
Ci.nsIClickRule.RUN_TOP,
null,
"button#nonExistingOptOut",
"button#nonExistingOptIn"
);
Services.cookieBanners.insertRule(ruleC);
info("Open a test page and verify the telemetry");
await openPageAndVerify({
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
await verifyRatioTelemetry({
cmp: { numerator: 1, denominator: 1 },
});
await verifyDetectedCMPTelemetry({
trustarcbar: 1,
quantcast: 1,
});
info("Open the test page again and verify if the telemetry gets updated");
await openPageAndVerify({
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
await verifyRatioTelemetry({
cmp: { numerator: 2, denominator: 2 },
});
await verifyDetectedCMPTelemetry({
trustarcbar: 2,
quantcast: 2,
});
info("Add domain specific rule which also targets the existing banner.");
let ruleDomain = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
Ci.nsICookieBannerRule
);
ruleDomain.id = genUUID();
ruleDomain.domains = [TEST_DOMAIN_A];
ruleDomain.addClickRule(
"div#banner",
false,
Ci.nsIClickRule.RUN_TOP,
null,
"button#optOut",
"button#optIn"
);
Services.cookieBanners.insertRule(ruleDomain);
info("Open the test page and now the site-specific rule will handle it");
await openPageAndVerify({
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
info("Verify that the CMP telemetry doesn't get updated.");
await verifyDetectedCMPTelemetry({
trustarcbar: 2,
quantcast: 2,
});
info(
"Verify the handled ratio telemetry for site-specific rule gets updated."
);
await verifyRatioTelemetry({
cmp: { numerator: 2, denominator: 3 },
});
// Clear Telemetry
await Services.fog.testFlushAllChildren();
Services.fog.testResetFOG();
});