| # Change to build directory. |
| # SPDX-FileCopyrightText: The Eigen Authors |
| # SPDX-License-Identifier: MPL-2.0 |
| $rootdir = Get-Location |
| |
| # The affected-tests tier (see scripts/affected_tests.py) passes its CTest |
| # filter as a file rather than a variable so the regex is not bounded by CI |
| # variable limits. "ALL" means run everything the paired build produced, |
| # "NONE" means the merge request affects no test at all. |
| if (${EIGEN_CI_CTEST_REGEX_FILE}) { |
| $regex_file = ${EIGEN_CI_CTEST_REGEX_FILE} |
| if (-Not [System.IO.Path]::IsPathRooted($regex_file)) { |
| $regex_file = Join-Path ${rootdir} $regex_file |
| } |
| # Fail loudly rather than falling through: a missing selection would |
| # otherwise silently run the whole suite against a partial build. |
| if (-Not (Test-Path $regex_file)) { |
| Write-Error ("EIGEN_CI_CTEST_REGEX_FILE=${EIGEN_CI_CTEST_REGEX_FILE} does not exist. " + |
| "The select:tests artifact is missing; refusing to guess a test filter.") |
| Exit 1 |
| } |
| $selection = (Get-Content $regex_file -Raw).Trim() |
| if ($selection -eq "NONE") { |
| Write-Host "No tests are affected by this merge request; nothing to run." |
| Exit 0 |
| } elseif ($selection -eq "ALL") { |
| $EIGEN_CI_CTEST_REGEX = "" |
| } else { |
| $EIGEN_CI_CTEST_REGEX = $selection |
| } |
| } |
| |
| cd $EIGEN_CI_BUILDDIR |
| |
| # Determine number of processors for parallel tests. |
| $NPROC=${Env:NUMBER_OF_PROCESSORS} |
| |
| # Total attempts for flaky tests, matching test.linux.script.sh. No job sets |
| # this, and an empty value made the retry below spell "until-pass:", which ctest |
| # rejects as a usage error -- so the retry never ran and its exit status masked |
| # the test failure that triggered it. |
| if (-Not ${EIGEN_CI_CTEST_REPEAT}) { $EIGEN_CI_CTEST_REPEAT = 3 } |
| |
| # @(), not "": an "ALL" selection leaves no regex and no label, so the |
| # no-filter case is reachable and must contribute no argument to ctest. |
| $target = @() |
| if (${EIGEN_CI_CTEST_REGEX}) { |
| $target = "-R","${EIGEN_CI_CTEST_REGEX}" |
| } elseif (${EIGEN_CI_CTEST_LABEL}) { |
| $target = "-L","${EIGEN_CI_CTEST_LABEL}" |
| } |
| |
| # Same knob as test.linux.script.sh, for tests this runner cannot execute. |
| $exclude = @() |
| if (${EIGEN_CI_CTEST_EXCLUDE}) { |
| $exclude = "-E","${EIGEN_CI_CTEST_EXCLUDE}" |
| } |
| |
| $ctest_cmd = { ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} --output-on-failure --no-compress-output --build-noclean ${target} ${exclude} @args } |
| |
| Write-Host "Running initial tests..." |
| |
| & $ctest_cmd "-T" "test" |
| $exit_code = $LASTEXITCODE |
| |
| if ($exit_code -eq 0) { |
| Write-Host "Tests passed on the first attempt." |
| } |
| else { |
| Write-Host "Initial tests failed with exit code $exit_code. Retrying up to $EIGEN_CI_CTEST_REPEAT times..." |
| & $ctest_cmd "--rerun-failed" "--repeat" "until-pass:$EIGEN_CI_CTEST_REPEAT" |
| $exit_code = $LASTEXITCODE |
| |
| if ($exit_code -eq 0) { |
| Write-Host "Tests passed on retry." |
| $exit_code = 42 |
| } |
| } |
| |
| # Return to root directory. |
| cd ${rootdir} |
| |
| Exit $exit_code |