Fix xvfb-run-eepp, update unit-tests.md.

This commit is contained in:
Martín Lucas Golini
2026-06-07 22:12:28 -03:00
parent 12413ea630
commit d8fa49be37
2 changed files with 37 additions and 9 deletions

View File

@@ -5,15 +5,23 @@ This project relies on a comprehensive suite of unit tests to prevent regression
## Running Tests
The test binary manages its own current working directory, so you can execute it from anywhere.
* **Standard Execution:**
`bin/unit_tests/eepp-unit_tests-debug`
* **Linux & FreeBSD Execution (Required for Desktop Environments):**
Tests open ~400 individual windows. To prevent disrupting the desktop environment, run them in an isolated framebuffer using `xvfb-run-eepp` (a project-specific fork of `xvfb-run` that enables `--auto-servernum`, sets the default screen to 1280x1024x24, and injects `ASAN_OPTIONS=detect_leaks=0` automatically):
* **Default Execution for Agents on Linux & FreeBSD:**
Always run unit tests through the project wrapper unless the user explicitly asks for a different harness:
`projects/scripts/xvfb-run-eepp bin/unit_tests/eepp-unit_tests-debug`
* **Why the wrapper is required:**
Tests open ~400 individual windows. The wrapper runs them in an isolated framebuffer, enables race-safe automatic display selection for concurrent agent test runs, sets the default screen to `1280x1024x24`, and injects `ASAN_OPTIONS=detect_leaks=0` automatically.
* **Do not skip the wrapper for filtered tests:**
A focused test still needs the same wrapper:
`projects/scripts/xvfb-run-eepp bin/unit_tests/eepp-unit_tests-debug --filter="FontRendering.*Offset*"`
* **Fallback only when the wrapper itself fails:**
If `projects/scripts/xvfb-run-eepp` fails before launching the test binary, report that wrapper failure and then use this fallback to keep verification moving:
`ASAN_OPTIONS=detect_leaks=0 xvfb-run -a -s "-screen 0 1280x1024x24" bin/unit_tests/eepp-unit_tests-debug`
Do not use plain `xvfb-run` as the first attempt for GUI/unit tests.
* **Direct Execution (Only for non-window tests or explicit user requests):**
`bin/unit_tests/eepp-unit_tests-debug`
* **Filtering Tests:**
Use the `--filter` parameter to run specific tests (supports glob patterns).
*Example (runs all tests with "Offset" in the name):*
`bin/unit_tests/eepp-unit_tests-debug --filter="FontRendering.*Offset*"`
Keep the wrapper in front of the binary unless the test is known not to create windows.
## Writing New Tests
Writing new tests is highly encouraged, but depends on the context of your changes:

View File

@@ -103,6 +103,26 @@ claim_display() {
return 0
fi
# Older versions of this script claimed displays from a command substitution,
# which left lock directories behind because LOCKDIR was set in a subshell.
# Recover those stale claims, but never touch a lock owned by a live process.
if [ -f "$lock/pid" ]; then
oldpid=$(cat "$lock/pid" 2>/dev/null || true)
case "$oldpid" in
*[!0-9]*|'') oldpid= ;;
esac
if [ -z "$oldpid" ] || ! kill -0 "$oldpid" >/dev/null 2>&1; then
rm -f "$lock/pid" 2>/dev/null || true
rmdir "$lock" 2>/dev/null || true
if mkdir "$lock" 2>/dev/null; then
LOCKDIR=$lock
SERVERNUM=$n
echo "$$" > "$LOCKDIR/pid" 2>/dev/null || true
return 0
fi
fi
fi
return 1
}
@@ -110,7 +130,6 @@ find_and_claim_display() {
i=$SERVERNUM
while [ "$i" -le "$MAX_SERVERNUM" ]; do
if ! is_display_busy "$i" && claim_display "$i"; then
echo "$i"
return 0
fi
i=$((i + 1))
@@ -195,8 +214,9 @@ if ! command -v Xvfb >/dev/null 2>&1; then
fi
if [ "$AUTO_SERVERNUM" = yes ]; then
if ! SERVERNUM=$(find_and_claim_display); then
error "could not find a free X display between $SERVERNUM and $MAX_SERVERNUM"
START_SERVERNUM=$SERVERNUM
if ! find_and_claim_display; then
error "could not find a free X display between $START_SERVERNUM and $MAX_SERVERNUM"
exit 4
fi
else