Lines Matching +full:get +full:- +full:coverage +full:- +full:files
3 # Copyright (c) 2018-2025 Intel Corporation
4 # SPDX-License-Identifier: Apache-2.0
27 """ Base class for every supported coverage tool
46 logger.error(f"Unsupported coverage tool specified: {tool}")
49 logger.debug(f"Select {tool} as the coverage tool...")
67 # Loop until the coverage data is found.
76 hex_dump = sp[1][:-1]
104 # Iteratively call gcov-tool (not gcov) to merge the files
105 merge_tool = self.gcov_tool + '-tool'
106 for d1, d2 in zip(dirs[:-1], dirs[1:], strict=False):
107 cmd = [merge_tool, 'merge', d1, d2, '--output', d2]
111 with open(f'{dirs[-1]}/tmp.gcda', 'rb') as fp:
112 return fp.read(-1).hex()
116 logger.debug(f"Generating {len(extracted_coverage_info)} gcda files")
118 # if kobject_hash is given for coverage gcovr fails
121 filename = (filename[:-4]) + "gcno"
165 with open(os.path.join(outdir, "coverage.log"), "a") as coveragelog:
170 os.path.join(outdir, "coverage", "index.html")
173 os.path.join(outdir, "coverage.info")
176 os.path.join(outdir, "coverage", "coverage.xml")
179 os.path.join(outdir, "coverage", "coverage.csv")
182 os.path.join(outdir, "coverage", "coverage.txt")
185 os.path.join(outdir, "coverage", "coverage.coveralls.json")
188 os.path.join(outdir, "coverage", "coverage.sonarqube.xml")
195 logger.debug(f"All coverage data processed: {coverage_completed}")
212 ['lcov', '--version'],
241 # The --ignore-errors source option is added for genhtml as well as
245 "--ignore-errors", "inconsistent,inconsistent",
246 "--ignore-errors", "negative,negative",
247 "--ignore-errors", "unused,unused",
248 "--ignore-errors", "empty,empty",
249 "--ignore-errors", "mismatch,mismatch",
260 # Default: --parallel=0 will autodetect appropriate parallelism
261 parallel = ["--parallel", "0"]
266 parallel = ["--parallel", str(self.jobs)]
272 "lcov", "--gcov-tool", self.gcov_tool,
273 "--rc", branch_coverage,
279 coveragefile = os.path.join(outdir, "coverage.info")
283 files = []
286 [os.path.join(dir_, "coverage.info"),
290 logger.debug("Coverage merge no files in: %s", dir_)
292 files += files_
293 logger.debug("Coverage merge %d reports in %s", len(files), outdir)
294 cmd = ["--output-file", coveragefile]
295 for filename in files:
296 cmd.append("--add-tracefile")
299 cmd = ["--capture", "--directory", outdir, "--output-file", coveragefile]
301 invalid_chars = re.compile(r"[^A-Za-z0-9_]")
302 cmd.append("--test-name")
310 cmd = ["--extract", coveragefile,
312 "--output-file", ztestfile]
318 files = []
320 cmd = ["--remove", ztestfile,
322 "--output-file", ztestfile]
328 files = [coveragefile, ztestfile]
330 files = [coveragefile]
333 cmd = ["--remove", coveragefile, i, "--output-file", coveragefile]
342 cmd = ["genhtml", "--legend", "--branch-coverage",
343 "--prefix", self.base_dir,
344 "-output-directory", os.path.join(outdir, "coverage")]
346 cmd.append("--show-details")
347 cmd += files
352 # TODO: Add LCOV summary coverage report.
364 # Different ifdef-ed implementations of the same function should not be
365 # in conflict treated by GCOVR as separate objects for coverage statistics.
366 self.options = ["-v", "--merge-mode-functions=separate"]
372 ['gcovr', '--version'],
407 excludes = Gcovr._interleave_list("-e", self.ignores)
411 excludes += ["--exclude-branches-by-pattern", merged_regex]
414 cmd = ["gcovr", "-r", self.base_dir,
415 "--gcov-ignore-parse-errors=negative_hits.warn_once_per_file",
416 "--gcov-executable", self.gcov_tool,
417 "-e", "tests/*"]
418 cmd += excludes + self.options + ["--json", "-o", coverage_file, outdir]
428 cmd = ["gcovr", "-r", self.base_dir] + self.options
429 cmd += ["--gcov-executable", self.gcov_tool,
430 "-f", "tests/ztest", "-e", "tests/ztest/test/*",
431 "--json", "-o", ztest_file, outdir]
446 coverage_file = os.path.join(outdir, "coverage.json")
452 files = []
456 [os.path.join(dir_, "coverage.json"),
460 logger.debug(f"Coverage merge no files in: {dir_}")
462 files += files_
463 logger.debug(f"Coverage merge {len(files)} reports in {outdir}")
465 cmd_ = ["--json-pretty", "--json", coverage_file]
467 ret, files = self.collect_coverage(outdir, coverage_file, ztest_file, coveragelog)
468 logger.debug(f"Coverage collected {len(files)} reports from: {outdir}")
470 if not files:
471 logger.warning(f"No coverage files to compose report for {outdir}")
474 subdir = os.path.join(outdir, "coverage")
477 tracefiles = self._interleave_list("--add-tracefile", files)
479 # Convert command line argument (comma-separated list) to gcovr flags
481 "html": ["--html", os.path.join(subdir, "index.html"), "--html-details"],
482 "xml": ["--xml", os.path.join(subdir, "coverage.xml"), "--xml-pretty"],
483 "csv": ["--csv", os.path.join(subdir, "coverage.csv")],
484 "txt": ["--txt", os.path.join(subdir, "coverage.txt")],
485 "coveralls": ["--coveralls", os.path.join(subdir, "coverage.coveralls.json"),
486 "--coveralls-pretty"],
487 "sonarqube": ["--sonarqube", os.path.join(subdir, "coverage.sonarqube.xml")]
493 cmd = ["gcovr", "-r", self.base_dir] + self.options + gcovr_options + tracefiles
495 cmd += ["--json-summary-pretty", "--json-summary", coverage_summary]
511 os.environ.get("ZEPHYR_SDK_INSTALL_DIR", default=""),
512 "x86_64-zephyr-elf/bin/x86_64-zephyr-elf-gcov")
513 if os.environ.get("ZEPHYR_TOOLCHAIN_VARIANT") == "llvm":
514 llvm_path = os.environ.get("LLVM_TOOLCHAIN_PATH")
517 llvm_cov = shutil.which("llvm-cov", path=llvm_path)
531 "Can't find a suitable gcov tool. Use --gcov-tool or set ZEPHYR_SDK_INSTALL_DIR."
560 # Ignore branch coverage on LOG_* and LOG_HEXDUMP_* macros
563 # Ignore branch coverage on __ASSERT* macros
574 """ Summary code coverage over the full test plan's scope.
590 """ Per-instance code coverage called by ProjectBuilder ('coverage' operation).