Bug 1311991 - Add a basic cramtest mach command, r?gps draft
authorAndrew Halberstadt <ahalberstadt@mozilla.com>
Fri, 20 Jan 2017 11:15:25 -0500
changeset 649090 494cfdde5627d56868d9d7316e6798703e05b693
parent 649089 8d1809e0b240a04cba02e219bd2885ee891b6ccc
child 649091 6f44d7c35ae80e7af1f4c577d28daf2b0cfda9d2
push id74949
push userahalberstadt@mozilla.com
push dateFri, 18 Aug 2017 16:15:05 +0000
reviewersgps
bugs1311991
milestone57.0a1
Bug 1311991 - Add a basic cramtest mach command, r?gps This is a pretty bad runner. My goal for now is to get something really basic working and then improve it over time as more tests get added. Run tests with: ./mach cramtest path/to/dir Any extra args will be forwarded to the cram binary, e.g: ./mach cramtest -i path/to/dir Cram help can be seen with: ./mach python -m cram -- -h MozReview-Commit-ID: 67jYHfYQjWu
testing/mach_commands.py
--- a/testing/mach_commands.py
+++ b/testing/mach_commands.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 import argparse
 import json
+import logging
 import os
 import sys
 import tempfile
 import subprocess
 import shutil
 
 from mach.decorators import (
     CommandArgument,
@@ -506,16 +507,55 @@ class JsapiTestsCommand(MachCommandBase)
         if params['test_name']:
             jsapi_tests_cmd.append(params['test_name'])
 
         jsapi_tests_result = subprocess.call(jsapi_tests_cmd)
 
         return jsapi_tests_result
 
 
+@CommandProvider
+class CramTest(MachCommandBase):
+    @Command('cramtest', category='testing',
+             description="Mercurial style .t tests for command line applications.")
+    @CommandArgument('test_paths', nargs='*', metavar='N',
+                     help="Test paths to run. Each path can be a test file or directory. "
+                          "If omitted, the entire suite will be run.")
+    @CommandArgument('cram_args', nargs=argparse.REMAINDER,
+                     help="Extra arguments to pass down to the cram binary. See "
+                          "'./mach python -m cram -- -h' for a list of available options.")
+    def cramtest(self, cram_args=None, test_paths=None, test_objects=None):
+        self._activate_virtualenv()
+        import mozinfo
+        from manifestparser import TestManifest
+
+        if test_objects is None:
+            from mozbuild.testing import TestResolver
+            resolver = self._spawn(TestResolver)
+            if test_paths:
+                # If we were given test paths, try to find tests matching them.
+                test_objects = resolver.resolve_tests(paths=test_paths, flavor='cram')
+            else:
+                # Otherwise just run everything in CRAMTEST_MANIFESTS
+                test_objects = resolver.resolve_tests(flavor='cram')
+
+        if not test_objects:
+            message = 'No tests were collected, check spelling of the test paths.'
+            self.log(logging.WARN, 'cramtest', {}, message)
+            return 1
+
+        mp = TestManifest()
+        mp.tests.extend(test_objects)
+        tests = mp.active_tests(disabled=False, **mozinfo.info)
+
+        python = self.virtualenv_manager.python_path
+        cmd = [python, '-m', 'cram'] + cram_args + [t['relpath'] for t in tests]
+        return subprocess.call(cmd, cwd=self.topsrcdir)
+
+
 def get_parser(argv=None):
     parser = ArgumentParser()
     parser.add_argument(dest="suite_name",
                         nargs=1,
                         choices=['mochitest'],
                         type=str,
                         help="The test for which chunk should be found. It corresponds "
                              "to the mach test invoked (only 'mochitest' currently).")