Bug 983948 - Add mach mochitest-devtools r=jmaher
authorMichael Ratcliffe <mratcliffe@mozilla.com>
Tue, 25 Mar 2014 16:52:53 +0000
changeset 197591 52da0fc935cec05dc09f1a9ac05a5259ae977fba
parent 197590 4182ec5042d5ebd501f4d6fe8c5d158e215db2d5
child 197592 df3c1971ecdc39482e8c39e456b0ccdbed9cc314
push id486
push userasasaki@mozilla.com
push dateMon, 14 Jul 2014 18:39:42 +0000
treeherdermozilla-release@d33428174ff1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjmaher
bugs983948
milestone31.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 983948 - Add mach mochitest-devtools r=jmaher
browser/devtools/app-manager/test/browser.ini
browser/devtools/canvasdebugger/test/browser.ini
browser/devtools/commandline/test/browser.ini
browser/devtools/fontinspector/test/browser.ini
browser/devtools/framework/test/browser.ini
browser/devtools/inspector/test/browser.ini
browser/devtools/layoutview/test/browser.ini
browser/devtools/markupview/test/browser.ini
browser/devtools/netmonitor/test/browser.ini
browser/devtools/profiler/test/browser.ini
browser/devtools/responsivedesign/test/browser.ini
browser/devtools/scratchpad/test/browser.ini
browser/devtools/shadereditor/test/browser.ini
browser/devtools/shared/test/browser.ini
browser/devtools/sourceeditor/test/browser.ini
browser/devtools/styleeditor/test/browser.ini
browser/devtools/styleinspector/test/browser.ini
browser/devtools/tilt/test/browser.ini
browser/devtools/webaudioeditor/test/browser.ini
browser/devtools/webconsole/test/browser.ini
testing/mach_commands.py
testing/mochitest/mach_commands.py
testing/mochitest/mochitest_options.py
testing/mochitest/runtests.py
testing/mozbase/manifestdestiny/manifestparser/manifestparser.py
testing/mozbase/manifestdestiny/tests/test_convert_directory.py
testing/mozbase/manifestdestiny/tests/test_manifestparser.py
testing/testsuite-targets.mk
toolkit/devtools/server/tests/browser/browser.ini
--- a/browser/devtools/app-manager/test/browser.ini
+++ b/browser/devtools/app-manager/test/browser.ini
@@ -1,9 +1,11 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   head.js
   hosted_app.manifest
   manifest.webapp
 
 [browser_manifest_editor.js]
 skip-if = os == "linux"
--- a/browser/devtools/canvasdebugger/test/browser.ini
+++ b/browser/devtools/canvasdebugger/test/browser.ini
@@ -1,9 +1,10 @@
 [DEFAULT]
+subsuite = devtools
 support-files =
   doc_simple-canvas.html
   doc_simple-canvas-deep-stack.html
   doc_simple-canvas-transparent.html
   head.js
 
 [browser_canvas-actor-test-01.js]
 [browser_canvas-actor-test-02.js]
--- a/browser/devtools/commandline/test/browser.ini
+++ b/browser/devtools/commandline/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   head.js
   helpers.js
   mockCommands.js
 
 [browser_cmd_addon.js]
 [browser_cmd_calllog.js]
 skip-if = true || e10s # Bug 845831
--- a/browser/devtools/fontinspector/test/browser.ini
+++ b/browser/devtools/fontinspector/test/browser.ini
@@ -1,8 +1,10 @@
 [DEFAULT]
+subsuite = devtools
+
 support-files =
   browser_font.woff
   browser_fontinspector.html
 
 [browser_fontinspector.js]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
 
--- a/browser/devtools/framework/test/browser.ini
+++ b/browser/devtools/framework/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   browser_toolbox_options_disable_js.html
   browser_toolbox_options_disable_js_iframe.html
   browser_toolbox_options_disable_cache.sjs
   head.js
 
 [browser_devtools_api.js]
 [browser_dynamic_tool_enabling.js]
