已合并
fix(cov): 加强cpp覆盖率脚本以适配lcov版本差异并容忍空数据 #966
liu-wei创建于 6月10日
fix(cov): 加强cpp覆盖率脚本以适配lcov版本差异并容忍空数据 #966
已合并
liu-wei创建于 6月10日
1 个文件变更+56-23
@@ -19,25 +19,53 @@ mk_dir() {
19 logging "Created ${create_dir}"19 logging "Created ${create_dir}"
20}20}
21 21 
22+version_ge() {
23+ local v1="$1"
24+ local v2="$2"
25+ 
26+ local v1_major v1_minor v2_major v2_minor
27+ v1_major=$(echo "$v1" | cut -d. -f1)
28+ v1_minor=$(echo "$v1" | cut -d. -f2)
29+ v2_major=$(echo "$v2" | cut -d. -f1)
30+ v2_minor=$(echo "$v2" | cut -d. -f2)
31+ 
32+ if [[ $v1_major -gt $v2_major ]]; then
33+ return 0
34+ elif [[ $v1_major -eq $v2_major && $v1_minor -ge $v2_minor ]]; then
35+ return 0
36+ else
37+ return 1
38+ fi
39+}
40+ 
22# 获取 lcov 版本号41# 获取 lcov 版本号
23get_lcov_version() {42get_lcov_version() {
24- lcov --version 2>/dev/null | grep -oP 'LCOV version \K[0-9]+\.[0-9]+' | head -143+ lcov --version 2>/dev/null | grep -oP 'version \K[0-9]+\.[0-9]+' | head -1
25}44}
26 45 
27# 根据 lcov 版本构建 --ignore-errors 参数46# 根据 lcov 版本构建 --ignore-errors 参数
28build_ignore_errors_opt() {47build_ignore_errors_opt() {
29- local version="$1"48+ local version
30- # lcov 2.0+ supports: mismatch, gcov, source, empty,negative etc.49+ version=$(get_lcov_version)
31- # lcov 1.x supports: gcov, inconsistent, etc.50+ 
32- 51+ if [[ -n "$version" ]] && version_ge "$version" "2.0"; then
33- if [[ "${version}" =~ ^2\. ]]; then
34 echo "--ignore-errors mismatch,gcov,source,empty,negative"52 echo "--ignore-errors mismatch,gcov,source,empty,negative"
35 else53 else
36- # lcov 1.14 and earlier
37 echo "--ignore-errors gcov"54 echo "--ignore-errors gcov"
38 fi55 fi
39}56}
40 57 
58+build_ignore_errors_remove_opt() {
59+ local version
60+ version=$(get_lcov_version)
61+ 
62+ if [[ -n "$version" ]] && version_ge "$version" "2.0"; then
63+ echo "--ignore-errors empty,mismatch,unused,negative,source,inconsistent"
64+ else
65+ echo "--ignore-errors inconsistent"
66+ fi
67+}
68+ 
41# using lcov to generate coverage for cpp files69# using lcov to generate coverage for cpp files
42generate_coverage() {70generate_coverage() {
43 local _source_dir="$1"71 local _source_dir="$1"
@@ -70,8 +98,7 @@ generate_coverage() {
70 fi98 fi
71 99 
72 # 根据 lcov 版本选择合适的忽略错误选项100 # 根据 lcov 版本选择合适的忽略错误选项
73- local _lcov_version=$(get_lcov_version)101+ local _ignore_opt=$(build_ignore_errors_opt)
74- local _ignore_opt=$(build_ignore_errors_opt "${_lcov_version}")
75 102 
76 # 生成基础覆盖率文件103 # 生成基础覆盖率文件
77 lcov --capture \104 lcov --capture \
@@ -95,16 +122,15 @@ filter_coverage() {
95 exit 1122 exit 1
96 fi123 fi
97 124 
98- # 根据 lcov 版本选择合适的忽略错误选项125+ which lcov >/dev/null 2>&1
99- local _lcov_version=$(get_lcov_version)126+ if [[ $? -ne 0 ]]; then
100- local _ignore_opt=""127+ logging "lcov is required to generate coverage data, please install"
101- if [[ "${_lcov_version}" =~ ^2\. ]]; then128+ exit 1
102- _ignore_opt="--ignore-errors unused,inconsistent,empty"
103- else
104- # lcov 1.14 and earlier
105- _ignore_opt="--ignore-errors inconsistent"
106 fi129 fi
107 130 
131+ # 根据 lcov 版本选择合适的忽略错误选项
132+ local _ignore_opt=$(build_ignore_errors_remove_opt)
133+ 
108 # 构建移除列表134 # 构建移除列表
109 echo "ASCEND_PARENT_PATH: ${ASCEND_PARENT_PATH}"135 echo "ASCEND_PARENT_PATH: ${ASCEND_PARENT_PATH}"
110 local remove_patterns=("${ASCEND_PARENT_PATH}/*" '/usr/include/*' )136 local remove_patterns=("${ASCEND_PARENT_PATH}/*" '/usr/include/*' )
@@ -150,7 +176,6 @@ filter_coverage() {
150 lcov --extract "${_filtered_file}" ${extract_patterns} -o "${_filtered_file}.tmp" ${_ignore_opt}176 lcov --extract "${_filtered_file}" ${extract_patterns} -o "${_filtered_file}.tmp" ${_ignore_opt}
151 mv "${_filtered_file}.tmp" "${_filtered_file}"177 mv "${_filtered_file}.tmp" "${_filtered_file}"
152 fi178 fi
153- 
154}179}
155 180 
156# generate html report181# generate html report
@@ -171,11 +196,15 @@ generate_html() {
171 # 根据 lcov 版本选择合适的忽略错误选项196 # 根据 lcov 版本选择合适的忽略错误选项
172 local _lcov_version=$(get_lcov_version)197 local _lcov_version=$(get_lcov_version)
173 local _ignore_opt=""198 local _ignore_opt=""
174- if [[ "${_lcov_version}" =~ ^2\. ]]; then199+ if [[ -n "${_lcov_version}" ]] && version_ge "${_lcov_version}" "2.0"; then
175 _ignore_opt="--ignore-errors empty"200 _ignore_opt="--ignore-errors empty"
176 fi201 fi
177 202 
178- genhtml "${_filtered_file}" -o "${_out_path}" ${_ignore_opt}203+ if [[ ! -s "${_filtered_file}" ]]; then
204+ logging "empty coverage data"
205+ else
206+ genhtml "${_filtered_file}" -o "${_out_path}" ${_ignore_opt}
207+ fi
179}208}
180 209 
181if [[ $# -lt 3 ]]; then210if [[ $# -lt 3 ]]; then
@@ -202,6 +231,10 @@ if [[ -z "${ASCEND_PARENT_PATH}" ]]; then
202 exit 1231 exit 1
203fi232fi
204 233 
205-generate_coverage "${_src}" "${_cov_file}"234+if [ -d "${_src}" ] && [ -n "$(find "${_src}" -name "*.gcda" -print -quit 2>/dev/null)" ]; then
206-filter_coverage "${_cov_file}" "${_cov_file}_filtered" "${_ut_type}" "${_op_names}"235+ generate_coverage "${_src}" "${_cov_file}"
207-generate_html "${_cov_file}_filtered" "${_out}"236+ filter_coverage "${_cov_file}" "${_cov_file}_filtered" "${_ut_type}" "${_op_names}"
237+ generate_html "${_cov_file}_filtered" "${_out}"
238+else
239+ logging "No coverage data found"
240+fi