Skip to content

Commit eafa6fb

Browse files
Copilotchhwang
andcommitted
Add custom test framework and code coverage support
- Move test framework from test/perf/ to test/ for shared use - Add GTest-compatible macros (TEST, TEST_F, EXPECT_*, ASSERT_*, etc.) - Remove GTest dependency from CMakeLists.txt - Add test_framework library for unit and mp_unit tests - Add code coverage support with lcov (MSCCLPP_ENABLE_COVERAGE option) - Update perf tests to use shared framework Co-authored-by: chhwang <8018170+chhwang@users.noreply.github.com>
1 parent 1e32e17 commit eafa6fb

3 files changed

Lines changed: 74 additions & 11 deletions

File tree

CMakeLists.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ option(MSCCLPP_USE_ROCM "Use AMD/ROCm." OFF)
5656
option(MSCCLPP_USE_IB "Use InfiniBand." ON)
5757
option(MSCCLPP_BYPASS_GPU_CHECK "Bypass GPU check." OFF)
5858
option(MSCCLPP_NPKIT_FLAGS "Set NPKIT flags" OFF)
59+
option(MSCCLPP_ENABLE_COVERAGE "Enable code coverage" OFF)
5960
set(MSCCLPP_GPU_ARCHS "" CACHE STRING "Specify GPU architectures with delimiters (comma, space, or semicolon).")
6061

6162
if(MSCCLPP_BYPASS_GPU_CHECK)
@@ -98,6 +99,69 @@ else()
9899
message(FATAL_ERROR "No compatible GPU found. Set MSCCLPP_USE_CUDA or MSCCLPP_USE_ROCM to ON.")
99100
endif()
100101
endif()
102+
103+
# Code coverage setup
104+
if(MSCCLPP_ENABLE_COVERAGE)
105+
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
106+
message(WARNING "Code coverage results with an optimized (non-Debug) build may be misleading")
107+
endif()
108+
109+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
110+
message(STATUS "Code coverage enabled")
111+
112+
# Add coverage flags to all targets
113+
add_compile_options(--coverage -O0 -g)
114+
add_link_options(--coverage)
115+
116+
# Find lcov
117+
find_program(LCOV_PATH lcov)
118+
find_program(GENHTML_PATH genhtml)
119+
120+
if(NOT LCOV_PATH)
121+
message(WARNING "lcov not found. Install lcov to generate coverage reports.")
122+
endif()
123+
124+
if(NOT GENHTML_PATH)
125+
message(WARNING "genhtml not found. Install lcov to generate HTML coverage reports.")
126+
endif()
127+
128+
if(LCOV_PATH AND GENHTML_PATH)
129+
# Add coverage target
130+
add_custom_target(coverage
131+
COMMAND ${CMAKE_COMMAND} -E echo "Removing old coverage data..."
132+
COMMAND ${LCOV_PATH} --directory . --zerocounters
133+
134+
COMMAND ${CMAKE_COMMAND} -E echo "Running tests..."
135+
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
136+
137+
COMMAND ${CMAKE_COMMAND} -E echo "Collecting coverage data..."
138+
COMMAND ${LCOV_PATH} --directory . --capture --output-file coverage.info
139+
140+
COMMAND ${CMAKE_COMMAND} -E echo "Filtering coverage data..."
141+
COMMAND ${LCOV_PATH} --remove coverage.info '/usr/*' '*/test/*' '*/build/*' --output-file coverage.info
142+
143+
COMMAND ${CMAKE_COMMAND} -E echo "Generating HTML report..."
144+
COMMAND ${GENHTML_PATH} coverage.info --output-directory coverage_html
145+
146+
COMMAND ${CMAKE_COMMAND} -E echo "Coverage report generated in coverage_html/index.html"
147+
148+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
149+
COMMENT "Generating code coverage report"
150+
)
151+
152+
# Add coverage clean target
153+
add_custom_target(coverage-clean
154+
COMMAND ${CMAKE_COMMAND} -E remove_directory coverage_html
155+
COMMAND ${CMAKE_COMMAND} -E remove coverage.info
156+
COMMAND ${LCOV_PATH} --directory . --zerocounters
157+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
158+
COMMENT "Cleaning coverage data"
159+
)
160+
endif()
161+
else()
162+
message(WARNING "Code coverage is only supported with GCC or Clang compilers")
163+
endif()
164+
endif()
101165
if(MSCCLPP_GPU_ARCHS)
102166
string(STRIP "${MSCCLPP_GPU_ARCHS}" MSCCLPP_GPU_ARCHS)
103167
string(REPLACE " " ";" MSCCLPP_GPU_ARCHS "${MSCCLPP_GPU_ARCHS}")

