Skip to content

Commit 564c5ca

Browse files
committed
[#491] Add test coverage reports into the runtime documentation
1 parent d953148 commit 564c5ca

File tree

4 files changed

+106
-2
lines changed

4 files changed

+106
-2
lines changed

cmake/coverage_utils.cmake

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function(create_coverage_target)
2828
endif ()
2929

3030
set(cov_binary_dir "${PROJECT_BINARY_DIR}/${cov_tgt_name}")
31+
set(cov_install_dir "${CMAKE_INSTALL_PREFIX}/cpp/zserio_doc/coverage")
3132

3233
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
3334
set(cov_fail)
@@ -49,7 +50,8 @@ function(create_coverage_target)
4950
-r ${PROJECT_SOURCE_DIR}
5051
--object-directory=${PROJECT_BINARY_DIR}
5152
${cov_fail}
52-
${cov_exclude}
53+
${cov_exclude} > ${cov_binary_dir}/coverage_report.txt
54+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${cov_binary_dir} ${cov_install_dir}/gcc
5355
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
5456
VERBATIM
5557
COMMENT "Generating html code coverage report in ${cov_binary_dir}/index.html")
@@ -67,16 +69,20 @@ function(create_coverage_target)
6769
COMMAND ${LLVM_PROFDATA_BIN} merge --sparse default.profraw -o ${cov_binary_dir}/runtime.profdata
6870
COMMAND ${LLVM_COV_BIN} show ${cov_test_exectable}
6971
-instr-profile=${cov_binary_dir}/runtime.profdata
70-
--format=html --show-instantiations=false -output-dir=${cov_binary_dir}
72+
-format=html -show-instantiations=false -output-dir=${cov_binary_dir}
7173
${cov_exclude}
7274
COMMAND ${LLVM_COV_BIN} report ${cov_test_exectable}
7375
-instr-profile=${cov_binary_dir}/runtime.profdata
7476
${cov_exclude}
77+
COMMAND bash -c "${LLVM_COV_BIN} report ${cov_test_exectable} \
78+
-instr-profile=${cov_binary_dir}/runtime.profdata ${cov_exclude} \
79+
> ${cov_binary_dir}/coverage_report.txt"
7580
COMMAND bash -c "(( \
7681
`${LLVM_COV_BIN} report ${cov_test_exectable} \
7782
-instr-profile=${cov_binary_dir}/runtime.profdata ${cov_exclude} | grep TOTAL | \
7883
tr -s ' ' | cut -d' ' -f 10 | cut -d. -f 1` >= ${cov_INCOMPLETE_COVERAGE_FAIL} \
7984
))"
85+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${cov_binary_dir} ${cov_install_dir}/clang
8086
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
8187
VERBATIM
8288
COMMENT "Generating html code coverage report in ${cov_binary_dir}/index.html")

compiler/extensions/java/runtime/build.xml

+12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ spotbugs.home_dir - Location of the spotbugs tool. If not set, spo
5454
value="${zserio_java_runtime.test.build_dir}/coverage"/>
5555
<property name="zserio_java_runtime.test.coverage_file"
5656
value="${zserio_java_runtime.test.coverage_dir}/jacoco_coverage.bin"/>
57+
<property name="zserio_java_runtime.test.coverage_jar_file"
58+
value="${zserio_java_runtime.install_dir}/zserio_runtime_coverage.jar"/>
5759

5860
<property name="zserio_java_runtime.jar_dir" value="${zserio_java_runtime.build_dir}/jar"/>
5961
<property name="zserio_java_runtime.jar_file" value="${zserio_java_runtime.jar_dir}/zserio_runtime.jar"/>
@@ -311,13 +313,23 @@ spotbugs.home_dir - Location of the spotbugs tool. If not set, spo
311313
</structure>
312314

313315
<html destdir="${zserio_java_runtime.test.coverage_dir}"/>
316+
<xml destfile="${zserio_java_runtime.test.coverage_dir}/jacoco_report.xml"/>
314317

315318
<check>
316319
<rule element="BUNDLE">
317320
<limit counter="INSTRUCTION" value="COVEREDRATIO" minimum="92%"/>
318321
</rule>
319322
</check>
320323
</jacoco:report>
324+
325+
<jar destfile="${zserio_java_runtime.test.coverage_jar_file}">
326+
<fileset dir="${zserio_java_runtime.test.coverage_dir}">
327+
<include name="**"/>
328+
</fileset>
329+
<manifest>
330+
<attribute name="Implementation-Version" value="${zserio_java_runtime.version}"/>
331+
</manifest>
332+
</jar>
321333
</target>
322334

