diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 53ca49e64a..e745e87d35 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -99,8 +99,6 @@ else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fPIC -DELPP_THREAD_SAFE -fopenmp") endif() - - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(ExternalProject) @@ -132,6 +130,11 @@ link_directories(${CMAKE_CURRRENT_BINARY_DIR}) add_subdirectory(src) +if (BUILD_COVERAGE STREQUAL "ON") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") +endif() + + if (BUILD_UNIT_TEST) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/unittest) endif(BUILD_UNIT_TEST) diff --git a/cpp/build.sh b/cpp/build.sh index 3af7b31bfb..fde45e8ce8 100755 --- a/cpp/build.sh +++ b/cpp/build.sh @@ -5,8 +5,9 @@ BUILD_UNITTEST="off" LICENSE_CHECK="OFF" INSTALL_PREFIX=$(pwd)/milvus MAKE_CLEAN="OFF" +BUILD_COVERAGE="OFF" -while getopts "p:t:uhlr" arg +while getopts "p:t:uhlrc" arg do case $arg in t) @@ -28,6 +29,9 @@ do MAKE_CLEAN="ON" fi ;; + c) + BUILD_COVERAGE="ON" + ;; h) # help echo " @@ -37,9 +41,10 @@ parameter: -p: install prefix -l: build license version -r: remove previous build directory +-c: code coverage usage: -./build.sh -t \${BUILD_TYPE} [-u] [-h] [-g] [-r] +./build.sh -t \${BUILD_TYPE} [-u] [-h] [-g] [-r] [-c] " exit 0 ;; @@ -65,6 +70,7 @@ if [[ ${MAKE_CLEAN} = "ON" ]]; then -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ -DCMAKE_CUDA_COMPILER=${CUDA_COMPILER} \ -DCMAKE_LICENSE_CHECK=${LICENSE_CHECK} \ + -DBUILD_COVERAGE=${BUILD_COVERAGE} \ $@ ../" echo ${CMAKE_CMD} @@ -78,5 +84,8 @@ if [[ ${BUILD_TYPE} != "Debug" ]]; then strip src/milvus_server fi -make install +if [[ ${BUILD_COVERAGE} = "ON" ]]; then + bash coverage.sh +fi +make install diff --git a/cpp/coverage.sh b/cpp/coverage.sh new file mode 100644 index 0000000000..39e1b1870c --- /dev/null +++ b/cpp/coverage.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +LCOV_CMD="lcov" +LCOV_GEN_CMD="genhtml" + +FILE_INFO_BASE="base.info" +FILE_INFO_MILVUS="server.info" +FILE_INFO_OUTPUT="output.info" +FILE_INFO_OUTPUT_NEW="output_new.info" +DIR_LCOV_OUTPUT="lcov_out" + +DIR_GCNO="cmake_build" +DIR_UNITTEST="milvus/bin" + +# get baseline +${LCOV_CMD} -c -i -d ${DIR_GCNO} -o "${FILE_INFO_BASE}" +if [ $? -ne 0 ]; then + echo "gen baseline coverage run failed" + exit -1 +fi + +for test in `ls ${DIR_UNITTEST}`; do + echo $test + case ${test} in + *_test) + # run unittest + ./${DIR_UNITTEST}/${test} + if [ $? -ne 0 ]; then + echo ${DIR_UNITTEST}/${test} "run failed" + fi + esac +done + +# gen test converage +${LCOV_CMD} -d ${DIR_GCNO} -o "${FILE_INFO_MILVUS}" -c -b +# merge coverage +${LCOV_CMD} -a ${FILE_INFO_BASE} -a ${FILE_INFO_MILVUS} -o "${FILE_INFO_OUTPUT}" + +# remove third party from tracefiles +${LCOV_CMD} -r "${FILE_INFO_OUTPUT}" -o "${FILE_INFO_OUTPUT_NEW}" \ + "/usr/*" \ + "*/boost/*" \ + "*/cmake_build/*_ep-prefix/*" \ + +# gen html report +${LCOV_GEN_CMD} "${FILE_INFO_OUTPUT_NEW}" --output-directory ${DIR_LCOV_OUTPUT}/