Bug 1261412 - Report when mach python-test collects no tests; r?gps draft
authorMaja Frydrychowicz <mjzffr@gmail.com>
Tue, 22 Mar 2016 18:53:57 -0400
changeset 352717 08801affc238fa8bb7213cd0f6faa1359b696605
parent 352668 6066850740cd4711ee5502fda89f422440b7c2cc
child 352718 77eb1b76fd17fdba33890efc57bc279044bb31db
push id15758
push usermjzffr@gmail.com
push dateMon, 18 Apr 2016 14:42:55 +0000
reviewersgps
bugs1261412
milestone48.0a1
Bug 1261412 - Report when mach python-test collects no tests; r?gps MozReview-Commit-ID: GDlshUUjO7C
python/mach_commands.py
--- a/python/mach_commands.py
+++ b/python/mach_commands.py
@@ -74,45 +74,48 @@ class MachCommands(MachCommandBase):
         action='store_true',
         help='Verbose output.')
     @CommandArgument('--stop',
         default=False,
         action='store_true',
         help='Stop running tests after the first error or failure.')
     @CommandArgument('tests', nargs='*',
         metavar='TEST',
-        help='Tests to run. Each test can be a single file or a directory.')
+        help=('Tests to run. Each test can be a single file or a directory. '
+              'Tests must be part of PYTHON_UNIT_TESTS.'))
     def python_test(self,
                     tests=[],
                     test_objects=None,
                     subsuite=None,
                     verbose=False,
                     stop=False):
         self._activate_virtualenv()
 
         # Python's unittest, and in particular discover, has problems with
         # clashing namespaces when importing multiple test modules. What follows
         # is a simple way to keep environments separate, at the price of
         # launching Python multiple times. This also runs tests via mozunit,
         # which produces output in the format Mozilla infrastructure expects.
         return_code = 0
+        found_tests = False
         if test_objects is None:
             # If we're not being called from `mach test`, do our own
             # test resolution.
             from mozbuild.testing import TestResolver
             resolver = self._spawn(TestResolver)
             if tests:
                 # If we were given test paths, try to find tests matching them.
                 test_objects = resolver.resolve_tests(paths=tests,
                                                       flavor='python')
             else:
                 # Otherwise just run all Python tests.
                 test_objects = resolver.resolve_tests(flavor='python')
 
         for test in test_objects:
+            found_tests = True
             f = test['path']
             file_displayed_test = []  # Used as a boolean.
 
             def _line_handler(line):
                 if not file_displayed_test and line.startswith('TEST-'):
                     file_displayed_test.append(True)
 
             inner_return_code = self.run_process(
@@ -133,16 +136,23 @@ class MachCommands(MachCommandBase):
                     self.log(logging.INFO, 'python-test', {'file': f},
                              'Test failed: {file}')
                 else:
                     self.log(logging.INFO, 'python-test', {'file': f},
                              'Test passed: {file}')
             if stop and return_code > 0:
                 return 1
 
+        if not found_tests:
+            self.log(logging.WARN, 'python-test', {},
+                     'TEST-UNEXPECTED-FAIL | No tests collected '
+                     '(not in PYTHON_UNIT_TESTS?)')
+
+            return 1
+
         return 0 if return_code == 0 else 1
 
     @Command('eslint', category='devenv',
         description='Run eslint or help configure eslint for optimal development.')
     @CommandArgument('-s', '--setup', default=False, action='store_true',
         help='configure eslint for optimal development.')
     @CommandArgument('-e', '--ext', default='[.js,.jsm,.jsx,.xml,.html]',
         help='Filename extensions to lint, default: "[.js,.jsm,.jsx,.xml,.html]".')