diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 0087961..edd768f 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -84,12 +84,24 @@ jobs: timeout-minutes: 16 shell: bash run: scripts/run_ci_tests.sh + - name: Run desktop tests + timeout-minutes: 10 + shell: bash + env: + TOGA_BACKEND: toga_dummy + run: scripts/run_gui_tests.sh - name: Upload pytest log if: always() uses: actions/upload-artifact@v4 with: name: pytest-log-${{ matrix.os }} path: pytest.log + - name: Upload GUI pytest log + if: always() + uses: actions/upload-artifact@v4 + with: + name: gui-pytest-log-${{ matrix.os }} + path: pytest_gui.log - name: Upload coverage report uses: actions/upload-artifact@v4 with: diff --git a/scripts/run_gui_tests.sh b/scripts/run_gui_tests.sh new file mode 100755 index 0000000..3962394 --- /dev/null +++ b/scripts/run_gui_tests.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -eo pipefail + +pytest_args=(-vv --desktop -m desktop src/tests) +if [[ "${RUNNER_OS:-}" == "Windows" ]]; then + pytest_args+=(-n 1) +fi + +timeout_bin="timeout" +if ! command -v "$timeout_bin" >/dev/null 2>&1; then + if command -v gtimeout >/dev/null 2>&1; then + timeout_bin="gtimeout" + else + timeout_bin="" + fi +fi + +if [[ -n "$timeout_bin" ]]; then + $timeout_bin 10m pytest "${pytest_args[@]}" 2>&1 | tee pytest_gui.log + status=${PIPESTATUS[0]} +else + echo "timeout command not found; running tests without timeout" >&2 + pytest "${pytest_args[@]}" 2>&1 | tee pytest_gui.log + status=${PIPESTATUS[0]} +fi + +if [[ $status -eq 124 ]]; then + echo "::error::Desktop tests exceeded 10-minute limit" + tail -n 20 pytest_gui.log + exit 1 +fi +exit $status