--- a/browser/devtools/inspector/test/browser.ini
+++ b/browser/devtools/inspector/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   browser_inspector_breadcrumbs.html
   browser_inspector_bug_650804_search.html
   browser_inspector_bug_831693_search_suggestions.html
   browser_inspector_cmd_inspect.html
   browser_inspector_dead_node_exception.html
   browser_inspector_destroyselection.html
   browser_inspector_menu.html
--- a/browser/devtools/layoutview/test/browser.ini
+++ b/browser/devtools/layoutview/test/browser.ini
@@ -1,10 +1,11 @@
 [DEFAULT]
 support-files =
   head.js
+subsuite = devtools
 
 [browser_layoutview.js]
 skip-if = true
 [browser_editablemodel.js]
 [browser_editablemodel_allproperties.js]
 [browser_editablemodel_border.js]
 [browser_editablemodel_stylerules.js]
--- a/browser/devtools/markupview/test/browser.ini
+++ b/browser/devtools/markupview/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   doc_markup_edit.html
   doc_markup_flashing.html
   doc_markup_mutation.html
   doc_markup_navigation.html
   doc_markup_pagesize_01.html
   doc_markup_pagesize_02.html
   doc_markup_search.html
--- a/browser/devtools/netmonitor/test/browser.ini
+++ b/browser/devtools/netmonitor/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   head.js
   html_content-type-test-page.html
   html_content-type-without-cache-test-page.html
   html_custom-get-page.html
   html_single-get-page.html
   html_cyrillic-test-page.html
   html_filter-test-page.html
--- a/browser/devtools/profiler/test/browser.ini
+++ b/browser/devtools/profiler/test/browser.ini
@@ -1,9 +1,11 @@
 [DEFAULT]
+subsuite = devtools
+
 # Crashes/timeouts on all platforms (bug 973974)
 skip-if = true
 support-files =
   head.js
   mock_console_api.html
   mock_profiler_bug_834878_page.html
   mock_profiler_bug_834878_script.js
 
--- a/browser/devtools/responsivedesign/test/browser.ini
+++ b/browser/devtools/responsivedesign/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   head.js
   touch.html
 
 [browser_responsive_cmd.js]
 [browser_responsivecomputedview.js]
 [browser_responsiveruleview.js]
 [browser_responsiveui.js]
--- a/browser/devtools/scratchpad/test/browser.ini
+++ b/browser/devtools/scratchpad/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files = head.js
 
 [browser_scratchpad_browser_last_window_closing.js]
 [browser_scratchpad_reset_undo.js]
 [browser_scratchpad_display_outputs_errors.js]
 [browser_scratchpad_eval_func.js]
 [browser_scratchpad_goto_line_ui.js]
 [browser_scratchpad_reload_and_run.js]
--- a/browser/devtools/shadereditor/test/browser.ini
+++ b/browser/devtools/shadereditor/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   doc_blended-geometry.html
   doc_multiple-contexts.html
   doc_overlapping-geometry.html
   doc_shader-order.html
   doc_simple-canvas.html
   head.js
 
--- a/browser/devtools/shared/test/browser.ini
+++ b/browser/devtools/shared/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   browser_layoutHelpers.html
   browser_layoutHelpers_iframe.html
   browser_templater_basic.html
   browser_toolbar_basic.html
   browser_toolbar_webconsole_errors_count.html
   head.js
   leakhunt.js
--- a/browser/devtools/sourceeditor/test/browser.ini
+++ b/browser/devtools/sourceeditor/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   cm_comment_test.js
   cm_doc_test.js
   cm_driver.js
   cm_emacs_test.js
   cm_mode_test.css
   cm_mode_test.js
   cm_multi_test.js
