#!/usr/bin/env bash # Cross-compile the test suite (ObsidianDragonTests.exe) and the fake daemon (tools/fake_dragonxd) # for Windows with mingw-w64, then run the tests: directly under WSL (Windows interop), else with # wine if installed, else just build. # # scripts/test-windows.sh [--no-run] [--jobs N] # # Uses its own build/windows-tests tree (full-node config), so build/windows is left alone. Needs # the mingw toolchain file that ./build.sh --win-release writes to build/windows/. Dependency sources # already fetched into build/windows/_deps are reused, so nothing is downloaded twice. set -euo pipefail repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" bd="$repo/build/windows-tests" toolchain="$repo/build/windows/mingw-toolchain.cmake" deps="$repo/build/windows/_deps" run=true jobs=8 # each test TU is large; several parallel mingw builds can exhaust RAM while [[ $# -gt 0 ]]; do case "$1" in --no-run) run=false; shift ;; --jobs) jobs="$2"; shift 2 ;; -h|--help) sed -n '2,10p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "unknown option: $1" >&2; exit 2 ;; esac done if [[ ! -f "$toolchain" ]]; then echo "missing $toolchain; run ./build.sh --win-release once to create the mingw toolchain" >&2 exit 1 fi src_args=() for dep in sdl3 json tomlplusplus sqlite3 curl libwebp; do if [[ -d "$deps/$dep-src" ]]; then src_args+=("-DFETCHCONTENT_SOURCE_DIR_${dep^^}=$deps/$dep-src") fi done cmake -S "$repo" -B "$bd" \ -DCMAKE_TOOLCHAIN_FILE="$toolchain" \ -DCMAKE_BUILD_TYPE=Release \ -DDRAGONX_USE_SYSTEM_SDL3=OFF \ -DDRAGONX_BUILD_LITE=OFF \ -DDRAGONX_ENABLE_LITE_BACKEND=OFF \ -DBUILD_TESTING=ON \ -DDRAGONX_BUILD_FAKE_DAEMON=ON \ "${src_args[@]}" cmake --build "$bd" --target ObsidianDragonTests fake_dragonxd -j "$jobs" exe="$bd/bin/ObsidianDragonTests.exe" echo "built: $exe" echo "built: $bd/fake_dragonxd/dragonxd.exe" $run || exit 0 # The fixture path compiled into the binary is a Linux path; hand the Windows process its own. # APPDATA/LOCALAPPDATA point at a sandbox so anything resolving them from the environment stays out # of the real profile. (SHGetFolderPath-based paths ignore the environment; the tests that would # write through those are compiled out on Windows.) export DRAGONX_TEST_FIXTURE_DIR="$repo/tests/fixtures" sandbox="$bd/test-appdata" mkdir -p "$sandbox" export APPDATA="$sandbox" LOCALAPPDATA="$sandbox" if grep -qi microsoft /proc/version 2>/dev/null && [[ -e /proc/sys/fs/binfmt_misc/WSLInterop ]]; then # /p: translate each to a Windows path for the Windows process export WSLENV="${WSLENV:+$WSLENV:}DRAGONX_TEST_FIXTURE_DIR/p:APPDATA/p:LOCALAPPDATA/p" cd "$bd/bin" exec "$exe" elif command -v wine >/dev/null 2>&1; then export DRAGONX_TEST_FIXTURE_DIR="$(winepath -w "$DRAGONX_TEST_FIXTURE_DIR")" cd "$bd/bin" exec wine "$exe" else echo "not on WSL and no wine: copy $exe (and tests/fixtures) to Windows to run it" >&2 fi