summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@jelmer.uk>2018-03-24 12:28:59 +0000
committerJelmer Vernooij <jelmer@jelmer.uk>2018-03-24 14:22:02 +0000
commitbb00b29f4778650bc484912f6198f19832b1b1ac (patch)
tree9ce9503d65ca863d9dd4dcd91d1ab72beb9fda9e
parent9a80eb9adba9d5e43776658801e2fe1ccdb04f5c (diff)
downloadsubunit-git-bb00b29f4778650bc484912f6198f19832b1b1ac.tar.gz
Add support for parsing in a regex to apply to test ids.
Bug: pad.lv/1758522
-rw-r--r--NEWS6
-rwxr-xr-xfilters/subunit-filter14
-rw-r--r--python/subunit/test_results.py17
-rw-r--r--python/subunit/tests/test_subunit_filter.py16
4 files changed, 51 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 7f5b735..393ce8d 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,12 @@ NEXT (In development)
1.3.0
-----
+IMPROVEMENTS
+~~~~~~~~~~~~
+
+* Add a --rename flag to subunit-filter.
+ (Jelmer Vernooij, #1758522)
+
BUGFIXES
~~~~~~~~
diff --git a/filters/subunit-filter b/filters/subunit-filter
index ef4afd9..7314531 100755
--- a/filters/subunit-filter
+++ b/filters/subunit-filter
@@ -91,6 +91,9 @@ def make_options(description):
parser.add_option("-F", "--only-genuine-failures", action="callback",
callback=only_genuine_failures_callback,
help="Only pass through failures and exceptions.")
+ parser.add_option("--rename", action="append", nargs=2,
+ help="Apply specified regex subsitutions to test names.",
+ dest="renames", default=[])
return parser
@@ -125,6 +128,14 @@ def _make_regexp_filter(with_regexps, without_regexps):
return check_regexps
+def _compile_rename(patterns):
+ def rename(name):
+ for (from_pattern, to_pattern) in patterns:
+ name = re.sub(from_pattern, to_pattern, name)
+ return name
+ return rename
+
+
def _make_result(output, options, predicate):
"""Make the result that we'll send the test outcomes to."""
fixup_expected_failures = set()
@@ -139,7 +150,8 @@ def _make_result(output, options, predicate):
filter_skip=options.skip,
filter_xfail=options.xfail,
filter_predicate=predicate,
- fixup_expected_failures=fixup_expected_failures))
+ fixup_expected_failures=fixup_expected_failures,
+ rename=_compile_rename(options.renames)))
def main():
diff --git a/python/subunit/test_results.py b/python/subunit/test_results.py
index b3ca968..53c3dad 100644
--- a/python/subunit/test_results.py
+++ b/python/subunit/test_results.py
@@ -25,6 +25,7 @@ from testtools.content import (
TracebackContent,
)
from testtools import StreamResult
+from testtools.testcase import PlaceHolder
from subunit import iso8601
import subunit
@@ -450,7 +451,8 @@ class TestResultFilter(TestResultDecorator):
def __init__(self, result, filter_error=False, filter_failure=False,
filter_success=True, filter_skip=False, filter_xfail=False,
- filter_predicate=None, fixup_expected_failures=None):
+ filter_predicate=None, fixup_expected_failures=None,
+ rename=None):
"""Create a FilterResult object filtering to result.
:param filter_error: Filter out errors.
@@ -467,6 +469,7 @@ class TestResultFilter(TestResultDecorator):
parameter for efficiency.
:param fixup_expected_failures: Set of test ids to consider known
failing.
+ :param rename: Optional function to rename test ids
"""
predicates = []
if filter_error:
@@ -500,8 +503,10 @@ class TestResultFilter(TestResultDecorator):
self._fixup_expected_failures = frozenset()
else:
self._fixup_expected_failures = fixup_expected_failures
+ self._rename_fn = rename
def addError(self, test, err=None, details=None):
+ test = self._apply_renames(test)
if self._failure_expected(test):
self.addExpectedFailure(test, err=err, details=details)
else:
@@ -509,6 +514,7 @@ class TestResultFilter(TestResultDecorator):
test, err=err, details=details)
def addFailure(self, test, err=None, details=None):
+ test = self._apply_renames(test)
if self._failure_expected(test):
self.addExpectedFailure(test, err=err, details=details)
else:
@@ -516,6 +522,7 @@ class TestResultFilter(TestResultDecorator):
test, err=err, details=details)
def addSuccess(self, test, details=None):
+ test = self._apply_renames(test)
if self._failure_expected(test):
self.addUnexpectedSuccess(test, details=details)
else:
@@ -524,6 +531,14 @@ class TestResultFilter(TestResultDecorator):
def _failure_expected(self, test):
return (test.id() in self._fixup_expected_failures)
+ def _apply_renames(self, test):
+ if self._rename_fn is None:
+ return test
+ new_id = self._rename_fn(test.id())
+ # TODO(jelmer): Isn't there a cleaner way of doing this?
+ setattr(test, "id", lambda: new_id)
+ return test
+
class TestIdPrintingResult(testtools.TestResult):
"""Print test ids to a stream.
diff --git a/python/subunit/tests/test_subunit_filter.py b/python/subunit/tests/test_subunit_filter.py
index 5f34b3b..95aea36 100644
--- a/python/subunit/tests/test_subunit_filter.py
+++ b/python/subunit/tests/test_subunit_filter.py
@@ -280,6 +280,22 @@ xfail todo
('addSkip', foo, {}),
('stopTest', foo), ], result._events)
+ def test_renames(self):
+ def rename(name):
+ return name + " - renamed"
+ result = ExtendedTestResult()
+ result_filter = TestResultFilter(
+ result, filter_success=False, rename=rename)
+ input_stream = _b(
+ "test: foo\n"
+ "successful: foo\n")
+ self.run_tests(result_filter, input_stream)
+ self.assertEquals(
+ [('startTest', 'foo - renamed'),
+ ('addSuccess', 'foo - renamed'),
+ ('stopTest', 'foo - renamed')],
+ [(ev[0], ev[1].id()) for ev in result._events])
+
if sys.version_info < (2, 7):
# These tests require Python >=2.7.
del test_fixup_expected_failures, test_fixup_expected_errors, test_fixup_unexpected_success