--- a/browser/devtools/styleeditor/test/browser.ini
+++ b/browser/devtools/styleeditor/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   autocomplete.html
   browser_styleeditor_cmd_edit.html
   four.html
   head.js
   import.css
   import.html
   import2.css
--- a/browser/devtools/styleinspector/test/browser.ini
+++ b/browser/devtools/styleinspector/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   doc_content_stylesheet.html
   doc_content_stylesheet.xul
   doc_content_stylesheet_imported.css
   doc_content_stylesheet_imported2.css
   doc_content_stylesheet_linked.css
   doc_content_stylesheet_script.css
   doc_content_stylesheet_xul.css
--- a/browser/devtools/tilt/test/browser.ini
+++ b/browser/devtools/tilt/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files = head.js
 
 [browser_tilt_01_lazy_getter.js]
 [browser_tilt_02_notifications-seq.js]
 [browser_tilt_02_notifications-tabs.js]
 [browser_tilt_02_notifications.js]
 [browser_tilt_03_tab_switch.js]
 [browser_tilt_04_initialization.js]
--- a/browser/devtools/webaudioeditor/test/browser.ini
+++ b/browser/devtools/webaudioeditor/test/browser.ini
@@ -1,10 +1,10 @@
 [DEFAULT]
-
+subsuite = devtools
 support-files =
   doc_simple-context.html
   doc_complex-context.html
   doc_simple-node-creation.html
   head.js
 
 [browser_webaudio-actor-simple.js]
 [browser_audionode-actor-get-set-param.js]
--- a/browser/devtools/webconsole/test/browser.ini
+++ b/browser/devtools/webconsole/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
+
 support-files =
   head.js
   test-bug-585956-console-trace.html
   test-bug-593003-iframe-wrong-hud-iframe.html
   test-bug-593003-iframe-wrong-hud.html
   test-bug-595934-canvas-css.html
   test-bug-595934-canvas-css.js
   test-bug-595934-css-loader.css
--- a/testing/mach_commands.py
+++ b/testing/mach_commands.py
@@ -75,16 +75,21 @@ TEST_SUITES = {
         'aliases': ('bc', 'BC', 'Bc'),
         'mach_command': 'mochitest-browser',
         'kwargs': {'test_file': None},
     },
     'mochitest-chrome': {
         'mach_command': 'mochitest-chrome',
         'kwargs': {'test_file': None},
     },
