ExternalProject: Add tests for UPDATE_COMMAND.
Tests are added for UPDATE_COMMAND to ensure it is working properly. Testing infrastructure is added along with tests for Git, but tests for other version control systems could easily be added in the future.
This commit is contained in:
parent
378aa127b4
commit
2619f4d87a
|
@ -982,6 +982,20 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
|
||||||
set_tests_properties(ExternalProject PROPERTIES
|
set_tests_properties(ExternalProject PROPERTIES
|
||||||
TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
|
TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
|
||||||
|
|
||||||
|
add_test(ExternalProjectUpdate ${CMAKE_CMAKE_COMMAND}
|
||||||
|
-DExternalProjectUpdate_SOURCE_DIR:PATH=${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
|
||||||
|
-DExternalProjectUpdate_BINARY_DIR:PATH=${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate
|
||||||
|
-DCMAKE_TEST_GENERATOR=${CMAKE_TEST_GENERATOR}
|
||||||
|
-DCMAKE_TEST_MAKEPROGRAM=${CMAKE_TEST_MAKEPROGRAM}
|
||||||
|
-DCMAKE_CTEST_COMMAND=${CMAKE_CTEST_COMMAND}
|
||||||
|
-P ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
|
||||||
|
)
|
||||||
|
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate")
|
||||||
|
set_tests_properties(ExternalProjectUpdate PROPERTIES
|
||||||
|
TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT}
|
||||||
|
WORKING_DIRECTORY ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
|
||||||
|
)
|
||||||
|
|
||||||
# do each of the tutorial steps
|
# do each of the tutorial steps
|
||||||
foreach(STP RANGE 1 7)
|
foreach(STP RANGE 1 7)
|
||||||
add_test(TutorialStep${STP} ${CMAKE_CTEST_COMMAND}
|
add_test(TutorialStep${STP} ${CMAKE_CTEST_COMMAND}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
project(ExternalProjectUpdateTest NONE)
|
||||||
|
|
||||||
|
include(ExternalProject)
|
||||||
|
|
||||||
|
find_package(Git)
|
||||||
|
|
||||||
|
option(ExternalProjectUpdateTest_USE_FOLDERS "Enable folder grouping in IDEs." ON)
|
||||||
|
if(ExternalProjectUpdateTest_USE_FOLDERS)
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
else()
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER
|
||||||
|
"CMakePredefinedTargets-in-ExternalProjectUpdateTest")
|
||||||
|
|
||||||
|
set(base "${CMAKE_BINARY_DIR}/CMakeExternals")
|
||||||
|
set(binary_base "${base}/Build")
|
||||||
|
set_property(DIRECTORY PROPERTY EP_BASE ${base})
|
||||||
|
set_property(DIRECTORY PROPERTY EP_STEP_TARGETS configure build test)
|
||||||
|
|
||||||
|
set(do_git_tests 0)
|
||||||
|
|
||||||
|
if(GIT_EXECUTABLE)
|
||||||
|
set(do_git_tests 1)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" --version
|
||||||
|
OUTPUT_VARIABLE ov
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
string(REGEX REPLACE "^git version (.+)$" "\\1" git_version "${ov}")
|
||||||
|
message(STATUS "git_version='${git_version}'")
|
||||||
|
|
||||||
|
if(git_version VERSION_LESS 1.6.5)
|
||||||
|
message(STATUS "No ExternalProject git tests with git client less than version 1.6.5")
|
||||||
|
set(do_git_tests 0)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This should be specified from the command line.
|
||||||
|
if(NOT TEST_GIT_TAG)
|
||||||
|
message(FATAL_ERROR "TEST_GIT_TAG must be specified.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(do_git_tests)
|
||||||
|
set(local_git_repo "../../LocalRepositories/GIT")
|
||||||
|
|
||||||
|
# Unzip/untar the git repository in our source folder so that other
|
||||||
|
# projects below may use it to test git args of ExternalProject_Add
|
||||||
|
#
|
||||||
|
set(proj SetupLocalGITRepository)
|
||||||
|
ExternalProject_Add(${proj}
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/LocalRepositories/GIT
|
||||||
|
URL ${CMAKE_CURRENT_SOURCE_DIR}/gitrepo.tgz
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
CONFIGURE_COMMAND "${GIT_EXECUTABLE}" --version
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
)
|
||||||
|
set_property(TARGET ${proj}
|
||||||
|
PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing")
|
||||||
|
|
||||||
|
set(proj TutorialStep1-GIT)
|
||||||
|
ExternalProject_Add(${proj}
|
||||||
|
GIT_REPOSITORY "${local_git_repo}"
|
||||||
|
GIT_TAG ${TEST_GIT_TAG}
|
||||||
|
CMAKE_GENERATOR "${CMAKE_GENERATOR}"
|
||||||
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
DEPENDS "SetupLocalGITRepository"
|
||||||
|
)
|
||||||
|
set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Test the testable built/installed products:
|
||||||
|
#
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
|
||||||
|
# Do at least a smoke test of a built executable from each
|
||||||
|
# project's build directory...
|
||||||
|
#
|
||||||
|
# BuildTree tests:
|
||||||
|
#
|
||||||
|
|
||||||
|
if(do_git_tests)
|
||||||
|
add_test(TutorialStep1-GIT
|
||||||
|
"${binary_base}/TutorialStep1-GIT/Tutorial" 81)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "do_git_tests='${do_git_tests}'")
|
||||||
|
message(STATUS "GIT_EXECUTABLE='${GIT_EXECUTABLE}'")
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Set the ExternalProject GIT_TAG to desired_tag, and make sure the
|
||||||
|
# resulting checked out version is resulting_sha and a rebuild.
|
||||||
|
# This check's the viability of the ExternalProject UPDATE_COMMAND.
|
||||||
|
macro(check_a_tag desired_tag resulting_sha)
|
||||||
|
# Configure
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND}
|
||||||
|
-G ${CMAKE_TEST_GENERATOR}
|
||||||
|
-DTEST_GIT_TAG:STRING=${desired_tag}
|
||||||
|
${ExternalProjectUpdate_SOURCE_DIR}
|
||||||
|
WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}
|
||||||
|
RESULT_VARIABLE error_code
|
||||||
|
)
|
||||||
|
if(error_code)
|
||||||
|
message(FATAL_ERROR "Could not configure the project.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Build
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND}
|
||||||
|
--build ${ExternalProjectUpdate_BINARY_DIR}
|
||||||
|
RESULT_VARIABLE error_code
|
||||||
|
)
|
||||||
|
if(error_code)
|
||||||
|
message(FATAL_ERROR "Could not build the project.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check the resulting SHA
|
||||||
|
execute_process(COMMAND ${GIT_EXECUTABLE}
|
||||||
|
rev-list --max-count=1 HEAD
|
||||||
|
WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT
|
||||||
|
RESULT_VARIABLE error_code
|
||||||
|
OUTPUT_VARIABLE tag_sha
|
||||||
|
)
|
||||||
|
if(error_code)
|
||||||
|
message(FATAL_ERROR "Could not check the sha.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(STRIP "${tag_sha}" tag_sha)
|
||||||
|
if(NOT (${tag_sha} STREQUAL ${resulting_sha}))
|
||||||
|
message(FATAL_ERROR "UPDATE_COMMAND produced
|
||||||
|
${tag_sha}
|
||||||
|
when
|
||||||
|
${resulting_sha}
|
||||||
|
was expected."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
find_package(Git)
|
||||||
|
if(GIT_EXECUTABLE)
|
||||||
|
check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
|
||||||
|
check_a_tag(tag1 d1970730310fe8bc07e73f15dc570071f9f9654a)
|
||||||
|
# With the Git UPDATE_COMMAND performance patch, this will not required a
|
||||||
|
# 'git fetch'
|
||||||
|
check_a_tag(tag1 d1970730310fe8bc07e73f15dc570071f9f9654a)
|
||||||
|
check_a_tag(tag2 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
|
||||||
|
check_a_tag(d19707303 d1970730310fe8bc07e73f15dc570071f9f9654a)
|
||||||
|
check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
|
||||||
|
endif()
|
Binary file not shown.
Loading…
Reference in New Issue