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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#!/usr/bin/python3
import re
import os
import logging
import sys
from e3.fs import mkdir, ls, find
from e3.os.process import Run
from e3.testsuite import Testsuite
from drivers import make_gnatcoll, TESTSUITE_ROOT_DIR
from drivers.basic import BasicTestDriver
class MyTestsuite(Testsuite):
tests_subdir = "tests"
test_driver_map = {
"default": BasicTestDriver,
}
default_driver = "default"
def add_options(self, parser):
parser.add_argument(
"--gcov",
help="compute testsuite coverage of gnatcoll",
default=False,
action="store_true",
)
parser.add_argument(
"--valgrind",
help="check memory usage with Valgrind (memcheck tool)",
action="store_true",
)
parser.add_argument(
"--recompile",
help="recompile production version of gnatcoll for testing",
default=None,
action="store_const",
const="PROD",
)
parser.add_argument(
"--debug",
help="recompile debug version of gnatcoll for testing",
dest="recompile",
action="store_const",
const="DEBUG",
)
def set_up(self):
super().set_up()
self.env.gcov = self.main.args.gcov
self.env.valgrind = self.main.args.valgrind
if self.main.args.gcov:
work_dir = os.path.join(TESTSUITE_ROOT_DIR, "gcov")
gpr_dir, src_dir, obj_dir = make_gnatcoll(work_dir, "DEBUG", gcov=True)
self.env.gnatcoll_gpr_dir = gpr_dir
self.env.gnatcoll_src_dir = src_dir
self.env.gnatcoll_obj_dir = obj_dir
else:
self.env.gnatcoll_gpr_dir = None
recompile_mode = self.main.args.recompile
if recompile_mode:
work_dir = os.path.join(TESTSUITE_ROOT_DIR, recompile_mode.lower())
gpr_dir, _, _ = make_gnatcoll(
work_dir, recompile_mode, gcov=False
)
self.env.gnatcoll_prod_gpr_dir = gpr_dir
if self.env.gnatcoll_gpr_dir is None:
self.env.gnatcoll_gpr_dir = gpr_dir
else:
self.env.gnatcoll_prod_gpr_dir = None
def tear_down(self):
if self.main.args.gcov:
wd = TESTSUITE_ROOT_DIR
# We need to call gcov on gcda present both in gnatcoll itself and
# tests (for generics coverage).
gcda_files = find(
os.path.join(self.env.gnatcoll_obj_dir), "*.gcda"
) + find(os.path.join(self.env.working_dir), "*.gcda")
mkdir(os.path.join(wd, "gcov", "results"))
gcr = os.path.join(wd, "gcov", "results")
Run(["gcov"] + gcda_files, cwd=os.path.join(wd, "gcov", "results"))
total_sources = 0
total_covered = 0
for source_file in ls(
os.path.join(self.env.gnatcoll_src_dir, "*", "*")
):
base_file = os.path.basename(source_file)
if not os.path.isfile(os.path.join(gcr, base_file + ".gcov")):
total = 1
covered = 0
with open(source_file) as fd:
total = len(
[
line
for line in fd
if line.strip() and not re.match(r" *--", line)
]
)
else:
with open(os.path.join(gcr, base_file + ".gcov")) as fd:
total = 0
covered = 0
for line in fd:
if re.match(r" *-:", line):
pass
elif re.match(r" *[#=]{5}:", line):
total += 1
else:
total += 1
covered += 1
total_sources += total
total_covered += covered
logging.info(
"%6.2f %% %8d/%-8d %s",
float(covered) * 100.0 / float(total),
covered,
total,
os.path.basename(source_file),
)
logging.info(
"%6.2f %% %8d/%-8d %s",
float(total_covered) * 100.0 / float(total_sources),
total_covered,
total_sources,
"TOTAL",
)
super().tear_down()
if __name__ == "__main__":
sys.exit(MyTestsuite().testsuite_main())
|