Skip to content

Commit 96e7ae5

Browse files
authored
Change cmake test file so it is possible to add separate unit test executables (#934)
* Change cmake test file so it is possible to add separate unit test executables. Signed-off-by: Maaike Zijderveld, iolar <git.mail@iolar.nl>
1 parent e58099c commit 96e7ae5

File tree

4 files changed

+162
-64
lines changed

4 files changed

+162
-64
lines changed

tests/CMakeLists.txt

Lines changed: 51 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,59 @@
1-
set(CONFIG_DIR_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/v16/")
2-
set(MIGRATION_FILES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/v16/migration_files")
3-
set(MIGRATION_FILES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/v201/migration_files")
4-
set(CONFIG_FILE_LOCATION_V16 ${CMAKE_CURRENT_SOURCE_DIR}/config/v16/resources/config.json)
5-
set(USER_CONFIG_FILE_LOCATION_V16 ${CMAKE_CURRENT_SOURCE_DIR}/config/v16/resources/user_config.json)
6-
set(CONFIG_FILE_RESOURCES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v16/config.json")
7-
set(USER_CONFIG_FILE_RESOURCES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v16/user_config.json")
1+
include(${CMAKE_CURRENT_SOURCE_DIR}/libocpp-unittests.cmake)
82

9-
set(MIGRATION_FILES_DEVICE_MODEL_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/v201/device_model_migration_files")
10-
set(DEVICE_MODEL_DB_LOCATION_V201 "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/device_model_storage.db")
11-
set(DEVICE_MODEL_RESOURCES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201")
12-
set(DEVICE_MODEL_RESOURCES_CHANGED_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201/changed")
13-
set(DEVICE_MODEL_RESOURCES_WRONG_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201/wrong")
14-
set(DEVICE_MODEL_CURRENT_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources)
15-
set(DEVICE_MODEL_CURRENT_CHANGED_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources_changed)
16-
set(DEVICE_MODEL_CURRENT_WRONG_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources_wrong)
17-
set(DEVICE_MODEL_EXAMPLE_CONFIG_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/example_config/v201/component_config")
18-
set(DEVICE_MODEL_CURRENT_EXAMPLE_CONFIG_LOCATION_V201 "${PROJECT_SOURCE_DIR}/config/v201/component_config")
19-
set(TEST_PROFILES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/profiles/v16")
20-
set(TEST_PROFILES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/profiles/v201")
3+
# For libocpp tests, there is one big executable, which links against the ocpp lib and all other libs.
4+
# When it is useful to link only to the tested cpp files, a separate executable can be created for each file.
5+
# The source files can be added to this variable, which is a list. For example:
6+
# list(APPEND SEPARATE_UNIT_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ocpp/v201/functional_blocks/test_security.cpp)
7+
# CMake will then create a new test executable based on the filename and adds 'libocpp_' in front of it. In above
8+
# example, a test executable 'libocpp_test_security' will be created. In this example, in the CMakeLists of
9+
# `lib/ocpp/v201/functional_blocks`, files to link against can be added to this target / executable.
10+
#
11+
# For each test in this list, cmake will link agaist some 'default' cpp files (like utils and enums etc), set all
12+
# correct flags, add a test, set definitions, etc. See below.
13+
set(SEPARATE_UNIT_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ocpp/common/utils_tests.cpp)
2114

15+
# Add separate tests for V201 only.
16+
if(LIBOCPP_ENABLE_V201)
17+
# Add all v201 tests you don't want to include in the default test executable here.
18+
# Example (remove if there are real tests added):
19+
# list(APPEND SEPARATE_UNIT_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ocpp/v201/functional_blocks/test_security.cpp)
20+
endif()
2221

23-
add_executable(libocpp_unit_tests
24-
config/v201/resources_wrong/component_config_required_no_value/standardized/UnitTestCtrlr.json)
2522

26-
target_compile_definitions(libocpp_unit_tests
27-
PRIVATE
28-
CONFIG_FILE_LOCATION_V16="${CONFIG_FILE_RESOURCES_LOCATION_V16}"
29-
USER_CONFIG_FILE_LOCATION_V16="${USER_CONFIG_FILE_RESOURCES_LOCATION_V16}"
30-
CONFIG_DIR_V16="${CONFIG_DIR_V16}"
31-
MIGRATION_FILES_LOCATION_V16="${MIGRATION_FILES_LOCATION_V16}"
32-
MIGRATION_FILES_LOCATION_V201="${MIGRATION_FILES_LOCATION_V201}"
33-
MIGRATION_FILE_VERSION_V16=${MIGRATION_FILE_VERSION_V16}
34-
MIGRATION_FILE_VERSION_V201=${MIGRATION_FILE_VERSION_V201}
35-
DEVICE_MODEL_DB_LOCATION_V201="${DEVICE_MODEL_DB_LOCATION_V201}"
36-
TEST_PROFILES_LOCATION_V16="${TEST_PROFILES_LOCATION_V16}"
37-
TEST_PROFILES_LOCATION_V201="${TEST_PROFILES_LOCATION_V201}"
38-
)
23+
set(TEST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
24+
set(GCOVR_DEPENDENCIES)
25+
26+
27+
add_libocpp_unittest(NAME libocpp_unit_tests PATH "")
3928

40-
target_compile_options(libocpp_unit_tests
41-
PRIVATE
42-
-pedantic-errors
29+
target_link_libraries(libocpp_unit_tests PRIVATE
30+
ocpp
31+
${GTEST_LIBRARIES}
4332
)
4433

45-
target_compile_features(libocpp_unit_tests PUBLIC cxx_std_17)
34+
35+
# Add executables, link libraries etc for the unit tests that are separate and do not link against the ocpp lib.
36+
# This loops over all tests added to `SEPARATE_UNIT_TESTS` and does the necessary things to make it build.
37+
# For now, everything is added that seems to be needed in every test. If later some sources and link libraries should
38+
# not be added here, they can always be removed from this loop and added to the test targets that actually need them.
39+
foreach(ITEM ${SEPARATE_UNIT_TESTS})
40+
set(TEST_ROOT_NAME)
41+
cmake_path(GET ITEM STEM TEST_ROOT_NAME)
42+
set(TEST_NAME "libocpp_${TEST_ROOT_NAME}")
43+
add_libocpp_unittest(NAME ${TEST_NAME} PATH ${ITEM})
44+
endforeach(ITEM)
45+
46+
# Subdirectories should be added only after adding the tests, because they have to exist for the CMakeLists.txt in the
47+
# child directories.
48+
add_subdirectory(lib/ocpp/common)
49+
50+
if(LIBOCPP_ENABLE_V16)
51+
add_subdirectory(lib/ocpp/v16)
52+
endif()
53+
54+
if(LIBOCPP_ENABLE_V201)
55+
add_subdirectory(lib/ocpp/v201)
56+
endif()
4657

4758
add_custom_command(TARGET libocpp_unit_tests POST_BUILD
4859
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/resources/unittest_device_model.db ${CMAKE_CURRENT_BINARY_DIR}/resources/unittest_device_model.db
@@ -67,38 +78,16 @@ add_custom_command(TARGET libocpp_unit_tests POST_BUILD
6778
COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEVICE_MODEL_CURRENT_EXAMPLE_CONFIG_LOCATION_V201} ${DEVICE_MODEL_EXAMPLE_CONFIG_LOCATION_V201}
6879
)
6980

70-
add_test(libocpp_unit_tests libocpp_unit_tests)
71-
72-
target_include_directories(libocpp_unit_tests PUBLIC
73-
${CMAKE_CURRENT_SOURCE_DIR}
74-
${CMAKE_CURRENT_SOURCE_DIR}/lib/ocpp/common
75-
)
76-
target_link_libraries(libocpp_unit_tests PRIVATE
77-
ocpp
78-
GTest::gmock_main
79-
GTest::gtest_main
80-
)
81-
82-
add_subdirectory(lib/ocpp/common)
83-
84-
if(LIBOCPP_ENABLE_V16)
85-
add_subdirectory(lib/ocpp/v16)
86-
endif()
87-
88-
if(LIBOCPP_ENABLE_V201)
89-
add_subdirectory(lib/ocpp/v201)
90-
endif()
91-
9281
setup_target_for_coverage_gcovr_html(
9382
NAME ${PROJECT_NAME}_gcovr_coverage
9483
EXECUTABLE ctest
95-
DEPENDENCIES libocpp_unit_tests
84+
DEPENDENCIES libocpp_unit_tests ${GCOVR_DEPENDENCIES}
9685
EXCLUDE "src/*" "tests/*"
9786
)
9887

9988
setup_target_for_coverage_gcovr_xml(
10089
NAME ${PROJECT_NAME}_gcovr_coverage_xml
10190
EXECUTABLE ctest
102-
DEPENDENCIES libocpp_unit_tests
91+
DEPENDENCIES libocpp_unit_tests ${GCOVR_DEPENDENCIES}
10392
EXCLUDE "src/*" "tests/*"
10493
)
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
21
target_sources(libocpp_unit_tests PRIVATE
32
test_database_migration_files.cpp
43
test_database_schema_updater.cpp
54
test_message_queue.cpp
65
test_websocket_uri.cpp
7-
utils_tests.cpp
86
)
7+
8+
9+
set(TEST_UTILS_SOURCES ${LIBOCPP_LIB_PATH}/ocpp/common/utils.cpp)
10+
11+
target_sources(libocpp_utils_tests PRIVATE ${TEST_UTILS_SOURCES})

tests/lib/ocpp/v201/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ target_sources(libocpp_unit_tests PRIVATE
2525
# Copy the json files used for testing to the destination directory
2626
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/json DESTINATION ${TEST_PROFILES_LOCATION_V201})
2727

28+
set(LIBOCPP_TESTS_V201_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
29+
2830
add_subdirectory(functional_blocks)

tests/libocpp-unittests.cmake

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
set(CONFIG_DIR_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/v16/")
2+
set(MIGRATION_FILES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/v16/migration_files")
3+
set(MIGRATION_FILES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/v201/migration_files")
4+
set(CONFIG_FILE_LOCATION_V16 ${CMAKE_CURRENT_SOURCE_DIR}/config/v16/resources/config.json)
5+
set(USER_CONFIG_FILE_LOCATION_V16 ${CMAKE_CURRENT_SOURCE_DIR}/config/v16/resources/user_config.json)
6+
set(CONFIG_FILE_RESOURCES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v16/config.json")
7+
set(USER_CONFIG_FILE_RESOURCES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v16/user_config.json")
8+
9+
set(MIGRATION_FILES_DEVICE_MODEL_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/v201/device_model_migration_files")
10+
set(DEVICE_MODEL_DB_LOCATION_V201 "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/device_model_storage.db")
11+
set(DEVICE_MODEL_RESOURCES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201")
12+
set(DEVICE_MODEL_RESOURCES_CHANGED_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201/changed")
13+
set(DEVICE_MODEL_RESOURCES_WRONG_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/config/v201/wrong")
14+
set(DEVICE_MODEL_CURRENT_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources)
15+
set(DEVICE_MODEL_CURRENT_CHANGED_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources_changed)
16+
set(DEVICE_MODEL_CURRENT_WRONG_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/config/v201/resources_wrong)
17+
set(DEVICE_MODEL_EXAMPLE_CONFIG_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/example_config/v201/component_config")
18+
set(DEVICE_MODEL_CURRENT_EXAMPLE_CONFIG_LOCATION_V201 "${PROJECT_SOURCE_DIR}/config/v201/component_config")
19+
set(TEST_PROFILES_LOCATION_V16 "${CMAKE_CURRENT_BINARY_DIR}/resources/profiles/v16")
20+
set(TEST_PROFILES_LOCATION_V201 "${CMAKE_CURRENT_BINARY_DIR}/resources/profiles/v201")
21+
22+
# Add variables that can be used for all tests if needed.
23+
set(GTEST_LIBRARIES GTest::gmock_main GTest::gtest_main)
24+
set(TEST_COMPILE_OPTIONS -pedantic-errors)
25+
set(TEST_COMPILE_DEFINITIONS
26+
CONFIG_FILE_LOCATION_V16="${CONFIG_FILE_RESOURCES_LOCATION_V16}"
27+
USER_CONFIG_FILE_LOCATION_V16="${USER_CONFIG_FILE_RESOURCES_LOCATION_V16}"
28+
CONFIG_DIR_V16="${CONFIG_DIR_V16}"
29+
MIGRATION_FILES_LOCATION_V16="${MIGRATION_FILES_LOCATION_V16}"
30+
MIGRATION_FILES_LOCATION_V201="${MIGRATION_FILES_LOCATION_V201}"
31+
MIGRATION_FILE_VERSION_V16=${MIGRATION_FILE_VERSION_V16}
32+
MIGRATION_FILE_VERSION_V201=${MIGRATION_FILE_VERSION_V201}
33+
DEVICE_MODEL_DB_LOCATION_V201="${DEVICE_MODEL_DB_LOCATION_V201}"
34+
TEST_PROFILES_LOCATION_V16="${TEST_PROFILES_LOCATION_V16}"
35+
TEST_PROFILES_LOCATION_V201="${TEST_PROFILES_LOCATION_V201}")
36+
set(TEST_COMPILE_FEATURES cxx_std_17)
37+
set(LIBOCPP_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include)
38+
set(LIBOCPP_LIB_PATH ${PROJECT_SOURCE_DIR}/lib)
39+
set(LIBOCPP_3RDPARTY_PATH ${PROJECT_SOURCE_DIR}/3rd_party)
40+
set(TEST_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}
41+
${CMAKE_CURRENT_SOURCE_DIR}/lib/ocpp/common
42+
${LIBOCPP_INCLUDE_PATH}
43+
)
44+
# If the test is not linked against the ocpp library, most probably those libraries are needed to link against.
45+
set(LIBOCPP_TEST_DEFAULT_LINK_LIBRARIES
46+
SQLite::SQLite3
47+
nlohmann_json::nlohmann_json
48+
date::date-tz
49+
everest::log
50+
everest::evse_security
51+
)
52+
53+
# If the test is not linked against the ocpp library, those default sources can be linked against, they will often
54+
# be needed to link against.
55+
set(LIBOCPP_TEST_INCLUDE_COMMON_SOURCES ${LIBOCPP_LIB_PATH}/ocpp/common/types.cpp
56+
${LIBOCPP_LIB_PATH}/ocpp/common/ocpp_logging.cpp
57+
${LIBOCPP_LIB_PATH}/ocpp/common/utils.cpp
58+
${LIBOCPP_LIB_PATH}/ocpp/common/call_types.cpp
59+
${LIBOCPP_LIB_PATH}/ocpp/common/evse_security.cpp
60+
${LIBOCPP_LIB_PATH}/ocpp/common/database/database_connection.cpp
61+
${LIBOCPP_LIB_PATH}/ocpp/common/database/database_handler_common.cpp
62+
${LIBOCPP_LIB_PATH}/ocpp/common/database/sqlite_statement.cpp
63+
${LIBOCPP_LIB_PATH}/ocpp/common/database/database_schema_updater.cpp
64+
)
65+
66+
# If the test is not linked against the ocpp library, those default sources for ocpp v2.0.1 can be linked against, they
67+
# will often be needed to link against.
68+
set(LIBOCPP_TEST_INCLUDE_V201_SOURCES ${LIBOCPP_LIB_PATH}/ocpp/v16/ocpp_enums.cpp # This is currently still needed but might be removed in the future.
69+
${LIBOCPP_LIB_PATH}/ocpp/v201/ctrlr_component_variables.cpp
70+
${LIBOCPP_LIB_PATH}/ocpp/v201/types.cpp
71+
${LIBOCPP_LIB_PATH}/ocpp/v201/ocpp_types.cpp
72+
${LIBOCPP_LIB_PATH}/ocpp/v201/enums.cpp
73+
${LIBOCPP_LIB_PATH}/ocpp/v201/ocpp_enums.cpp
74+
${LIBOCPP_LIB_PATH}/ocpp/v201/device_model.cpp
75+
${LIBOCPP_LIB_PATH}/ocpp/v201/init_device_model_db.cpp
76+
${LIBOCPP_LIB_PATH}/ocpp/v201/device_model_storage_sqlite.cpp
77+
${LIBOCPP_LIB_PATH}/ocpp/v201/utils.cpp
78+
)
79+
80+
function(add_libocpp_unittest)
81+
set(oneValueArgs NAME PATH)
82+
set(options)
83+
set(multiValueArgs)
84+
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
85+
if (arg_PATH)
86+
add_executable(${arg_NAME} ${arg_PATH})
87+
else ()
88+
add_executable(${arg_NAME})
89+
endif()
90+
add_test(NAME ${arg_NAME} COMMAND ${arg_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
91+
list(APPEND GCOVR_DEPENDENCIES ${arg_NAME})
92+
target_link_libraries(${arg_NAME} PUBLIC ${GTEST_LIBRARIES})
93+
target_link_libraries(${arg_NAME} PRIVATE ${LIBOCPP_TEST_DEFAULT_LINK_LIBRARIES})
94+
target_compile_definitions(${arg_NAME}
95+
PRIVATE
96+
${TEST_COMPILE_DEFINITIONS}
97+
MIGRATION_FILE_VERSION_V16=${MIGRATION_FILE_VERSION_V16}
98+
MIGRATION_FILE_VERSION_V201=${MIGRATION_FILE_VERSION_V201}
99+
MIGRATION_DEVICE_MODEL_FILE_VERSION_V201=${MIGRATION_DEVICE_MODEL_FILE_VERSION_V201})
100+
target_compile_options(${arg_NAME} PRIVATE ${TEST_COMPILE_OPTIONS})
101+
target_compile_features(${arg_NAME} PUBLIC ${TEST_COMPILE_FEATURES})
102+
target_include_directories(${arg_NAME} PRIVATE ${TEST_INCLUDE_DIRECTORIES})
103+
message("Add test ${arg_NAME}")
104+
endfunction()

0 commit comments

Comments
 (0)