bazel: run wrapped Rust unit test shards

This commit is contained in:
Michael Bolin
2026-04-21 17:17:17 -07:00
parent 3420b06c7d
commit 960d5145fa
3 changed files with 141 additions and 5 deletions

View File

@@ -255,10 +255,9 @@ def codex_rust_crate(
unit_test_name = name + "-unit-tests"
unit_test_binary = name + "-unit-tests-bin"
unit_test_shard_count = _test_shard_count(test_shard_counts, unit_test_name)
unit_test_binary_kwargs = {}
if unit_test_shard_count:
unit_test_binary_kwargs["experimental_enable_sharding"] = True
# Shard at the workspace_root_test layer. rules_rust's sharding wrapper
# expects to run from its own runfiles cwd, while workspace_root_test
# deliberately changes cwd so Insta sees Cargo-like snapshot paths.
rust_test(
name = unit_test_binary,
crate = name,
@@ -277,7 +276,6 @@ def codex_rust_crate(
rustc_env = rustc_env,
data = test_data_extra,
tags = test_tags + ["manual"],
**unit_test_binary_kwargs
)
unit_test_kwargs = {}

View File

@@ -12,9 +12,81 @@ if errorlevel 1 exit /b 1
set "INSTA_WORKSPACE_ROOT=%workspace_root%"
cd /d "%workspace_root%" || exit /b 1
set "TOTAL_SHARDS=%RULES_RUST_TEST_TOTAL_SHARDS%"
if not defined TOTAL_SHARDS set "TOTAL_SHARDS=%TEST_TOTAL_SHARDS%"
if defined TOTAL_SHARDS if not "%TOTAL_SHARDS%"=="0" (
call :run_sharded_libtest %*
exit /b !ERRORLEVEL!
)
"%test_bin%" %*
exit /b %ERRORLEVEL%
:run_sharded_libtest
if defined TEST_SHARD_STATUS_FILE if defined TEST_TOTAL_SHARDS if not "%TEST_TOTAL_SHARDS%"=="0" (
type nul > "%TEST_SHARD_STATUS_FILE%"
)
if not "%~1"=="" (
"%test_bin%" %*
exit /b !ERRORLEVEL!
)
set "SHARD_INDEX=%RULES_RUST_TEST_SHARD_INDEX%"
if not defined SHARD_INDEX set "SHARD_INDEX=%TEST_SHARD_INDEX%"
if not defined SHARD_INDEX (
>&2 echo TEST_SHARD_INDEX or RULES_RUST_TEST_SHARD_INDEX must be set when sharding is enabled
exit /b 1
)
set "TEMP_ROOT=%TEST_TMPDIR%"
if not defined TEMP_ROOT set "TEMP_ROOT=%TEMP%"
if not defined TEMP_ROOT set "TEMP_ROOT=."
:CREATE_TEMP_DIR
set "TEMP_DIR=%TEMP_ROOT%\workspace_root_test_sharding_!RANDOM!_!RANDOM!_!RANDOM!"
mkdir "!TEMP_DIR!" 2>nul
if errorlevel 1 goto :CREATE_TEMP_DIR
set "TEMP_LIST=!TEMP_DIR!\list.txt"
set "TEMP_SHARD_LIST=!TEMP_DIR!\shard.txt"
"%test_bin%" --list --format terse > "!TEMP_LIST!"
if errorlevel 1 (
rmdir /s /q "!TEMP_DIR!" 2>nul
exit /b 1
)
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference = 'Stop';" ^
"$tests = @(Get-Content -LiteralPath $env:TEMP_LIST | Where-Object { $_.EndsWith(': test') } | ForEach-Object { $_.Substring(0, $_.Length - 6) });" ^
"[Array]::Sort($tests, [StringComparer]::Ordinal);" ^
"$totalShards = [uint32]$env:TOTAL_SHARDS; $shardIndex = [uint32]$env:SHARD_INDEX;" ^
"$fnvPrime = [uint64]16777619; $u32Mask = [uint64]4294967295;" ^
"foreach ($test in $tests) { $hash = [uint32]2166136261; foreach ($byte in [Text.Encoding]::UTF8.GetBytes($test)) { $hash = [uint32](([uint64]($hash -bxor $byte) * $fnvPrime) -band $u32Mask) }; if (($hash %% $totalShards) -eq $shardIndex) { $test } }" ^
> "!TEMP_SHARD_LIST!"
if errorlevel 1 (
rmdir /s /q "!TEMP_DIR!" 2>nul
exit /b 1
)
set SHARD_TESTS=
for /f "usebackq delims=" %%T in ("!TEMP_SHARD_LIST!") do (
if "!SHARD_TESTS!"=="" (
set SHARD_TESTS=%%T
) else (
set SHARD_TESTS=!SHARD_TESTS! %%T
)
)
rmdir /s /q "!TEMP_DIR!" 2>nul
if "!SHARD_TESTS!"=="" (
exit /b 0
)
"%test_bin%" !SHARD_TESTS! --exact
exit /b !ERRORLEVEL!
:resolve_runfile
setlocal EnableExtensions EnableDelayedExpansion
set "logical_path=%~2"

View File

@@ -48,6 +48,72 @@ workspace_root_marker="$(resolve_runfile "__WORKSPACE_ROOT_MARKER__")"
workspace_root="$(dirname "$(dirname "$(dirname "${workspace_root_marker}")")")"
test_bin="$(resolve_runfile "__TEST_BIN__")"
test_shard_index() {
local test_name="$1"
# FNV-1a 32-bit hash. Keep this stable so adding one test does not reshuffle
# unrelated tests between shards.
local hash=2166136261
local byte
local char
local i
local LC_ALL=C
for ((i = 0; i < ${#test_name}; i++)); do
char="${test_name:i:1}"
printf -v byte "%d" "'$char"
hash=$(( ((hash ^ byte) * 16777619) & 0xffffffff ))
done
echo $(( hash % TOTAL_SHARDS ))
}
run_sharded_libtest() {
if [[ -n "${TEST_SHARD_STATUS_FILE:-}" && "${TEST_TOTAL_SHARDS:-0}" != "0" ]]; then
touch "${TEST_SHARD_STATUS_FILE}"
fi
# Extra libtest args are usually ad-hoc local filters. Preserve those exactly
# rather than combining them with generated exact filters.
if [[ $# -gt 0 ]]; then
exec "${test_bin}" "$@"
fi
if [[ -z "${SHARD_INDEX}" ]]; then
echo "TEST_SHARD_INDEX or RULES_RUST_TEST_SHARD_INDEX must be set when sharding is enabled" >&2
exit 1
fi
local list_output
local test_list
list_output="$("${test_bin}" --list --format terse)"
test_list="$(printf '%s\n' "${list_output}" | grep ': test$' | sed 's/: test$//' | LC_ALL=C sort || true)"
if [[ -z "${test_list}" ]]; then
exit 0
fi
local shard_tests=()
local test_name
while IFS= read -r test_name; do
if (( $(test_shard_index "${test_name}") == SHARD_INDEX )); then
shard_tests+=("${test_name}")
fi
done <<< "${test_list}"
if [[ ${#shard_tests[@]} -eq 0 ]]; then
exit 0
fi
exec "${test_bin}" "${shard_tests[@]}" --exact
}
export INSTA_WORKSPACE_ROOT="${workspace_root}"
cd "${workspace_root}"
TOTAL_SHARDS="${RULES_RUST_TEST_TOTAL_SHARDS:-${TEST_TOTAL_SHARDS:-}}"
SHARD_INDEX="${RULES_RUST_TEST_SHARD_INDEX:-${TEST_SHARD_INDEX:-}}"
if [[ -n "${TOTAL_SHARDS}" && "${TOTAL_SHARDS}" != "0" ]]; then
run_sharded_libtest "$@"
fi
exec "${test_bin}" "$@"