Bug 1470266 - [taskgraph] Add ability to schedule serviceworker-e10s test tasks in taskgraph, r=jmaher
authorAndrew Halberstadt <ahalberstadt@mozilla.com>
Tue, 02 Oct 2018 17:13:04 +0000
changeset 439209 3e6405e7631c01f4e4fca496db66c55601575634
parent 439208 26d8702b46cd70f7cc31ed2841f369ca5fc6e57b
child 439210 6eec41ce0c9469c33e4d1cbd9b412ce1d70d93c7
push id34758
push userdvarga@mozilla.com
push dateTue, 02 Oct 2018 21:45:21 +0000
treeherdermozilla-central@4392b5198fb7 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
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 1470266 - [taskgraph] Add ability to schedule serviceworker-e10s test tasks in taskgraph, r=jmaher This adds a transform which will evaluate the 'serviceworker-e10s' key. If False, the task is returned as is. If True, the task is run with the 'dom.serviceWorkers.parent_intercept' pref enabled. If 'both' the task is split into two tasks, one with the pref, and one without. Differential Revision: https://phabricator.services.mozilla.com/D7480
--- a/taskcluster/docs/attributes.rst
+++ b/taskcluster/docs/attributes.rst
@@ -113,16 +113,22 @@ This is the name used to refer to a "job
 some kinds, ``-j`` also matches against ``build_platform``.
 This is the chunk number of a chunked test suite (talos or unittest).  Note
 that this is a string!
+For test suites which distinguish whether or not they run with the serviceworker
+e10s redesign enabled.
 For test suites which distinguish whether they run with or without e10s, this
 boolean value identifies this particular run.
--- a/taskcluster/taskgraph/transforms/tests.py
+++ b/taskcluster/taskgraph/transforms/tests.py
@@ -15,16 +15,17 @@ The test description should be fully for
 transforms, and these transforms should not embody any specific knowledge about
 what should run where. this is the wrong place for special-casing platforms,
 for example - use `all_tests.py` instead.
 from __future__ import absolute_import, print_function, unicode_literals
 from taskgraph.transforms.base import TransformSequence
+from taskgraph.util.attributes import match_run_on_projects
 from taskgraph.util.schema import resolve_keyed_by, OptimizationSchema
 from taskgraph.util.treeherder import split_symbol, join_symbol, add_suffix
 from taskgraph.util.platforms import platform_family
 from taskgraph.util.schema import (
@@ -197,16 +198,24 @@ test_description_schema = Schema({
     Required('chunks'): optionally_keyed_by(
     # the time (with unit) after which this task is deleted; default depends on
     # the branch (see below)
     Optional('expires-after'): basestring,
+    # Whether to run this task with the serviceworker e10s redesign enabled
+    # (desktop-test only).  If 'both', run one task with and one task without.
+    # Tasks with this enabled have have "-sw" appended to the test name and
+    # treeherder group.
+    Optional('serviceworker-e10s'): optionally_keyed_by(
+        'test-platform', 'project',
+        Any(bool, 'both')),
     # Whether to run this task with e10s (desktop-test only).  If false, run
     # without e10s; if true, run with e10s; if 'both', run one task with and
     # one task without e10s.  E10s tasks have "-e10s" appended to the test name
     # and treeherder group.
     Required('e10s'): optionally_keyed_by(
         'test-platform', 'project',
         Any(bool, 'both')),
@@ -455,16 +464,17 @@ def set_defaults(config, tests):
         test.setdefault('instance-size', 'default')
         test.setdefault('max-run-time', 3600)
         test.setdefault('reboot', False)
         test.setdefault('virtualization', 'virtual')
         test.setdefault('loopback-audio', False)
         test.setdefault('loopback-video', False)
         test.setdefault('docker-image', {'in-tree': 'desktop1604-test'})
         test.setdefault('checkout', False)
+        test.setdefault('serviceworker-e10s', False)
         test['mozharness'].setdefault('extra-options', [])
         test['mozharness'].setdefault('requires-signed-builds', False)
         test['mozharness'].setdefault('tooltool-downloads', False)
         test['mozharness'].setdefault('set-moz-node-path', False)
         test['mozharness'].setdefault('chunked', False)
         test['mozharness'].setdefault('chunking-args', 'this-chunk')
         yield test
@@ -681,16 +691,17 @@ def set_download_symbols(config, tests):
 def handle_keyed_by(config, tests):
     """Resolve fields that can be keyed by platform, etc."""
     fields = [
+        'serviceworker-e10s',
@@ -810,16 +821,47 @@ def handle_run_on_projects(config, tests
     """Handle translating `built-projects` appropriately"""
     for test in tests:
         if test['run-on-projects'] == 'built-projects':
             test['run-on-projects'] = test['build-attributes'].get('run_on_projects', ['all'])
         yield test
+def split_serviceworker_e10s(config, tests):
+    for test in tests:
+        sw = test.pop('serviceworker-e10s')
+        test['serviceworker-e10s'] = False
+        test['attributes']['serviceworker_e10s'] = False
+        if sw == 'both':
+            yield copy.deepcopy(test)
+            sw = True
+        if sw:
+            if not match_run_on_projects('mozilla-central', test['run-on-projects']):
+                continue
+            test['description'] += " with serviceworker-e10s redesign enabled"
+            test['run-on-projects'] = ['mozilla-central']
+            test['test-name'] += '-sw'
+            test['try-name'] += '-sw'
+            test['attributes']['serviceworker_e10s'] = True
+            group, symbol = split_symbol(test['treeherder-symbol'])
+            if group != '?':
+                group += '-sw'
+            else:
+                symbol += '-sw'
+            test['treeherder-symbol'] = join_symbol(group, symbol)
+            test['mozharness']['extra-options'].append(
+                '--setpref="dom.serviceWorkers.parent_intercept=true"')
+        yield test
 def split_e10s(config, tests):
     for test in tests:
         e10s = test['e10s']
         test['e10s'] = False
         test['attributes']['e10s'] = False
         if e10s == 'both':