From 49ae46d2b5aed3962b711b76b93ebb739baa1d30 Mon Sep 17 00:00:00 2001 From: maxime pech Date: Tue, 17 May 2011 14:34:53 +0200 Subject: [PATCH] tests with google tests coupled with cdash reporting --- CMakeLists.txt | 16 ++-- DartConfiguration.tcl | 90 +++++++++++++++++++++++ tests/CMakeLists.txt | 49 +++++++----- tests/tools/CMakeLists.txt | 27 +++---- tests/tools/clitkImageInfoTest.cxx | 69 ++++++----------- tests/tools/clitkWriteDicomSeriesTest.cxx | 50 ++++--------- tests/tools/vvMainTest.cxx | 5 ++ tests/vv/CMakeLists.txt | 22 ++++++ tests/vv/vvMainTest.cxx | 8 ++ tests/vv/vvRegisterFormTest.cxx | 52 +++++++++++++ vv/CMakeLists.txt | 26 +++---- 11 files changed, 276 insertions(+), 138 deletions(-) create mode 100644 DartConfiguration.tcl create mode 100644 tests/tools/vvMainTest.cxx create mode 100644 tests/vv/CMakeLists.txt create mode 100644 tests/vv/vvMainTest.cxx create mode 100644 tests/vv/vvRegisterFormTest.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 897fd2e..a340a36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ #========================================================= # CLITK = Command Line ITK -cmake_minimum_required(VERSION 2.4) -cmake_policy(VERSION 2.4) +cmake_minimum_required(VERSION 2.8) +cmake_policy(VERSION 2.8) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) @@ -18,7 +18,6 @@ OPTION(BUILD_TESTING "Build the testing tree" OFF) IF (BUILD_TESTING) OPTION(CLITK_BUILD_TESTING "Test ITK" ON) INCLUDE(CTest) - ADD_SUBDIRECTORY(tests) ENDIF(BUILD_TESTING) #========================================================= @@ -90,9 +89,9 @@ INCLUDE_DIRECTORIES(itk filters segmentation registration tools ${PROJECT_BINARY # Select what is compiled ADD_SUBDIRECTORY(common) -add_subdirectory(tools) -add_subdirectory(segmentation) -add_subdirectory(registration) +ADD_SUBDIRECTORY(tools) +ADD_SUBDIRECTORY(segmentation) +ADD_SUBDIRECTORY(registration) # Compilation options @@ -108,4 +107,7 @@ ENDIF(CLITK_BUILD_VV) #========================================================= - +# Build test when vv has been compiled +IF(BUILD_TESTING) + ADD_SUBDIRECTORY(tests) +ENDIF(BUILD_TESTING) diff --git a/DartConfiguration.tcl b/DartConfiguration.tcl new file mode 100644 index 0000000..789d086 --- /dev/null +++ b/DartConfiguration.tcl @@ -0,0 +1,90 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: /home/mpech/workspace/vvSource +BuildDirectory: /home/mpech/workspace/vvSource + +# Where to place the cost data store +CostDataFile: + +# Site is something like machine.domain, i.e. pragmatic.crd +Site: russule + +# Build name is osname-revision-compiler, i.e. Linux-2.4.2-2smp-c++ +BuildName: Linux-c++ + +# Submission information +IsCDash: TRUE +CDashVersion: +QueryCDashVersion: +DropSite: localhost +DropLocation: /cdash/submit.php?project=vv +DropSiteUser: +DropSitePassword: +DropSiteMode: +DropMethod: http +TriggerSite: +ScpCommand: /usr/bin/scp + +# Dashboard start time +NightlyStartTime: 00:00:00 EST + +# Commands for the build/test/submit cycle +ConfigureCommand: "/usr/bin/cmake" "/home/mpech/workspace/vvSource" +MakeCommand: /usr/bin/gmake -i +DefaultCTestConfigurationType: Release + +# CVS options +# Default is "-d -P -A" +CVSCommand: /usr/bin/cvs +CVSUpdateOptions: -d -A -P + +# Subversion options +SVNCommand: /usr/bin/svn +SVNUpdateOptions: + +# Git options +GITCommand: /usr/bin/git +GITUpdateOptions: +GITUpdateCustom: + +# Generic update command +UpdateCommand: /usr/bin/git +UpdateOptions: +UpdateType: git + +# Compiler info +Compiler: /usr/bin/c++ + +# Dynamic analysis and coverage +PurifyCommand: +ValgrindCommand: +ValgrindCommandOptions: +MemoryCheckCommand: MEMORYCHECK_COMMAND-NOTFOUND +MemoryCheckCommandOptions: +MemoryCheckSuppressionFile: +CoverageCommand: /usr/bin/gcov + +# Cluster commands +SlurmBatchCommand: SLURM_SBATCH_COMMAND-NOTFOUND +SlurmRunCommand: SLURM_SRUN_COMMAND-NOTFOUND + +# Testing options +# TimeOut is the amount of time in seconds to wait for processes +# to complete during testing. After TimeOut seconds, the +# process will be summarily terminated. +# Currently set to 25 minutes +TimeOut: 1500 + +UseLaunchers: +CurlOptions: +# warning, if you add new options here that have to do with submit, +# you have to update cmCTestSubmitCommand.cxx + +# For CTest submissions that timeout, these options +# specify behavior for retrying the submission +CTestSubmitRetryDelay: 5 +CTestSubmitRetryCount: 3 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e15b097..59a0187 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,22 +1,37 @@ -# Tests are organized to mirror the clitk directory tree. -# Eacho subdirectory has its own CMakeLists.txt with the compiling directives +macro(ADD_GOOGLE_TESTS executable) + foreach ( source ${ARGN} ) + file(READ "${source}" contents) + string(REGEX MATCHALL "TEST_?F?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) + foreach(hit ${found_tests}) + string(REGEX REPLACE ".*\\(([A-Za-z_0-9]+)[, ]*([A-Za-z_0-9]+)\\).*" "\\1.\\2" test_name ${hit}) + add_test(${test_name} ${executable} --gtest_filter=${test_name}) + endforeach(hit) + endforeach() +endmacro() +SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/tests/bin) +SET(BUILDNAME ${CMAKE_SYSTEM_NAME}${CMAKE_OSX_ARCHITECTURES} CACHE INTERNAL DOCSTRING) +SET(CLITK_DATA_PATH ${PROJECT_BINARY_DIR}/tests/data/ CACHE STRING "dataTest path") +#todo test if data test path exists -IF (CLITK_BUILD_TESTING) +ADD_DEFINITIONS(-DCLITK_DATA_PATH=\"${CLITK_DATA_PATH}\") - set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/tests/bin) - - # default data path is searched in the project source tree - FIND_PATH(CLITK_DATA_PATH data PATHS ${PROJECT_SOURCE_DIR}) - IF (CLITK_DATA_PATH STREQUAL "CLITK_DATA_PATH-NOTFOUND" OR CLITK_DATA_PATH STREQUAL "") - MESSAGE("Data path must be given when tests are enabled.") - ENDIF (CLITK_DATA_PATH STREQUAL "CLITK_DATA_PATH-NOTFOUND" OR CLITK_DATA_PATH STREQUAL "") - - set(CLITK_DATA_PATH ${CLITK_DATA_PATH}/data) - ADD_DEFINITIONS(-DCLITK_DATA_PATH='"${CLITK_DATA_PATH}"') +add_library(gtest UNKNOWN IMPORTED) +set(GTEST_DIR ${ITK_DIR}/../gtest/ CACHE STRING "gtestDir") +#if windows gtestLibName=gtest.dll else libgtest.a +set(gtestLibName libgtest.a) +set(GTEST_LIB ${GTEST_DIR}/build/${gtestLibName}) +message(gtestlib name = ${GTEST_LIB}) +set_property(TARGET gtest PROPERTY IMPORTED_LOCATION "${GTEST_LIB}") +include_directories(${GTEST_DIR}/include/) +IF(CLITK_BUILD_TOOLS) ADD_SUBDIRECTORY(tools) - #ADD_SUBDIRECTORY(segmentation) - #ADD_SUBDIRECTORY(registration) - #ADD_SUBDIRECTORY(common) +ENDIF() +IF(CLITK_BUILD_VV) + ADD_SUBDIRECTORY(vv) +ENDIF() +# ADD_SUBDIRECTORY(segmentation) +# ADD_SUBDIRECTORY(registration) +# ADD_SUBDIRECTORY(common) + -ENDIF(CLITK_BUILD_TESTING) diff --git a/tests/tools/CMakeLists.txt b/tests/tools/CMakeLists.txt index 950194e..ad57d59 100644 --- a/tests/tools/CMakeLists.txt +++ b/tests/tools/CMakeLists.txt @@ -1,17 +1,14 @@ -# Add test apps and test executions to this part -# Test apps are compiled as any other app in the -# project. Test executions are run using "make test" -# -IF(CLITK_BUILD_TESTING) +include_directories( + ${PROJECT_SOURCE_DIR}/common + ${PROJECT_SOURCE_DIR}/tools + ${GTEST_DIR}/include +) - # clitkImageInfo - ADD_EXECUTABLE(clitkImageInfoTest clitkImageInfoTest.cxx) - TARGET_LINK_LIBRARIES(clitkImageInfoTest ITKIO) - ADD_TEST(NAME clitkImageInfoTest COMMAND clitkImageInfoTest) +FILE(GLOB srcs *.cxx) +ADD_EXECUTABLE(toolsTest ${srcs}) +ADD_DEFINITIONS(-DTOOLS_PATH=\"${PROJECT_BINARY_DIR}/bin/\") +target_link_libraries(toolsTest vvLib ${vvExternalLibs} gtest) - # clitkWriteDicomSeries - ADD_EXECUTABLE(clitkWriteDicomSeriesTest clitkWriteDicomSeriesTest.cxx) - TARGET_LINK_LIBRARIES(clitkWriteDicomSeriesTest ITKIO) - ADD_TEST(NAME clitkWriteDicomSeriesTest COMMAND clitkWriteDicomSeriesTest) - -ENDIF(CLITK_BUILD_TESTING) +# Add all tests found in the source code, calling the executable to run them +add_google_tests ( ${EXECUTABLE_OUTPUT_PATH}/toolsTest ${srcs}) +SET(BUILDNAME ${BUILDNAME}_tools CACHE INTERNAL DOCSTRING) \ No newline at end of file diff --git a/tests/tools/clitkImageInfoTest.cxx b/tests/tools/clitkImageInfoTest.cxx index e7cc921..5e7476b 100644 --- a/tests/tools/clitkImageInfoTest.cxx +++ b/tests/tools/clitkImageInfoTest.cxx @@ -15,57 +15,30 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================*/ -#include -#include - #include #include #include - +#include +#include "gtest/gtest.h" +#include "stdio.h" #include - - -const size_t NUMTESTS=2; - -// test files -const char mhd_files[NUMTESTS][128] = { - CLITK_DATA_PATH"/4d/mhd/00.mhd", - CLITK_DATA_PATH"/4d/mhd/bh.mhd" -}; - -// pre-written validation files. the idea -// is that the output generated from the test -// files match the verification files -const char validation_files[NUMTESTS][128] = { - CLITK_DATA_PATH"/tools/clitkImageInfoTestValidate3D.out", - CLITK_DATA_PATH"/tools/clitkImageInfoTestValidate4D.out" -}; - -int main(int argc, char** argv) -{ - system("pwd"); +static inline void compare(std::string mhd, std::string ref){ + std::ostringstream cmd_line; + ASSERT_TRUE(itksys::SystemTools::FileExists(mhd.c_str(), true)); + cmd_line << TOOLS_PATH<<"clitkImageInfo " << mhd << " > clitkImageInfoTest.out"; + std::cout << "Executing " << cmd_line.str() << std::endl; + system(cmd_line.str().c_str()); - bool failed = false; - for (size_t i = 0; i < NUMTESTS; i++) { - std::ostringstream cmd_line; - cmd_line << "clitkImageInfo " << mhd_files[i] << " > clitkImageInfoTest.out"; - - std::cout << "Executing " << cmd_line.str() << std::endl; - system(cmd_line.str().c_str()); - - // compare output with validation file - std::cout << "Validating output against " << validation_files[i] << std::endl; - bool differ = itksys::SystemTools::FilesDiffer("clitkImageInfoTest.out", validation_files[i]); - if (differ) - { - failed = true; - std::cout << "FAILED: Program output and reference do not match." << std::endl; - } - else - { - itksys::SystemTools::RemoveFile("clitkImageInfoTest.out"); - std::cout << "PASSED" << std::endl; - } - } - return failed ? -1 : 0; + bool differ = itksys::SystemTools::FilesDiffer("clitkImageInfoTest.out", ref.c_str()); + remove("clitkImageInfoTest.out"); + EXPECT_FALSE(differ); +} +TEST(clitkImageInfoTest, main){ + std::string mhd1=std::string(CLITK_DATA_PATH)+"4d/mhd/00.mhd"; + std::string ref1=std::string(CLITK_DATA_PATH)+"tools/clitkImageInfoTestValidate3D.out"; + compare(mhd1, ref1); + + std::string mhd2=std::string(CLITK_DATA_PATH)+"4d/mhd/bh.mhd"; + std::string ref2=std::string(CLITK_DATA_PATH)+"tools/clitkImageInfoTestValidate4D.out"; + compare(mhd2, ref2); } \ No newline at end of file diff --git a/tests/tools/clitkWriteDicomSeriesTest.cxx b/tests/tools/clitkWriteDicomSeriesTest.cxx index 6f53ef5..bc63080 100644 --- a/tests/tools/clitkWriteDicomSeriesTest.cxx +++ b/tests/tools/clitkWriteDicomSeriesTest.cxx @@ -15,44 +15,20 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================*/ -#include -#include - #include #include -#include - +#include "gtest/gtest.h" #include - -const size_t NUMTESTS=1; - -const char mhd_files[NUMTESTS][128] = { - CLITK_DATA_PATH"/3d/mhd/00.mhd" -}; - -const char dcm_dirs[NUMTESTS][128] = { - CLITK_DATA_PATH"/3d/dcm/1.2.840.113704.1.111.536.1248695032.26" -}; - -int main(int argc, char** argv) -{ - bool failed = false; - for (size_t i = 0; i < NUMTESTS; i++) { - std::ostringstream cmd_line; - cmd_line << "clitkWriteDicomSeries -i " << mhd_files[i] << " -d " << dcm_dirs[i] << " -o dcm --verbose"; - - std::cout << "Executing " << cmd_line.str() << std::endl; - int err = system(cmd_line.str().c_str()); - if (err != 0) - { - failed = true; - std::cout << "FAILED (errno = " << err << ")" << std::endl; - } - else - { - itksys::SystemTools::RemoveADirectory("dcm"); - std::cout << "PASSED" << std::endl; - } - } - return failed ? -1 : 0; +TEST(clitkWriteDicomSeriesTest, main){ + + std::string fIn=std::string(CLITK_DATA_PATH)+"/3d/mhd/00.mhd"; + std::string fOut=std::string(CLITK_DATA_PATH)+"/3d/dcm/1.2.840.113704.1.111.536.1248695032.26"; + ASSERT_TRUE(itksys::SystemTools::FileExists(fIn.c_str(), true)); + std::ostringstream cmd_line; + cmd_line << TOOLS_PATH <<"clitkWriteDicomSeries -i " << fIn << " -d " << fOut << " -o dcm --verbose"; + EXPECT_TRUE(itksys::SystemTools::FileExists(fOut.c_str(), false)); + EXPECT_TRUE(itksys::SystemTools::FileExists("dcm", false)); + EXPECT_EQ(0, system(cmd_line.str().c_str())); + //does directory exists + itksys::SystemTools::RemoveADirectory("dcm"); } \ No newline at end of file diff --git a/tests/tools/vvMainTest.cxx b/tests/tools/vvMainTest.cxx new file mode 100644 index 0000000..9d00e8a --- /dev/null +++ b/tests/tools/vvMainTest.cxx @@ -0,0 +1,5 @@ +#include "gtest/gtest.h" +int main(int argc, char** argv){ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests/vv/CMakeLists.txt b/tests/vv/CMakeLists.txt new file mode 100644 index 0000000..492e8f7 --- /dev/null +++ b/tests/vv/CMakeLists.txt @@ -0,0 +1,22 @@ +include_directories( + ${PROJECT_SOURCE_DIR}/vv + ${PROJECT_BINARY_DIR}/vv + ${QT_INCLUDES} + ${QT_INCLUDE_DIR} + ${QT_QTGUI_INCLUDE_DIR} + ${QT_QTCORE_INCLUDE_DIR} + ${QT_QTNETWORK_INCLUDE_DIR} + ${PROJECT_SOURCE_DIR}/common + ${PROJECT_SOURCE_DIR}/tools + ${PROJECT_SOURCE_DIR}/segmentation + ${QT_LIBRARY_DIR} + ${GTEST_DIR}/include +) + +FILE(GLOB srcs *.cxx) +ADD_EXECUTABLE(vvTest ${srcs}) +target_link_libraries(vvTest vvLib ${vvExternalLibs} gtest) + +# Add all tests found in the source code, calling the executable to run them +add_google_tests ( ${EXECUTABLE_OUTPUT_PATH}/vvTest ${srcs}) +SET(BUILDNAME ${BUILDNAME}_vv CACHE INTERNAL DOCSTRING) diff --git a/tests/vv/vvMainTest.cxx b/tests/vv/vvMainTest.cxx new file mode 100644 index 0000000..0efcdef --- /dev/null +++ b/tests/vv/vvMainTest.cxx @@ -0,0 +1,8 @@ +#include "gtest/gtest.h" +#include +#include +int main(int argc, char** argv){ + QApplication* q=new QApplication ( argc, argv ); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests/vv/vvRegisterFormTest.cxx b/tests/vv/vvRegisterFormTest.cxx new file mode 100644 index 0000000..9537602 --- /dev/null +++ b/tests/vv/vvRegisterFormTest.cxx @@ -0,0 +1,52 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================*/ +#include "vvRegisterForm.h" +#include +#include +#include "gtest/gtest.h" +#include "vvCommon.h" +#include +#include +const std::string data_path = "/home/mpech/workspace/vvSource/tests/data/"; +TEST(vvRegisterForm, canPush){ + QUrl url; + //the file exists with some old lines + vvRegisterForm* v=new vvRegisterForm(url, QString::fromStdString(data_path+".settingsCanPush.txt"), QSettings::NativeFormat); + std::ifstream inFile((data_path+".settingsCanPush.txt").c_str(), std::ifstream::in); + ASSERT_FALSE(inFile.fail()); + EXPECT_TRUE(v->canPush()); + + //the file doesn't exist + vvRegisterForm* v2=new vvRegisterForm(url, QString::fromStdString(data_path+".settings_notFound.txt"), QSettings::NativeFormat); + EXPECT_TRUE(v2->canPush()); + + //the current version is the same + QString strSettings=QString::fromStdString(data_path+".settings2.txt"); + QSettings settings(strSettings, QSettings::NativeFormat); + settings.setValue("vvVersion", VV_VERSION); + vvRegisterForm* v3=new vvRegisterForm(url, strSettings, QSettings::NativeFormat); + EXPECT_FALSE(v3->canPush()); +} +TEST(vvRegisterForm, acquitPushed){ + QUrl url; + vvRegisterForm* v=new vvRegisterForm(url, QString::fromStdString(data_path+".settingsAcquit.txt"), QSettings::NativeFormat); + ASSERT_TRUE(v->canPush()); + v->acquitPushed(); + EXPECT_FALSE(v->canPush()); + remove((data_path+".settingsAcquit.txt").c_str()); +} diff --git a/vv/CMakeLists.txt b/vv/CMakeLists.txt index 25cac3d..4d5c36b 100644 --- a/vv/CMakeLists.txt +++ b/vv/CMakeLists.txt @@ -134,13 +134,11 @@ foreach(tool ${vv_TOOLS} ${vv_COMMON_WITH_UI}) QT4_WRAP_CPP(vv_SRCS ${tool}.h) QT4_WRAP_UI(vv_UI_CXX qt_ui/${tool}.ui) endforeach(tool) - #Add the common source files foreach(tool ${vv_COMMON}) SET(vv_SRCS ${vv_SRCS} ${tool}.cxx) QT4_WRAP_CPP(vv_SRCS ${tool}.h) endforeach(tool) - # if Windows and Qt was built as a static lib then don't set QT_DLL flag SET(QT_STATIC 0) IF (WIN32) @@ -188,22 +186,25 @@ IF(WIN32) ENDIF(WIN32) LINK_DIRECTORIES(${QT_LIBRARY_DIR}) -ADD_EXECUTABLE(vv ${vv_SRCS} vv.cxx ${vv_UI_CXX} ${EXE_ICON}) -ADD_DEPENDENCIES(vv clitkSegmentationGgoLib) -TARGET_LINK_LIBRARIES(vv clitkDicomRTStruct) - #========================================================= #Add each tool's dependencies foreach(tool ${vv_TOOLS}) - target_link_libraries(vv ${${tool}_LIBS}) + SET(toolLibs ${toolLibs} ${${tool}_LIBS}) endforeach(tool) - #========================================================= #Add Foundation Libraries (this should be after our libraries, since we depend #on them) -TARGET_LINK_LIBRARIES(vv -clitkCommon ${ITK_LIBRARIES} QVTK vtkHybrid) +SET(foundationLibraries clitkCommon ${ITK_LIBRARIES} QVTK vtkHybrid) +#========================================================= +#Create binary and libs for tests +SET(vvExternalLibs clitkSegmentationGgoLib clitkDicomRTStruct ${toolLibs} ${foundationLibraries} CACHE INTERNAL DOCSTRING) +ADD_EXECUTABLE(vv ${vv_SRCS} vv.cxx ${vv_UI_CXX} ${EXE_ICON}) +ADD_DEPENDENCIES(vv clitkSegmentationGgoLib) +IF(BUILD_TESTING) + target_link_libraries(vv ${vvExternalLibs}) + add_library(vvLib ${vv_SRCS} vv.cxx ${vv_UI_CXX} ${EXE_ICON}) +ENDIF(BUILD_TESTING) #========================================================= # Install options (also used by CPack) IF(UNIX AND NOT APPLE) @@ -261,8 +262,5 @@ ENDIF(WIN32) INCLUDE(CPack) #========================================================= #========================================================= -configure_file ( - vvCommon.h.in - vvCommon.h -) +configure_file(vvCommon.h.in vvCommon.h) #========================================================= \ No newline at end of file -- 2.47.1