flatpak: run host interpreters via flatpak-spawn; validation --mode flag
py_func, lua_func and the run item now reach host binaries through `flatpak-spawn --host` instead of trying to load them under the sandbox runtime (which fails with a glibc ABI mismatch). Adds `--talk-name=org.freedesktop.Flatpak` to the manifest, stages the /app/lib/testium tree under /tmp so the host can read it, and drops the dead `_FLATPAK_HOST_DIRS` / lib-injection code paths that the new approach makes obsolete. Validation suite gains a `--mode source|wheel|pyinstaller|flatpak| appimage` flag so the same item set can run against every packaging channel; per-mode report file names avoid clobbering. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,61 +1,131 @@
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
REM Runs the testium validation suite with a dedicated Python venv used
|
||||
REM by every py_func / cycle / inline-eval subprocess. testium itself
|
||||
REM keeps running in the project's own environment; the validation venv
|
||||
REM only isolates *test execution*.
|
||||
REM Runs the testium validation suite against any installable channel of
|
||||
REM testium on Windows (source, wheel, pyinstaller).
|
||||
REM
|
||||
REM test\validation\run.bat [clean] [extra testium args]
|
||||
REM Usage:
|
||||
REM test\validation\run.bat [clean] [--mode MODE] [extra testium args]
|
||||
REM
|
||||
REM Requires the project venv to already exist (run the project's
|
||||
REM run.bat once first, or any other testium install method).
|
||||
REM clean remove the validation venv before recreating it
|
||||
REM (must be the first argument; useful after a Python upgrade)
|
||||
REM
|
||||
REM --mode MODE which testium build to validate. One of:
|
||||
REM source (default) project's run.bat (src\testium)
|
||||
REM wheel dist\testium-<v>-py3-none-any.whl
|
||||
REM pyinstaller dist\testium-<v>.exe (or dist\testium-<v>)
|
||||
REM
|
||||
REM Every test-execution subprocess runs in a dedicated host venv under
|
||||
REM %TEMP%\testium-validation-venv (created with --system-site-packages,
|
||||
REM then junit-xml is pip-installed for post_execution.py).
|
||||
REM
|
||||
REM The report file is suffixed with the mode so consecutive runs in
|
||||
REM different modes don't overwrite each other.
|
||||
|
||||
SET "SCRIPT_DIR=%~dp0"
|
||||
SET "PROJECT_DIR=%SCRIPT_DIR%..\.."
|
||||
REM Venv in the user temp dir (Windows equivalent of /tmp).
|
||||
SET "VENV_DIR=%TEMP%\testium-validation-venv"
|
||||
SET "PROJECT_VENV=%PROJECT_DIR%\test\tmp\testium_venv"
|
||||
IF "%SCRIPT_DIR:~-1%"=="\" SET "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
|
||||
SET "PROJECT_DIR=%SCRIPT_DIR%\..\.."
|
||||
SET /P VERSION=<"%PROJECT_DIR%\src\VERSION"
|
||||
|
||||
REM ---------- arg parsing ----------------------------------------------------
|
||||
|
||||
SET "MODE=source"
|
||||
SET "CLEAN=0"
|
||||
IF /I "%~1"=="clean" (
|
||||
rmdir /s /q "%VENV_DIR%"
|
||||
SET "CLEAN=1"
|
||||
SHIFT
|
||||
)
|
||||
|
||||
REM Locate a host Python.
|
||||
SET "PYTHON_EXE=python"
|
||||
SET "EXTRA="
|
||||
:PARSE_ARGS
|
||||
IF "%~1"=="" GOTO ARGS_DONE
|
||||
IF /I "%~1"=="--mode" (
|
||||
SET "MODE=%~2"
|
||||
SHIFT
|
||||
SHIFT
|
||||
GOTO PARSE_ARGS
|
||||
)
|
||||
SET "EXTRA=!EXTRA! "%~1""
|
||||
SHIFT
|
||||
GOTO PARSE_ARGS
|
||||
:ARGS_DONE
|
||||
|
||||
REM ---------- locate host python ---------------------------------------------
|
||||
|
||||
SET "PYTHON_EXE="
|
||||
py --version >nul 2>&1
|
||||
IF %ERRORLEVEL% EQU 0 (
|
||||
SET "PYTHON_EXE=py"
|
||||
goto :PYTHON_FOUND
|
||||
GOTO PYTHON_FOUND
|
||||
)
|
||||
python --version >nul 2>&1
|
||||
IF %ERRORLEVEL% EQU 0 (
|
||||
SET "PYTHON_EXE=python"
|
||||
goto :PYTHON_FOUND
|
||||
GOTO PYTHON_FOUND
|
||||
)
|
||||
echo ERROR : Python could not be found on this system.
|
||||
echo ERROR: Python could not be found on this system.
|
||||
exit /b 1
|
||||
|
||||
:PYTHON_FOUND
|
||||
|
||||
REM ---------- validation venv -------------------------------------------------
|
||||
|
||||
SET "VENV_DIR=%TEMP%\testium-validation-venv"
|
||||
IF "%CLEAN%"=="1" IF EXIST "%VENV_DIR%" rmdir /s /q "%VENV_DIR%"
|
||||
|
||||
IF NOT EXIST "%VENV_DIR%" (
|
||||
echo Creating validation venv at %VENV_DIR%
|
||||
%PYTHON_EXE% -m venv --system-site-packages "%VENV_DIR%"
|
||||
IF %ERRORLEVEL% NEQ 0 (
|
||||
IF !ERRORLEVEL! NEQ 0 (
|
||||
echo ERROR while creating the validation venv.
|
||||
exit /b 1
|
||||
)
|
||||
call "%VENV_DIR%\Scripts\pip" install --quiet --upgrade pip
|
||||
call "%VENV_DIR%\Scripts\pip" install --quiet junit-xml
|
||||
)
|
||||
|
||||
SET "VENV_PYTHON=%VENV_DIR%\Scripts\python.exe"
|
||||
|
||||
IF NOT EXIST "%PROJECT_VENV%" (
|
||||
echo ERROR : project venv not found at %PROJECT_VENV%. Run the project run.bat once first.
|
||||
REM ---------- shared "tail" forwarded to every launcher -----------------------
|
||||
REM Reports are stamped with the mode so successive runs don't clobber each other.
|
||||
|
||||
SET "TAIL=-b -d "python_bin=%VENV_PYTHON%" -d "validation_report_file=validation-%MODE%" -- "%SCRIPT_DIR%\main.tum"%EXTRA%"
|
||||
|
||||
REM ---------- per-mode launcher ----------------------------------------------
|
||||
|
||||
echo -- validation mode: %MODE%
|
||||
|
||||
IF /I "%MODE%"=="source" GOTO MODE_SOURCE
|
||||
IF /I "%MODE%"=="wheel" GOTO MODE_WHEEL
|
||||
IF /I "%MODE%"=="pyinstaller" GOTO MODE_PYI
|
||||
echo ERROR: unknown --mode '%MODE%'. Expected: source ^| wheel ^| pyinstaller.
|
||||
exit /b 1
|
||||
|
||||
:MODE_SOURCE
|
||||
call "%PROJECT_DIR%\run.bat" %TAIL%
|
||||
exit /b %ERRORLEVEL%
|
||||
|
||||
:MODE_WHEEL
|
||||
SET "WHEEL=%PROJECT_DIR%\dist\testium-%VERSION%-py3-none-any.whl"
|
||||
IF NOT EXIST "%WHEEL%" (
|
||||
echo ERROR: wheel not found at %WHEEL% -- run build_all.sh first.
|
||||
exit /b 1
|
||||
)
|
||||
SET "WHEEL_VENV=%TEMP%\testium-wheel-venv-%VERSION%"
|
||||
IF "%CLEAN%"=="1" IF EXIST "%WHEEL_VENV%" rmdir /s /q "%WHEEL_VENV%"
|
||||
IF NOT EXIST "%WHEEL_VENV%" (
|
||||
echo Creating wheel venv at %WHEEL_VENV%
|
||||
%PYTHON_EXE% -m venv --system-site-packages "%WHEEL_VENV%"
|
||||
call "%WHEEL_VENV%\Scripts\pip" install --quiet --upgrade pip
|
||||
call "%WHEEL_VENV%\Scripts\pip" install --quiet "%WHEEL%"
|
||||
)
|
||||
"%WHEEL_VENV%\Scripts\python.exe" -m testium %TAIL%
|
||||
exit /b %ERRORLEVEL%
|
||||
|
||||
call "%PROJECT_VENV%\Scripts\activate"
|
||||
python "%PROJECT_DIR%\src\testium" -b -d "python_bin=%VENV_PYTHON%" -- "%SCRIPT_DIR%main.tum" %*
|
||||
:MODE_PYI
|
||||
SET "PYI_BIN=%PROJECT_DIR%\dist\testium-%VERSION%.exe"
|
||||
IF NOT EXIST "%PYI_BIN%" SET "PYI_BIN=%PROJECT_DIR%\dist\testium-%VERSION%"
|
||||
IF NOT EXIST "%PYI_BIN%" (
|
||||
echo ERROR: PyInstaller binary not found in %PROJECT_DIR%\dist -- run build_all.sh first.
|
||||
exit /b 1
|
||||
)
|
||||
"%PYI_BIN%" %TAIL%
|
||||
exit /b %ERRORLEVEL%
|
||||
|
||||
Reference in New Issue
Block a user