diff --git a/scripts/clear_config.cmd b/scripts/clear_config.cmd new file mode 100644 index 0000000..abcf9ad --- /dev/null +++ b/scripts/clear_config.cmd @@ -0,0 +1,2 @@ +REM Clear the saved config options (in the registry) +REG DELETE "HKCU\SOFTWARE\codersnotes.com\Very Sleepy" /F diff --git a/scripts/get_config.cmd b/scripts/get_config.cmd new file mode 100644 index 0000000..baf61b5 --- /dev/null +++ b/scripts/get_config.cmd @@ -0,0 +1,13 @@ +@SETLOCAL ENABLEDELAYEDEXPANSION +@ECHO OFF + +REM Retrieve a config value from the registry and store it in the specified environment variable. +REM Usage: get_config.cmd + +SET "VALUE_NAME=%~1" +SET "VAR_NAME=%~2" + +FOR /F "usebackq tokens=*" %%v IN (`PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ItemPropertyValue -Path 'Registry::HKEY_CURRENT_USER\SOFTWARE\codersnotes.com\Very Sleepy' -Name '!VALUE_NAME!' -ErrorAction:SilentlyContinue" ^ +rem Get from Stats.txt and save its value in + +set "SLEEPY_BASE=%~1" +set "STAT_DESCR=%~2" +set "TARGET_ENVVAR=%~3" + +if exist "!SLEEPY_BASE!" rmdir /S /Q "!SLEEPY_BASE!" +call %~dp0\unpack_to "!SLEEPY_BASE!.sleepy" "!SLEEPY_BASE!" > nul +if errorlevel 1 exit 1 + +set FOUND=0 +set STAT_VALUE=_NOT_FOUND_ +if exist "!SLEEPY_BASE!\Stats.txt" ( + for /f "tokens=1,2* delims=: " %%a in (!SLEEPY_BASE!\Stats.txt) do ( + if "%%~a"=="!STAT_DESCR!" ( + set FOUND=1 + set "STAT_VALUE=%%~b" + ) + ) +) +if %FOUND% == 0 exit /b 1 + +ENDLOCAL & set "%TARGET_ENVVAR%=%STAT_VALUE%" diff --git a/scripts/set_config_dword.cmd b/scripts/set_config_dword.cmd new file mode 100644 index 0000000..cf51ed3 --- /dev/null +++ b/scripts/set_config_dword.cmd @@ -0,0 +1,11 @@ +@setlocal enabledelayedexpansion +@echo off + +rem Set a config value (that's a DWORD) in the registry. +rem Usage: set_config_dword.cmd + +set "VALUE_NAME=%~1" +set "VALUE_DATA=%~2" + +reg add "HKCU\SOFTWARE\codersnotes.com\Very Sleepy" /v "!VALUE_NAME!" /t REG_DWORD /d !VALUE_DATA! /f + diff --git a/scripts/test_minidump.cmd b/scripts/test_minidump.cmd new file mode 100644 index 0000000..cb2436c --- /dev/null +++ b/scripts/test_minidump.cmd @@ -0,0 +1,12 @@ +@echo off + +rem usage: test_minidump.cmd + +if exist %1 rmdir /S /Q %1 +call %~dp0\unpack_to %1.sleepy %1 > nul +if errorlevel 1 exit 1 + +set FOUND=0 +if exist "%~1\minidump.dmp" set FOUND=1 + +if %FOUND% == 0 exit /b 1 diff --git a/tests/cmdline/.gitignore b/tests/cmdline/.gitignore new file mode 100644 index 0000000..68d3006 --- /dev/null +++ b/tests/cmdline/.gitignore @@ -0,0 +1,5 @@ +*.ilk +*.pdb + +# custom script to build (outside of appveyor environment) +build.local.bat diff --git a/tests/cmdline/ReadMe.md b/tests/cmdline/ReadMe.md new file mode 100644 index 0000000..864ea5d --- /dev/null +++ b/tests/cmdline/ReadMe.md @@ -0,0 +1,9 @@ +# Command Line Parameter Testing + +These command line parameters are tested + + * minidump + * samplerate + +The tests are not so much tests of functionality related to the parameters, but rather tests that the parameters are correctly honored when specified on the command line. + diff --git a/tests/cmdline/build.bat b/tests/cmdline/build.bat new file mode 100644 index 0000000..c2f30ee --- /dev/null +++ b/tests/cmdline/build.bat @@ -0,0 +1,16 @@ +@setlocal +@echo off +cd /d "%~dp0" +call ..\..\scripts\clear_env.cmd + +rem https://github.com/VerySleepy/verysleepy/issues/28 + +SETLOCAL +call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 +cl /MD /Z7 program.c /Fe:program32.exe /link /DEBUG:FASTLINK +ENDLOCAL + +SETLOCAL +call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 +cl /MD /Z7 program.c /Fe:program64.exe /link /DEBUG:FASTLINK +ENDLOCAL diff --git a/tests/cmdline/program.c b/tests/cmdline/program.c new file mode 100644 index 0000000..f47b28e --- /dev/null +++ b/tests/cmdline/program.c @@ -0,0 +1,13 @@ +int vs_test_fun() +{ + unsigned int i, n = 17; + // This is 4x longer than the other ones because we need more time to gather samples. + for (i=0; i<4000000000u; i++) + n = n * 17 + i; + return n; +} + +int main() +{ + return vs_test_fun(); +} diff --git a/tests/cmdline/program32.exe b/tests/cmdline/program32.exe new file mode 100644 index 0000000..c914612 Binary files /dev/null and b/tests/cmdline/program32.exe differ diff --git a/tests/cmdline/program64.exe b/tests/cmdline/program64.exe new file mode 100644 index 0000000..45f3cf0 Binary files /dev/null and b/tests/cmdline/program64.exe differ diff --git a/tests/cmdline/test.bat b/tests/cmdline/test.bat new file mode 100644 index 0000000..ec7ffe4 --- /dev/null +++ b/tests/cmdline/test.bat @@ -0,0 +1,24 @@ +@echo off +setlocal enabledelayedexpansion +if not exist program32.exe call build +if not exist program64.exe call build + +rem https://github.com/VerySleepy/verysleepy/issues/28 + +rem Verify that command-line options are honored and do not override saved configuration settings. + +set SLEEPY_SILENT_CRASH=1 + +for %%b in (32 64) do ( + echo Testing %%b + + FOR %%o in (minidump samplerate) do ( + rem Discard any saved config options. + call ..\..\scripts\clear_config + + call test_cmdline_%%o.cmd %%b + if !ERRORLEVEL! neq 0 exit /b 1 + ) +) + +echo %~dp0 OK diff --git a/tests/cmdline/test_cmdline_minidump.cmd b/tests/cmdline/test_cmdline_minidump.cmd new file mode 100644 index 0000000..58317c0 --- /dev/null +++ b/tests/cmdline/test_cmdline_minidump.cmd @@ -0,0 +1,30 @@ +@echo off +setlocal enabledelayedexpansion + +set "PGMARCH=%~1" + +call ..\..\scripts\get_config SaveMinidump START_MINIDUMP_VALUE +IF NOT "!START_MINIDUMP_VALUE!"=="" (IF "START_MINIDUMP_VALUE"=="429496729" (SET /A START_MINIDUMP_VALUE=-1) ELSE (SET /A START_MINIDUMP_VALUE=START_MINIDUMP_VALUE)) + +SET TEST_MINIDUMP_VALUE=2 + +IF "!START_MINIDUMP_VALUE!"=="!TEST_MINIDUMP_VALUE!" (SET /A TEST_MINIDUMP_VALUE=TEST_MINIDUMP_VALUE+1) +@echo Test MiniDump value: !TEST_MINIDUMP_VALUE! + +if exist program-!PGMARCH!.sleepy del program-!PGMARCH!.sleepy +rem Ensure that we profile a matching-architecture executable so that the "mismatch" warning doesn't halt the test. +call ..\..\scripts\sleepy!pgmarch! /r:program!pgmarch!.exe /o:program-!pgmarch!.sleepy /minidump:!TEST_MINIDUMP_VALUE! +if !ERRORLEVEL! neq 0 exit /b 1 + +rem Verify the capture has a dump. +call ..\..\scripts\test_minidump program-!pgmarch! +if !ERRORLEVEL! neq 0 echo Minidump not taken & exit /b 1 + +rem Verify that the config value didn't change to what we specified. +rem It will change if it wasn't set, but not to what we specified. +call ..\..\scripts\get_config SaveMinidump FINAL_MINIDUMP_VALUE + +IF "!FINAL_MINIDUMP_VALUE!"=="!TEST_MINIDUMP_VALUE!" ( + echo ERROR: SaveMinidump value was changed to the cmdline override value. + exit /b 1 +) diff --git a/tests/cmdline/test_cmdline_samplerate.cmd b/tests/cmdline/test_cmdline_samplerate.cmd new file mode 100644 index 0000000..75e46f9 --- /dev/null +++ b/tests/cmdline/test_cmdline_samplerate.cmd @@ -0,0 +1,85 @@ +@echo off +setlocal enabledelayedexpansion + +rem Testing Parameter: samplerate (speed throttle) +rem The test for this involves counting the number of samples taken during captures whose durations are identical. +rem Test with a number different sample rates, and verify that the number of samples decreases when the sample rate decreases. +rem Because sample rate is only a fudge-y way of reducing induced load due to sampling, choose +rem values for sample rate that _should_ clearly indicate that the rate was higher. +rem I have also observed that sample rates above 60 or so will not always effect taking more samples. + + +set "PGMARCH=%~1" +set CONFIG_PARAM=SpeedThrottle + +set PREVIOUS_SAMPLES= +for /L %%r in (1, 40, 100) DO ( + @echo Testing Sample Rate: %%r + call :TEST_SAMPLE_RATE %%r OBSERVED_SAMPLE_COUNT + if ERRORLEVEL 1 exit /b 1 + @echo Observed samples: !OBSERVED_SAMPLE_COUNT! + if not "!PREVIOUS_SAMPLES!"=="" ( + if !PREVIOUS_SAMPLES! gtr !OBSERVED_SAMPLE_COUNT! ( + @echo ERROR: Sample count did not decrease as the sample rate increased. + exit /b 1 + ) + ) + set /a PREVIOUS_SAMPLES = OBSERVED_SAMPLE_COUNT +) + +exit /b + + + + +:TEST_SAMPLE_RATE +setlocal enabledelayedexpansion + +rem Set the parameter to a different value than what's being tested with. +rem Perform the profiling capture. +rem Expand the archive. +rem Get the number of samples taken from Stats.txt. +rem Assign that value to the passed-in environment variable name. + +SET "TEST_SAMPLERATE_VALUE=%~1" +SET "OUTPUT_VAR=%~2" + + +set /a START_SAMPLERATE_VALUE=101-!TEST_SAMPLERATE_VALUE! +call ..\..\scripts\set_config_dword "!CONFIG_PARAM!" !START_SAMPLERATE_VALUE! +call ..\..\scripts\get_config "!CONFIG_PARAM!" CHECK_START_SAMPLERATE_VALUE +if not "!CHECK_START_SAMPLERATE_VALUE!"=="!START_SAMPLERATE_VALUE!" ( + @echo PRECONDITION ERROR: failed to set the saved config value for !CONFIG_PARAM! + exit /b 1 +) + +@echo Test SampleRate value: !TEST_SAMPLERATE_VALUE! + +if exist "program-!PGMARCH!.sleepy" del "program-!PGMARCH!.sleepy" +if exist "program-!PGMARCH!" rmdir /s /q "program-!PGMARCH!" + +call ..\..\scripts\sleepy!pgmarch! /r:program!pgmarch!.exe /o:program-!pgmarch!.sleepy /samplerate:!TEST_SAMPLERATE_VALUE! +if !ERRORLEVEL! neq 0 ( + @echo ERROR: Very Sleepy reports failure: !ERRORLEVEL! + exit /b 1 +) + +rem Get the number of samples. +call ..\..\scripts\get_stat "program-!pgmarch!" Samples OBSERVED_SAMPLES +if !ERRORLEVEL! neq 0 exit /b 1 +if "!OBSERVED_SAMPLES!"=="" ( + @echo Unable to find sample count in profile stats. + exit /b 1 +) + +rem Verify that the config value didn't change to what we specified. +rem It will change if it wasn't set, but not to what we specified. +call ..\..\scripts\get_config "!CONFIG_PARAM!" FINAL_SAMPLERATE_VALUE + +IF "!FINAL_SAMPLERATE_VALUE!"=="!TEST_SAMPLERATE_VALUE!" ( + echo ERROR: !CONFIG_PARAM! value was changed to the cmdline override value. + exit /b 1 +) + +endlocal & set /a %OUTPUT_VAR% = %OBSERVED_SAMPLES% +exit /b diff --git a/tests/dmd-32mscoff/test.bat b/tests/dmd-32mscoff/test.bat index 95b2d4d..2b68620 100644 --- a/tests/dmd-32mscoff/test.bat +++ b/tests/dmd-32mscoff/test.bat @@ -6,6 +6,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (32 64) do ( echo Testing %%b + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b.sleepy del program-%%b.sleepy call ..\..\scripts\sleepy%%b /r:program.exe /o:program-%%b.sleepy if !ERRORLEVEL! neq 0 exit /b 1 diff --git a/tests/dmd-64/test.bat b/tests/dmd-64/test.bat index 43f379d..16dace7 100644 --- a/tests/dmd-64/test.bat +++ b/tests/dmd-64/test.bat @@ -6,6 +6,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (64) do ( echo Testing %%b + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b.sleepy del program-%%b.sleepy call ..\..\scripts\sleepy%%b /r:program.exe /o:program-%%b.sleepy if !ERRORLEVEL! neq 0 exit /b 1 diff --git a/tests/gcc43-wine/test.bat b/tests/gcc43-wine/test.bat index 74c673f..ecaa201 100644 --- a/tests/gcc43-wine/test.bat +++ b/tests/gcc43-wine/test.bat @@ -9,6 +9,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (32 64) do for %%d in (wine mingw) do ( echo Testing %%b-%%d + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b-%%d.sleepy del program-%%b-%%d.sleepy call ..\..\scripts\sleepy%%b --%%d /r:program.exe /o:program-%%b-%%d.sleepy if !ERRORLEVEL! neq 0 exit /b 1 diff --git a/tests/gcc49-32/test.bat b/tests/gcc49-32/test.bat index b75b9a4..80300cf 100644 --- a/tests/gcc49-32/test.bat +++ b/tests/gcc49-32/test.bat @@ -10,6 +10,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (32 64) do for %%d in (mingw) do ( echo Testing %%b-%%d + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b-%%d.sleepy del program-%%b-%%d.sleepy call ..\..\scripts\sleepy%%b --%%d /r:program.exe /o:program-%%b-%%d.sleepy if !ERRORLEVEL! neq 0 exit /b 1 diff --git a/tests/gcc49-64/test.bat b/tests/gcc49-64/test.bat index 7d9517b..ce08891 100644 --- a/tests/gcc49-64/test.bat +++ b/tests/gcc49-64/test.bat @@ -10,6 +10,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (64) do for %%d in (mingw) do ( echo Testing %%b-%%d + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b-%%d.sleepy del program-%%b-%%d.sleepy call ..\..\scripts\sleepy%%b --%%d /r:program.exe /o:program-%%b-%%d.sleepy if !ERRORLEVEL! neq 0 exit /b 1 diff --git a/tests/msvc14/test.bat b/tests/msvc14/test.bat index 7239b59..a5c0b2e 100644 --- a/tests/msvc14/test.bat +++ b/tests/msvc14/test.bat @@ -8,6 +8,10 @@ set SLEEPY_SILENT_CRASH=1 for %%b in (32 64) do ( echo Testing %%b + + rem Discard any saved config options. + call ..\..\scripts\clear_config + if exist program-%%b.sleepy del program-%%b.sleepy call ..\..\scripts\sleepy%%b /r:program.exe /o:program-%%b.sleepy if !ERRORLEVEL! neq 0 exit /b 1