Bug 1261412 - Report when mach python-test collects no tests; r=gps
authorMaja Frydrychowicz <mjzffr@gmail.com>
Tue, 22 Mar 2016 18:53:57 -0400
changeset 331515 6f3009caf1eff2a0145b0efbc3c6a465c58c74fd
parent 331493 6e6c5143feaa28e2d374a9a12b30c090fa051093
child 331516 b79810219014164bdad95abc806b66a5dd006ec3
push id6048
push userkmoir@mozilla.com
push dateMon, 06 Jun 2016 19:02:08 +0000
treeherdermozilla-beta@46d72a56c57d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgps
bugs1261412
milestone48.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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]".')