#!/usr/bin/env bash # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -xe PADDLE_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}")/../../" && pwd )" function lcov_init(){ # install lcov if [ ! -f "/root/.cache/lcov-1.14.tar.gz" ];then wget -P /home https://paddle-ci.gz.bcebos.com/coverage/lcov-1.14.tar.gz --no-proxy --no-check-certificate || exit 101 cp /home/lcov-1.14.tar.gz /root/.cache/lcov-1.14.tar.gz else cp /root/.cache/lcov-1.14.tar.gz /home/lcov-1.14.tar.gz fi tar -xf /home/lcov-1.14.tar.gz -C / cd /lcov-1.14 make install } function gen_cpp_covinfo(){ # run paddle coverage cd /paddle/build python3.7 ${PADDLE_ROOT}/tools/coverage/gcda_clean.py ${GIT_PR_ID} || exit 101 lcov --capture -d ./ -o coverage.info --rc lcov_branch_coverage=0 } # full html report function gen_full_html_report() { lcov --extract coverage.info \ '/paddle/paddle/fluid/framework/*' \ '/paddle/paddle/fluid/imperative/*' \ '/paddle/paddle/fluid/inference/*' \ '/paddle/paddle/fluid/memory/*' \ '/paddle/paddle/fluid/operators/*' \ '/paddle/paddle/fluid/recordio/*' \ '/paddle/paddle/fluid/string/*' \ '/paddle/paddle/fluid/eager/*' \ '/paddle/paddle/phi/*' \ '/paddle/paddle/utils/*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info lcov --remove coverage-full.info \ '/paddle/paddle/fluid/framework/*_test*' \ '/paddle/paddle/fluid/*/*test*' \ '/paddle/paddle/fluid/*/*/*test*' \ '/paddle/paddle/fluid/inference/tests/*' \ '/paddle/paddle/fluid/inference/api/demo_ci/*' \ '/paddle/paddle/fluid/eager/tests/*' \ '/paddle/paddle/phi/tests/*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info } function gen_full_html_report_xpu() { lcov --extract coverage.info \ '/paddle/paddle/fluid/operators/*xpu*' \ '/paddle/paddle/phi/kernels/xpu/*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info lcov --remove coverage-full.info \ '/paddle/paddle/fluid/framework/*_test*' \ '/paddle/paddle/fluid/*/*test*' \ '/paddle/paddle/fluid/*/*/*test*' \ '/paddle/paddle/fluid/inference/tests/*' \ '/paddle/paddle/fluid/inference/api/demo_ci/*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info } function gen_full_html_report_npu() { lcov --extract coverage.info \ '/paddle/paddle/fluid/operators/*npu*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info lcov --remove coverage-full.info \ '/paddle/paddle/fluid/framework/*_test*' \ '/paddle/paddle/fluid/*/*test*' \ '/paddle/paddle/fluid/*/*/*test*' \ '/paddle/paddle/fluid/inference/tests/*' \ '/paddle/paddle/fluid/inference/api/demo_ci/*' \ -o coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f coverage-full.tmp coverage-full.info } # if [ ${WITH_XPU:-OFF} == "ON" ]; then # gen_full_html_report_xpu || true # elif [ ${WITH_ASCEND_CL:-OFF} == "ON" ]; then # gen_full_html_report_npu || true # else # gen_full_html_report || true # fi # diff html report function gen_diff_html_report() { if [ "${GIT_PR_ID}" != "" ]; then COVERAGE_DIFF_PATTERN="`python3.7 ${PADDLE_ROOT}/tools/coverage/pull_request.py files ${GIT_PR_ID}`" python3.7 ${PADDLE_ROOT}/tools/coverage/pull_request.py diff ${GIT_PR_ID} > git-diff.out fi lcov --extract coverage-full.info \ ${COVERAGE_DIFF_PATTERN} \ -o coverage-diff.info \ --rc lcov_branch_coverage=0 python3.7 ${PADDLE_ROOT}/tools/coverage/coverage_diff.py coverage-diff.info git-diff.out > coverage-diff.tmp mv -f coverage-diff.tmp coverage-diff.info genhtml -o coverage-diff -t 'Diff Coverage' --no-function-coverage --no-branch-coverage coverage-diff.info } # gen_diff_html_report || true function gen_py_covinfo(){ # python coverage export COVERAGE_FILE=/paddle/build/python-coverage.data coverage combine `$(ls python-coverage.data.*)` || NO_PYTHON_COVERAGE_DATA=1 `$(coverage xml -i -o python-coverage.xml)` || [[ "${NO_PYTHON_COVERAGE_DATA}" == "1" ]] sed -i 's/mnt\/paddle/paddle/g' python-coverage.xml `$(python ${PADDLE_ROOT}/tools/coverage/python_coverage.py > python-coverage.info)` || [[ "${NO_PYTHON_COVERAGE_DATA}" == "1" ]] } # python full html report # function gen_python_full_html_report() { lcov --extract python-coverage.info \ '/paddle/python/*' \ -o python-coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f python-coverage-full.tmp python-coverage-full.info lcov --remove python-coverage-full.info \ '/*/tests/*' \ -o python-coverage-full.tmp \ --rc lcov_branch_coverage=0 mv -f python-coverage-full.tmp python-coverage-full.info } # gen_python_full_html_report || true # python diff html report function gen_python_diff_html_report() { if [ "${GIT_PR_ID}" != "" ]; then COVERAGE_DIFF_PATTERN="`python3.7 ${PADDLE_ROOT}/tools/coverage/pull_request.py files ${GIT_PR_ID}`" python3.7 ${PADDLE_ROOT}/tools/coverage/pull_request.py diff ${GIT_PR_ID} > python-git-diff.out fi lcov --extract python-coverage-full.info \ ${COVERAGE_DIFF_PATTERN} \ -o python-coverage-diff.info \ --rc lcov_branch_coverage=0 python3.7 ${PADDLE_ROOT}/tools/coverage/coverage_diff.py python-coverage-diff.info python-git-diff.out > python-coverage-diff.tmp mv -f python-coverage-diff.tmp python-coverage-diff.info genhtml -o python-coverage-diff \ -t 'Python Diff Coverage' \ --no-function-coverage \ --no-branch-coverage \ --ignore-errors source \ python-coverage-diff.info } # gen_python_diff_html_report || true # assert coverage lines function covinfo_combine_full(){ if [ -f "other-coverage.info" ];then if [ -f "infer-coverage.info" ];then lcov -a other-coverage.info -a infer-coverage.info -o coverage.info else mv other-coverage.info coverage.info fi elif [ -f "infer-coverage.info" ];then mv infer-coverage.info coverage.info else echo "Cannot found coverage.info" fi if [ -f "other-python-coverage-full.info" ];then if [ -f "infer-python-coverage-full.info" ];then lcov -a other-python-coverage-full.info -a infer-python-coverage-full.info -o python-coverage-full.info else mv other-python-coverage-full.info python-coverage-full.info fi elif [ -f "infer-coverage.info" ];then mv infer-python-coverage-full.info python-coverage-full.info else echo "Cannot found python coverage.info" fi } function cov_rate_judge(){ echo "Assert CPP Diff Coverage" python3.7 ${PADDLE_ROOT}/tools/coverage/coverage_lines.py coverage-diff.info 0.9 || COVERAGE_LINES_ASSERT=1 echo "Assert Python Diff Coverage" if [ ${WITH_XPU:-OFF} == "ON" ]; then echo "XPU has no python coverage!" elif [ ${WITH_ASCEND_CL:-OFF} == "ON" ]; then echo "NPU has no python coverage!" else if [[ python-coverage-diff.info ]];then python3.7 ${PADDLE_ROOT}/tools/coverage/coverage_lines.py python-coverage-diff.info 0.9 || PYTHON_COVERAGE_LINES_ASSERT=1 fi fi if [ "$COVERAGE_LINES_ASSERT" = "1" ] || [ "$PYTHON_COVERAGE_LINES_ASSERT" = "1" ]; then echo "exit 9" > /tmp/paddle_coverage.result exit 9 fi } function print_usage() { echo -e "\n${RED}Usage${NONE}: ${BOLD}${SCRIPT_NAME}${NONE} [OPTION]" echo -e "\n${RED}Options${NONE}: ${BLUE}gen_cov_info${NONE}: generate coverage info ${BLUE}test${NONE}: coverage info combine " } function main () { local CMD=$1 lcov_init case $CMD in gen_cov_info) gen_cpp_covinfo gen_py_covinfo ;; combine_cov_info) covinfo_combine_full gen_diff_html_report gen_python_diff_html_report cov_rate_judge ;; *) print_usage exit 1 ;; esac } main $@