get_single_test_cov.py 7.6 KB
Newer Older
Z
zhangchunle 已提交
1
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
#
Z
zhangchunle 已提交
3 4 5
# 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
6
#
Z
zhangchunle 已提交
7
#     http://www.apache.org/licenses/LICENSE-2.0
8
#
Z
zhangchunle 已提交
9 10 11 12 13 14
# 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.

15
import json
Z
zhangchunle 已提交
16 17
import os
import re
18
import sys
Z
zhangchunle 已提交
19 20 21


def getFNDAFile(rootPath, test):
22 23 24 25 26 27 28 29 30 31 32
    # load base fnda
    fnda_base_dict = {}
    find_file_cmd = os.popen("find %s -name %s.cc" % (rootPath, test))
    if find_file_cmd.read() != "":
        print("%s is a c++ unittest" % test)
        with open(
            "%s/build/ut_map/simple_precision_test/base_fnda.json" % rootPath,
            'r',
        ) as load_f:
            fnda_base_dict = json.load(load_f)
    # analyse fnda
Z
zhangchunle 已提交
33 34 35
    filename = '%s/build/ut_map/%s/coverage.info.tmp' % (rootPath, test)
    fn_filename = '%s/build/ut_map/%s/fnda.tmp' % (rootPath, test)
    os.system('touch %s' % fn_filename)
R
risemeup1 已提交
36 37 38 39 40 41
    try:
        f = open(filename)
        print("oepn %s succesfully" % filename)
    except FileNotFoundError:
        print("%s is not found." % filename)
        return
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    all_data = f.read().split('TN:')
    del all_data[0]
    for gcov_data in all_data:
        message_list = gcov_data.split('\n')
        os.system('echo %s >> %s' % (message_list[1], fn_filename))
        if 'FNH:0' not in gcov_data:
            for message in message_list:
                if message.startswith(('FNDA:')) and (
                    not message.startswith(('FNDA:0,'))
                ):
                    tmp_data = message.split('FNDA:')[1].split(',')
                    hit = int(tmp_data[0])
                    symbol = tmp_data[1]
                    if symbol in fnda_base_dict:
                        if (hit - fnda_base_dict[symbol]) > 0:
                            fnda_str = 'FNDA:%s,%s' % (
                                str(hit - fnda_base_dict[symbol]),
                                symbol,
                            )
                            os.system('echo %s >> %s' % (fnda_str, fn_filename))
                    else:
                        os.system('echo %s >> %s' % (message, fn_filename))
Z
zhangchunle 已提交
64 65 66 67
    f.close()


def analysisFNDAFile(rootPath, test):
68 69 70 71 72
    related_ut_map_file = '%s/build/ut_map/%s/related_%s.txt' % (
        rootPath,
        test,
        test,
    )
Z
zhangchunle 已提交
73
    notrelated_ut_map_file = '%s/build/ut_map/%s/notrelated_%s.txt' % (
74 75 76 77
        rootPath,
        test,
        test,
    )
Z
zhangchunle 已提交
78 79
    os.system('touch %s' % related_ut_map_file)
    os.system('touch %s' % notrelated_ut_map_file)
R
risemeup1 已提交
80 81 82 83 84 85 86 87 88

    if os.path.isfile(related_ut_map_file) and os.path.isfile(
        notrelated_ut_map_file
    ):
        print("make related.txt and not_related.txt succesfully")
    else:
        print("make related.txt and not_related.txt failed")
        return

Z
zhangchunle 已提交
89
    fn_filename = '%s/build/ut_map/%s/fnda.tmp' % (rootPath, test)
R
risemeup1 已提交
90 91 92 93 94 95
    try:
        f = open(fn_filename)
        print("oepn %s succesfully" % fn_filename)
    except FileNotFoundError:
        print("%s is not found." % fn_filename)
        return
Z
zhangchunle 已提交
96
    data = f.read().split('SF:')
Z
zhangchunle 已提交
97
    related_file_list = []
Z
zhangchunle 已提交
98
    for message in data:
Z
zhangchunle 已提交
99 100 101 102 103 104 105 106
        message_list = message.split('\n')
        clazz_filename = message_list[0]
        if '/build/' in clazz_filename:
            clazz_filename = clazz_filename.replace('/build', '')
        if '.pb.h' in clazz_filename:
            clazz_filename = clazz_filename.replace('.pb.h', '.proto')
        if '.pb.cc' in clazz_filename:
            clazz_filename = clazz_filename.replace('.pb.cc', '.proto')
Z
zhangchunle 已提交
107
        if 'FNDA:' in message:
Z
zhangchunle 已提交
108
            OP_REGIST = True