323335
<target name="test" depends="test.run">

scripts/build.sh

+18
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ test_python_runtime()
3838
ZSERIO_CPP_DIR=$(ls -d1 "${BUILD_DIR}/zserio_cpp/lib"*)
3939
if [ $? -ne 0 ] ; then
4040
stderr_echo "Failed to locate C++ runtime binding to Python!"
41+
popd > /dev/null
4142
return 1
4243
fi
4344

@@ -66,6 +67,14 @@ test_python_runtime()
6667
return 1
6768
fi
6869

70+
python -m coverage xml -o "coverage/coverage_report.xml" --fail-under=100 --omit="*test_object*"
71+
local COVERAGE_RESULT=$?
72+
if [ ${COVERAGE_RESULT} -ne 0 ] ; then
73+
stderr_echo "Running python coverage report failed with return code ${COVERAGE_RESULT}!"
74+
popd > /dev/null
75+
return 1
76+
fi
77+
6978
popd > /dev/null
7079
echo
7180

@@ -176,6 +185,15 @@ install_python_runtime()
176185
return 1
177186
fi
178187

188+
# install test coverage report
189+
echo "Installing test coverage report"
190+
cp -r "${PYTHON_RUNTIME_BUILD_DIR}/coverage" "${PYTHON_RUNTIME_DISTR_DIR}/zserio_doc/coverage"
191+
if [ $? -ne 0 ] ; then
192+
stderr_echo "Failed to install documentation!"
193+
return 1
194+
fi
195+
rm -f "${PYTHON_RUNTIME_DISTR_DIR}/zserio_doc/coverage/.gitignore"
196+
179197
return 0
180198
}
181199

scripts/release.sh

+68
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ set_release_global_variables()
5252
return 1
5353
fi
5454

