From 21e5859e0292d7adc067f98a87be1bb0fe5d11d4 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 8 Aug 2012 16:18:21 -0700 Subject: [PATCH] Add a test that "apitrace diff-images" flags mismatching images. With this test we add a new EXPECT_FAILURE: attribute to the script syntax to indicate that a particular apitrace command in the script is expected to fail. This requires manually invoking the Popen constructor rather than using subprocess.check_output, (which is *close* to what we need but fails to assign the output when raising an exception). We also remove the globbing from the CMakeLists.txt file to get a manual ordering of the tests (rather than executing in alphabetic order). --- cli/CMakeLists.txt | 31 +++++++++++++++++-------- cli/README.markdown | 14 +++++++---- cli/cli-diff-images-mismatch.script | 4 ++++ cli/tri-ref-mismatch/tri0000000027.png | Bin 0 -> 13905 bytes cli_driver.py | 19 ++++++++++++++- 5 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 cli/cli-diff-images-mismatch.script create mode 100644 cli/tri-ref-mismatch/tri0000000027.png diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 283f56f..39a15c8 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -1,15 +1,26 @@ -file (GLOB scripts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.script) +function (ADD_CLI_TEST) + cmake_parse_arguments( + TEST + # Options + "" + # One value args + "NAME" + # Multi value args + "" + ${ARGN} + ) -list (SORT scripts) - -foreach (script ${scripts}) if (APITRACE_EXECUTABLE) add_test( - NAME ${script} - COMMAND python ${CMAKE_SOURCE_DIR}/cli_driver.py - --apitrace ${APITRACE_EXECUTABLE} - --apitrace-source ${APITRACE_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/${script} + NAME ${TEST_NAME} + COMMAND + python ${CMAKE_SOURCE_DIR}/cli_driver.py + --apitrace ${APITRACE_EXECUTABLE} + --apitrace-source ${APITRACE_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME} ) endif () -endforeach (script) +endfunction () + +add_cli_test(NAME "cli-diff-images.script") +add_cli_test(NAME "cli-diff-images-mismatch.script") diff --git a/cli/README.markdown b/cli/README.markdown index 3d49c7c..6be80a9 100644 --- a/cli/README.markdown +++ b/cli/README.markdown @@ -10,8 +10,10 @@ test in the traces directory. Otherwise, a new test program can be written in this directory. The tests in this directory are found in files with names matching -*.script. The scripts are simple line-based commands with the -following meanings based on the first word of each line: +*.script by convention. The scripts must be listed explicitly in the +CMakeLists.txt file. Each script consists of simple line-based +commands with the following meanings (based on the first word of each +line): apitrace: Execute the current apitrace executable being tested with the given arguments. If apitrace returns a @@ -26,6 +28,10 @@ following meanings based on the first word of each line: interpreted locally. If this fails for any reason other than "file does not exist" the test will fail. -If none of the commands in the script cause the test to fail, then the -test will pass. +Commands can be prefixed with "EXPECT_FAILURE:" to indicate that a +command is expected to return a non-zero value. In this case, a return +value of zero from the command will cause the test to fail. + +If none of the commands in the script cause the test to fail (as +described above), then the test will pass. diff --git a/cli/cli-diff-images-mismatch.script b/cli/cli-diff-images-mismatch.script new file mode 100644 index 0000000..9c97fa3 --- /dev/null +++ b/cli/cli-diff-images-mismatch.script @@ -0,0 +1,4 @@ +rm_and_mkdir ./tri-out +apitrace dump-images -o ./tri-out/tri tri.trace +EXPECT_FAILURE: apitrace diff-images -v ./tri-ref-mismatch ./tri-out +expect "Comparing ./tri-ref-mismatch/tri0000000027.png and ./tri-out/tri0000000027.png ... MISMATCH\n" diff --git a/cli/tri-ref-mismatch/tri0000000027.png b/cli/tri-ref-mismatch/tri0000000027.png new file mode 100644 index 0000000000000000000000000000000000000000..e68261080bfc00b2df8f83030718f3c558ecc037 GIT binary patch literal 13905 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