Skip to content

Commit

Permalink
Merge pull request #197 from mozilla/fix-193
Browse files Browse the repository at this point in the history
fix(project): Update to current foxpuppet for chrome utils fix and fix about:studies test.
  • Loading branch information
b4handjr authored Feb 18, 2025
2 parents 7eb55b6 + c84270e commit 8c7893f
Show file tree
Hide file tree
Showing 12 changed files with 186 additions and 97 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
docker push mozilla/klaatu:firefox-release
lint:
docker:
- image: cimg/python:3.11
- image: cimg/python:3.12
steps:
- checkout
- restore_cache:
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile.desktop
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

FROM python:3-slim as moz-central
FROM python:3.12-slim as moz-central

RUN apt-get -qq update && apt-get -qq install -y git

RUN git clone https://github.com/mozilla/gecko-dev.git --depth 1

FROM python:3-slim
FROM python:3.12-slim

USER root

Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ services:
ports:
- "5000:5000"
static-server:
image: python:3.11.3-alpine
image: python:3.12-alpine
volumes:
- ./tests/fixtures/:/code/fixtures
working_dir: /code/fixtures
Expand Down
90 changes: 80 additions & 10 deletions poetry.lock

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ profile = "black"
skip_gitignore = true

[tool.mypy]
python_version = "3.11"
python_version = "3.12"
disable_error_code = "attr-defined"
disallow_untyped_calls = false
follow_imports = "normal"
Expand All @@ -32,7 +32,7 @@ warn_unused_ignores = true
warn_unreachable = true

