Bug 1289444 - Forward extra arguments in |mach test| to the underlying test commands, r?chmanchester draft
authorAndrew Halberstadt <ahalberstadt@mozilla.com>
Tue, 29 Aug 2017 16:20:47 -0400
changeset 655314 8df2704a78f901214a179d55f9ff37f4f92292a1
parent 654592 1b4c59eef820b46eb0037aca68f83a15088db45f
child 728791 4678eb7fe91130d320db02bdb9a7aa009e0dd1d0
push id76827
push userahalberstadt@mozilla.com
push dateTue, 29 Aug 2017 20:28:17 +0000
reviewerschmanchester
bugs1289444
milestone57.0a1
Bug 1289444 - Forward extra arguments in |mach test| to the underlying test commands, r?chmanchester MozReview-Commit-ID: 631K2n0wB1a
python/mach/mach/registrar.py
testing/mach_commands.py
--- a/python/mach/mach/registrar.py
+++ b/python/mach/mach/registrar.py
@@ -111,16 +111,22 @@ class MachRegistrar(object):
 
         if handler.parser:
             parser = handler.parser
 
             # save and restore existing defaults so **kwargs don't persist across
             # subsequent invocations of Registrar.dispatch()
             old_defaults = parser._defaults.copy()
             parser.set_defaults(**kwargs)
-            kwargs, _ = parser.parse_known_args(argv or [])
+            kwargs, unknown = parser.parse_known_args(argv or [])
             kwargs = vars(kwargs)
             parser._defaults = old_defaults
 
+            if unknown:
+                if subcommand:
+                    name = '{} {}'.format(name, subcommand)
+                parser.error("unrecognized arguments for {}: {}".format(
+                    name, ', '.join(["'{}'".format(arg) for arg in unknown])))
+
         return self._run_command_handler(handler, context=context, **kwargs)
 
 
 Registrar = MachRegistrar()
--- a/testing/mach_commands.py
+++ b/testing/mach_commands.py
@@ -196,17 +196,21 @@ The following test suites and aliases ar
 TEST_HELP = TEST_HELP.strip()
 
 
 @CommandProvider
 class Test(MachCommandBase):
     @Command('test', category='testing',
              description='Run tests (detects the kind of test and runs it).')
     @CommandArgument('what', default=None, nargs='*', help=TEST_HELP)
-    def test(self, what):
+    @CommandArgument('extra_args', default=None, nargs=argparse.REMAINDER,
+                     help="Extra arguments to pass to the underlying test command(s). "
+                          "If an underlying command doesn't recognize the argument, it "
+                          "will fail.")
+    def test(self, what, extra_args):
         """Run tests from names or paths.
 
         mach test accepts arguments specifying which tests to run. Each argument
         can be:
 
         * The path to a test file
         * A directory containing tests
         * A test suite name
@@ -300,17 +304,17 @@ class Test(MachCommandBase):
 
         status = None
         for suite_name in run_suites:
             suite = TEST_SUITES[suite_name]
 
             if 'mach_command' in suite:
                 res = self._mach_context.commands.dispatch(
                     suite['mach_command'], self._mach_context,
-                    **suite['kwargs'])
+                    argv=extra_args, **suite['kwargs'])
                 if res:
                     status = res
 
         buckets = {}
         for test in run_tests:
             key = (test['flavor'], test.get('subsuite', ''))
             buckets.setdefault(key, []).append(test)
 
@@ -326,17 +330,17 @@ class Test(MachCommandBase):
                 status = 1
                 continue
 
             kwargs = dict(m['kwargs'])
             kwargs['subsuite'] = subsuite
 
             res = self._mach_context.commands.dispatch(
                 m['mach_command'], self._mach_context,
-                test_objects=tests, **kwargs)
+                argv=extra_args, test_objects=tests, **kwargs)
             if res:
                 status = res
 
         return status
 
 
 @CommandProvider
 class MachCommands(MachCommandBase):