<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[214314] trunk/Websites/perf.webkit.org</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/214314">214314</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2017-03-23 13:54:39 -0700 (Thu, 23 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>create-test-group should allow a different set of repositories to be used in each configuration
https://bugs.webkit.org/show_bug.cgi?id=169992

Rubber-stamped by Antti Koivisto.

Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
This new parameter now specifies an array of repository id to revision dictionaries, and allows
different set of repositories' revisions to be specified in each dictionary.

We keep the old API for v2 UI and detect-changes.js compatibility for now.

* public/privileged-api/create-test-group.php:
(main):
(commit_sets_from_revision_sets): Added.
(ensure_commit_sets): Only fetch the top-level repository per <a href="http://trac.webkit.org/projects/webkit/changeset/213788">r213788</a> and <a href="http://trac.webkit.org/projects/webkit/changeset/213976">r213976</a>.

* public/v3/models/test-group.js:
(TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
the now depreacted commitSets parameter.

* public/v3/pages/analysis-task-page.js:
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
an array of commit sets instead of a dictionary of repository name to a list of revisions.

* server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicprivilegedapicreatetestgroupphp">trunk/Websites/perf.webkit.org/public/privileged-api/create-test-group.php</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3modelstestgroupjs">trunk/Websites/perf.webkit.org/public/v3/models/test-group.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs">trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgservertestsprivilegedapicreatetestgrouptestsjs">trunk/Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesperfwebkitorgChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/ChangeLog (214313 => 214314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2017-03-23 20:31:18 UTC (rev 214313)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2017-03-23 20:54:39 UTC (rev 214314)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2017-03-23  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        create-test-group should allow a different set of repositories to be used in each configuration
+        https://bugs.webkit.org/show_bug.cgi?id=169992
+
+        Rubber-stamped by Antti Koivisto.
+
+        Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
+        This new parameter now specifies an array of repository id to revision dictionaries, and allows
+        different set of repositories' revisions to be specified in each dictionary.
+
+        We keep the old API for v2 UI and detect-changes.js compatibility for now.
+
+        * public/privileged-api/create-test-group.php:
+        (main):
+        (commit_sets_from_revision_sets): Added.
+        (ensure_commit_sets): Only fetch the top-level repository per r213788 and r213976.
+
+        * public/v3/models/test-group.js:
+        (TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
+        the now depreacted commitSets parameter.
+
+        * public/v3/pages/analysis-task-page.js:
+        (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
+        by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
+        an array of commit sets instead of a dictionary of repository name to a list of revisions.
+
+        * server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.
+
</ins><span class="cx"> 2017-03-22  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         /api/uploaded-file should return createdAt as a POSIX timestamp
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicprivilegedapicreatetestgroupphp"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/privileged-api/create-test-group.php (214313 => 214314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/privileged-api/create-test-group.php        2017-03-23 20:31:18 UTC (rev 214313)
+++ trunk/Websites/perf.webkit.org/public/privileged-api/create-test-group.php        2017-03-23 20:54:39 UTC (rev 214314)
</span><span class="lines">@@ -15,10 +15,11 @@
</span><span class="cx">     $name = $arguments['name'];
</span><span class="cx">     $task_id = $arguments['task'];
</span><span class="cx">     $repetition_count = $arguments['repetitionCount'];
</span><ins>+    $revision_set_list = array_get($data, 'revisionSets');
</ins><span class="cx">     $commit_sets_info = array_get($data, 'commitSets');
</span><span class="cx"> 
</span><span class="cx">     require_format('Task', $task_id, '/^\d+$/');
</span><del>-    if (!$commit_sets_info)
</del><ins>+    if (!$revision_set_list &amp;&amp; !$commit_sets_info)
</ins><span class="cx">         exit_with_error('InvalidCommitSets');
</span><span class="cx"> 
</span><span class="cx">     if ($repetition_count === null)
</span><span class="lines">@@ -33,7 +34,10 @@
</span><span class="cx">     if (!$triggerable)
</span><span class="cx">         exit_with_error('TriggerableNotFoundForTask', array('task' =&gt; $task_id));
</span><span class="cx"> 
</span><del>-    $commit_sets = ensure_commit_sets($db, $commit_sets_info);
</del><ins>+    if ($revision_set_list)
+        $commit_sets = commit_sets_from_revision_sets($db, $revision_set_list);
+    else // V2 UI compatibility
+        $commit_sets = ensure_commit_sets($db, $commit_sets_info);
</ins><span class="cx"> 
</span><span class="cx">     $db-&gt;begin_transaction();
</span><span class="cx"> 
</span><span class="lines">@@ -67,9 +71,36 @@
</span><span class="cx">     exit_with_success(array('testGroupId' =&gt; $group_id));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function commit_sets_from_revision_sets($db, $revision_set_list)
+{
+    if (count($revision_set_list) &lt; 2)
+        exit_with_error('InvalidRevisionSets', array('revisionSets' =&gt; $revision_set_list));
+
+    $commit_set_list = array();
+    foreach ($revision_set_list as $revision_set) {
+        $commit_set = array();
+
+        if (!count($revision_set))
+            exit_with_error('InvalidRevisionSets', array('revisionSets' =&gt; $revision_set_list));
+
+        foreach ($revision_set as $repository_id =&gt; $revision) {
+            if (!is_numeric($repository_id))
+                exit_with_error('InvalidRepository', array('repository' =&gt; $repository_id));
+            $commit = $db-&gt;select_first_row('commits', 'commit',
+                array('repository' =&gt; intval($repository_id), 'revision' =&gt; $revision));
+            if (!$commit)
+                exit_with_error('RevisionNotFound', array('repository' =&gt; $repository_id, 'revision' =&gt; $revision));
+            array_push($commit_set, $commit['commit_id']);
+        }
+        array_push($commit_set_list, $commit_set);
+    }
+
+    return $commit_set_list;
+}
+
</ins><span class="cx"> function ensure_commit_sets($db, $commit_sets_info) {
</span><span class="cx">     $repository_name_to_id = array();
</span><del>-    foreach ($db-&gt;fetch_table('repositories') as $row)
</del><ins>+    foreach ($db-&gt;select_rows('repositories', 'repository', array('owner' =&gt; NULL)) as $row)
</ins><span class="cx">         $repository_name_to_id[$row['repository_name']] = $row['repository_id'];
</span><span class="cx"> 
</span><span class="cx">     $commit_sets = array();
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3modelstestgroupjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/models/test-group.js (214313 => 214314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/models/test-group.js        2017-03-23 20:31:18 UTC (rev 214313)
+++ trunk/Websites/perf.webkit.org/public/v3/models/test-group.js        2017-03-23 20:54:39 UTC (rev 214314)
</span><span class="lines">@@ -199,11 +199,21 @@
</span><span class="cx"> 
</span><span class="cx">     static createAndRefetchTestGroups(task, name, repetitionCount, commitSets)
</span><span class="cx">     {
</span><ins>+        console.assert(commitSets.length == 2);
+
+        const revisionSets = commitSets.map((commitSet) =&gt; {
+            console.assert(commitSet instanceof CustomCommitSet || commitSet instanceof CommitSet);
+            const revisionSet = {};
+            for (let repository of commitSet.repositories())
+                revisionSet[repository.id()] = commitSet.revisionForRepository(repository);
+            return revisionSet;
+        });
+
</ins><span class="cx">         return PrivilegedAPI.sendRequest('create-test-group', {
</span><span class="cx">             task: task.id(),
</span><span class="cx">             name: name,
</span><span class="cx">             repetitionCount: repetitionCount,
</span><del>-            commitSets: commitSets,
</del><ins>+            revisionSets: revisionSets,
</ins><span class="cx">         }).then((data) =&gt; {
</span><span class="cx">             return this.cachedFetch('/api/test-groups', {task: task.id()}, true).then((data) =&gt; this._createModelsFromFetchedTestGroups(data));
</span><span class="cx">         });
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js (214313 => 214314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2017-03-23 20:31:18 UTC (rev 214313)
+++ trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2017-03-23 20:54:39 UTC (rev 214314)
</span><span class="lines">@@ -546,40 +546,31 @@
</span><span class="cx"> 
</span><span class="cx">     _createTestGroupAfterVerifyingCommitSetList(testGroupName, repetitionCount, commitSetMap)
</span><span class="cx">     {
</span><del>-        if (this._hasDuplicateTestGroupName(testGroupName))
</del><ins>+        if (this._hasDuplicateTestGroupName(testGroupName)) {
</ins><span class="cx">             alert(`There is already a test group named &quot;${testGroupName}&quot;`);
</span><del>-
-        const commitSetsByName = {};
-        let firstLabel;
-        for (firstLabel in commitSetMap) {
-            const commitSet = commitSetMap[firstLabel];
-            for (let repository of commitSet.repositories())
-                commitSetsByName[repository.name()] = [];
-            break;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        let setIndex = 0;
-        for (let label in commitSetMap) {
-            const commitSet = commitSetMap[label];
</del><ins>+        const firstLabel = Object.keys(commitSetMap)[0];
+        const firstCommitSet = commitSetMap[firstLabel];
+
+        for (let currentLabel in commitSetMap) {
+            const commitSet = commitSetMap[currentLabel];
</ins><span class="cx">             for (let repository of commitSet.repositories()) {
</span><del>-                const list = commitSetsByName[repository.name()];
-                if (!list) {
-                    alert(`Set ${label} specifies ${repository.label()} but set ${firstLabel} does not.`);
-                    return null;
-                }
-                list.push(commitSet.revisionForRepository(repository));
</del><ins>+                if (!firstCommitSet.revisionForRepository(repository))
+                    return alert(`Set ${currentLabel} specifies ${repository.label()} but set ${firstLabel} does not.`);
</ins><span class="cx">             }
</span><del>-            setIndex++;
-            for (let name in commitSetsByName) {
-                const list = commitSetsByName[name];
-                if (list.length &lt; setIndex) {
-                    alert(`Set ${firstLabel} specifies ${name} but set ${label} does not.`);
-                    return null;
-                }
</del><ins>+            for (let repository of firstCommitSet.repositories()) {
+                if (!commitSet.revisionForRepository(repository))
+                    return alert(`Set ${firstLabel} specifies ${repository.label()} but set ${currentLabel} does not.`);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        TestGroup.createAndRefetchTestGroups(this._task, testGroupName, repetitionCount, commitSetsByName)
</del><ins>+        const commitSets = [];
+        for (let label in commitSetMap)
+            commitSets.push(commitSetMap[label]);
+
+        TestGroup.createAndRefetchTestGroups(this._task, testGroupName, repetitionCount, commitSets)
</ins><span class="cx">             .then(this._didFetchTestGroups.bind(this), function (error) {
</span><span class="cx">             alert('Failed to create a new test group: ' + error);
</span><span class="cx">         });
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgservertestsprivilegedapicreatetestgrouptestsjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js (214313 => 214314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js        2017-03-23 20:31:18 UTC (rev 214313)
+++ trunk/Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js        2017-03-23 20:54:39 UTC (rev 214314)
</span><span class="lines">@@ -205,6 +205,28 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><ins>+    it('should return &quot;InvalidRevisionSets&quot; when a revision set is empty', () =&gt; {
+        return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
+            const webkit = Repository.all().find((repository) =&gt; repository.name() == 'WebKit');
+            return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, revisionSets: [{[webkit.id()]: '191622'}, {}]}).then((content) =&gt; {
+                assert(false, 'should never be reached');
+            }, (error) =&gt; {
+                assert.equal(error, 'InvalidRevisionSets');
+            });
+        });
+    });
+
+    it('should return &quot;InvalidRevisionSets&quot; when the number of revision sets is less than two', () =&gt; {
+        return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
+            const webkit = Repository.all().find((repository) =&gt; repository.name() == 'WebKit');
+            return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, revisionSets: [{[webkit.id()]: '191622'}]}).then((content) =&gt; {
+                assert(false, 'should never be reached');
+            }, (error) =&gt; {
+                assert.equal(error, 'InvalidRevisionSets');
+            });
+        });
+    });
+
</ins><span class="cx">     it('should return &quot;RepositoryNotFound&quot; when commit sets contains an invalid repository', () =&gt; {
</span><span class="cx">         return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
</span><span class="cx">             return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, commitSets: {'Foo': []}}).then((content) =&gt; {
</span><span class="lines">@@ -225,6 +247,27 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><ins>+    it('should return &quot;RevisionNotFound&quot; when revision sets contains an invalid revision', () =&gt; {
+        return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
+            const webkit = Repository.all().find((repository) =&gt; repository.name() == 'WebKit');
+            return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, revisionSets: [{[webkit.id()]: '191622'}, {[webkit.id()]: '1'}]}).then((content) =&gt; {
+                assert(false, 'should never be reached');
+            }, (error) =&gt; {
+                assert.equal(error, 'RevisionNotFound');
+            });
+        });
+    });
+
+    it('should return &quot;InvalidRepository&quot; when a revision set uses a repository name instead of a repository id', () =&gt; {
+        return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
+            return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, revisionSets: [{'WebKit': '191622'}, {}]}).then((content) =&gt; {
+                assert(false, 'should never be reached');
+            }, (error) =&gt; {
+                assert.equal(error, 'InvalidRepository');
+            });
+        });
+    });
+
</ins><span class="cx">     it('should return &quot;InvalidCommitSets&quot; when commit sets contains an inconsistent number of revisions', () =&gt; {
</span><span class="cx">         return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
</span><span class="cx">             return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, commitSets: {'WebKit': ['191622', '191623'], 'macOS': ['15A284']}}).then((content) =&gt; {
</span><span class="lines">@@ -235,7 +278,7 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    it('should create a test group with the repetition count of one when repetitionCount is omitted', () =&gt; {
</del><ins>+    it('should create a test group from commitSets with the repetition count of one when repetitionCount is omitted', () =&gt; {
</ins><span class="cx">         return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
</span><span class="cx">             let insertedGroupId;
</span><span class="cx">             return PrivilegedAPI.sendRequest('create-test-group', {name: 'test', task: taskId, commitSets: {'WebKit': ['191622', '191623']}}).then((content) =&gt; {
</span><span class="lines">@@ -257,6 +300,30 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><ins>+    it('should create a test group from revisionSets with the repetition count of one when repetitionCount is omitted', () =&gt; {
+        return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
+            const webkit = Repository.all().find((repository) =&gt; repository.name() == 'WebKit');
+            const params = {name: 'test', task: taskId, revisionSets: [{[webkit.id()]: '191622'}, {[webkit.id()]: '191623'}]};
+            let insertedGroupId;
+            return PrivilegedAPI.sendRequest('create-test-group', params).then((content) =&gt; {
+                insertedGroupId = content['testGroupId'];
+                return TestGroup.fetchByTask(taskId);
+            }).then((testGroups) =&gt; {
+                assert.equal(testGroups.length, 1);
+                const group = testGroups[0];
+                assert.equal(group.id(), insertedGroupId);
+                assert.equal(group.repetitionCount(), 1);
+                const requests = group.buildRequests();
+                assert.equal(requests.length, 2);
+                const webkit = Repository.all().filter((repository) =&gt; repository.name() == 'WebKit')[0];
+                assert.deepEqual(requests[0].commitSet().repositories(), [webkit]);
+                assert.deepEqual(requests[1].commitSet().repositories(), [webkit]);
+                assert.equal(requests[0].commitSet().revisionForRepository(webkit), '191622');
+                assert.equal(requests[1].commitSet().revisionForRepository(webkit), '191623');
+            });
+        });
+    });
+
</ins><span class="cx">     it('should create a test group with the repetition count of two with two repositories', () =&gt; {
</span><span class="cx">         return addTriggerableAndCreateTask('some task').then((taskId) =&gt; {
</span><span class="cx">             let insertedGroupId;
</span></span></pre>
</div>
</div>

</body>
</html>