blob: dd3426421cfc154727188cdcf9cb2dea8e29ac36 [file] [log] [blame] [edit]
@echo off
setlocal ENABLEDELAYEDEXPANSION
if "%BUILD_CONFIG%"=="" (
set BUILD_CONFIG=Debug
)
rem Whether we built the project using ninja as the generator.
set GENERATOR_NINJA=0
set TEST_ALL=1
set TEST_CLANG=0
set TEST_CMD=0
set TEST_EXEC=0
set TEST_DXILCONV=0
set TEST_DXILCONV_FILTER=
set TEST_EXEC_FUTURE=0
set TEST_EXTRAS=0
set TEST_EXEC_REQUIRED=0
set TEST_CLANG_FILTER= /select: "@Priority<1"
set TEST_EXEC_FILTER=ExecutionTest::*
set LOG_FILTER=/logOutput:LowWithConsoleBuffering
set TEST_COMPAT_SUITE=0
set MANUAL_FILE_CHECK_PATH=
set TEST_MANUAL_FILE_CHECK=0
set SINGLE_FILE_CHECK_NAME=0
set CUSTOM_BIN_SET=
rem Begin SPIRV change
set TEST_SPIRV=0
set TEST_SPIRV_ONLY=0
rem End SPIRV change
set HCT_DIR=%~dp0
if "%NUMBER_OF_PROCESSORS%"=="" (
set PARALLEL_OPTION=
) else if %NUMBER_OF_PROCESSORS% LEQ 1 (
set PARALLEL_OPTION=
) else if %NUMBER_OF_PROCESSORS% LEQ 4 (
set PARALLEL_OPTION=/parallel:%NUMBER_OF_PROCESSORS%
) else (
rem Sweet spot for /parallel seems to be NUMBER_OF_PROCESSORS - 1
set /a PARALLEL_COUNT=%NUMBER_OF_PROCESSORS%-1
set PARALLEL_OPTION=/parallel:!PARALLEL_COUNT!
)
:opt_loop
if "%1"=="" (goto :done_opt)
if "%1"=="/?" goto :showhelp
if "%1"=="-?" goto :showhelp
if "%1"=="-help" goto :showhelp
if "%1"=="--help" goto :showhelp
rem Begin SPIRV change
if "%1"=="spirv" (
set TEST_SPIRV=1
shift /1
)
if "%1"=="spirv_only" (
set TEST_SPIRV=1
set TEST_SPIRV_ONLY=1
shift /1
)
rem End SPIRV change
if "%1"=="-clean" (
set TEST_CLEAN=1
) else if "%1"=="clean" (
set TEST_CLEAN=1
set TEST_CLEAN_ONLY=1
) else if "%1"=="none" (
set TEST_ALL=0
) else if "%1"=="clang" (
set TEST_ALL=0
set TEST_CLANG=1
) else if "%1"=="clang-filter" (
set TEST_ALL=0
set TEST_CLANG=1
set TEST_CLANG_FILTER= /name:%2
shift /1
) else if "%1"=="file-check" (
set TEST_ALL=0
set TEST_MANUAL_FILE_CHECK=1
set MANUAL_FILE_CHECK_PATH=%~2
shift /1
) else if "%1"=="v" (
set TEST_ALL=0
set TEST_CLANG=1
set TEST_CLANG_FILTER= /name:VerifierTest::*
) else if "%1"=="cmd" (
set TEST_ALL=0
set TEST_CMD=1
) else if "%1" == "dxilconv" (
set TEST_ALL=0
set TEST_DXILCONV=1
) else if "%1" == "dxilconv-filter" (
set TEST_ALL=0
set TEST_DXILCONV=1
set TEST_DXILCONV_FILTER= /name:%2
shift /1
) else if "%1"=="noexec" (
set TEST_ALL=0
set TEST_CLANG=1
set TEST_CMD=1
set TEST_DXILCONV=1
) else if "%1"=="exec" (
rem If exec is explicitly supplied, hcttest will fail if machine is not configured
rem to run execution tests, otherwise, execution tests would be skipped.
set TEST_ALL=0
set TEST_EXEC=1
set TEST_EXEC_REQUIRED=1
) else if "%1"=="exec-filter" (
set TEST_ALL=0
set TEST_EXEC=1
set TEST_EXEC_FILTER=ExecutionTest::%2
set TEST_EXEC_REQUIRED=1
shift /1
) else if "%1"=="exec-future" (
set TEST_ALL=0
set TEST_EXEC=1
set TEST_EXEC_FUTURE=1
set TEST_EXEC_REQUIRED=1
) else if "%1"=="exec-future-filter" (
set TEST_ALL=0
set TEST_EXEC=1
set TEST_EXEC_FUTURE=1
set TEST_EXEC_FILTER=ExecutionTest::%2
set TEST_EXEC_REQUIRED=1
shift /1
) else if "%1"=="extras" (
set TEST_ALL=0
set TEST_EXTRAS=1
) else if "%1"=="-ninja" (
set GENERATOR_NINJA=1
) else if "%1"=="-rel" (
set BUILD_CONFIG=Release
) else if "%1"=="-x86" (
rem Allow BUILD_ARCH override. This may be used by HCT_EXTRAS scripts.
set BUILD_ARCH=Win32
) else if "%1"=="-x64" (
set BUILD_ARCH=x64
) else if "%1"=="-arm" (
set BUILD_ARCH=ARM
) else if "%1"=="-adapter" (
set TEST_ADAPTER= /p:"Adapter=%~2"
shift /1
) else if "%1"=="-verbose" (
set LOG_FILTER=
set PARALLEL_OPTION=
) else if "%1"=="-dxilconv-loc" (
set DXILCONV_LOC=%~2
shift /1
) else if "%1"=="-custom-bin-set" (
set CUSTOM_BIN_SET=%~2
shift /1
) else if "%1"=="--" (
shift /1
goto :done_opt
) else (
goto :done_opt
)
shift /1
goto :opt_loop
:done_opt
rem Collect additional arguments for tests
:collect_args
if "%1"=="" goto :done_args
set ADDITIONAL_OPTS=%ADDITIONAL_OPTS% %1
shift /1
goto :collect_args
:done_args
rem By default, run all clang tests and execution tests and dxilconv tests
if "%TEST_ALL%"=="1" (
set TEST_CLANG=1
set TEST_CMD=1
set TEST_EXEC=1
set TEST_EXTRAS=1
set TEST_DXILCONV=1
)
where te.exe 1>nul 2>nul
if errorlevel 1 (
echo Unable to find te.exe on path.
exit /b 1
)
Rem For the Ninja generator, artifacts are not generated into a directory
Rem matching the current build configuration; instead, they are generated
Rem directly into bin/ under the build root directory.
if "%GENERATOR_NINJA%"=="1" (
set BIN_DIR=%HLSL_BLD_DIR%\bin
set TEST_DIR=%HLSL_BLD_DIR%\test
) else (
set BIN_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\bin
set TEST_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\test
)
if "%TEST_DXILCONV%"=="1" (
if "%DXILCONV_LOC%"=="" ( set DXILCONV_LOC=%BIN_DIR%\dxilconv.dll )
if not exist "%DXILCONV_LOC%" (
echo Skipping dxilconv tests, dxilconv.dll not found.
set TEST_DXILCONV=0
)
)
if "%TEST_CLEAN%"=="1" (
echo Cleaning %TEST_DIR% ...
if exist %TEST_DIR%\. (
rmdir /q /s %TEST_DIR%
)
if "%TEST_CLEAN_ONLY%"=="1" (
echo exiting after deleting test directory. if clean and test is desired, use -clean option.
exit /b 0
)
)
if not exist %TEST_DIR% (mkdir %TEST_DIR%)
echo Copying binaries to test to %TEST_DIR%:
if "%CUSTOM_BIN_SET%"=="" (
call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% dxa.exe dxc.exe dxexp.exe dxopt.exe dxr.exe dxv.exe clang-hlsl-tests.dll dxcompiler.dll d3dcompiler_dxc_bridge.dll dxl.exe dxc_batch.exe dxlib_sample.dll
if errorlevel 1 exit /b 1
if "%TEST_DXILCONV%"=="1" (
call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% dxbc2dxil.exe dxilconv-tests.dll opt.exe
call %HCT_DIR%\hctcopy.cmd %DXILCONV_LOC% %TEST_DIR% dxilconv.dll
)
) else (
call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% %CUSTOM_BIN_SET%
if errorlevel 1 exit /b 1
if "%TEST_DXILCONV%"=="1" (
call %HCT_DIR%\hctcopy.cmd %DXILCONV_LOC% %TEST_DIR% dxilconv.dll
)
)
if errorlevel 1 exit /b 1
rem Begin SPIRV change
if "%TEST_SPIRV%"=="1" (
if not exist %BIN_DIR%\clang-spirv-tests.exe (
echo clang-spirv-tests.exe has not been built. Make sure you run "hctbuild -spirvtest" first.
exit /b 1
)
echo Running SPIRV tests ...
%BIN_DIR%\clang-spirv-tests.exe --spirv-test-root %HLSL_SRC_DIR%\tools\clang\test\CodeGenSPIRV
if errorlevel 1 (
echo Failure occured in SPIRV unit tests
exit /b 1
)
if "%TEST_SPIRV_ONLY%"=="1" (
exit /b 0
)
)
rem End SPIRV change
echo Running HLSL tests ...
if exist "%HCT_EXTRAS%\hcttest-before.cmd" (
call "%HCT_EXTRAS%\hcttest-before.cmd" %TEST_DIR%
if errorlevel 1 (
echo Fatal error, Failed command: "%HCT_EXTRAS%\hcttest-before.cmd" %TEST_DIR%
exit /b 1
)
)
if "%TEST_CLANG%"=="1" (
echo Running Clang unit tests ...
call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL"%TEST_CLANG_FILTER%%ADDITIONAL_OPTS%
set RES_CLANG=!ERRORLEVEL!
)
if "%TEST_CMD%"=="1" (
copy /y %HLSL_SRC_DIR%\utils\hct\cmdtestfiles\smoke.hlsl %TEST_DIR%\smoke.hlsl
call %HLSL_SRC_DIR%\utils\hct\hcttestcmds.cmd %TEST_DIR% %HLSL_SRC_DIR%\tools\clang\test\HLSL
set RES_CMD=!ERRORLEVEL!
)
if "%TEST_EXEC%"=="1" (
echo Sniffing for D3D12 configuration ...
call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /name:ExecutionTest::BasicTriangleTest /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER%
rem /p:"ExperimentalShaders=*"
set RES_EXEC=!ERRORLEVEL!
if errorlevel 1 (
if not "%TEST_EXEC_REQUIRED%"=="1" (
echo Basic triangle test failed.
echo Assuming this is an environmental limitation not a regression
set TEST_EXEC=0
) else (
echo Basic triangle test succeeded. Proceeding with execution tests.
)
)
)
if "%TEST_EXEC%"=="1" (
if "%TEST_EXEC_FUTURE%"=="1" (
call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /select:"@Name='%TEST_EXEC_FILTER%' AND @Priority=2" /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER% %ADDITIONAL_OPTS%
) else (
call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /select:"@Name='%TEST_EXEC_FILTER%' AND @Priority<2" /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER% %ADDITIONAL_OPTS%
)
set RES_EXEC=!ERRORLEVEL!
)
if exist "%HCT_EXTRAS%\hcttest-extras.cmd" (
if "%TEST_EXTRAS%"=="1" (
echo Running extra tests ...
call "%HCT_EXTRAS%\hcttest-extras.cmd" %TEST_DIR%
set RES_EXTRAS=!ERRORLEVEL!
)
)
if "%TEST_DXILCONV%"=="1" (
call :runte dxilconv-tests.dll /p:"DxilConvDataDir=%HLSL_SRC_DIR%\projects\dxilconv\test" %TEST_DXILCONV_FILTER%
set RES_DXILCONV=!ERRORLEVEL!
)
if exist "%HCT_EXTRAS%\hcttest-after.cmd" (
call "%HCT_EXTRAS%\hcttest-after.cmd" %TEST_DIR%
set RES_HCTTEST_AFTER=!ERRORLEVEL!
)
if "%TEST_MANUAL_FILE_CHECK%"=="1" (
call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /name:CompilerTest::ManualFileCheckTest /runIgnoredTests /p:"InputPath=%MANUAL_FILE_CHECK_PATH%"
set RES_EXEC=!ERRORLEVEL!
)
echo.
echo ==================================
echo Unit test results:
set TESTS_PASSED=0
set TESTS_FAILED=0
call :check_result "clang tests" %RES_CLANG%
call :check_result "command line tests" %RES_CMD%
if "%TEST_EXEC%"=="1" (
call :check_result "execution tests" %RES_EXEC%
)
call :check_result "hcttest-extras tests" %RES_EXTRAS%
call :check_result "hcttest-after script" %RES_HCTTEST_AFTER%
call :check_result "dxilconv tests" %RES_DXILCONV%
if not "%TESTS_PASSED%"=="0" (
echo %TESTS_PASSED% succeeded.
) else if "%TESTS_FAILED%"=="0" (
echo No Unit tests run.
)
if not "%TESTS_FAILED%"=="0" (
echo %TESTS_FAILED% failed.
)
echo ==================================
exit /b %TESTS_FAILED%
:showhelp
echo Usage:
echo hcttest [options] [target(s)] [-- additonal test arguments]
echo.
echo target can be empty or a specific subset.
echo.
echo If target if not specified, all tests will be run, but clang tests
echo will be limited by /select: "@Priority<1" by default.
echo You may specify 'clang-filter *' to run all clang tests.
echo Multiple targets may be specified to choose which stages to run.
echo.
echo options:
echo -clean - deletes test directory before copying binaries and testing
echo -ninja - artifacts were built using the Ninja generator
echo -rel - tests release rather than debug
echo -adapter "adapter name" - overrides Adapter for execution tests
echo -verbose - for TAEF: turns off /parallel and removes logging filter
echo -custom-bin-set "file [file]..." - custom set of binaries to copy into test directory
echo -dxilconv-loc "dxilconv.dll location" - fetch dxilconv.dll from custom location
echo.
echo current BUILD_ARCH=%BUILD_ARCH%. Override with:
echo -x86 targets an x86 build (aka. Win32)
echo -x64 targets an x64 build (aka. Win64)
echo -arm targets an ARM build
echo.
echo target(s):
echo clang - run clang tests.
echo file-check - run file-check test on single file.
echo - hcttest file-check "..\CodeGenHLSL\shader-compat-suite\lib_arg_flatten\lib_arg_flatten.hlsl"
echo compat-suite - run compat-suite test.
echo - hcttest compat-suite "..\CodeGenHLSL\shader-compat-suite\lib_arg_flatten"
echo cmd - run command line tool tests.
echo dxilconv - run dxilconv tests
echo v - run the subset of clang tests that are verified-based.
echo exec - run execution tests.
echo exec-future - run execution tests for future releases.
echo extras - run hcttest-extras tests.
echo noexec - all except exec and extras tests.
echo.
echo Select clang or exec targets with filter by test name:
echo clang-filter Name
echo exec-filter Name
echo exec-exp-filter Name
echo dxilconv-filter Name
echo.
echo Use the HCT_EXTRAS environment variable to add hcttest-before and hcttest-after hooks.
echo.
echo Delete test directory and do not copy binaries or run tests:
echo hcttest clean
echo.
call :showtesample clang-hlsl-tests.dll /p:"DxilConvDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL"
goto :eof
:runte
rem Runs a unit test.
rem %1 - the name of the binary to run
rem %2 - first argument to te
rem %3 - second argument to te
rem %4 - third argument to te
echo te /labMode /miniDumpOnCrash %LOG_FILTER% %PARALLEL_OPTION% %TEST_DIR%\%*
call te /labMode /miniDumpOnCrash %LOG_FILTER% %PARALLEL_OPTION% %TEST_DIR%\%*
if errorlevel 1 (
call :showtesample %*
exit /b 1
)
goto :eof
:showtesample
rem %1 - name of binary to demo
rem %2 - first argument to te
if "%TEST_DIR%"=="" (
set TEST_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\test
)
echo You can debug the test with the following command line.
echo start devenv /debugexe TE.exe /inproc %TEST_DIR%\%*
echo.
echo Use this te.exe for out-of-proc, or pick the correct one for the target arch, currently %BUILD_ARCH%.
where te.exe
echo.
echo Use /name:TestClass* or /name:TestClass::MethodName to filter and /breakOnError to catch the failure.
goto :eof
:check_result
if not "%2"=="" (
if "%2"=="0" (
echo [PASSED] %~1
set /a TESTS_PASSED=%TESTS_PASSED%+1
) else (
echo [FAILED] %~1
set /a TESTS_FAILED=%TESTS_FAILED%+1
)
)
goto :eof