subunit: Update to latest upstream version.
[samba.git] / lib / subunit / filters / subunit-filter
index 7f5620f151d0bae68d5424dd99b1f6f344ca2772..6a1ecc9a010118915403a70bcb923abf66d4d189 100755 (executable)
@@ -36,41 +36,59 @@ from subunit import (
     TestProtocolClient,
     read_test_list,
     )
-from subunit.test_results import TestResultFilter
-
-parser = OptionParser(description=__doc__)
-parser.add_option("--error", action="store_false",
-    help="include errors", default=False, dest="error")
-parser.add_option("-e", "--no-error", action="store_true",
-    help="exclude errors", dest="error")
-parser.add_option("--failure", action="store_false",
-    help="include failures", default=False, dest="failure")
-parser.add_option("-f", "--no-failure", action="store_true",
-    help="exclude failures", dest="failure")
-parser.add_option("--passthrough", action="store_false",
-    help="Show all non subunit input.", default=False, dest="no_passthrough")
-parser.add_option("--no-passthrough", action="store_true",
-    help="Hide all non subunit input.", default=False, dest="no_passthrough")
-parser.add_option("-s", "--success", action="store_false",
-    help="include successes", dest="success")
-parser.add_option("--no-success", action="store_true",
-    help="exclude successes", default=True, dest="success")
-parser.add_option("--no-skip", action="store_true",
-    help="exclude skips", dest="skip")
-parser.add_option("--xfail", action="store_false",
-    help="include expected falures", default=True, dest="xfail")
-parser.add_option("--no-xfail", action="store_true",
-    help="exclude expected falures", default=True, dest="xfail")
-parser.add_option("-m", "--with", type=str,
-    help="regexp to include (case-sensitive by default)",
-    action="append", dest="with_regexps")
-parser.add_option("--fixup-expected-failures", type=str,
-    help="File with list of test ids that are expected to fail; on failure "
-         "their result will be changed to xfail; on success they will be "
-         "changed to error.", dest="fixup_expected_failures", action="append")
-parser.add_option("--without", type=str,
-    help="regexp to exclude (case-sensitive by default)",
-    action="append", dest="without_regexps")
+from subunit.filters import filter_by_result
+from subunit.test_results import (
+    and_predicates,
+    make_tag_filter,
+    TestResultFilter,
+    )
+
+
+def make_options(description):
+    parser = OptionParser(description=__doc__)
+    parser.add_option("--error", action="store_false",
+        help="include errors", default=False, dest="error")
+    parser.add_option("-e", "--no-error", action="store_true",
+        help="exclude errors", dest="error")
+    parser.add_option("--failure", action="store_false",
+        help="include failures", default=False, dest="failure")
+    parser.add_option("-f", "--no-failure", action="store_true",
+        help="exclude failures", dest="failure")
+    parser.add_option("--passthrough", action="store_false",
+        help="Show all non subunit input.", default=False, dest="no_passthrough")
+    parser.add_option("--no-passthrough", action="store_true",
+        help="Hide all non subunit input.", default=False, dest="no_passthrough")
+    parser.add_option("-s", "--success", action="store_false",
+        help="include successes", dest="success")
+    parser.add_option("--no-success", action="store_true",
+        help="exclude successes", default=True, dest="success")
+    parser.add_option("--no-skip", action="store_true",
+        help="exclude skips", dest="skip")
+    parser.add_option("--xfail", action="store_false",
+        help="include expected falures", default=True, dest="xfail")
+    parser.add_option("--no-xfail", action="store_true",
+        help="exclude expected falures", default=True, dest="xfail")
+    parser.add_option(
+        "--with-tag", type=str,
+        help="include tests with these tags", action="append", dest="with_tags")
+    parser.add_option(
+        "--without-tag", type=str,
+        help="exclude tests with these tags", action="append", dest="without_tags")
+    parser.add_option("-m", "--with", type=str,
+        help="regexp to include (case-sensitive by default)",
+        action="append", dest="with_regexps")
+    parser.add_option("--fixup-expected-failures", type=str,
+        help="File with list of test ids that are expected to fail; on failure "
+             "their result will be changed to xfail; on success they will be "
+             "changed to error.", dest="fixup_expected_failures", action="append")
+    parser.add_option("--without", type=str,
+        help="regexp to exclude (case-sensitive by default)",
+        action="append", dest="without_regexps")
+    parser.add_option("-F", "--only-genuine-failures", action="callback",
+        callback=only_genuine_failures_callback,
+        help="Only pass through failures and exceptions.")
+    return parser
+
 
 def only_genuine_failures_callback(option, opt, value, parser):
     parser.rargs.insert(0, '--no-passthrough')
