diff options
Diffstat (limited to 'meta')
-rw-r--r-- | meta/lib/oeqa/runtime/cases/ptest.py | 7 | ||||
-rw-r--r-- | meta/lib/oeqa/utils/logparser.py | 62 |
2 files changed, 11 insertions, 58 deletions
diff --git a/meta/lib/oeqa/runtime/cases/ptest.py b/meta/lib/oeqa/runtime/cases/ptest.py index 7d8849308d..ebef3f9eac 100644 --- a/meta/lib/oeqa/runtime/cases/ptest.py +++ b/meta/lib/oeqa/runtime/cases/ptest.py | |||
@@ -12,12 +12,7 @@ class PtestRunnerTest(OERuntimeTestCase): | |||
12 | 12 | ||
13 | # a ptest log parser | 13 | # a ptest log parser |
14 | def parse_ptest(self, logfile): | 14 | def parse_ptest(self, logfile): |
15 | parser = Lparser(test_0_pass_regex="^PASS:(.+)", | 15 | parser = Lparser() |
16 | test_0_fail_regex="^FAIL:(.+)", | ||
17 | test_0_skip_regex="^SKIP:(.+)", | ||
18 | section_0_begin_regex="^BEGIN: .*/(.+)/ptest", | ||
19 | section_0_end_regex="^END: .*/(.+)/ptest") | ||
20 | parser.init() | ||
21 | result = Result() | 16 | result = Result() |
22 | 17 | ||
23 | with open(logfile, errors='replace') as f: | 18 | with open(logfile, errors='replace') as f: |
diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py index 0670627c3c..328baeefaf 100644 --- a/meta/lib/oeqa/utils/logparser.py +++ b/meta/lib/oeqa/utils/logparser.py | |||
@@ -5,66 +5,24 @@ import os | |||
5 | import re | 5 | import re |
6 | from . import ftools | 6 | from . import ftools |
7 | 7 | ||
8 | |||
9 | # A parser that can be used to identify weather a line is a test result or a section statement. | 8 | # A parser that can be used to identify weather a line is a test result or a section statement. |
10 | class Lparser(object): | 9 | class Lparser(object): |
11 | 10 | ||
12 | def __init__(self, test_0_pass_regex, test_0_fail_regex, test_0_skip_regex, section_0_begin_regex=None, section_0_end_regex=None, **kwargs): | 11 | def __init__(self, **kwargs): |
13 | # Initialize the arguments dictionary | ||
14 | if kwargs: | ||
15 | self.args = kwargs | ||
16 | else: | ||
17 | self.args = {} | ||
18 | |||
19 | # Add the default args to the dictionary | ||
20 | self.args['test_0_pass_regex'] = test_0_pass_regex | ||
21 | self.args['test_0_fail_regex'] = test_0_fail_regex | ||
22 | self.args['test_0_skip_regex'] = test_0_skip_regex | ||
23 | if section_0_begin_regex: | ||
24 | self.args['section_0_begin_regex'] = section_0_begin_regex | ||
25 | if section_0_end_regex: | ||
26 | self.args['section_0_end_regex'] = section_0_end_regex | ||
27 | |||
28 | self.test_possible_status = ['pass', 'fail', 'error', 'skip'] | ||
29 | self.section_possible_status = ['begin', 'end'] | ||
30 | |||
31 | self.initialized = False | ||
32 | 12 | ||
33 | |||
34 | # Initialize the parser with the current configuration | ||
35 | def init(self): | ||
36 | |||
37 | # extra arguments can be added by the user to define new test and section categories. They must follow a pre-defined pattern: <type>_<category_name>_<status>_regex | ||
38 | self.test_argument_pattern = "^test_(.+?)_(%s)_regex" % '|'.join(map(str, self.test_possible_status)) | ||
39 | self.section_argument_pattern = "^section_(.+?)_(%s)_regex" % '|'.join(map(str, self.section_possible_status)) | ||
40 | |||
41 | # Initialize the test and section regex dictionaries | ||
42 | self.test_regex = {} | 13 | self.test_regex = {} |
43 | self.section_regex ={} | 14 | self.test_regex[0] = {} |
44 | 15 | self.test_regex[0]['pass'] = re.compile(r"^PASS:(.+)") | |
45 | for arg, value in self.args.items(): | 16 | self.test_regex[0]['fail'] = re.compile(r"^FAIL:(.+)") |
46 | if not value: | 17 | self.test_regex[0]['skip'] = re.compile(r"^SKIP:(.+)") |
47 | raise Exception('The value of provided argument %s is %s. Should have a valid value.' % (key, value)) | 18 | |
48 | is_test = re.search(self.test_argument_pattern, arg) | 19 | self.section_regex = {} |
49 | is_section = re.search(self.section_argument_pattern, arg) | 20 | self.section_regex[0] = {} |
50 | if is_test: | 21 | self.section_regex[0]['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") |
51 | if not is_test.group(1) in self.test_regex: | 22 | self.section_regex[0]['end'] = re.compile(r"^END: .*/(.+)/ptest") |
52 | self.test_regex[is_test.group(1)] = {} | ||
53 | self.test_regex[is_test.group(1)][is_test.group(2)] = re.compile(value) | ||
54 | elif is_section: | ||
55 | if not is_section.group(1) in self.section_regex: | ||
56 | self.section_regex[is_section.group(1)] = {} | ||
57 | self.section_regex[is_section.group(1)][is_section.group(2)] = re.compile(value) | ||
58 | else: | ||
59 | # TODO: Make these call a traceback instead of a simple exception.. | ||
60 | raise Exception("The provided argument name does not correspond to any valid type. Please give one of the following types:\nfor tests: %s\nfor sections: %s" % (self.test_argument_pattern, self.section_argument_pattern)) | ||
61 | |||
62 | self.initialized = True | ||
63 | 23 | ||
64 | # Parse a line and return a tuple containing the type of result (test/section) and its category, status and name | 24 | # Parse a line and return a tuple containing the type of result (test/section) and its category, status and name |
65 | def parse_line(self, line): | 25 | def parse_line(self, line): |
66 | if not self.initialized: | ||
67 | raise Exception("The parser is not initialized..") | ||
68 | 26 | ||
69 | for test_category, test_status_list in self.test_regex.items(): | 27 | for test_category, test_status_list in self.test_regex.items(): |
70 | for test_status, status_regex in test_status_list.items(): | 28 | for test_status, status_regex in test_status_list.items(): |