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:
parent
ef77e71184
commit
f29087ee1b
2 changed files with 58 additions and 32 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue