sanitycheck: Handle data over UART from gcov

Make sure we capture data from gcov and do not timeout before all the
data has been captured. Also report on incomplete data capture.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
Anas Nashif 2019-01-25 09:37:38 -05:00
commit f29087ee1b
2 changed files with 58 additions and 32 deletions

View file

@ -2,6 +2,17 @@ import re
from collections import OrderedDict
class Harness:
GCOV_START = "GCOV_COVERAGE_DUMP_START"
GCOV_END = "GCOV_COVERAGE_DUMP_END"
FAULTS = [
"Unknown Fatal Error",
"MPU FAULT",
"Kernel Panic",
"Kernel OOPS",
"BUS FAULT",
"CPU Page Fault"
]
def __init__(self):
self.state = None
self.type = None
@ -13,6 +24,7 @@ class Harness:
self.id = None
self.fail_on_fault = True
self.fault = False
self.capture_coverage = False
def configure(self, instance):
config = instance.test.harness_config
@ -41,33 +53,35 @@ class Console(Harness):
if len(self.matches) == len(self.regex):
# check ordering
if not self.ordered:
self.state = "passed"
return
ordered = True
pos = 0
for k,v in self.matches.items():
if k != self.regex[pos]:
ordered = False
pos += 1
if self.ordered:
ordered = True
pos = 0
for k,v in self.matches.items():
if k != self.regex[pos]:
ordered = False
pos += 1
if ordered:
self.state = "passed"
if ordered:
self.state = "passed"
else:
self.state = "failed"
else:
self.state = "failed"
self.state = "passed"
if self.fail_on_fault:
for fault in self.FAULTS:
if fault in line:
self.fault = True
if self.GCOV_START in line:
self.capture_coverage = True
elif self.GCOV_END in line:
self.capture_coverage = False
class Test(Harness):
RUN_PASSED = "PROJECT EXECUTION SUCCESSFUL"
RUN_FAILED = "PROJECT EXECUTION FAILED"
faults = [
"Unknown Fatal Error",
"MPU FAULT",
"Kernel Panic",
"Kernel OOPS",
"BUS FAULT",
"CPU Page Fault"
]
def handle(self, line):
result = re.compile("(PASS|FAIL|SKIP) - (test_)?(.*)")
@ -86,7 +100,11 @@ class Test(Harness):
self.state = "failed"
if self.fail_on_fault:
for fault in self.faults:
for fault in self.FAULTS:
if fault in line:
self.fault = True
if self.GCOV_START in line:
self.capture_coverage = True
elif self.GCOV_END in line:
self.capture_coverage = False

View file

@ -601,12 +601,11 @@ class QEMUHandler(Handler):
# if we get some state, that means test is doing well, we reset
# the timeout and wait for 2 more seconds just in case we have
# crashed after test has completed
if harness.type:
break
else:
if not timeout_extended:
timeout_extended= True
if not timeout_extended or harness.capture_coverage:
timeout_extended= True
if harness.capture_coverage:
timeout_time = time.time() + 10
else:
timeout_time = time.time() + 2
# TODO: Add support for getting numerical performance data
@ -2787,18 +2786,19 @@ def size_report(sc):
(sc.rom_size, sc.ram_size))
info("")
def retrieve_data(intput_file):
def retrieve_gcov_data(intput_file):
if VERBOSE:
print("Working on %s" %intput_file)
extracted_coverage_info = {}
capture_data = False
capture_complete = False
with open(intput_file, 'r') as fp:
for line in fp.readlines():
if re.search("GCOV_COVERAGE_DUMP_START", line):
capture_data = True
continue
if re.search("GCOV_COVERAGE_DUMP_END", line):
capture_data = True
capture_complete = True
break
# Loop until the coverage data is found.
if not capture_data:
@ -2815,7 +2815,9 @@ def retrieve_data(intput_file):
else:
continue
extracted_coverage_info.update({file_name:hex_dump})
return extracted_coverage_info
if not capture_data:
capture_complete = True
return {'complete': capture_complete, 'data': extracted_coverage_info}
def create_gcda_files(extracted_coverage_info):
if VERBOSE:
@ -2837,8 +2839,14 @@ def create_gcda_files(extracted_coverage_info):
def generate_coverage(outdir, ignores):
for filename in glob.glob("%s/**/handler.log" %outdir, recursive=True):
extracted_coverage_info = retrieve_data(filename)
create_gcda_files(extracted_coverage_info)
gcov_data = retrieve_gcov_data(filename)
capture_complete = gcov_data['complete']
extracted_coverage_info = gcov_data['data']
if capture_complete:
create_gcda_files(extracted_coverage_info)
verbose("Gcov data captured: {}".format(filename))
else:
error("Gcov data capture incomplete: {}".format(filename))
gcov_tool = options.gcov_tool