blob: efc8be9e1b850e86a1b2266d74620c431ac58d7c [file] [log] [blame]
Paul Sokolovsky2512ec52022-03-04 00:15:39 +03001__copyright__ = """
2/*
Xinyu Zhangebc400c2022-09-14 11:58:58 +08003 * Copyright (c) 2018-2022, Arm Limited. All rights reserved.
Paul Sokolovsky2512ec52022-03-04 00:15:39 +03004 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 */
8 """
9
10"""
11Module with helper functions for code coverage reports.
12"""
13
14import os
15import subprocess
16
17from lava_helper import test_lava_dispatch_credentials
18
19
20def run(cmd, cwd=None):
21 print("+ %s" % cmd, flush=True)
22 subprocess.check_call(cmd, shell=True, cwd=cwd)
23
24
Paul Sokolovskyc2d6d882022-02-25 19:11:18 +030025def extract_trace_data(lava_log_fname, job_dir):
26 last_fname = None
27 f_out = None
28 with open(lava_log_fname) as f_in:
29 for l in f_in:
30 if l.startswith("covtrace-"):
31 fname, l = l.split(" ", 1)
32 if fname != last_fname:
33 if f_out:
34 f_out.close()
35 f_out = open(job_dir + "/" + fname, "w")
36 last_fname = fname
37 f_out.write(l)
38
39
Paul Sokolovsky2512ec52022-03-04 00:15:39 +030040def coverage_reports(jobs, user_args):
41 lava = test_lava_dispatch_credentials(user_args)
42 for job_id, info in jobs.items():
43 job_dir = info["job_dir"]
44 metadata = info["metadata"]
45
46 if os.getenv("CODE_COVERAGE_EN") == "TRUE" and info["device_type"] == "fvp":
47
48 def dl_artifact(fname):
49 lava.fetch_file(
50 metadata["build_job_url"] + "artifact/trusted-firmware-m/build/bin/" + fname,
51 os.path.join(job_dir, fname)
52 )
53
54 dl_artifact("bl2.axf")
55 dl_artifact("tfm_s.axf")
56 dl_artifact("tfm_ns.axf")
57 run("python3 $SHARE_FOLDER/qa-tools/coverage-tool/coverage-reporting/intermediate_layer.py --config-json $SHARE_FOLDER/tf-m-ci-scripts/lava_helper/trace2covjson.json --local-workspace $SHARE_FOLDER", cwd=job_dir)
58 run("python3 $SHARE_FOLDER/qa-tools/coverage-tool/coverage-reporting/generate_info_file.py --workspace $SHARE_FOLDER --json covjson.json", cwd=job_dir)
Paul Sokolovsky375c9db2022-12-27 23:50:39 +030059 # Remove sources, coverage of which we're not interested in (e.g.
60 # 3rd party code).
61 run(
62 "lcov %s -rc lcov_branch_coverage=1 -r coverage.info "
63 "'*/trusted-firmware-m/platform/*' '*/trusted-firmware-m/lib/ext/*' "
64 "'*/tf-m-tests/*' '*/mbedtls/*' '*/mcuboot/*' '*/psa-arch-tests/*' "
65 "'*/QCBOR/*' -o coverage.info.tmp" % os.getenv("LCOV_FLAGS", ""),
66 cwd=job_dir
67 )
Paul Sokolovsky9b881e12022-07-12 15:34:05 +030068 run("mv coverage.info.tmp coverage.info", cwd=job_dir)
Paul Sokolovsky55dffeb2022-04-30 10:58:03 +030069 run("genhtml --branch-coverage coverage.info --output-directory trace_report | grep -v -E '^Processing file '", cwd=job_dir)