get_single_test_cov.py 8.7 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
Z
zhangbo9674 已提交
18
import subprocess
19
import sys
Z
zhangchunle 已提交
20 21 22


def getFNDAFile(rootPath, test):
23 24 25 26 27 28 29 30 31 32 33
    # 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 已提交
34 35 36
    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 已提交
37 38 39 40 41 42
    try:
        f = open(filename)
        print("oepn %s succesfully" % filename)
    except FileNotFoundError:
        print("%s is not found." % filename)
        return
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    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 已提交
65 66 67 68
    f.close()


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

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


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 166
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 已提交
167 168
def getCovinfo(rootPath, test):
    ut_map_path = '%s/build/ut_map/%s' % (rootPath, test)
Z
zhangbo9674 已提交
169
    print("start get fluid ===>")
170 171 172 173
    cmd_fluid = (
        'cd %s && lcov --capture -d ./paddle/fluid/ -o ./paddle/fluid/coverage_fluid.info --rc lcov_branch_coverage=0'
        % ut_map_path
    )
Z
zhangbo9674 已提交
174 175 176
    p_fluid = subprocess.Popen(cmd_fluid, shell=True, stdout=subprocess.DEVNULL)

    print("start get phi ===>")
177 178 179 180
    cmd_phi = (
        'cd %s && lcov --capture -d ./paddle/phi -o ./paddle/phi/coverage_phi.info --rc lcov_branch_coverage=0'
        % ut_map_path
    )
Z
zhangbo9674 已提交
181 182 183
    p_phi = subprocess.Popen(cmd_phi, shell=True, stdout=subprocess.DEVNULL)

    print("start get utils ===>")
184 185 186 187
    cmd_utils = (
        'cd %s && lcov --capture -d ./paddle/utils -o ./paddle/utils/coverage_utils.info --rc lcov_branch_coverage=0'
        % ut_map_path
    )
Z
zhangbo9674 已提交
188 189
    p_utils = subprocess.Popen(cmd_utils, shell=True, stdout=subprocess.DEVNULL)

190
    print("start wait fluid ===>")
Z
zhangbo9674 已提交
191
    p_fluid.wait()
192
    print("start wait phi ===>")
Z
zhangbo9674 已提交
193
    p_phi.wait()
194
    print("start wait utils ===>")
Z
zhangbo9674 已提交
195 196
    p_utils.wait()
    print("end wait...")
Z
zhangchunle 已提交
197
    os.system(
Z
zhangbo9674 已提交
198
        'cd %s && lcov -a paddle/fluid/coverage_fluid.info -a paddle/phi/coverage_phi.info -a paddle/utils/coverage_utils.info -o coverage.info --rc lcov_branch_coverage=0 > /dev/null 2>&1'
199 200
        % ut_map_path
    )
R
risemeup1 已提交
201 202 203 204 205 206 207
    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 已提交
208
    os.system(
R
risemeup1 已提交
209
        "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"
210 211
        % ut_map_path
    )
R
risemeup1 已提交
212 213 214 215 216 217 218 219
    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 已提交
220 221
    os.system('rm -rf %s/paddle' % ut_map_path)
    os.system('rm -rf %s/coverage.info' % ut_map_path)
222 223 224 225 226
    if test == "simple_precision_test":
        getBaseFnda(rootPath, test)
    else:
        getFNDAFile(rootPath, test)
        analysisFNDAFile(rootPath, test)
R
risemeup1 已提交
227
    os.system('rm -rf %s/coverage.info.tmp' % ut_map_path)
Z
zhangchunle 已提交
228 229 230 231 232 233


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