已合并
fix(cov): 加强cpp覆盖率脚本以适配lcov版本差异并容忍空数据 #966
liu-wei创建于 6月10日
fix(cov): 加强cpp覆盖率脚本以适配lcov版本差异并容忍空数据 #966
已合并
共 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 版本号 |
| 23 | get_lcov_version() { | 42 | get_lcov_version() { |
| 24 | - lcov --version 2>/dev/null | grep -oP 'LCOV version \K[0-9]+\.[0-9]+' | head -1 | 43 | + 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 参数 |
| 28 | build_ignore_errors_opt() { | 47 | build_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 | else | 53 | else |
| 36 | - # lcov 1.14 and earlier | ||
| 37 | echo "--ignore-errors gcov" | 54 | echo "--ignore-errors gcov" |
| 38 | fi | 55 | 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 files | 69 | # using lcov to generate coverage for cpp files |
| 42 | generate_coverage() { | 70 | generate_coverage() { |
| 43 | local _source_dir="$1" | 71 | local _source_dir="$1" |
| @@ -70,8 +98,7 @@ generate_coverage() { | |||
| 70 | fi | 98 | 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 1 | 122 | exit 1 |
| 96 | fi | 123 | 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\. ]]; then | 128 | + 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 | fi | 129 | 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 | fi | 178 | fi |
| 153 | - | ||
| 154 | } | 179 | } |
| 155 | 180 | ||
| 156 | # generate html report | 181 | # 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\. ]]; then | 199 | + if [[ -n "${_lcov_version}" ]] && version_ge "${_lcov_version}" "2.0"; then |
| 175 | _ignore_opt="--ignore-errors empty" | 200 | _ignore_opt="--ignore-errors empty" |
| 176 | fi | 201 | 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 | ||
| 181 | if [[ $# -lt 3 ]]; then | 210 | if [[ $# -lt 3 ]]; then |
| @@ -202,6 +231,10 @@ if [[ -z "${ASCEND_PARENT_PATH}" ]]; then | |||
| 202 | exit 1 | 231 | exit 1 |
| 203 | fi | 232 | fi |
| 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 | ||