@@ -78,11 +96,6 @@ def only_genuine_failures_callback(option, opt, value, parser):
     parser.rargs.insert(0, '--no-skip')
     parser.rargs.insert(0, '--no-success')
 
-parser.add_option("-F", "--only-genuine-failures", action="callback",
-    callback=only_genuine_failures_callback,
-    help="Only pass through failures and exceptions.")
-
-(options, args) = parser.parse_args()
 
 def _compile_re_from_list(l):
     return re.compile("|".join(l), re.MULTILINE)
@@ -97,7 +110,7 @@ def _make_regexp_filter(with_regexps, without_regexps):
     with_re = with_regexps and _compile_re_from_list(with_regexps)
     without_re = without_regexps and _compile_re_from_list(without_regexps)
 
-    def check_regexps(test, outcome, err, details):
+    def check_regexps(test, outcome, err, details, tags):
         """Check if this test and error match the regexp filters."""
         test_str = str(test) + outcome + str(err) + str(details)
         if with_re and not with_re.search(test_str):
@@ -108,21 +121,38 @@ def _make_regexp_filter(with_regexps, without_regexps):
     return check_regexps
 
 
-regexp_filter = _make_regexp_filter(options.with_regexps,
-        options.without_regexps)
-fixup_expected_failures = set()
-for path in options.fixup_expected_failures or ():
-    fixup_expected_failures.update(read_test_list(path))
-result = TestProtocolClient(sys.stdout)
-result = TestResultFilter(result, filter_error=options.error,
-    filter_failure=options.failure, filter_success=options.success,
-    filter_skip=options.skip, filter_xfail=options.xfail,
-    filter_predicate=regexp_filter,
-    fixup_expected_failures=fixup_expected_failures)
-if options.no_passthrough:
-    passthrough_stream = DiscardStream()
-else:
-    passthrough_stream = None
-test = ProtocolTestCase(sys.stdin, passthrough=passthrough_stream)
-test.run(result)
-sys.exit(0)
+def _make_result(output, options, predicate):
+    """Make the result that we'll send the test outcomes to."""
+    fixup_expected_failures = set()
+    for path in options.fixup_expected_failures or ():
+        fixup_expected_failures.update(read_test_list(path))
+    return TestResultFilter(
+        TestProtocolClient(output),
+        filter_error=options.error,
+        filter_failure=options.failure,
+        filter_success=options.success,
+        filter_skip=options.skip,
+        filter_xfail=options.xfail,
+        filter_predicate=predicate,
+        fixup_expected_failures=fixup_expected_failures)
+
+
+def main():
+    parser = make_options(__doc__)
+    (options, args) = parser.parse_args()
+
+    regexp_filter = _make_regexp_filter(
+        options.with_regexps, options.without_regexps)
+    tag_filter = make_tag_filter(options.with_tags, options.without_tags)
+    filter_predicate = and_predicates([regexp_filter, tag_filter])
+
+    filter_by_result(
+        lambda output_to: _make_result(sys.stdout, options, filter_predicate),
+        output_path=None,
+        passthrough=(not options.no_passthrough),
+        forward=False)
+    sys.exit(0)
+
+
+if __name__ == '__main__':
+    main()