File: test_coverage.py

package info (click to toggle)
cp2k 2025.2-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 372,052 kB
  • sloc: fortran: 963,262; ansic: 64,495; f90: 21,676; python: 14,419; sh: 11,382; xml: 2,173; makefile: 953; pascal: 845; perl: 492; cpp: 345; lisp: 297; csh: 16
file content (89 lines) | stat: -rwxr-xr-x 2,991 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python3

# author: Ole Schuett

import sys
import subprocess
from os import path
from pprint import pformat
from datetime import datetime


# ===============================================================================
def main():
    if len(sys.argv) != 3:
        print("Usage test_coverage.py <reference-file> <lcov-file>")
        sys.exit(1)

    print("Date: {:%Y-%m-%d %H:%M:%S}".format(datetime.utcnow()))

    git_rev = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"])
    print("Git Commit: {}".format(git_rev))

    ref_fn, lcov_fn = sys.argv[1:]
    content = open(lcov_fn, encoding="utf8").read()
    lines = content.split("\n")

    assert lines[2] == "=" * 80
    assert lines[-3] == "=" * 80
    assert lines[3][0] == "["

    coverage = {}
    for l in lines[4:-3]:
        assert len(l.strip()) > 0
        assert l[0] != "["
        parts = [p.strip() for p in l.split("|")]
        rate, nlines = parts[1].split()
        assert rate[-1] == "%"
        coverage[parts[0]] = (float(rate[:-1]), int(nlines))

    if not path.exists(ref_fn):
        open(ref_fn, "w", encoding="utf8").write(pformat(coverage))
        print("Summary: Wrote new reference file")
        print("Status: UNKNOWN")
        sys.exit(0)

    ref_coverage = eval(open(ref_fn, encoding="utf8").read())

    issues = 0
    new_ref_coverage = dict()
    for fn in coverage.keys():
        cov_rate, nlines = coverage[fn]
        uncov_lines = nlines * (100.0 - cov_rate) / 100.0
        if fn in ref_coverage:
            cov_rate0, nlines0 = ref_coverage[fn]
            uncov_lines0 = nlines0 * (100.0 - cov_rate0) / 100.0
            tol = max(nlines, nlines0) * 0.001  # uncov_lines has limited precision
            if uncov_lines - uncov_lines0 > tol and cov_rate < cov_rate0:
                issues += 1
                print(
                    'Coverage of file "%s" decreased from %.1f%% to %.1f%%.'
                    % (fn, cov_rate0, cov_rate)
                )
                print(
                    'Number of untests lines of file "%s" increased from %d to %d.'
                    % (fn, uncov_lines0, uncov_lines)
                )
                new_ref_coverage[fn] = (cov_rate0, nlines0)
            else:
                new_ref_coverage[fn] = (cov_rate, nlines)
        else:
            if cov_rate < 90.0:
                issues += 1
                print('New file "%s" has only %.1f%% coverage.' % (fn, cov_rate))
            else:
                new_ref_coverage[fn] = (cov_rate, nlines)

    assert "Total:" in lines[-2]
    total_coverage = float(lines[-2].split("|")[1].split("%")[0])
    print(
        "Summary: Found %d issues, total coverage is at %.1f%%."
        % (issues, total_coverage)
    )
    print("Status: " + ("OK" if (issues == 0) else "FAILED"))

    open(ref_fn, "w", encoding="utf8").write(pformat(new_ref_coverage))


# ===============================================================================
main()