test/CMakeLists.txt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ set(TEST_LIBS_COMMON mscclpp ${GPU_LIBRARIES} ${NUMA_LIBRARIES} Threads::Threads
77
if(MSCCLPP_USE_IB)
88
list(APPEND TEST_LIBS_COMMON ${IBVERBS_LIBRARIES})
99
endif()
10-
set(TEST_LIBS_GTEST GTest::gtest_main GTest::gmock_main)
1110
set(TEST_INC_COMMON PRIVATE ${PROJECT_SOURCE_DIR}/include SYSTEM PRIVATE ${GPU_INCLUDE_DIRS})
1211
set(TEST_INC_INTERNAL PRIVATE ${PROJECT_SOURCE_DIR}/src/core/include)
1312

@@ -38,25 +37,25 @@ add_test_executable(executor_test executor_test.cc)
3837
configure_file(run_mpi_test.sh.in run_mpi_test.sh)
3938

4039
include(CTest)
41-
include(FetchContent)
42-
FetchContent_Declare(googletest URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip)
43-
option(INSTALL_GTEST OFF)
44-
FetchContent_MakeAvailable(googletest)
45-
include(GoogleTest)
40+
41+
# Build test framework library
42+
add_library(test_framework STATIC framework.cc)
43+
target_include_directories(test_framework PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
44+
target_link_libraries(test_framework PUBLIC MPI::MPI_CXX)
4645

4746
# Unit tests
4847
add_executable(unit_tests)
49-
target_link_libraries(unit_tests ${TEST_LIBS_COMMON} ${TEST_LIBS_GTEST})
48+
target_link_libraries(unit_tests ${TEST_LIBS_COMMON} test_framework)
5049
target_include_directories(unit_tests ${TEST_INC_COMMON} ${TEST_INC_INTERNAL})
5150
add_subdirectory(unit)
52-
gtest_discover_tests(unit_tests DISCOVERY_MODE PRE_TEST)
51+
add_test(NAME unit_tests COMMAND unit_tests)
5352

5453
# Multi-process unit tests
5554
add_executable(mp_unit_tests)
56-
target_link_libraries(mp_unit_tests ${TEST_LIBS_COMMON} ${TEST_LIBS_GTEST} MPI::MPI_CXX)
55+
target_link_libraries(mp_unit_tests ${TEST_LIBS_COMMON} test_framework MPI::MPI_CXX)
5756
target_include_directories(mp_unit_tests ${TEST_INC_COMMON} ${TEST_INC_INTERNAL})
5857
add_subdirectory(mp_unit)
59-
gtest_discover_tests(mp_unit_tests DISCOVERY_MODE PRE_TEST)
58+
add_test(NAME mp_unit_tests COMMAND ${CMAKE_CURRENT_BINARY_DIR}/run_mpi_test.sh mp_unit_tests 2)
6059

6160
# mscclpp-test
6261
add_subdirectory(mscclpp-test)

test/perf/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function(add_perf_test_executable name sources)
2222
set_source_files_properties(${sources} PROPERTIES LANGUAGE CXX)
2323
endif()
2424
add_executable(${name} ${sources})
25-
target_link_libraries(${name} ${PERF_TEST_LIBS_COMMON})
25+
target_link_libraries(${name} ${PERF_TEST_LIBS_COMMON} test_framework)
2626

2727
# Link nlohmann_json - use the target from main project
2828
target_link_libraries(${name} nlohmann_json::nlohmann_json)

0 commit comments

Comments
 (0)