summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/runtime/cases/parselogs.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/runtime/cases/parselogs.py')
-rw-r--r--meta/lib/oeqa/runtime/cases/parselogs.py91
1 files changed, 41 insertions, 50 deletions
diff --git a/meta/lib/oeqa/runtime/cases/parselogs.py b/meta/lib/oeqa/runtime/cases/parselogs.py
index 3980582dda..a805edd79d 100644
--- a/meta/lib/oeqa/runtime/cases/parselogs.py
+++ b/meta/lib/oeqa/runtime/cases/parselogs.py
@@ -4,9 +4,9 @@
# SPDX-License-Identifier: MIT
#
+import collections
import os
-from subprocess import check_output
from shutil import rmtree
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
@@ -64,6 +64,7 @@ common_errors = [
"xf86OpenConsole: Switching VT failed",
"Failed to read LoaderConfigTimeoutOneShot variable, ignoring: Operation not supported",
"Failed to read LoaderEntryOneShot variable, ignoring: Operation not supported",
+ "invalid BAR (can't size)",
]
x86_common = [
@@ -97,16 +98,13 @@ ignore_errors = {
'default' : common_errors,
'qemux86' : [
'Failed to access perfctr msr (MSR',
- 'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
] + qemux86_common,
'qemux86-64' : qemux86_common,
'qemumips' : [
'Failed to load module "glx"',
- 'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
'cacheinfo: Failed to find cpu0 device node',
] + common_errors,
'qemumips64' : [
- 'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
'cacheinfo: Failed to find cpu0 device node',
] + common_errors,
'qemuppc' : [
@@ -218,11 +216,13 @@ class ParseLogsTest(OERuntimeTestCase):
'Ordering cycle found, skipping',
])
+ cls.errors = [s.casefold() for s in cls.errors]
+
try:
- cls.ignore_errors = ignore_errors[cls.td.get('MACHINE')]
+ cls.ignore_errors = [s.casefold() for s in ignore_errors[cls.td.get('MACHINE')]]
except KeyError:
cls.logger.info('No ignore list found for this machine, using default')
- cls.ignore_errors = ignore_errors['default']
+ cls.ignore_errors = [s.casefold() for s in ignore_errors['default']]
# Go through the log locations provided and if it's a folder
# create a list with all the .log files in it, if it's a file
@@ -263,30 +263,33 @@ class ParseLogsTest(OERuntimeTestCase):
logs = [f for f in dir_files if os.path.isfile(f)]
return logs
- # Build the grep command to be used with filters and exclusions
- def build_grepcmd(self, log):
- grepcmd = 'grep '
- grepcmd += '-Ei "'
- for error in self.errors:
- grepcmd += r'\<' + error + r'\>' + '|'
- grepcmd = grepcmd[:-1]
- grepcmd += '" ' + str(log) + " | grep -Eiv \'"
+ def get_context(self, lines, index, before=6, after=3):
+ """
+ Given a set of lines and the index of the line that is important, return
+ a number of lines surrounding that line.
+ """
+ last = len(lines)
+ start = index - before
+ end = index + after + 1
- for ignore_error in self.ignore_errors:
- ignore_error = ignore_error.replace('(', r'\(')
- ignore_error = ignore_error.replace(')', r'\)')
- ignore_error = ignore_error.replace("'", '.')
- ignore_error = ignore_error.replace('?', r'\?')
- ignore_error = ignore_error.replace('[', r'\[')
- ignore_error = ignore_error.replace(']', r'\]')
- ignore_error = ignore_error.replace('*', r'\*')
- ignore_error = ignore_error.replace('0-9', '[0-9]')
- grepcmd += ignore_error + '|'
- grepcmd = grepcmd[:-1]
- grepcmd += "\'"
+ if start < 0:
+ end -= start
+ start = 0
+ if end > last:
+ start -= end - last
+ end = last
- return grepcmd
+ return lines[start:end]
+
+ def test_get_context(self):
+ """
+ A test case for the test case.
+ """
+ lines = list(range(0,10))
+ self.assertEqual(self.get_context(lines, 0, 2, 1), [0, 1, 2, 3])
+ self.assertEqual(self.get_context(lines, 5, 2, 1), [3, 4, 5, 6])
+ self.assertEqual(self.get_context(lines, 9, 2, 1), [6, 7, 8, 9])
def parse_logs(self, logs, lines_before=10, lines_after=10):
"""
@@ -296,31 +299,19 @@ class ParseLogsTest(OERuntimeTestCase):
Returns a dictionary of log filenames to a dictionary of error lines to
the error context (controlled by @lines_before and @lines_after).
"""
- results = {}
- rez = []
- grep_output = ''
+ results = collections.defaultdict(dict)
for log in logs:
- result = None
- thegrep = self.build_grepcmd(log)
-
- try:
- result = check_output(thegrep, shell=True).decode('utf-8')
- except:
- pass
+ with open(log) as f:
+ lines = f.readlines()
- if result is not None:
- results[log] = {}
- rez = result.splitlines()
+ for i, line in enumerate(lines):
+ line = line.strip()
+ line_lower = line.casefold()
- for xrez in rez:
- try:
- cmd = ['grep', '-F', xrez, '-B', str(lines_before)]
- cmd += ['-A', str(lines_after), log]
- grep_output = check_output(cmd).decode('utf-8')
- except:
- pass
- results[log][xrez]=grep_output
+ if any(keyword in line_lower for keyword in self.errors):
+ if not any(ignore in line_lower for ignore in self.ignore_errors):
+ results[log][line] = "".join(self.get_context(lines, i, lines_before, lines_after))
return results
@@ -342,9 +333,9 @@ class ParseLogsTest(OERuntimeTestCase):
self.msg += '-----------------------\n'
for error in result[log]:
errcount += 1
- self.msg += 'Central error: ' + str(error) + '\n'
+ self.msg += 'Central error: ' + error + '\n'
self.msg += '***********************\n'
- self.msg += result[str(log)][str(error)] + '\n'
+ self.msg += result[log][error] + '\n'
self.msg += '***********************\n'
self.msg += '%s errors found in logs.' % errcount
self.assertEqual(errcount, 0, msg=self.msg)