Z
zhangchunle 已提交
109 110 111 112
            for i in range(1, len(message_list) - 1):
                fn = message_list[i]
                matchObj = re.match(
                    r'(.*)Maker(.*)|(.*)Touch(.*)Regist(.*)|(.*)Touch(.*)JitKernel(.*)|(.*)converterC2Ev(.*)',
113 114 115
                    fn,
                    re.I,
                )
116
                if matchObj is None:
Z
zhangchunle 已提交
117
                    OP_REGIST = False
Z
zhangchunle 已提交
118
                    break
119
            if not OP_REGIST:
Z
zhangchunle 已提交
120
                related_file_list.append(clazz_filename)
121 122 123
                os.system(
                    'echo %s >> %s' % (clazz_filename, related_ut_map_file)
                )
Z
zhangchunle 已提交
124
            else:
125 126 127
                os.system(
                    'echo %s >> %s' % (clazz_filename, notrelated_ut_map_file)
                )
Z
zhangchunle 已提交
128 129
        else:
            if clazz_filename != '':
130 131 132 133 134 135 136
                if (
                    clazz_filename not in related_file_list
                ):  # xx.pb.cc in RELATED xx.pb.h not in RELATED
                    os.system(
                        'echo %s >> %s'
                        % (clazz_filename, notrelated_ut_map_file)
                    )
Z
zhangchunle 已提交
137 138 139
    f.close()


140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
def getBaseFnda(rootPath, test):
    filename = '%s/build/ut_map/%s/coverage.info.tmp' % (rootPath, test)
    try:
        f = open(filename)
        print("oepn %s succesfully" % filename)
    except FileNotFoundError:
        print("%s is not found." % filename)
    symbol_fnda = {}
    all_data = f.read().split('TN:')
    del all_data[0]
    for gcov_data in all_data:
        message_list = gcov_data.split('\n')
        # only for cc file
        if ".cc" in message_list[1]:
            for message in message_list:
                if message.startswith(('FNDA:')) and (
                    not message.startswith(('FNDA:0,'))
                ):
                    tmp_data = message.split('FNDA:')[1].split(',')
                    symbol_fnda[tmp_data[1]] = int(tmp_data[0])
    f.close()

    with open("%s/build/ut_map/%s/base_fnda.json" % (rootPath, test), "w") as f:
        json.dump(symbol_fnda, f, indent=4)


Z
zhangchunle 已提交
166 167 168 169
def getCovinfo(rootPath, test):
    ut_map_path = '%s/build/ut_map/%s' % (rootPath, test)
    os.system(
        'cd %s && lcov --capture -d . -o coverage.info --rc lcov_branch_coverage=0 > /dev/null 2>&1'
170 171
        % ut_map_path
    )
R
risemeup1 已提交
172 173 174 175 176 177 178
    coverage_info_path = ut_map_path + '/coverage.info'
    file_size = os.path.getsize(coverage_info_path)
    if file_size == 0:
        print("coverage.info is empty,collect coverage rate failed")
        return
    else:
        print("get coverage.info succesfully")
Z
zhangchunle 已提交
179
    os.system(
R
risemeup1 已提交
180
        "cd %s && lcov --extract coverage.info '/paddle/paddle/phi/*' '/paddle/paddle/utils/*' '/paddle/paddle/fluid/framework/*' '/paddle/paddle/fluid/imperative/*' '/paddle/paddle/fluid/inference/*' '/paddle/paddle/fluid/memory/*' '/paddle/paddle/fluid/operators/*' '/paddle/paddle/fluid/string/*' '/paddle/paddle/fluid/distributed/*' '/paddle/paddle/fluid/platform/*' '/paddle/paddle/fluid/pybind/*' '/paddle/build/*' -o coverage.info.tmp --rc lcov_branch_coverage=0 > /dev/null 2>&1"
181 182
        % ut_map_path
    )
R
risemeup1 已提交
183 184 185 186 187 188 189 190
    coverage_info_tmp = ut_map_path + '/coverage.info.tmp'
    coverage_tmp_size = os.path.getsize(coverage_info_tmp)
    if coverage_tmp_size == 0:
        print("coverage.info.tmp is empty,collect coverage rate failed")
        return
    else:
        print("get coverage.info.tmp succesfully")

Z
zhangchunle 已提交
191 192
    os.system('rm -rf %s/paddle' % ut_map_path)
    os.system('rm -rf %s/coverage.info' % ut_map_path)
193 194 195 196 197
    if test == "simple_precision_test":
        getBaseFnda(rootPath, test)
    else:
        getFNDAFile(rootPath, test)
        analysisFNDAFile(rootPath, test)
R
risemeup1 已提交
198
    os.system('rm -rf %s/coverage.info.tmp' % ut_map_path)
Z
zhangchunle 已提交
199 200 201 202 203 204


if __name__ == "__main__":
    rootPath = sys.argv[1]
    case = sys.argv[2]
    getCovinfo(rootPath, case)