Skip to content
Permalink
Browse files

sanitycheck harness: Correct ordered regex handling

The way sanitycheck did its ordered regexes is that it would test
every regex against every line, and store the matching lines and their
regexes in an OrderedDict and check that they happened in the right
order.

That's wrong, because it disallows matching against a line that
previously appeared (and should have been ignored) in the input
stream.  The watchdog sample is the best illustration: the first boot
will (by definition) contain all the output already, but the regex has
to match against a line from the SECOND boot and not the same one it
saw earlier.

Do this the simple way: keep a counter of which regex we're trying to
apply next and increment it on a match.  This is faster too as we only
need to check one pattern per line.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
  • Loading branch information...
andyross authored and nashif committed Jun 18, 2019
1 parent 42d8936 commit 5efdd6a5252e80b40863fd1544dbea5f44d417c9
Showing with 8 additions and 17 deletions.
  1. +8 −17 scripts/sanity_chk/harness.py
@@ -28,6 +28,7 @@ def __init__(self):
self.fail_on_fault = True
self.fault = False
self.capture_coverage = False
self.next_pattern = 0

def configure(self, instance):
config = instance.test.harness_config
@@ -53,31 +54,21 @@ def configure(self, instance):
self.patterns.append(re.compile(r))

def handle(self, line):

if self.type == "one_line":
if self.pattern.search(line):
self.state = "passed"
elif self.type == "multi_line":
elif self.type == "multi_line" and self.ordered:
if (self.next_pattern < len(self.patterns) and
self.patterns[self.next_pattern].search(line)):
self.next_pattern += 1
if self.next_pattern >= len(self.patterns):
self.state = "passed"
elif self.type == "multi_line" and not self.ordered:
for i, pattern in enumerate(self.patterns):
r = self.regex[i]
if pattern.search(line) and not r in self.matches:
self.matches[r] = line

if len(self.matches) == len(self.regex):
# check ordering
if self.ordered:
ordered = True
pos = 0
for k in self.matches:
if k != self.regex[pos]:
ordered = False
pos += 1

if ordered:
self.state = "passed"
else:
self.state = "failed"
else:
self.state = "passed"

if self.fail_on_fault:

0 comments on commit 5efdd6a

Please sign in to comment.
You can’t perform that action at this time.