Bug 1827459 - Add a Nimbus variable for browser.search.serpEventTelemetry.enabled. r=Standard8

Differential Revision: https://phabricator.services.mozilla.com/D176364
This commit is contained in:
Stephanie Cunnane
2023-05-05 14:25:12 +00:00
parent b45b6ce291
commit bc69c60880
3 changed files with 170 additions and 0 deletions

View File

@@ -43,6 +43,10 @@ support-files =
[browser_searchEngine_behaviors.js]
[browser_search_annotation.js]
[browser_search_discovery.js]
[browser_search_glean_serp_telemetry_enabled_by_nimbus_variable.js]
tags = search-telemetry
support-files =
searchTelemetryAd.html
[browser_search_nimbus_reload.js]
[browser_search_telemetry_abandonment.js]
tags = search-telemetry

View File

@@ -0,0 +1,162 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Test to verify we can toggle the Glean SERP telemetry feature via a Nimbus
// variable.
const {
SearchSERPTelemetry,
SearchSERPTelemetryUtils,
} = ChromeUtils.importESModule(
"resource:///modules/SearchSERPTelemetry.sys.mjs"
);
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
ExperimentFakes: "resource://testing-common/NimbusTestUtils.sys.mjs",
});
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"serpEventsEnabled",
"browser.search.serpEventTelemetry.enabled",
false
);
const TEST_PROVIDER_INFO = [
{
telemetryId: "example",
searchPageRegexp: /^https:\/\/example.org\/browser\/browser\/components\/search\/test\/browser\/searchTelemetry(?:Ad)?.html/,
queryParamName: "s",
codeParamName: "abc",
taggedCodes: ["ff"],
followOnParamNames: ["a"],
extraAdServersRegexps: [/^https:\/\/example\.com\/ad2?/],
components: [
{
type: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
default: true,
},
],
},
];
async function verifyEventsRecorded() {
function getSERPUrl(page, organic = false) {
let url =
getRootDirectory(gTestPath).replace(
"chrome://mochitests/content",
"https://example.org"
) + page;
return `${url}?s=test${organic ? "" : "&abc=ff"}`;
}
resetTelemetry();
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
getSERPUrl("searchTelemetryAd.html")
);
assertImpressionEvents([
{
impression: {
provider: "example",
tagged: "true",
partner_code: "ff",
source: "unknown",
is_shopping_page: "false",
shopping_tab_displayed: "false",
},
},
]);
await waitForPageWithAdImpressions();
assertAdImpressionEvents([
{
component: SearchSERPTelemetryUtils.COMPONENTS.AD_LINK,
ads_loaded: "2",
ads_visible: "2",
ads_hidden: "0",
},
]);
BrowserTestUtils.removeTab(tab);
assertAbandonmentEvent({
abandonment: {
reason: SearchSERPTelemetryUtils.ABANDONMENTS.TAB_CLOSE,
},
});
}
// sharedData messages are only passed to the child on idle. Therefore
// we wait for a few idles to try and ensure the messages have been able
// to be passed across and handled.
async function waitForIdle() {
for (let i = 0; i < 10; i++) {
await new Promise(resolve => Services.tm.idleDispatchToMainThread(resolve));
}
}
add_setup(async function() {
SearchSERPTelemetry.overrideSearchTelemetryForTests(TEST_PROVIDER_INFO);
await waitForIdle();
// Enable local telemetry recording for the duration of the tests.
let oldCanRecord = Services.telemetry.canRecordExtended;
Services.telemetry.canRecordExtended = true;
await SpecialPowers.pushPrefEnv({
set: [["browser.search.log", true]],
});
registerCleanupFunction(async () => {
SearchSERPTelemetry.overrideSearchTelemetryForTests();
Services.telemetry.canRecordExtended = oldCanRecord;
await SpecialPowers.popPrefEnv();
resetTelemetry();
});
});
add_task(async function test_enable_experiment() {
Assert.equal(
lazy.serpEventsEnabled,
false,
"serpEventsEnabled should be false when not enrolled in experiment."
);
await lazy.ExperimentAPI.ready();
let doExperimentCleanup = await lazy.ExperimentFakes.enrollWithFeatureConfig(
{
featureId: NimbusFeatures.search.featureId,
value: {
serpEventTelemetryEnabled: true,
},
},
{ isRollout: true }
);
Assert.equal(
lazy.serpEventsEnabled,
true,
"serpEventsEnabled should be true when enrolled in experiment."
);
// To ensure Nimbus set "browser.search.serpEventTelemetry.enabled" to true,
// we test that an impression, ad_impression and abandonment event are
// recorded correctly.
await verifyEventsRecorded();
await doExperimentCleanup();
Assert.equal(
lazy.serpEventsEnabled,
false,
"serpEventsEnabled should be false after experiment."
);
});

View File

@@ -83,6 +83,10 @@ search:
type: string
setPref: browser.search.param.google_channel_row
description: A string pref set by Nimbus tests for Rest of World search cohort
serpEventTelemetryEnabled:
type: boolean
setPref: browser.search.serpEventTelemetry.enabled
description: Whether the Glean SERP event telemetry is enabled.
urlbar:
description: The Address Bar