55+
# XMLLINT to use, defaults to "xmllint" if not set
56+
XMLLINT="${XMLLINT:-xmllint}"
57+
if [ ! -f "`which "${XMLLINT}"`" ] ; then
58+
stderr_echo "Cannot find xmllint! Set XMLLINT environment variable."
59+
return 1
60+
fi
61+
5562
# GPG to use, defaults to "gpg" if not set
5663
GPG="${GPG:-gpg}"
5764
if [ ! -f "`which "${GPG}"`" ] ; then
@@ -140,6 +147,7 @@ Uses the following environment variables for releasing:
140147
MVN Mvn executable to use. Default is "mvn".
141148
GIT Git executable to use. Default is "git".
142149
UNZIP Unzip executable to use. Default is "unzip".
150+
XMLLINT Xmllint executable to use. Default is "xmllint".
143151
GPG Gpg executable to use. Default is "gpg".
144152
JAVA_BIN Java executable to use. Default is "java".
145153
PYTHON Python executable to use. Default is "python3".
@@ -534,6 +542,12 @@ update_web_pages()
534542
stderr_echo "Cannot unzip zserio runtime javadocs jar!"
535543
return 1
536544
fi
545+
"${UNZIP}" -q "${WEB_PAGES_BUILD_DIR}"/runtime_libs/java/zserio_runtime_coverage.jar \
546+
-d "${WEB_PAGES_BUILD_DIR}"/runtime_libs/java/zserio_doc/coverage -x META-INF/*
547+
if [ $? -ne 0 ] ; then
548+
stderr_echo "Cannot unzip zserio runtime javadocs jar!"
549+
return 1
550+
fi
537551
echo "Done"
538552

539553
echo -ne "Copying Zserio runtime libraries..."
@@ -554,6 +568,42 @@ update_web_pages()
554568
fi
555569
echo "Done"
556570

571+
echo -ne "Creating Zserio runtime library GitHub badges..."
572+
local CLANG_COVERAGE_DIR="${ZSERIO_PROJECT_ROOT}"/doc/runtime/cpp/coverage/clang
573+
local CLANG_LINES_COVERAGE=`cat "${CLANG_COVERAGE_DIR}"/coverage_report.txt | grep TOTAL | \
574+
tr -s ' ' | cut -d' ' -f 10`
575+
create_github_badge_json "${CLANG_COVERAGE_DIR}"/coverage_github_badge.json \
576+
"C++ clang runtime ${ZSERIO_VERSION} coverage" "${CLANG_LINES_COVERAGE}"
577+
578+
local GCC_COVERAGE_DIR="${ZSERIO_PROJECT_ROOT}"/doc/runtime/cpp/coverage/gcc
579+
local GCC_LINES_COVERAGE=`cat "${GCC_COVERAGE_DIR}"/coverage_report.txt | grep lines: | \
580+
tr -s ' ' | cut -d' ' -f 2`
581+
create_github_badge_json "${GCC_COVERAGE_DIR}"/coverage_github_badge.json \
582+
"C++ gcc runtime ${ZSERIO_VERSION} coverage" "${GCC_LINES_COVERAGE}"
583+
584+
local JAVA_COVERAGE_DIR="${ZSERIO_PROJECT_ROOT}"/doc/runtime/java/coverage
585+
local JAVA_LINES_MISSED=`${XMLLINT} --format "${JAVA_COVERAGE_DIR}"/jacoco_report.xml | \
586+
grep '<counter type="INSTRUCTION"' | tail -1 | tr -s ' ' | cut -d' ' -f4 | cut -d= -f2 | tr -d \"`
587+
local JAVA_LINES_COVERED=`${XMLLINT} --format "${JAVA_COVERAGE_DIR}"/jacoco_report.xml | \
588+
grep '<counter type="INSTRUCTION"' | tail -1 | tr -s ' ' | cut -d' ' -f5 | cut -d= -f2 | \
589+
tr -d \"\/\>`
590+
local JAVA_LINES_VALID=$((${JAVA_LINES_COVERED} - ${JAVA_LINES_MISSED}))
591+
local JAVA_LINES_COVERAGE=$((10000 * ${JAVA_LINES_VALID} / ${JAVA_LINES_COVERED}))
592+
create_github_badge_json "${JAVA_COVERAGE_DIR}"/coverage_github_badge.json \
593+
"Java runtime ${ZSERIO_VERSION} coverage" \
594+
"${JAVA_LINES_COVERAGE:0:-2}.${JAVA_LINES_COVERAGE: -2}%"
595+
596+
local PYTHON_COVERAGE_DIR="${ZSERIO_PROJECT_ROOT}"/doc/runtime/python/coverage
597+
local PYTHON_LINES_VALID=`cat "${PYTHON_COVERAGE_DIR}"/coverage_report.xml | grep lines-covered | \
598+
cut -d' ' -f 4 | cut -d= -f2 | tr -d \"`
599+
local PYTHON_LINES_COVERED=`cat "${PYTHON_COVERAGE_DIR}"/coverage_report.xml | grep lines-covered | \
600+
cut -d' ' -f 5 | cut -d= -f2 | tr -d \"`
601+
local PYTHON_LINES_COVERAGE=$((10000 * ${PYTHON_LINES_VALID} / ${PYTHON_LINES_COVERED}))
602+
create_github_badge_json "${PYTHON_COVERAGE_DIR}"/coverage_github_badge.json \
603+
"Python runtime ${ZSERIO_VERSION} coverage" \
604+
"${PYTHON_LINES_COVERAGE:0:-2}.${PYTHON_LINES_COVERAGE: -2}%"
605+
echo "Done"
606+
557607
# This is necessary because Jekyll ignores Python runtime doc directories that start with underscores.
558608
echo -ne "Creating Jekyll configuration file..."
559609
echo "theme: jekyll-theme-slate" > "${ZSERIO_PROJECT_ROOT}"/_config.yml
@@ -590,6 +640,24 @@ update_web_pages()
590640
return 0
591641
}
592642

643+
# Create JSON configuration file for GitHub badge
644+
create_github_badge_json()
645+
{
646+
exit_if_argc_ne $# 3
647+
local BADGE_JSON_FILE="$1"; shift
648+
local BADGE_LABEL="$1"; shift
649+
local BADGE_MESSAGE="$1"; shift
650+
651+
cat > "${BADGE_JSON_FILE}" << EOF
652+
{
653+
"schemaVersion": 1,
654+
"label": "${BADGE_LABEL}",
655+
"message": "${BADGE_MESSAGE}",
656+
"color": "green"
657+
}
658+
EOF
659+
}
660+
593661
# Print help message.
594662
print_help()
595663
{

0 commit comments

Comments
 (0)