scripts/test-windows.sh cross-compiles ObsidianDragonTests.exe (and the fake_dragonxd stub) with mingw into build/windows-tests, reusing the toolchain and dependency sources from build/windows, and runs it from WSL through Windows interop (or wine). All tests pass on Windows. CMake: - Windows forced BUILD_TESTING OFF in the cache to keep curl's tests out, which also removed ObsidianDragonTests from every Windows build. Hide it from curl with a scoped variable instead, and restore our cache value afterwards (curl's cmake_dependent_option FORCE-writes it). Windows still defaults to OFF, so release builds are unchanged. - ObsidianDragonTests now depends on copy_langs: i18n.cpp includes the generated embedded/lang_*.h, so a tree that builds only the tests failed (latent on Linux too). - Link the Windows system libraries the tests need. Tests: - testTmpPath/fixtureDir/removeTree helpers: no hard-coded /tmp, a runtime fixture-dir override (the compiled-in path is a Linux one), and best-effort cleanup that can't abort the suite. - Close the explorer cache before deleting its directory (Windows can't delete an open file). - Compile out the address-book and wallet-index round-trips on Windows: getConfigDir() uses SHGetFolderPath there, which no environment variable redirects, so they would overwrite the real %APPDATA%\ObsidianDragon files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
2.9 KiB
Bash
Executable File
77 lines
2.9 KiB
Bash
Executable File
#!/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
|