Skip to content

fix(tests): Update filter expression script to use ExperimentAPI module. #12855

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jul 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions experimenter/tests/integration/nimbus/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ def firefox_options(firefox_options):
"""Set Firefox Options."""
firefox_options.log.level = "trace"
firefox_options.set_preference("remote.system-access-check.enabled", False)
firefox_options.add_argument("-remote-allow-system-access")
return firefox_options


Expand Down
6 changes: 3 additions & 3 deletions experimenter/tests/integration/nimbus/pages/browser/__init__.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@


class Browser:
def execute_script(self, *args, script=None, context=None):
def execute_async_script(self, *args, script=None, context=None):
if "chrome" in context:
with self.context(self.CONTEXT_CHROME):
return self.execute_script(script, *args)
return self.execute_async_script(script, *args)
else:
return self.execute_script
return self.execute_async_script(script, *args)


class AboutConfig(Page):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def test_check_advanced_targeting(
# Inject filter expression
selenium.get("about:blank")
with filter_expression_path.open() as js:
result = Browser.execute_script(
result = Browser.execute_async_script(
selenium,
targeting,
json.dumps({"experiment": recipe}),
Expand Down Expand Up @@ -101,7 +101,7 @@ def test_check_audience_targeting(
# Inject filter expression
selenium.get("about:blank")
with filter_expression_path.open() as js:
result = Browser.execute_script(
result = Browser.execute_async_script(
selenium,
targeting,
json.dumps({"experiment": recipe}),
Expand Down
66 changes: 29 additions & 37 deletions experimenter/tests/integration/nimbus/utils/filter_expression.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,47 @@
async function remoteSettings(arguments) {

/*
Arguments contains 2 items.
arguments[0] - the JEXL targeting string
arguments[1] - the experiment recipe
*/

// See https://bugzilla.mozilla.org/show_bug.cgi?id=1868838 -
// ASRouterTargeting was moved from browser/components/newtab into
// browser/components/asrouter and its import path changed.
async function remoteSettings(targetingString, recipe) {
const { TelemetryEnvironment } = ChromeUtils.importESModule("resource://gre/modules/TelemetryEnvironment.sys.mjs");
await TelemetryEnvironment.onInitialized();

let ASRouterTargeting;

try {
ASRouterTargeting = ChromeUtils.importESModule("resource:///modules/asrouter/ASRouterTargeting.sys.mjs");
} catch (ex) {
if (ex.result === Cr.NS_ERROR_FILE_NOT_FOUND) {
ASRouterTargeting = ChromeUtils.importESModule("resource://activity-stream/lib/ASRouterTargeting.sys.mjs");
} else {
throw ex;
}
}
const ExperimentManager = ChromeUtils.importESModule("resource://nimbus/lib/ExperimentManager.sys.mjs");
const TargetingContext = ChromeUtils.importESModule("resource://messaging-system/targeting/Targeting.sys.mjs");
const { ASRouterTargeting } = ChromeUtils.importESModule("resource:///modules/asrouter/ASRouterTargeting.sys.mjs");
const { ExperimentAPI } = ChromeUtils.importESModule("resource://nimbus/ExperimentAPI.sys.mjs");
const { TargetingContext } = ChromeUtils.importESModule("resource://messaging-system/targeting/Targeting.sys.mjs");

const _experiment = JSON.parse(arguments[1]);
const _experiment = JSON.parse(recipe);
await ExperimentAPI.ready();

const context = TargetingContext.TargetingContext.combineContexts(
const context = TargetingContext.combineContexts(
_experiment,
{
defaultProfile: {},
attributionData: {},
isMSIX: {},
isDefaultHandler: {},
defaultPDFHandler: {}
}, // Workaround for supporting background tasks
ExperimentManager.ExperimentManager.createTargetingContext(),
ASRouterTargeting.ASRouterTargeting.Environment
},
ExperimentAPI._manager.createTargetingContext(),
ASRouterTargeting.Environment
);
const targetingContext = new TargetingContext.TargetingContext(context);
let result = false;
const targetingContext = new TargetingContext(context);
try {
result = await targetingContext.evalWithDefault(arguments[0]) !== undefined;
const evalResult = await targetingContext.evalWithDefault(targetingString);
return evalResult !== undefined;
} catch (err) {
result = null;
return null;
}
return result;
}

let results = remoteSettings(arguments);

return results;
/*
Arguments contains 3 items.
arguments[0] - the JEXL targeting string
arguments[1] - the experiment recipe
arguments[3] - the callback from selenium
*/
const [targetingString, recipe, callback] = arguments;

remoteSettings(targetingString, recipe)
.then(result => {
callback(result);
})
.catch(err => {
callback(null);
});