[Lldb-commits] [lldb] r248384 - Cleaned up results formatter options hand-off.
Todd Fiala via lldb-commits
lldb-commits at lists.llvm.org
Wed Sep 23 08:21:28 PDT 2015
Author: tfiala
Date: Wed Sep 23 10:21:28 2015
New Revision: 248384
URL: http://llvm.org/viewvc/llvm-project?rev=248384&view=rev
Log:
Cleaned up results formatter options hand-off.
* --results-formatter-options renamed to --results-formatter-option,
with short version of -O
* Multiple --results-formatter-option=OPTION can be specified. The
comma-separating mechanism has been removed.
* XunitFormatter options modified: -n and -r are now short forms of
--ignore-skip-name and --ignore-skip-reason. Those long option
names were tweaked lightly. They also can be specified multiple
times on the command line. The comma-separating, multiple-pattern-
per-option mechanism has been removed.
One can now specify:
dotest.py --results-file stdout -O-ndsym -O-nlldb-mi
for example, to ignore reporting skips for dsym-related or lldb-mi-related
tests in the xUnit report.
Modified:
lldb/trunk/test/dosep.py
lldb/trunk/test/dotest.py
lldb/trunk/test/dotest_args.py
lldb/trunk/test/test_results.py
Modified: lldb/trunk/test/dosep.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dosep.py?rev=248384&r1=248383&r2=248384&view=diff
==============================================================================
--- lldb/trunk/test/dosep.py (original)
+++ lldb/trunk/test/dosep.py Wed Sep 23 10:21:28 2015
@@ -1068,43 +1068,87 @@ def get_test_runner_strategies(num_threa
}
-def _remove_option(args, option_name, removal_count):
+def _remove_option(
+ args, long_option_name, short_option_name, takes_arg):
"""Removes option and related option arguments from args array.
+
+ This method removes all short/long options that match the given
+ arguments.
+
@param args the array of command line arguments (in/out)
- @param option_name the full command line representation of the
- option that will be removed (including '--' or '-').
- @param the count of elements to remove. A value of 1 will remove
- just the found option, while 2 will remove the option and its first
- argument.
+
+ @param long_option_name the full command line representation of the
+ long-form option that will be removed (including '--').
+
+ @param short_option_name the short version of the command line option
+ that will be removed (including '-').
+
+ @param takes_arg True if the option takes an argument.
+
"""
- try:
- index = args.index(option_name)
- # Handle the exact match case.
- del args[index:index+removal_count]
- return
- except ValueError:
- # Thanks to argparse not handling options with known arguments
- # like other options parsing libraries (see
- # https://bugs.python.org/issue9334), we need to support the
- # --results-formatter-options={second-level-arguments} (note
- # the equal sign to fool the first-level arguments parser into
- # not treating the second-level arguments as first-level
- # options). We're certainly at risk of getting this wrong
- # since now we're forced into the business of trying to figure
- # out what is an argument (although I think this
- # implementation will suffice).
- regex_string = "^" + option_name + "="
- regex = re.compile(regex_string)
+ if long_option_name is not None:
+ regex_string = "^" + long_option_name + "="
+ long_regex = re.compile(regex_string)
+ if short_option_name is not None:
+ # Short options we only match the -X and assume
+ # any arg is one command line argument jammed together.
+ # i.e. -O--abc=1 is a single argument in the args list.
+ # We don't handle -O --abc=1, as argparse doesn't handle
+ # it, either.
+ regex_string = "^" + short_option_name
+ short_regex = re.compile(regex_string)
+
+ def remove_long_internal():
+ """Removes one matching long option from args.
+ @returns True if one was found and removed; False otherwise.
+ """
+ try:
+ index = args.index(long_option_name)
+ # Handle the exact match case.
+ if takes_arg:
+ removal_count = 2
+ else:
+ removal_count = 1
+ del args[index:index+removal_count]
+ return True
+ except ValueError:
+ # Thanks to argparse not handling options with known arguments
+ # like other options parsing libraries (see
+ # https://bugs.python.org/issue9334), we need to support the
+ # --results-formatter-options={second-level-arguments} (note
+ # the equal sign to fool the first-level arguments parser into
+ # not treating the second-level arguments as first-level
+ # options). We're certainly at risk of getting this wrong
+ # since now we're forced into the business of trying to figure
+ # out what is an argument (although I think this
+ # implementation will suffice).
+ for index in range(len(args)):
+ match = long_regex.search(args[index])
+ if match:
+ del args[index]
+ return True
+ return False
+
+ def remove_short_internal():
+ """Removes one matching short option from args.
+ @returns True if one was found and removed; False otherwise.
+ """
for index in range(len(args)):
- match = regex.match(args[index])
+ match = short_regex.search(args[index])
if match:
del args[index]
- return
- print "failed to find regex '{}'".format(regex_string)
+ return True
+ return False
- # We didn't find the option but we should have.
- raise Exception("failed to find option '{}' in args '{}'".format(
- option_name, args))
+ removal_count = 0
+ while long_option_name is not None and remove_long_internal():
+ removal_count += 1
+ while short_option_name is not None and remove_short_internal():
+ removal_count += 1
+ if removal_count == 0:
+ raise Exception(
+ "failed to find at least one of '{}', '{}' in options".format(
+ long_option_name, short_option_name))
def adjust_inferior_options(dotest_argv):
@@ -1132,17 +1176,18 @@ def adjust_inferior_options(dotest_argv)
# we'll have inferiors spawn with the --results-port option and
# strip the original test runner options.
if dotest_options.results_file is not None:
- _remove_option(dotest_argv, "--results-file", 2)
+ _remove_option(dotest_argv, "--results-file", None, True)
if dotest_options.results_port is not None:
- _remove_option(dotest_argv, "--results-port", 2)
+ _remove_option(dotest_argv, "--results-port", None, True)
if dotest_options.results_formatter is not None:
- _remove_option(dotest_argv, "--results-formatter", 2)
+ _remove_option(dotest_argv, "--results-formatter", None, True)
if dotest_options.results_formatter_options is not None:
- _remove_option(dotest_argv, "--results-formatter-options", 2)
+ _remove_option(dotest_argv, "--results-formatter-option", "-O",
+ True)
# Remove test runner name if present.
if dotest_options.test_runner_name is not None:
- _remove_option(dotest_argv, "--test-runner-name", 2)
+ _remove_option(dotest_argv, "--test-runner-name", None, True)
def is_darwin_version_lower_than(target_version):
Modified: lldb/trunk/test/dotest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dotest.py?rev=248384&r1=248383&r2=248384&view=diff
==============================================================================
--- lldb/trunk/test/dotest.py (original)
+++ lldb/trunk/test/dotest.py Wed Sep 23 10:21:28 2015
@@ -1000,12 +1000,10 @@ def setupTestResults():
# Handle formatter options for the results formatter class.
formatter_arg_parser = clazz.arg_parser()
if results_formatter_options and len(results_formatter_options) > 0:
- import shlex
- split_options = shlex.split(results_formatter_options)
+ formatter_options = formatter_arg_parser.parse_args(
+ results_formatter_options)
else:
- split_options = []
-
- formatter_options = formatter_arg_parser.parse_args(split_options)
+ formatter_options = []
# Create the TestResultsFormatter given the processed options.
results_formatter_object = clazz(results_file_object, formatter_options)
Modified: lldb/trunk/test/dotest_args.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dotest_args.py?rev=248384&r1=248383&r2=248384&view=diff
==============================================================================
--- lldb/trunk/test/dotest_args.py (original)
+++ lldb/trunk/test/dotest_args.py Wed Sep 23 10:21:28 2015
@@ -172,11 +172,13 @@ def create_parser():
'test events into some kind of meaningful report, written to '
'the designated output results file-like object'))
group.add_argument(
- '--results-formatter-options',
- action='store',
- help=('Specify comma-separated options to pass to the formatter. '
- 'Use --results-formatter-options="--option1[,--option2[,...]]" '
- 'syntax. Note the "=" is critical, and don\'t use whitespace.'))
+ '--results-formatter-option',
+ '-O',
+ action='append',
+ dest='results_formatter_options',
+ help=('Specify an option to pass to the formatter. '
+ 'Use --results-formatter-option="--option1=val1" '
+ 'syntax. Note the "=" is critical, don\'t include whitespace.'))
group.add_argument(
'--event-add-entries',
action='store',
Modified: lldb/trunk/test/test_results.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_results.py?rev=248384&r1=248383&r2=248384&view=diff
==============================================================================
--- lldb/trunk/test/test_results.py (original)
+++ lldb/trunk/test/test_results.py Wed Sep 23 10:21:28 2015
@@ -538,19 +538,25 @@ class XunitFormatter(ResultsFormatter):
help=('cause unknown test events to generate '
'a python assert. Default is to ignore.'))
parser.add_argument(
- "--ignore-skip-matching-name",
- action="store",
- help=('one or more comma-separated python regex patterns, where '
+ "--ignore-skip-name",
+ "-n",
+ metavar='PATTERN',
+ action="append",
+ dest='ignore_skip_name_patterns',
+ help=('a python regex pattern, where '
'any skipped test with a test method name where regex '
'matches (via search) will be ignored for xUnit test '
- 'result purposes.'))
+ 'result purposes. Can be specified multiple times.'))
parser.add_argument(
- "--ignore-skip-matching-reason",
- action="store",
- help=('one or more comma-separated python regex patterns, where '
+ "--ignore-skip-reason",
+ "-r",
+ metavar='PATTERN',
+ action="append",
+ dest='ignore_skip_reason_patterns',
+ help=('a python regex pattern, where '
'any skipped test with a skip reason where the regex '
'matches (via search) will be ignored for xUnit test '
- 'result purposes.'))
+ 'result purposes. Can be specified multiple times.'))
parser.add_argument(
"--xpass", action="store", choices=results_mapping_choices,
default=XunitFormatter.RM_FAILURE,
@@ -564,7 +570,7 @@ class XunitFormatter(ResultsFormatter):
return parser
@staticmethod
- def _build_regex_list_from_option(option):
+ def _build_regex_list_from_patterns(patterns):
"""Builds a list of compiled regexes from option value.
@param option string containing a comma-separated list of regex
@@ -574,8 +580,8 @@ class XunitFormatter(ResultsFormatter):
patterns provided.
"""
regex_list = []
- if option is not None and len(option) > 0:
- for pattern in option.split(","):
+ if patterns is not None:
+ for pattern in patterns:
regex_list.append(re.compile(pattern))
return regex_list
@@ -591,11 +597,11 @@ class XunitFormatter(ResultsFormatter):
self.invalid_xml_re = XunitFormatter._build_illegal_xml_regex()
self.total_test_count = 0
self.ignore_skip_name_regexes = (
- XunitFormatter._build_regex_list_from_option(
- options.ignore_skip_matching_name))
+ XunitFormatter._build_regex_list_from_patterns(
+ options.ignore_skip_name_patterns))
self.ignore_skip_reason_regexes = (
- XunitFormatter._build_regex_list_from_option(
- options.ignore_skip_matching_reason))
+ XunitFormatter._build_regex_list_from_patterns(
+ options.ignore_skip_reason_patterns))
self.elements = {
"successes": [],
More information about the lldb-commits
mailing list