+    'mochitest-devtools': {
+        'aliases': ('dt', 'DT', 'Dt'),
+        'mach_command': 'mochitest-browser --subsuite=devtools',
+        'kwargs': {'test_file': None},
+    },
     'mochitest-ipcplugins': {
         'make_target': 'mochitest-ipcplugins',
     },
     'mochitest-plain': {
         'mach_command': 'mochitest-plain',
         'kwargs': {'test_file': None},
     },
     'reftest': {
--- a/testing/mochitest/mach_commands.py
+++ b/testing/mochitest/mach_commands.py
@@ -252,27 +252,31 @@ class MochitestRunner(MozbuildObject):
         for handler in remove_handlers:
             logging.getLogger().removeHandler(handler)
 
         runner = mochitest.Mochitest()
 
         opts = mochitest.MochitestOptions()
         options, args = opts.parse_args([])
 
+        options.subsuite = ''
         flavor = suite
 
         # Need to set the suite options before verifyOptions below.
         if suite == 'plain':
             # Don't need additional options for plain.
             flavor = 'mochitest'
         elif suite == 'chrome':
             options.chrome = True
         elif suite == 'browser':
             options.browserChrome = True
             flavor = 'browser-chrome'
+        elif suite == 'devtools':
+            options.browserChrome = True
+            options.subsuite = 'devtools'
         elif suite == 'metro':
             options.immersiveMode = True
             options.browserChrome = True
         elif suite == 'a11y':
             options.a11y = True
         elif suite == 'webapprt-content':
             options.webapprtContent = True
             options.app = self.get_webapp_runtime_path()
@@ -586,16 +590,23 @@ class MachCommands(MachCommandBase):
 
     @Command('mochitest-browser', category='testing',
         conditions=[conditions.is_firefox],
         description='Run a mochitest with browser chrome.')
     @MochitestCommand
     def run_mochitest_browser(self, test_paths, **kwargs):
         return self.run_mochitest(test_paths, 'browser', **kwargs)
 
+    @Command('mochitest-devtools', category='testing',
+        conditions=[conditions.is_firefox],
+        description='Run a devtools mochitest with browser chrome.')
+    @MochitestCommand
+    def run_mochitest_devtools(self, test_paths, **kwargs):
+        return self.run_mochitest(test_paths, 'devtools', **kwargs)
+
     @Command('mochitest-metro', category='testing',
         conditions=[conditions.is_firefox],
         description='Run a mochitest with metro browser chrome.')
     @MochitestCommand
     def run_mochitest_metro(self, test_paths, **kwargs):
         return self.run_mochitest(test_paths, 'metro', **kwargs)
 
     @Command('mochitest-a11y', category='testing',
--- a/testing/mochitest/mochitest_options.py
+++ b/testing/mochitest/mochitest_options.py
@@ -166,16 +166,22 @@ class MochitestOptions(optparse.OptionPa
           "default": "",
         }],
         [["--browser-chrome"],
         { "action": "store_true",
           "dest": "browserChrome",
           "help": "run browser chrome Mochitests",
           "default": False,
         }],
+        [["--subsuite"],
+        { "action": "store",
+          "dest": "subsuite",
+          "help": "subsuite of tests to run",
+          "default": "",
+        }],
         [["--webapprt-content"],
         { "action": "store_true",
           "dest": "webapprtContent",
           "help": "run WebappRT content tests",
           "default": False,
         }],
         [["--webapprt-chrome"],
         { "action": "store_true",
--- a/testing/mochitest/runtests.py
+++ b/testing/mochitest/runtests.py
@@ -303,17 +303,20 @@ class MochitestUtilsMixin(object):
         endAt -- name of test to end at
         timeout -- per-test timeout in seconds
         repeat -- How many times to repeat the test, ie: repeat=1 will run the test twice.
     """
 
     # allow relative paths for logFile
     if options.logFile:
       options.logFile = self.getLogFilePath(options.logFile)
-    if options.browserChrome or options.chrome or options.a11y or options.webapprtChrome:
+
+    # Note that all tests under options.subsuite need to be browser chrome tests.
+    if options.browserChrome or options.chrome or options.subsuite or \
+       options.a11y or options.webapprtChrome:
       self.makeTestConfig(options)
     else:
       if options.autorun:
         self.urlOpts.append("autorun=1")
       if options.timeout:
         self.urlOpts.append("timeout=%d" % options.timeout)
       if options.closeWhenDone:
         self.urlOpts.append("closeWhenDone=1")
@@ -458,19 +461,20 @@ class MochitestUtilsMixin(object):
       # rid ourselves of 2.6.
       info = {}
       for k, v in mozinfo.info.items():
         if isinstance(k, unicode):
           k = k.encode('ascii')
         info[k] = v
 
       # Bug 883858 - return all tests including disabled tests
-      tests = manifest.active_tests(disabled=True, **info)
+      tests = manifest.active_tests(disabled=True, options=options, **info)
       paths = []
       testPath = self.getTestPath(options)
+
       for test in tests:
         pathAbs = os.path.abspath(test['path'])
         assert pathAbs.startswith(testRootAbs)
         tp = pathAbs[len(testRootAbs):].replace('\\', '/').strip('/')
 
         # Filter out tests if we are using --test-path
         if testPath and not tp.startswith(testPath):
           continue
--- a/testing/mozbase/manifestdestiny/manifestparser/manifestparser.py
+++ b/testing/mozbase/manifestdestiny/manifestparser/manifestparser.py
@@ -441,16 +441,19 @@ class ManifestParser(object):
             rootdir = self.rootdir + os.path.sep
 
         # read the configuration
         sections = read_ini(fp=fp, variables=defaults, strict=self.strict)
         self.manifest_defaults[filename] = defaults
 
         # get the tests
         for section, data in sections:
+            subsuite = ''
+            if 'subsuite' in data:
+                subsuite = data['subsuite']
 
             # a file to include
             # TODO: keep track of included file structure:
             # self.manifests = {'manifest.ini': 'relative/path.ini'}
             if section.startswith('include:'):
                 include_file = section.split('include:', 1)[-1]
                 include_file = normalize_path(include_file)
                 if not os.path.isabs(include_file):
@@ -493,16 +496,17 @@ class ManifestParser(object):
                 # When the rootdir is unknown, the relpath needs to be left
                 # unchanged. We use an empty string as rootdir in that case,
                 # which leaves relpath unchanged after slicing.
                 if path.startswith(rootdir):
                     _relpath = path[len(rootdir):]
                 else:
                     _relpath = relpath(path, rootdir)
 
+            test['subsuite'] = subsuite
             test['path'] = path
             test['relpath'] = _relpath
 
             # append the item
             self.tests.append(test)
 
     def read(self, *filenames, **defaults):
         """
@@ -1075,24 +1079,30 @@ class TestManifest(ManifestParser):
                 test.setdefault('disabled', reason)
 
             # mark test as a fail if so indicated
             if fail_tag in test:
                 condition = test[fail_tag]
                 if parse(condition, **values):
                     test['expected'] = 'fail'
 
-    def active_tests(self, exists=True, disabled=True, **values):
+    def active_tests(self, exists=True, disabled=True, options=None, **values):
         """
         - exists : return only existing tests
         - disabled : whether to return disabled tests
         - tags : keys and values to filter on (e.g. `os = linux mac`)
         """
+        tests = [i.copy() for i in self.tests] # shallow copy
 
-        tests = [i.copy() for i in self.tests] # shallow copy
+        # Filter on current subsuite
+        if options:
+            if  options.subsuite:
+                tests = [test for test in tests if options.subsuite == test['subsuite']]
+            else:
+                tests = [test for test in tests if not test['subsuite']]
 
         # mark all tests as passing unless indicated otherwise
         for test in tests:
             test['expected'] = test.get('expected', 'pass')
 
         # ignore tests that do not exist
         if exists:
             tests = [test for test in tests if os.path.exists(test['path'])]
--- a/testing/mozbase/manifestdestiny/tests/test_convert_directory.py
+++ b/testing/mozbase/manifestdestiny/tests/test_convert_directory.py
@@ -42,22 +42,26 @@ class TestDirectoryConversion(unittest.T
         try:
             stub = stub.replace(os.path.sep, "/")
             self.assertTrue(os.path.exists(stub) and os.path.isdir(stub))
 
             # Make a manifest for it
             manifest = convert([stub])
             self.assertEqual(str(manifest),
 """[%(stub)s/bar]
+subsuite = 
 
 [%(stub)s/fleem]
+subsuite = 
 
 [%(stub)s/foo]
+subsuite = 
 
 [%(stub)s/subdir/subfile]
+subsuite = 
 
 """ % dict(stub=stub))
         except:
             raise
         finally:
             shutil.rmtree(stub) # cleanup
 
     def test_convert_directory_manifests_in_place(self):
--- a/testing/mozbase/manifestdestiny/tests/test_manifestparser.py
+++ b/testing/mozbase/manifestdestiny/tests/test_manifestparser.py
@@ -100,17 +100,17 @@ class TestManifestParser(unittest.TestCa
 
         # All of the included tests actually exist:
         self.assertEqual([i['name'] for i in parser.missing()], [])
 
         # Write the output to a manifest:
         buffer = StringIO()
         parser.write(fp=buffer, global_kwargs={'foo': 'bar'})
         self.assertEqual(buffer.getvalue().strip(),
-                         '[DEFAULT]\nfoo = bar\n\n[fleem]\n\n[include/flowers]\nblue = ocean\nred = roses\nyellow = submarine')
+                         '[DEFAULT]\nfoo = bar\n\n[fleem]\nsubsuite = \n\n[include/flowers]\nblue = ocean\nred = roses\nsubsuite = \nyellow = submarine')
 
     def test_copy(self):
         """Test our ability to copy a set of manifests"""
 
         tempdir = tempfile.mkdtemp()
         include_example = os.path.join(here, 'include-example.ini')
         manifest = ManifestParser(manifests=(include_example,))
         manifest.copy(tempdir)
--- a/testing/testsuite-targets.mk
+++ b/testing/testsuite-targets.mk
@@ -15,17 +15,17 @@ endif
 
 # include automation-build.mk to get the path to the binary
 TARGET_DEPTH = $(DEPTH)
 include $(topsrcdir)/build/binary-location.mk
 
 SYMBOLS_PATH := --symbols-path=$(DIST)/crashreporter-symbols
 
 # Usage: |make [TEST_PATH=...] [EXTRA_TEST_ARGS=...] mochitest*|.
-MOCHITESTS := mochitest-plain mochitest-chrome mochitest-a11y mochitest-ipcplugins
+MOCHITESTS := mochitest-plain mochitest-chrome mochitest-devtools mochitest-a11y mochitest-ipcplugins
 mochitest:: $(MOCHITESTS)
 
 ifndef TEST_PACKAGE_NAME
 TEST_PACKAGE_NAME := $(ANDROID_PACKAGE_NAME)
 endif
 
 RUN_MOCHITEST_B2G_DESKTOP = \
   rm -f ./$@.log && \
@@ -140,16 +140,20 @@ mochitest-1 mochitest-2 mochitest-3 moch
 	echo 'mochitest: $* / 5'
 	$(RUN_MOCHITEST) --chunk-by-dir=4 --total-chunks=5 --this-chunk=$*
 	$(CHECK_TEST_ERROR)
 
 mochitest-chrome:
 	$(RUN_MOCHITEST) --chrome
 	$(CHECK_TEST_ERROR)
 
+mochitest-devtools:
+	$(RUN_MOCHITEST) --subsuite=devtools
+	$(CHECK_TEST_ERROR)
+
 mochitest-a11y:
 	$(RUN_MOCHITEST) --a11y
 	$(CHECK_TEST_ERROR)
 
 mochitest-ipcplugins:
 ifeq (Darwin,$(OS_ARCH))
 ifeq (i386,$(TARGET_CPU))
 	$(RUN_MOCHITEST) --setpref=dom.ipc.plugins.enabled.i386.test.plugin=false $(IPCPLUGINS_PATH_ARG)
@@ -533,16 +537,17 @@ stage-marionette: make-stage-dir
           | (cd $(MARIONETTE_DIR)/tests && tar -xf -)
 
 stage-mozbase: make-stage-dir
 	$(MAKE) -C $(DEPTH)/testing/mozbase stage-package
 .PHONY: \
   mochitest \
   mochitest-plain \
   mochitest-chrome \
+  mochitest-devtools \
   mochitest-a11y \
   mochitest-ipcplugins \
   reftest \
   crashtest \
   xpcshell-tests \
   jstestbrowser \
   package-tests \
   make-stage-dir \
--- a/toolkit/devtools/server/tests/browser/browser.ini
+++ b/toolkit/devtools/server/tests/browser/browser.ini
@@ -1,10 +1,11 @@
 [DEFAULT]
 skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
+subsuite = devtools
 support-files =
   head.js
   storage-dynamic-windows.html
   storage-listings.html
   storage-unsecured-iframe.html
   storage-updates.html
   storage-secured-iframe.html