Skip to content

Commit 3221c24

Browse files
committed
Run headed browser tests under xvfb
1 parent 438a7a5 commit 3221c24

5 files changed

Lines changed: 24 additions & 5 deletions

File tree

docs/msra-app.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
| `version` | Версия клиента или API-контракта | Копируется в generated package и используется как версия артефакта. Значение должно быть статическим. |
1818
| `timeout_ms` | Глобальный таймаут по умолчанию | Становится базовым лимитом для runtime-операций и используется, если локальный блок не переопределяет timeout. |
1919
| `browser` | Браузер по умолчанию | Определяет, какой движок запустит runtime для warmup и browser-backed функций. Если не указан, runtime использует `camoufox` по умолчанию. |
20-
| `@DisallowHeadless` | Запрещает headless-запуск | Меняет дефолт `headless` на `False` и заставляет runtime выбрасывать ошибку, если caller всё же просит `headless=True`. |
20+
| `@DisallowHeadless` | Запрещает headless-запуск | Меняет дефолт `headless` на `False`, заставляет runtime выбрасывать ошибку, если caller всё же просит `headless=True`, и переключает generated test pipeline на headed запуск под `xvfb-run` (runner должен предоставлять `xvfb-run`). |
2121
| `@Humanize` | Включает humanized-режим браузера | Передаёт `humanize=` в `AsyncCamoufox`, снижает “ботоподобность” поведения и требует `browser="camoufox"`. Разрешена либо как пустая аннотация, либо с положительным числом интенсивности, например `@Humanize(0.5)`. |
2222
| `@BlockImages` | Блокирует загрузку изображений | Передаёт `block_images=` в `AsyncCamoufox`, ускоряет старт и экономит трафик. Аннотация работает только с `browser="camoufox"`. |
2323

@@ -42,7 +42,7 @@
4242
### Что меняется
4343

4444
- `browser` определяет движок, на котором запускаются warmup и browser-backed функции.
45-
- `@DisallowHeadless` меняет значение по умолчанию для `headless` на `False` и запрещает запуск с `headless=True`.
45+
- `@DisallowHeadless` меняет значение по умолчанию для `headless` на `False`, запрещает запуск с `headless=True` и переключает generated test workflow на headed запуск под `xvfb-run`.
4646
- `@Humanize` и `@BlockImages` валидны только при `browser="camoufox"`.
4747
- Если значение не задано, runtime и generated client используют `camoufox` как дефолтный режим.
4848
- `package_name` задаёт имя generated Python-пакета; generator больше не пытается выводить его из `name`.
@@ -62,4 +62,4 @@
6262
`@BlockImages` блокирует загрузку изображений при старте браузера.
6363
`@DisallowHeadless` делает `headless=False` значением по умолчанию и выбрасывает runtime error, если клиент всё же стартует с `headless=True`.
6464

65-
`@Humanize` и `@BlockImages` работают только с `browser="camoufox"`. `@DisallowHeadless` не зависит от выбранного браузера.
65+
`@Humanize` и `@BlockImages` работают только с `browser="camoufox"`. `@DisallowHeadless` не зависит от выбранного браузера, но влияет на generated CI pipeline, который начинает запускать браузерные тесты через `xvfb-run`.

msra_codegen/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ install_commands = [
6868
"venv/bin/python -m pip install -U pip",
6969
"venv/bin/python -m pip install -r requirements-dev.txt",
7070
]
71+
run_command_shell = "bash -e -lc"
72+
headed_run_command_shell = "xvfb-run -a bash -e -lc"
7173
run_commands = [
7274
"set -o pipefail",
7375
"venv/bin/python -m pytest --jsss-ci-cd --save-original --tb=short 2>&1 | tee error.log",

msra_codegen/github_workflows.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
def build_github_workflows_context(project: dict[str, Any], package_name: str) -> dict[str, Any]:
13+
app = project.get("app", {})
1314
github_config = config_section("github", "workflows")
1415
tests_config = github_config["tests"]
1516
publish_config = github_config["publish"]
@@ -21,6 +22,8 @@ def build_github_workflows_context(project: dict[str, Any], package_name: str) -
2122
tests_python_version = str(tests_config["python_version"])
2223
publish_python_version = str(publish_config["python_version"])
2324
source_sync_python_version = str(source_sync_config["python_version"])
25+
tests_run_command_shell = str(tests_config["run_command_shell"])
26+
tests_headed_run_command_shell = str(tests_config["headed_run_command_shell"])
2427
preserved_target_paths = app_sync_config.get("preserved_target_paths", [])
2528
if not isinstance(preserved_target_paths, list):
2629
raise RuntimeError("app.sync.preserved_target_paths must be a list.")
@@ -41,6 +44,9 @@ def build_github_workflows_context(project: dict[str, Any], package_name: str) -
4144
"setup_python_action": str(tests_config["setup_python_action"]),
4245
"install_commands": list(tests_config["install_commands"]),
4346
"run_commands": list(tests_config["run_commands"]),
47+
"run_command_shell": tests_run_command_shell,
48+
"headed_run_command_shell": tests_headed_run_command_shell,
49+
"requires_xvfb": bool(app["disallow_headless"]),
4450
"report_playwright_failure_action": str(tests_config["report_playwright_failure_action"]),
4551
"report_schema_action": str(tests_config["report_schema_action"]),
4652
"github_token_expr": "${{ secrets." + str(tests_config["github_token_secret"]) + " }}",

msra_codegen/templates/github/workflows/tests.yml.tpl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,17 @@ jobs:
4141
{% endfor %}
4242

4343
- name: Run tests (venv)
44-
run: |
44+
env:
45+
MSRA_RUN_COMMANDS: |
4546
{% for line in tests.run_commands %}
46-
{{ line }}
47+
{{ line }}
4748
{% endfor %}
49+
run: |
50+
{% if tests.requires_xvfb %}
51+
{{ tests.headed_run_command_shell }} "$MSRA_RUN_COMMANDS"
52+
{% else %}
53+
{{ tests.run_command_shell }} "$MSRA_RUN_COMMANDS"
54+
{% endif %}
4855

4956
- name: report playwright failure
5057
if: failure()

tests/codegen.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,10 +1017,14 @@ test("python codegen builds the demo project", () => {
10171017
assert.strictEqual(validateResult.status, 0, validateResult.stderr || validateResult.stdout);
10181018

10191019
const readmeText = readFileSync(path.join(outputDir, "README.md"), "utf8");
1020+
const testsWorkflowText = normalizeNewlines(
1021+
readFileSync(path.join(outputDir, ".github", "workflows", "tests.yml"), "utf8"),
1022+
);
10201023
assert.match(
10211024
readmeText,
10221025
/\[!\[Ruff\]\(https:\/\/img\.shields\.io\/badge\/linting-Ruff-blue\?logo=ruff&logoColor=white\)\]\(https:\/\/github\.com\/astral-sh\/ruff\)/,
10231026
);
1027+
assert.match(testsWorkflowText, /xvfb-run -a bash -e -lc "\$MSRA_RUN_COMMANDS"/);
10241028

10251029
const probeScript = [
10261030
buildGeneratedPackageProbeScript({ expectedHeadlessDefault: false }),

0 commit comments

Comments
 (0)