diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2020-07-16 13:58:49 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2020-07-16 13:58:49 +0300 |
commit | 56aa5b0d8c6b66369f979e8bee4f1bd99454a99f (patch) | |
tree | 521ad55ec7da54988109d5105593fd817704cfa0 /tests/gtests/runner | |
parent | 065a00ee3e6668172faae5a72027de8b1bca9d77 (diff) |
T73268: Link C/C++ unit tests into single executable
This commit introduces a new way to build unit tests. It is now possible
for each module to generate its own test library. The tests in these
libraries are then bundled into a single executable.
The test executable can be run with `ctest`. Even though the tests
reside in a single executable, they are still exposed as individual
tests to `ctest`, and thus can be selected via its `-R` argument.
Not yet ported tests still build & run as before.
The following rules apply:
- Test code should reside in the same directory as the code under test.
- Tests that target functionality in `somefile.{c,cc}` should reside in
`somefile_test.cc`.
- The namespace for tests is the `tests` sub-namespace of the code under
test. For example, tests for `blender::bke` should be in
`blender::bke:tests`.
- The test files should be listed in the module's `CMakeLists.txt` in a
`blender_add_test_lib()` call. See the `blenkernel` module for an
example.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D7649
Diffstat (limited to 'tests/gtests/runner')
-rw-r--r-- | tests/gtests/runner/CMakeLists.txt | 63 | ||||
-rw-r--r-- | tests/gtests/runner/blender_test.cc | 25 |
2 files changed, 88 insertions, 0 deletions
diff --git a/tests/gtests/runner/CMakeLists.txt b/tests/gtests/runner/CMakeLists.txt new file mode 100644 index 00000000000..e7cbabfe7c6 --- /dev/null +++ b/tests/gtests/runner/CMakeLists.txt @@ -0,0 +1,63 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The Original Code is Copyright (C) 2020, Blender Foundation +# All rights reserved. +# ***** END GPL LICENSE BLOCK ***** + +# Build the test runner. This runner takes care of running all GTests, i.e. +# the code that was built using the blender_add_test_lib() CMake macro (see +# macros.cmake). +set(SRC + blender_test.cc +) + +if(WITH_BUILDINFO) + list(APPEND SRC + "$<TARGET_OBJECTS:buildinfoobj>" + ) +endif() + + +# Test libraries need to be linked "whole archive", because they're not +# directly referenced from other code. +get_property(_test_libs GLOBAL PROPERTY BLENDER_TEST_LIBS) +if(WIN32) + list(APPEND TEST_LIBS ${_test_libs}) +elseif(APPLE) + list(APPEND TEST_LIBS "-Wl,-force_load" ${_test_libs}) +elseif(UNIX) + list(APPEND TEST_LIBS "-Wl,--whole-archive" ${_test_libs} "-Wl,--no-whole-archive") +else() + message(FATAL_ERROR "Unknown how to link whole-archive with your compiler ${CMAKE_CXX_COMPILER_ID}") +endif() +unset(_test_libs) + +# This builds `bin/tests/blender_test`, but does not add it as a single test. +setup_libdirs() +BLENDER_SRC_GTEST_EX( + NAME blender + SRC "${SRC}" + EXTRA_LIBS "${TEST_LIBS}" + SKIP_ADD_TEST +) +setup_liblinks(blender_test) + +# This runs the blender_test executable with `--gtest_list_tests`, then +# exposes those tests individually to the ctest runner. +# See https://cmake.org/cmake/help/v3.18/module/GoogleTest.html +include(GoogleTest) +gtest_discover_tests(blender_test) diff --git a/tests/gtests/runner/blender_test.cc b/tests/gtests/runner/blender_test.cc new file mode 100644 index 00000000000..fbce7a4283f --- /dev/null +++ b/tests/gtests/runner/blender_test.cc @@ -0,0 +1,25 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 Blender Foundation. + * All rights reserved. + */ + +/* This file is intentionally left blank. It is necessary for CMake to have a source file for each + * executable. However, the blender_tests test runner only comprises of statically linked library + * files, including its main function. + * + * See source/blender/blenkernel/CMakeLists.txt for an example of how to add unit tests to the test + * runner. */ |