Bug 926693 - Add B2G support to marionette's mach command, r=ahal
authorJonathan Griffin <jgriffin@mozilla.com>
Tue, 15 Oct 2013 12:54:21 -0700
changeset 150802 15e91a96d77d105afd200b0d9dc88752b72c8148
parent 150801 c505616ed8a409abc0bae1e5f4d829f80d92b72e
child 150803 dd2957ba1805c037737742e8832233ceba02bb0e
push id34989
push userjgriffin@mozilla.com
push dateTue, 15 Oct 2013 22:09:52 +0000
treeherdermozilla-inbound@15e91a96d77d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersahal
bugs926693
milestone27.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 926693 - Add B2G support to marionette's mach command, r=ahal
testing/marionette/mach_commands.py
--- a/testing/marionette/mach_commands.py
+++ b/testing/marionette/mach_commands.py
@@ -1,81 +1,119 @@
 # 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 unicode_literals
 import os
 
-from mozbuild.base import MachCommandBase
+from mozbuild.base import (
+    MachCommandBase,
+    MachCommandConditions as conditions,
+)
 
 from mach.decorators import (
     CommandArgument,
     CommandProvider,
     Command,
 )
 
+MARIONETTE_DISABLED = '''
+The %s command requires a Marionette-enabled build.
+
+Add 'ENABLE_MARIONETTE=1' to your mozconfig file and re-build the application.
+Your currently active mozconfig is %s.
+'''.lstrip()
+
+MARIONETTE_DISABLED_B2G = '''
+The %s command requires a Marionette-enabled build.
+
+Please create an engineering build, which has Marionette enabled.  You can do
+this by ommitting the VARIANT variable when building, or using:
+
+VARIANT=eng ./build.sh
+'''
+
+def run_marionette(tests, b2g_path=None, emulator=None, testtype=None,
+    address=None, bin=None, topsrcdir=None):
+    from marionette.runtests import (
+        MarionetteTestRunner,
+        MarionetteTestOptions,
+        startTestRunner
+    )
+
+    parser = MarionetteTestOptions()
+    options, args = parser.parse_args()
+
+    if not tests:
+        tests = [os.path.join(topsrcdir,
+                    'testing/marionette/client/marionette/tests/unit-tests.ini')]
+
+    options.type = testtype
+    if b2g_path:
+        options.homedir = b2g_path
+        if emulator:
+            options.emulator = emulator
+    else:
+        options.bin = bin
+        path, exe = os.path.split(options.bin)
+        if 'b2g' in exe:
+            options.app = 'b2gdesktop'
+
+    options.address = address
+
+    parser.verify_usage(options, tests)
+
+    runner = startTestRunner(MarionetteTestRunner, options, tests)
+    if runner.failed > 0:
+        return 1
+
+    return 0
+
+@CommandProvider
+class B2GCommands(MachCommandBase):
+    def __init__(self, context):
+        MachCommandBase.__init__(self, context)
+
+        for attr in ('b2g_home', 'device_name'):
+            setattr(self, attr, getattr(context, attr, None))
+    @Command('marionette-webapi', category='testing',
+        description='Run a Marionette webapi test',
+        conditions=[conditions.is_b2g])
+    @CommandArgument('--emulator', choices=['x86', 'arm'],
+        help='Run an emulator of the specified architecture.')
+    @CommandArgument('--type', dest='testtype',
+        help='Test type, usually one of: browser, b2g, b2g-qemu.',
+        default='b2g')
+    @CommandArgument('tests', nargs='*', metavar='TESTS',
+        help='Path to test(s) to run.')
+    def run_marionette_webapi(self, tests, emulator=None, testtype=None):
+        if not emulator and self.device_name in ('emulator', 'emulator-jb'):
+            emulator='arm'
+
+        if self.substs.get('ENABLE_MARIONETTE') != '1':
+            print(MARIONETTE_DISABLED_B2G % 'marionette-webapi')
+            return 1
+
+        return run_marionette(tests, b2g_path=self.b2g_home, emulator=emulator,
+            testtype=testtype, topsrcdir=self.topsrcdir, address=None)
+
 
 @CommandProvider
 class MachCommands(MachCommandBase):
     @Command('marionette-test', category='testing',
-        description='Run a Marionette test.')
-    @CommandArgument('--homedir', dest='b2g_path',
-        help='For B2G testing, the path to the B2G repo.')
-    @CommandArgument('--emulator', choices=['x86', 'arm'],
-        help='Run an emulator of the specified architecture.')
+        description='Run a Marionette test.',
+        conditions=[conditions.is_firefox])
     @CommandArgument('--address',
         help='host:port of running Gecko instance to connect to.')
     @CommandArgument('--type', dest='testtype',
-        help='Test type, usually one of: browser, b2g, b2g-qemu.')
+        help='Test type, usually one of: browser, b2g, b2g-qemu.',
+        default='browser')
     @CommandArgument('tests', nargs='*', metavar='TESTS',
         help='Path to test(s) to run.')
-    def run_marionette(self, tests, emulator=None, address=None, b2g_path=None,
-            testtype=None):
-        from marionette.runtests import (
-            MarionetteTestRunner,
-            MarionetteTestOptions,
-            startTestRunner
-        )
-
-        parser = MarionetteTestOptions()
-        options, args = parser.parse_args()
-
-        if not tests:
-            tests = ['testing/marionette/client/marionette/tests/unit-tests.ini']
-
-        options.type = testtype
-        if emulator:
-            if b2g_path:
-                options.homedir = b2g_path
-            if not testtype:
-                options.type = "b2g"
-        else:
-            if not testtype:
-                options.type = "browser"
-            try:
-                bin = self.get_binary_path('app')
-                options.bin = bin
-            except Exception as e:
-                print("It looks like your program isn't built.",
-                      "You can run |mach build| to build it.")
-                print(e)
-                return 1
-            path, exe = os.path.split(options.bin)
-            if 'b2g' in exe:
-                options.app = 'b2gdesktop'
-
-        if not emulator:
-            if self.substs.get('ENABLE_MARIONETTE') != '1':
-                print("Marionette doesn't appear to be enabled; please "
-                      "add ENABLE_MARIONETTE=1 to your mozconfig and "
-                      "perform a clobber build.")
-                return 1
-
-        options.address = address
-
-        parser.verify_usage(options, tests)
-
-        runner = startTestRunner(MarionetteTestRunner, options, tests)
-        if runner.failed > 0:
+    def run_marionette_test(self, tests, address=None, testtype=None):
+        if self.substs.get('ENABLE_MARIONETTE') != '1':
+            print(MARIONETTE_DISABLED % ('marionette-test',
+                                         self.mozconfig['path']))
             return 1
 
-        return 0
+        return run_marionette(tests, bin=bin, testtype=testtype,
+            topsrcdir=self.topsrcdir, address=address)