diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh index 7106bba..974ca4b 100755 --- a/scripts/run-tests.sh +++ b/scripts/run-tests.sh @@ -1,18 +1,27 @@ #!/bin/bash -set -euo pipefail -ROOT="$(cd -- "$(dirname -- "$0")" && pwd)" -cd "$ROOT" -if ! command -v xcodebuild >/dev/null 2>&1; then - echo 'ERROR: Xcode and xcodebuild are required on macOS.' >&2 - exit 1 +# Compatible with bash and zsh, whether launched directly or via /bin/zsh. +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +if [ ! -d "$ROOT/DBSyn.xcodeproj" ]; then + echo "ERROR: DBSyn.xcodeproj not found at $ROOT" >&2 + exit 2 fi -mkdir -p test-results -STAMP="$(date +%Y%m%d-%H%M%S)" +if ! command -v xcodebuild >/dev/null 2>&1; then + echo 'ERROR: xcodebuild requires Xcode on macOS.' >&2 + exit 2 +fi +cd "$ROOT" || exit 2 +mkdir -p "$ROOT/test-results" +STAMP="$(date +%Y%m%d-%H%M%S)-$$" RESULT="$ROOT/test-results/DBSyn-$STAMP.xcresult" LOG="$ROOT/test-results/DBSyn-$STAMP.log" echo "Running DBSyn XCTest suite. Log: $LOG" -if xcodebuild test \ - -project DBSyn.xcodeproj \ +# pipefail preserves xcodebuild's failure even though output is piped to tee. +# Avoid PIPESTATUS, which is Bash-specific and fails under zsh with nounset. +set +e +xcodebuild test \ + -project "$ROOT/DBSyn.xcodeproj" \ -scheme DBSyn \ -configuration Debug \ -destination 'platform=macOS,arch=arm64' \ @@ -21,10 +30,7 @@ if xcodebuild test \ ONLY_ACTIVE_ARCH=YES \ ENABLE_TESTABILITY=YES \ SWIFT_ENABLE_EXPLICIT_MODULES=NO \ - CODE_SIGNING_ALLOWED=NO 2>&1 | tee "$LOG"; then - STATUS=0 -else - STATUS=${PIPESTATUS[0]} -fi + CODE_SIGNING_ALLOWED=NO 2>&1 | tee "$LOG" +STATUS=$? printf '\nTest log: %s\nTest results: %s\n' "$LOG" "$RESULT" exit "$STATUS"