[tool.poetry.dependencies]
python = "^3.11"
python = "^3.12"
pydocstyle = "^6.3.0"
selenium = "^4.28.1"
pytest-bdd = "^7.3.0"
Expand Down
39 changes: 19 additions & 20 deletions search_server/server.cert
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDqTCCApGgAwIBAgIULJBBRLQh22M2MhOyAAUWWRgHDAQwDQYJKoZIhvcNAQEL
BQAwZDELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEdMBsGA1UEAwwUa2xhYXR1LXNlYXJj
aC1zZXJ2ZXIwHhcNMjQwMzExMTQxOTEyWhcNMjQwNDEwMTQxOTEyWjBkMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQg
V2lkZ2l0cyBQdHkgTHRkMR0wGwYDVQQDDBRrbGFhdHUtc2VhcmNoLXNlcnZlcjCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdIA8ZbxxIJZ0zWvfKqURYD
I5YSGNA3wcCmPX1yqM/rmLUNqjIBGU4UJt1TTInCSN7INO76k5OXsjPsdGQ5Y14w
dzct7lChbMxLhm+Ary5EgvUSJONXDrTndP0o9XEpEZVs9mV4JpyFpx6r+bwKD32g
Pjb3NHKMs61Ep0orhMrpLVKkcZf9saNjP78pmMYh1QBBXe3/4E7+5utaNn24tFJV
8DlPSLXYwkyxcXCfngHJwCDFDprTSVjwfYgewNEhiaUVf+34lM4ghqBhj7Gr/ucA
fQHtkZzD1jnPeh/QUg0c/pESqPHWv7apoVC6NM8zWnUhWYSjpZZsV9ENR7OqVuMC
AwEAAaNTMFEwHQYDVR0OBBYEFCZIDebbK5hS4945opilJu0sRVO6MB8GA1UdIwQY
MBaAFCZIDebbK5hS4945opilJu0sRVO6MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggEBABa6YwbMOGzFq+1NZc3aW6arNDoHAEMKxFOsUDGyU6odXSCu
5u+foDMc4fUD9TyXZ3A513Up7uLvamJe8Srp1pI3lhJH+n7jBmoEwvYDtErU43Fc
o8/RxmzJZNKfZcO9BsYT6FkuEYZfE9oHO+AtJTEFkT1vFgbSA2ZeFiUz6OobxcRP
47rcebrd6Dm/Tr3sUXad4MgflSUxtzz1B8IAxz7iPNz4davS2LeO+5nZcFpO2XaJ
rZ9xRbyp7fySOJJl1vNWaRJieAiJV67ehjG2wkGpsUd/1aarm6Gguj9zjAl6Ybt1
Da3HXNsYVUVSrj3oGR/mrb657mUzjiXozka5wfA=
MIIDazCCAlOgAwIBAgIUeBph2ATU00MmKl8BaPn5l5j+jTAwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNTAyMTgxNzIwNDRaFw0yNTAz
MjAxNzIwNDRaMEUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQCn8O12ykxUIqBzzTcB/yqT9ZTHz3AVIzl1q8ratr+6
dRympJeAVRBGhxAg+c8npr2pN42gv2SRKnlCDIsYX0GGcs3NQC+tz5Zed9noaSlX
9xKg6AcJsg6otmNcxZU2kVmrbaQySFpnIWI5ChnthQSNSC50Izm0TcfTAIKOuY7U
zrbsp+1Kt9m+AT8L7sbWHiThq6MSdRVIDpRBOsiuv8VLlv1CQeFiXpf9ljSdSzsT
BZqrdjQKJl6jgeWaHjxw56sY5z68wQGP92nl5K9HL+QTH3TG8gaT3YzTOY5s0KDt
OebCSqSonle4ojU22dCN5TVQjnjtP+G+kP/nANMEAVqlAgMBAAGjUzBRMB0GA1Ud
DgQWBBR3Y0L3DwA41eFf1UV5J3bRpKc9tDAfBgNVHSMEGDAWgBR3Y0L3DwA41eFf
1UV5J3bRpKc9tDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA3
pQMR+dhkkSj4c64H9EJ8JYkmBaY+d9RIpx6NF3Wqn+d7VfCgyPKS58cFXQ4QAF2T
+y4YsCrKM7hQO2hGyyAihY0CYov1CiDfWQsTTKLdA0u3ZhkH3Fa55DZtm9/kMVoH
1Z7SZeBfySNWzoGjqCxq7clGOX2uSm0Lv680oudIbxvhxnh1tnymukVrOKMRkvFh
7EtE+90JarNbzVGur3BVoYH0D7p9lJbinK/aeaxtzAF5qJ1oG6/wWuhEooF3Gfx5
gv7eTPmPpZZ4gUoPs5LY0SlrdJIB66DuWxQkVkTY8YaBBEgz9qDPb56jElhM+MCV
+BApCbxpOjIMyV1cGl9x
-----END CERTIFICATE-----
52 changes: 26 additions & 26 deletions search_server/server.key
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHSAPGW8cSCWdM
1r3yqlEWAyOWEhjQN8HApj19cqjP65i1DaoyARlOFCbdU0yJwkjeyDTu+pOTl7Iz
7HRkOWNeMHc3Le5QoWzMS4ZvgK8uRIL1EiTjVw6053T9KPVxKRGVbPZleCachace
q/m8Cg99oD429zRyjLOtRKdKK4TK6S1SpHGX/bGjYz+/KZjGIdUAQV3t/+BO/ubr
WjZ9uLRSVfA5T0i12MJMsXFwn54BycAgxQ6a00lY8H2IHsDRIYmlFX/t+JTOIIag
YY+xq/7nAH0B7ZGcw9Y5z3of0FINHP6REqjx1r+2qaFQujTPM1p1IVmEo6WWbFfR
DUezqlbjAgMBAAECggEALi0/wqztmf5X03RHG33fwCwGCPY0jbr9yHg8816oQ1Wi
UwHRmDis9myw/MQajilY3Vai/WVO4PpbrrBx3+90WRT96ulXuZNONKCjjB7TePMj
LUqBBbTckYq4jxj4lrofevJ+vdBzkf1eVjsfaTUjlcaV5AKwQoLb96Ba61LeOG4b
B2nc/tE3pBnSunc32bFb3uX0s6UduBUWe+Fw6eVNCXz/PP7qt+UUSDdPhPg1+yu4
FLHZrG7Xz0th099CtzwtyX4IJm+tdN9GAJTMm6s6AFCedVEmeWrBGcDSyfHRFH50
gKMkdOmElyuNYrK+vCMtFGALqrothqHPgXK+Vv5j8QKBgQDhpN/4aKy3Rpies7ff
Ew3ptAKL4OrEH7wEv0XKf8H9rxyAI+IKJM67J5MdBnQuSclI7oYuhWHweZvseroc
h+F0HJ/n483rHwCZTzx4LVS+WgQMQDM/dOCuf0MXnxE9wFqM21aLtdtk2Bzb9qQN
D1I0ZtEn1vZkAjyTNpQyfJI61wKBgQDiFza6PmrL0CyXdvaO5kVaYqKf2xX2tO2+
LoIvc1tN1lYMwjcAWSSGbpdFVtr5yw5Vz6nQXh/JLPTdIGPj3WFPZNvs/omsm6ig
r0OvbhdvSa4SudhUvgjOcS9sMzDrINYd+fsCKPeFEbotDkrcnfajc1bEkBPQUM0M
IEA+FSFu1QKBgQDPvYzaVfyVq/A9RHbHcPKBNFKX15YsxI7EzBiEC8VdOsgBjYfB
EQwnsJK3yUZTi2k+tSNiVzjJPhz4xjDsrYk67lOmGcxuaJeTjii89/cqXROW99B2
3rMw1Ee/ypoEAUEcp59xdxerK3C+br+wqmdjiTmM9VLY1lpQqpIcPSYf9wKBgQCD
Z06NjH1xm7pvBdtjTn58e9tc4W6whpOu90T+4yLr6Gj23WIuN6E86MXOrR50FApu
4VUnH62FtTVT1+F2rFJEXLBd28qUoZuuWG8UZP4F1mLvy0fqaNChe7M+Rbpmzhzk
K0gyBzFlC9qTGT11X/HbKcwCTmLVrkCejZgI/SsDSQKBgQChNVmW2lNV15JBCOEX
zsBa0JMyRtPFcr1zooRgxxcHAlmFmHeETTC3qPTOfuH0O68X/F6PwOBil7nX0oXm
VOZLNGwV2pVNViRtWCyKCDhU0mIyEvlaFhdC+6XBdrYCWmm0qZaq3bhgk5ZG8OGW
TYmAT+FuUwyYXH1i8m/2MTvlAw==
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCn8O12ykxUIqBz
zTcB/yqT9ZTHz3AVIzl1q8ratr+6dRympJeAVRBGhxAg+c8npr2pN42gv2SRKnlC
DIsYX0GGcs3NQC+tz5Zed9noaSlX9xKg6AcJsg6otmNcxZU2kVmrbaQySFpnIWI5
ChnthQSNSC50Izm0TcfTAIKOuY7Uzrbsp+1Kt9m+AT8L7sbWHiThq6MSdRVIDpRB
Osiuv8VLlv1CQeFiXpf9ljSdSzsTBZqrdjQKJl6jgeWaHjxw56sY5z68wQGP92nl
5K9HL+QTH3TG8gaT3YzTOY5s0KDtOebCSqSonle4ojU22dCN5TVQjnjtP+G+kP/n
ANMEAVqlAgMBAAECggEADM4U/Rq9qSievVWnXRKcp31xI68QZ7ww1GUN6ZFHmyr0
zUv9dT6HKCmCNFF31xkimvVuahRN0bfAWSXlsS0KLPsx7/V17TXHzFotFkh2a4ue
MwCeEMIv1fNaLieukeORR73raB4WLojgGWNIyNB8oV0glaBd9P59Pvxp+AHz/wvI
TXv8YALSUH6NyxShxhC66UMpXmAx4e2hJSm4lvwkYIbQw0b9cyKJwpf43zM9N1Lx
xPV3JQdLd1kqnEm+EXU8fvGrp16ViNkl3EYaj4ltei3lbzssDrgkxh6UqLXN9D2I
FrEFL2aEnLf5HYt1eWzluXJz8uaqRXZxLjjI2zW6wQKBgQDMqlrhRaRYYCY0CL21
OoaB62NZ+RUoAeJfOFE1ocC/9rW5gDvEgpSoWnSm3rXJbNakS8IZkW5NeuyN5Z2H
8O/41aOs7ZhuhaVGo9CukZJuRzpKK1io0FSAuVtVC56ZuVb4HgDFpvtSlFG22Rmi
4ZOoMsFY3lC0vgm8oNsz0yikNQKBgQDSEH1qfU3+gdOMcKZlBuUZQRNU9QXz00mB
5Dzwgrz3QpSo7xF//88DZ9HQl30wwx7fBIAzjKAQ0XVtjq0ntSEk9YnT1/U+/+/x
fdCkkFHXxQ/2wXqP0mHHfVcJniLhi7jn+Gdi52v/ZFKnYCEOBLlJKrPMBZQuYPWU
smY4RL7KsQKBgArOI6YpCxgvW1T78SgUQu2xA7nIULmf/9ePHZp7Q7XezJFSl9U0
H60TuXzl3SsZN+vMpB69ctlcWAjVyo9WxRSaEt4aXSXYoHUuSOIuhVCVKhqoVzHy
bcOuBYhj6KetBU5sJxZITpR5iCbjJ1tWFXmX1GVgt1oTfmgbBfeiek7RAoGAO43Z
QJuNxR3hb+twASxXPzWn2Wot6dZ4/I5MiJNIJ4GEy/AbMgLAGeMRJOYN5Aktc2S/
Q94Wcy4u8ISGqr87SlMiZCDRsq60w+47fKw9x8JiqD5qFOQ8PGZYiq1+jhsirQFL
rkqV3639kN48ANFuBkRI/QqH3C448ZMyT7mNrcECgYEAvP+NG8hYzI9HzkDIAPnP
5Y1J1QMUEkgai17xd1N7E+xH/vRBero6KVgCmV2eL7WaQdP82+f5ZF0s3blTwQlj
GuGV00OV8jkhsn1oBQiDnrVrc29W/Ufff3pZNLS+WPUrlbSLcar7GOooUvRe1G5k
ddEYhubG+jwBDQDNE1unlvw=
-----END PRIVATE KEY-----
2 changes: 1 addition & 1 deletion tests/android/generate_smoke_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def search_for_smoke_tests(tests_name):
locations.append(count)

