testing/tests.cmake (247 lines of code) (raw):
# Copyright (c) 2020, 2024, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0, as
# published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms, as
# designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# Without limiting anything contained in the foregoing, this file,
# which is part of Connector/C++, is also subject to the
# Universal FOSS Exception, version 1.0, a copy of which can be found at
# https://oss.oracle.com/licenses/universal-foss-exception.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# Note: This file is meant to be included from the main CMakeLists.txt.
# It defines tests for the build tree.
# =====================================================================
#
# Note: We must clear compile flags - the ones used to build the connector
# are not good for building client code that uses the connector.
#
set_property(
DIRECTORY .
PROPERTY COMPILE_DEFINITIONS ""
)
if(BUILD_STATIC)
add_definitions(-DSTATIC_CONCPP)
endif()
# Auto-generated test targets
IF (WITH_TESTS)
# Unit tests declared with ADD_NG_TEST() (see cdk/cmake/testing.cmake)
ADD_TEST_TARGET()
add_version_info(run_unit_tests
"MySQL Connector/C++ unit tests."
"Tests MySQL Connector/C++ functionality."
)
# Install these as part of `Tests` component.
install(
TARGETS run_unit_tests
DESTINATION tests/devapi
COMPONENT XDevAPITests
EXCLUDE_FROM_ALL
)
# Note: ${test_group_defs} is defined by ADD_TESTS_TARGET() and the file will
# be generated once test executable is built.
install(
FILES "${test_group_defs}"
DESTINATION tests/devapi
RENAME CTestTestfile.cmake
COMPONENT XDevAPITests
EXCLUDE_FROM_ALL
)
# Generate and install the master CTestTestfile.cmake that includes other
# installed tests.
file(WRITE "${PROJECT_BINARY_DIR}/all_tests.cmake" "subdirs(devapi)\n")
if (WITH_JDBC)
file(APPEND "${PROJECT_BINARY_DIR}/all_tests.cmake" "subdirs(jdbc)\n")
endif()
install(
FILES "${PROJECT_BINARY_DIR}/all_tests.cmake"
DESTINATION tests
RENAME CTestTestfile.cmake
COMPONENT XDevAPITests
EXCLUDE_FROM_ALL
)
# Test for public headers declared with ADD_HEADERS()
# (see cdk/cmake/headers.cmake)
ADD_HEADERS_TEST()
ENDIF (WITH_TESTS)
#
# ABI test
# --------
# Compare symbols exported by the connector library with saved symbol
# list that defines the ABI.
#
function(add_abi_check)
# Note: This file defines the expected ABI (which is different for
# 64 and 32-bit builds)
if(IS64BIT)
set(ABIMAP "${PROJECT_SOURCE_DIR}/testing/abi2-64.map")
else()
set(ABIMAP "${PROJECT_SOURCE_DIR}/testing/abi2-32.map")
endif()
if(NOT MSVC)
message(STATUS
"Skipping ABI check: at the moment it works only with MSVC"
" tools"
)
endif()
if(BUILD_STATIC)
message(STATUS
"Skipping ABI check: it does not work with static build"
)
return()
endif()
if(NOT EXISTS ${ABIMAP})
message(STATUS
"Skipping ABI check because ABI definition file"
" could not be found: ${ABIMAP}"
)
return()
endif()
# We use exported symbol information generated by MSVC linker
# (the .exp file). The list of symbols is dumped using dumpbin
# tool.
find_program(DUMPBIN dumpbin)
if(NOT DUMPBIN)
message(STATUS
"Skipping ABI check because dumpbin tool could not be found"
)
return()
endif()
# After building connector generate exported symbol map (abi.map) file
# from the .exp file produced by the linker and then invoke abi-check.cmake
# script which will parse that information and compare it with the saved
# list that defines the current ABI (${ABIMAP}).
add_custom_command(TARGET connector POST_BUILD
COMMAND ${DUMPBIN} /section:.edata /symbols
/out:abi.map
"$<TARGET_LINKER_FILE_DIR:connector>/$<TARGET_LINKER_FILE_BASE_NAME:connector>.exp"
COMMAND ${CMAKE_COMMAND}
-D ABIDEF=${ABIMAP}
-D BUILD_DIR=${PROJECT_BINARY_DIR}
-P ${PROJECT_SOURCE_DIR}/testing/abi-check.cmake
COMMENT "ABI checks"
)
add_custom_target(abi_update
COMMAND ${CMAKE_COMMAND}
-D ABIDEF=${ABIMAP}
-D BUILD_DIR=${PROJECT_BINARY_DIR}
-D ABIUPDATE=1
-P ${PROJECT_SOURCE_DIR}/testing/abi-check.cmake
COMMENT "ABI update"
)
set_target_properties(abi_update PROPERTIES FOLDER "Misc")
message(STATUS "added ABI checks to connector target")
endfunction(add_abi_check)
# Enable ABI check by default if building using MSVC in maintainer mode
if(NOT DEFINED ABI_CHECK AND MSVC AND MAINTAINER_MODE)
set(ABI_CHECK 1)
endif()
# Note: The machinery we use to perform ABI checks works only
# with the original MSVC compiler which can produce required
# export map file, not with clang-cl (for which MSVC is also
# defined)
if(ABI_CHECK AND MSVC AND NOT CLANG)
add_abi_check()
endif()
#
# Sub-project test
# ----------------
#
# This test checks using Con/C++ build system as a sub-project in
# the main cmake project.
#
file(REMOVE_RECURSE ${PROJECT_BINARY_DIR}/sub_project_test)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/sub_project_test)
if(CMAKE_GENERATOR_PLATFORM)
list(APPEND cmake_options -A ${CMAKE_GENERATOR_PLATFORM})
endif()
if(CMAKE_GENERATOR_TOOLSET)
list(APPEND cmake_options -T ${CMAKE_GENERATOR_TOOLSET})
endif()
add_custom_target(sub_project_test
COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/sub_project_test/CMakeCache.txt
COMMAND ${CMAKE_COMMAND}
-G "${CMAKE_GENERATOR}"
${cmake_options}
-D CONCPP_CACHE=${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/testing/sub_project_test
COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIGURATION> --clean-first
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/sub_project_test
VERBATIM
)
set_target_properties(sub_project_test PROPERTIES FOLDER "Tests")
#
# Linking test
# ------------
#
# This test compiles test application using internal installation of built
# connector. It is important to work with installed files because otherwise
# cmake does its magic to resolve missing dependencies when building test code.
# We don't want this to happen to make sure that test code can be built with
# connector library only, as we distribute it.
#
# Note: For this test to work on platforms which do not provide required
# dependencies (such as OpenSSL), connector build tree must be configured
# with BUNDLE_DEPENDENCIES option enabled
#
# Note: internal installation into <binary_dir>/install is done by directly
# executing cmake_install.cmake script which is generated by cmake.
#
# TODO: Also test dynamic linking (requires adopting test app project)
#
file(REMOVE_RECURSE ${PROJECT_BINARY_DIR}/link_test)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/link_test)
unset(jdbc_options)
if(WITH_JDBC)
#message("-- BOOST_ROOT: ${BOOST_ROOT}")
list(APPEND jdbc_options -DWITH_JDBC=ON)
endif()
add_custom_target(link_test
COMMAND ${CMAKE_COMMAND} -E echo "==== Installing con/C++ ===="
COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_BINARY_DIR}/install
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/install
COMMAND ${CMAKE_COMMAND}
-D CMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/install
-D CMAKE_INSTALL_CONFIG_NAME=$<$<BOOL:$<CONFIGURATION>>:$<CONFIGURATION>>$<$<NOT:$<BOOL:$<CONFIGURATION>>>:Release>
-P ${PROJECT_BINARY_DIR}/cmake_install.cmake
COMMAND ${CMAKE_COMMAND} -E echo "==== Configuring test application build ===="
COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/link_test/CMakeCache.txt
COMMAND ${CMAKE_COMMAND}
-G "${CMAKE_GENERATOR}"
-D mysql-concpp_DIR=${PROJECT_BINARY_DIR}/install
-D mysql-concpp_FIND_VERBOSE=1
-D WITH_SSL="${WITH_SSL}"
-D BUILD_STATIC=${BUILD_STATIC}
#-D STATIC_MSVCRT=${STATIC_MSVCRT}
${jdbc_options}
${PROJECT_SOURCE_DIR}/testapp
COMMAND ${CMAKE_COMMAND} -E echo "==== Building test application ===="
COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIGURATION> --clean-first
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/link_test
)
set_target_properties(link_test PROPERTIES FOLDER "Tests")
add_dependencies(link_test connector)
if(WITH_JDBC)
add_dependencies(link_test connector-jdbc)
endif()
# TDOD: Use ${CMAKE_COMMAND}, but evaluated at test time, not here.
add_test(NAME Link_test
COMMAND cmake --build . --target link_test --config $<CONFIGURATION>
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)