for location in locations:
test_names.append(f"{class_name}#{code[location+3].strip('()')}")
test_names.append(f"{class_name}#{code[location + 3].strip('()')}")
return test_names


Expand Down
40 changes: 21 additions & 19 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,14 +126,14 @@ def fixture_enroll_experiment(
if experiment_branch == "":
pytest.raises("The experiment branch must be declared")
script = """
const ExperimentManager = ChromeUtils.import(
"resource://nimbus/lib/ExperimentManager.jsm"
const ExperimentManager = ChromeUtils.importESModule(
"resource://nimbus/lib/ExperimentManager.sys.mjs"
);
const branchSlug = arguments[1];
ExperimentManager.ExperimentManager.store._deleteForTests(arguments[1])
const recipe = JSON.parse(arguments[0]);
let branch = recipe.branches.find(b => b.slug == branchSlug);
ExperimentManager.ExperimentManager.forceEnroll(recipe, branch);
return ExperimentManager.ExperimentManager.forceEnroll(recipe, branch);
"""

try:
Expand Down Expand Up @@ -297,11 +297,11 @@ def _trigger_experiment_loader():
with selenium.context(selenium.CONTEXT_CHROME):
selenium.execute_script(
"""
const { RemoteSettings } = ChromeUtils.import(
"resource://services-settings/remote-settings.js"
const { RemoteSettings } = ChromeUtils.importESModule(
"resource://services-settings/remote-settings.sys.mjs"
);
const { RemoteSettingsExperimentLoader } = ChromeUtils.import(
"resource://nimbus/lib/RemoteSettingsExperimentLoader.jsm"
const { RemoteSettingsExperimentLoader } = ChromeUtils.importESModule(
"resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs"
);
RemoteSettings.pollChanges();
Expand Down Expand Up @@ -344,24 +344,22 @@ def _check_ping_for_experiment(experiment=None):
def fixture_telemetry_event_check(trigger_experiment_loader, selenium):
def _telemetry_event_check(experiment=None, event=None):
fetch_events = """
return Services.telemetry.snapshotEvents(Ci.nsITelemetry.DATASET_ALL_CHANNELS);
return Glean.nimbusEvents.enrollment.testGetValue("events");
"""

with selenium.context(selenium.CONTEXT_CHROME):
telemetry = selenium.execute_script(fetch_events)
logging.info(f"Event pings: {telemetry}\n")
control = True
timeout = time.time() + 30
timeout = time.time() + 300

while control and time.time() < timeout:
for item in telemetry.get("parent"):
if (experiment and event) in item:
return True
else:
trigger_experiment_loader()
continue
else:
return False
telemetry = selenium.execute_script(fetch_events)
logging.info(f"Event pings: {telemetry}\n")
if any(
experiment in item["extra"].get("experiment", "") for item in telemetry
) and any(event in item["name"] for item in telemetry):
return True
time.sleep(1)
trigger_experiment_loader()

return _telemetry_event_check

Expand Down Expand Up @@ -568,6 +566,10 @@ def setup_browser(selenium, setup_search_test):
root.find_element(By.CSS_SELECTOR, ".popup-notification-primary-button").click()
setup_search_test()
logging.info("Custom search enabled\n")
script = """Services.fog.testResetFOG();"""
with selenium.context(selenium.CONTEXT_CHROME):
selenium.execute_script(script)
logging.info("Cleared Telemetry events\n")
return selenium


Expand Down
4 changes: 2 additions & 2 deletions tests/features/generic_nimbus.feature
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ Feature: Generic Nimbus smoke tests all pass
Scenario: The experiment can unenroll from the about:studies page
Given Firefox is launched enrolled in an Experiment with custom search
Then The Experiment is unenrolled via the about:studies page
And the telemetry shows it as being unenrolled
And the Experiment is shown as disabled on about:studies page

@smoke
Scenario: The experiment can be unenrolled via opting out from studies
Given Firefox is launched enrolled in an Experiment with custom search
Then The experiment can be unenrolled via opting out of studies
And the telemetry shows it as being unenrolled
And the Experiment is shown as disabled on about:studies page
38 changes: 26 additions & 12 deletions tests/scenarios/test_generic_nimbus.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import logging
import time

from pytest_bdd import scenarios, then
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Expand All @@ -19,20 +22,31 @@ def check_branch_in_telemetry(telemetry_event_check, experiment_json, request, e

@then("The Experiment is unenrolled via the about:studies page")
def unenroll_via_studies_page(selenium, experiment_json):
selenium.get("about:studies")
WebDriverWait(selenium, 60).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".study-name")),
message="Experiment not shown on about:studies.",
)
items = selenium.find_elements(By.CSS_SELECTOR, ".study-name")
for item in items:
if experiment_json["userFacingName"] in item.text:
selenium.find_element(By.CSS_SELECTOR, ".remove-button").click()
study_name_locator = (By.CSS_SELECTOR, ".study-name")

timeout = timeout = time.time() + 60
while time.time() < timeout:
selenium.get("about:studies")
WebDriverWait(selenium, 30).until(EC.presence_of_element_located(study_name_locator))
items = selenium.find_elements(*study_name_locator)
if any(item for item in items if experiment_json["userFacingName"] in item.text):
logging.info("Experiment unenrolled")
return True
time.sleep(2)

@then("the telemetry shows it as being unenrolled")
def check_telemetry_for_unenrollment(experiment_slug, telemetry_event_check):
assert telemetry_event_check(experiment=f"optin-{experiment_slug}", event="unenroll")

@then("the Experiment is shown as disabled on about:studies page")
def check_experiment_is_disabled_on_about_studies(selenium, experiment_json):
selenium.get("about:studies")
disabled_studies = selenium.find_elements(
By.CSS_SELECTOR, "#app .inactive-study-list .study.nimbus.disabled"
)
if any(
item
for item in disabled_studies
if experiment_json["slug"] in item.get_attribute("data-study-slug")
):
return True


@then("The experiment can be unenrolled via opting out of studies")
Expand Down
6 changes: 5 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,21 @@ allowlist_externals =
mv

[testenv:exp-tests]
basepython = py312
passenv = *
commands =
poetry install --no-root
poetry run pytest --html=report.html --driver Firefox {posargs}

[testenv:bdd-tests]
basepython = py311
basepython = py312
passenv = *
commands =
poetry install --no-root
poetry run pytest --driver Firefox tests/scenarios/ {posargs}

[testenv:formatting]
basepython = py312
commands =
poetry install --no-root
poetry -V
Expand All @@ -37,12 +39,14 @@ commands =
# poetry run mypy tests/ --config-file=pyproject.toml - Scope too big for now

[testenv:fix-formatting]
basepython = py312
commands =
poetry install --no-root
poetry run black --config pyproject.toml tests/
poetry run isort tests/

[testenv:mypy]
basepython = py312
commands =
poetry install --no-root
poetry run mypy tests/

0 comments on commit 8c7893f

Please sign in to comment.