[webkit-reviews] review denied: [Bug 223886] [perf dashboard] Add sequential mode for perf dashboard A/B testing. : [Attachment 426409] Patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Tue Apr 20 02:15:59 PDT 2021


Ryosuke Niwa <rniwa at webkit.org> has denied dewei_zhu at apple.com's request for
review:
Bug 223886: [perf dashboard] Add sequential mode for perf dashboard A/B
testing.
https://bugs.webkit.org/show_bug.cgi?id=223886

Attachment 426409: Patch

https://bugs.webkit.org/attachment.cgi?id=426409&action=review




--- Comment #13 from Ryosuke Niwa <rniwa at webkit.org> ---
Comment on attachment 426409
  --> https://bugs.webkit.org/attachment.cgi?id=426409
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=426409&action=review

> Websites/perf.webkit.org/ChangeLog:15
> +	   Add retry logic for 'sequential' A/B testing and vove retry logic
into syncing script so that retry can be

Nit: vove??

> Websites/perf.webkit.org/ChangeLog:19
> +	   Fix a potential race in syncing script that 'Promise.all' may cause
test group not scheduled in order .

Nit: space between order and .

> Websites/perf.webkit.org/init-database.sql:295
> +    testgroup_repetition_type varchar(32) DEFAULT 'alternating',

We should enum as I mention above.

> Websites/perf.webkit.org/public/include/commit-sets-helpers.php:27
> +    } else {
> +	   for ($i = 0; $i < $repetition_count; $i++) {

We should assert that $repetition_type is alternating here.

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:33
> +    $is_sequential_type = $test_group['testgroup_repetition_type'] ==
'sequential';

Please assert that testgroup_repetition_type is either alternating or
sequential.

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:43
> +function add_build_request_for_sequential_test_group($db, $build_requests,
$add_count, $commit_set_id)
> +{

Please flip the order in which functions are defined so that the diff will look
saner.

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:48
> -    foreach ($existing_build_requests as $build_request) {
> +    foreach ($build_requests as $build_request) {

Why are we renaming this? They're clearly existing build requests.
It's important for clarify since this whole function is about adding new ones.

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:56
> +	   if (is_null($commit_set_id) || $requested_commit_set ==
$commit_set_id)

Just check !$commit_set_id || $requested_commit_set == $commit_set_id

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:59
>	   $build_request_by_commit_set[$requested_commit_set] =
$build_request;

So the only reason have this dictionary is to get the order of the last build
request.
It's very confusing / misleadingly generic to have this &
order_incremental_by_commit_set.

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:61
> +	   if (count($commit_sets)) {

Just do: if ($commit_sets)

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:63
> +	       $order_incremental_by_commit_set[$requested_commit_set] =
$current_order_incremental;
> +	       $current_order_incremental += $add_count;

This whole incremental thing is rather confusing.
Logically, each build request could only move by the number of build requests
added before it.
But that could be either $add_count or $add_count * (the position of
$commit_set in $commit_sets).

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:75
> +	   $db->query('UPDATE build_requests SET request_order = request_order
+ $1 WHERE request_commit_set = $2',
> +	       array($incremental, $commit_set));

It's not safe to assume that request_commit_set will uniquely identify a test
group. Please specify the group.
This also looks wrong. Because we have a unique constraint on (request_group,
request_order),
this will fail if commit_set_id wasn't set so that we'd try to add more build
requests to every commit set
since then request_order will start overlapping with later build requests.
r- because of this bug. I guess we don't have any tests for this case?

I suggest we rewrite this so that we iterate over all commits sets in the
reverse order,
and update build requests for each commit set (and test group).

> Websites/perf.webkit.org/public/privileged-api/add-build-requests.php:106
> +    if (!is_null($commit_set_id) && !count($commit_sets))
> +	   exit_with_error('CommitSetNotInTestGroup', array('commitSet' =>
$commit_set_id));

The first check for commit_set_id is redundant since we never use the value of
commit_set_id.

> Websites/perf.webkit.org/public/v3/components/test-group-form.js:74
> +		   <option selected value="alternating">alternating
(ABAB)</option>
> +		   <option value="sequential">sequential (AABB)</option>

This should be nouns: "alternative" and "sequence", not adjectives.

> Websites/perf.webkit.org/public/v3/models/test-group.js:113
> +	   const buildRequests =
this.requestsForCommitSet(commitSet).filter((buildRequest) =>
buildRequest.isTest());
> +	   const completedBuildRequestCount =
buildRequests.filter((buildRequest) => buildRequest.hasCompleted()).length;
> +	   const unfinishedBuildRequestCount =
buildRequests.filter((buildRequest) => !buildRequest.hasFinished()).length;

This is very inefficient way of counting these two values. I think we should
just loop over this._buildRequests like this:
for (const request of this._buildRequests) {
    if (request.commitSet() != commitSet || !request.isTest())
	continue;
    completedBuildRequestCount += request.hasCompleted();
    unfinishedBuildRequestCount += buildRequest.hasFinished();
}

> Websites/perf.webkit.org/public/v3/models/test-group.js:276
> -    static createWithTask(taskName, platform, test, groupName,
repetitionCount, commitSets, notifyOnCompletion)
> +    static async createWithTask(taskName, platform, test, groupName,
repetitionCount, commitSets, notifyOnCompletion, repetitionType)

For consistency, let's add repetitionType to right after repetitionCount.

> Websites/perf.webkit.org/public/v3/models/test-group.js:281
> +	   const params = {taskName, name: groupName, platform: platform.id(),
test: test.id(), repetitionCount,
> +	       revisionSets, repetitionType, needsNotification:
!!notifyOnCompletion};

It seems like we can just inline params to the function call of
PrivilegedAPI.sendRequest now?

> Websites/perf.webkit.org/public/v3/models/test-group.js:288
> -    static createWithCustomConfiguration(task, platform, test, groupName,
repetitionCount, commitSets, notifyOnCompletion)
> +    static async createWithCustomConfiguration(task, platform, test,
groupName, repetitionCount, commitSets, notifyOnCompletion, repetitionType)

Ditto.

> Websites/perf.webkit.org/public/v3/models/test-group.js:294
> +	   const data = await PrivilegedAPI.sendRequest('create-test-group',
params);

Ditto.

> Websites/perf.webkit.org/public/v3/models/test-group.js:295
> +	   return await this.fetchForTask(data['taskId'], true);

It seems like we can just use fetchById now? create-test-group returns
testGroupId too.

> Websites/perf.webkit.org/public/v3/models/test-group.js:298
> -    static createAndRefetchTestGroups(task, name, repetitionCount,
commitSets, notifyOnCompletion)
> +    static async createAndRefetchTestGroups(task, name, repetitionCount,
commitSets, notifyOnCompletion, repetitionType)

Ditto.

> Websites/perf.webkit.org/public/v3/models/test-group.js:306
> +	   return await this.fetchForTask(data['taskId'], true);

Ditto.

> Websites/perf.webkit.org/public/v3/models/test-group.js:314
> +    static async fetchById(testGroupId, ignoreCache=false)

Nit: space around =. Also, we should also call the first argument id.

> Websites/perf.webkit.org/public/v3/models/test-group.js:317
> +	   return this._createModelsFromFetchedTestGroups(data)[0];

This works but I think our preferred way of writing is this:
return TestGroup.findById(testGroupId).

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:28
> +	   this.part('form').listenToAction('startTesting', (repetitionCount,
name, commitSetMap, notifyOnCompletion, repetitionType) => {
> +	       this.dispatchAction('newTestGroup', name, repetitionCount,
commitSetMap, notifyOnCompletion, repetitionType);

Again, we should reorder two that repetitionType appears right after
repetitionCount for consistency.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:110
> +	   this.part('form').listenToAction('startTesting', (repetitionCount,
name, commitSetMap, notifyOnCompletion, repetitionType) => {
> +	       this.dispatchAction('newTestGroup', name, repetitionCount,
commitSetMap, notifyOnCompletion, repetitionType);

Ditto.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:271
> +	   this.part('retry-form').listenToAction('startTesting',
(repetitionCount, notifyOnCompletion, repetitionType) => {
> +	       this.dispatchAction('retryTestGroup', this._currentTestGroup,
repetitionCount, notifyOnCompletion, repetitionType);

Ditto.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:273
> -	   this.part('bisect-form').listenToAction('startTesting',
(repetitionCount, notifyOnCompletion) => {
> +	   this.part('bisect-form').listenToAction('startTesting',
(repetitionCount, notifyOnCompletion, repetitionType) => {

Ditto.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:384
> +	       if (currentGroup.hasRetries()) {
> +		   statusSummary = this.createElement('div', {id:
'status-summary', class: 'summary'},
> +		       this._summarizedTestGroup(currentGroup));
> +	       }

This is very confusing. This function is really about summarizing retries.
We should be re-using the element in the DOM and simply calling renderReplace
on this.content('status-summary').
The element should probably be renamed to retry-summary.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:388
> +		   `Scheduled ${authoredBy}at ${currentGroup.createdAt()}`);

Nit: Missing space between ${authoredBy} and at. The original code was better
for that reason.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:391
> +	       hideButton = this.createElement('button', {'id': 'hide-button'},
> +		   currentGroup.isHidden() ? 'Unhide' : 'Hide');

Again, we shouldn't be re-constructing button every single time.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:406
> +	   this.renderReplace(this.content('test-group-details'), [
> +	       this.content('results-viewer'), this.content('revision-table'),
statusSummary, requestSummary,
> +	       retryForm, bisectForm, hideButton, pendingRequestCancelWarning
> +	   ].filter(element => !!element));

Ugh... this will re-generate the entire DOM. I don't think we should do that.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:418
> +		   testGroup.repetitionCountForCommitSet(commitSet) -
testGroup.initialRepetitionCount());

Why are we re-computing retry count here??
Just call testGroup.retryCountForCommitSet.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:419
> +	       currentLabel = String.fromCharCode(currentLabel.charCodeAt(0) +
1);

Use testGroup.labelForCommitSet instead.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:422
> +	   const retryCountsAreIdentical =
testGroup.requestedCommitSets().every((commitSet) =>
> +	       retryCountByLabel.get(commitSet) ===
retryCountByLabel.get(currentLabel));

It seems like this should really be a helper function on TestGroup.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:426
> +	   if (retryCountsAreIdentical)
> +	       return `${testGroup.initialRepetitionCount()} requested,
> +		   ${retryCountByLabel.get(currentLabel)} added due to
failures.`;

Two line statements like these require curly braces: { ~ }
Since testGroup.initialRepetitionCount() is used many times in this function,
we might as well as just store in a local variable instead so that this whole
thing fits in a single line.

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:435
> +	   const retrySummary = retrySummaryParts.length === 1 ?
retrySummaryParts[0] :
> +	       `${retrySummaryParts.slice(0, -1).join(', ')} and
${retrySummaryParts[retrySummaryParts.length - 1]}`;

Use new Intl.ListFormat('en', {style:'long', type:'conjunction'}).format(~)?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Object
s/Intl/ListFormat/ListFormat

> Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js:917
> -    _createTestGroupAfterVerifyingCommitSetList(testGroupName,
repetitionCount, commitSetMap, notifyOnCompletion)
> +    _createTestGroupAfterVerifyingCommitSetList(testGroupName,
repetitionCount, commitSetMap, notifyOnCompletion, repetitionType)

Maybe make this function async as well?

> Websites/perf.webkit.org/public/v3/pages/chart-pane.js:111
> +	   this._repetitionType = 'alternating';

Looks like this variable is never used now? So maybe remove it?

> Websites/perf.webkit.org/public/v3/pages/chart-pane.js:131
> +	   repetitionType.onchange = () => this._repetitionType =
repetitionType.value;

Ditto.

> Websites/perf.webkit.org/public/v3/pages/chart-pane.js:602
> +				   <option value="alternating"
selected>alternating (ABAB)</option>
> +				   <option value="sequential">sequential
(AABB)</option>

Again, this should read "In alternate (ABAB)" / "In sequence (AABB)"

> Websites/perf.webkit.org/public/v3/pages/create-analysis-task-page.js:25
> -    _createAnalysisTaskWithGroup(repetitionCount, testGroupName, commitSets,
platform, test, taskName, notifyOnCompletion)
> +    async _createAnalysisTaskWithGroup(repetitionCount, testGroupName,
commitSets, platform, test, taskName, notifyOnCompletion, repetitionType)

Ditto about putting repetitionType right after repetitionCount.

> Websites/perf.webkit.org/server-tests/api-build-requests-tests.js:570
> +    it('should still return build requests associated with a given
triggerable when test group has all build requests finished with
"mayNeedMoreRequest" flag to be trues', () => {
> +	   return MockData.addMockData(TestServer.database(), ['completed',
'completed', 'completed', 'failed'], true, null, null, 'alternating',
true).then(() => {

Use async?

> Websites/perf.webkit.org/server-tests/api-build-requests-tests.js:578
> +	       assert.deepStrictEqual(content['commitSets'][0].revisionItems,
> +		   [{commit: '87832', commitOwner: null, patch: null,
requiresBuild: false, rootFile: null}, {commit: '93116', commitOwner: null,
patch: null, requiresBuild: false, rootFile: null}]);

Please insert another line break in this long line.

> Websites/perf.webkit.org/server-tests/api-build-requests-tests.js:581
> +	       assert.deepStrictEqual(content['commitSets'][1].revisionItems,
> +		   [{commit: '87832', commitOwner: null, patch: null,
requiresBuild: false, rootFile: null}, {commit: '96336', commitOwner: null,
patch: null, requiresBuild: false, rootFile: null}]);

Ditto.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:149
> +	   for (const commitSet of group.requestedCommitSets())
> +	      
assert.strictEqual(parseInt(group.repetitionCountForCommitSet(commitSet)), 2);

Just use + here. parseInt is overly permissive (like atoi, it would ignore
trailing non-digit characters).

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:157
> +	   for (const commitSet of updatedGroups[0].requestedCommitSets())
> +	      
assert.strictEqual(parseInt(updatedGroups[0].repetitionCountForCommitSet(commit
Set)), 4);

Ditto.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:181
> +	   for (const commitSet of group.requestedCommitSets())
> +	      
assert.strictEqual(parseInt(group.repetitionCountForCommitSet(commitSet)), 2);

Ditto.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:192
> +	   let result = await PrivilegedAPI.sendRequest('create-test-group',

const?

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:198
> +	   const testGroups = await TestGroup.fetchForTask(result['taskId'],
true);

Please add /* noCache */ or define a local variable like const noCache = true,
to make it clear what this true is.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:203
> +	   assert.strictEqual(parseInt(group.initialRepetitionCount()), 2);

Ditto about using + and the rest of tests.
We should also assert that the repetition type retuned by the server is
"sequential"

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:205
> +	   for (const commitSet of group.requestedCommitSets())
> +	      
assert.strictEqual(parseInt(group.repetitionCountForCommitSet(commitSet)), 2);

We should also assert that requestedCommitSets().length is 2.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:207
> +	   const commitSet = testGroups[0].requestedCommitSets()[1].id();

Add assertions for order.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:211
> +	   const updatedGroups = await TestGroup.fetchForTask(result['taskId'],
true);

Ditto about true.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:215
> +	   const firstCommitSet = updatedGroups[0].requestedCommitSets()[0];

Need an assert for the length of commit sets here as well.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:221
> +	   assert.strictEqual(buildRequestsForSecondCommitSet.length, 4);

Ditto about needing tests for order.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:224
> +    it('should add build requests right after requests with same commit set
for sequential test group', async () => {

This is very wordy. How about this:
it should be able to build requests for a specific commit set in a sequential
test group.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:230
> +	       {name: 'test', taskName: 'other task', platform:
MockData.somePlatformId(), repetitionCount: 2,
> +		   test: MockData.someTestId(), needsNotification: false,
repetitionType: 'sequential', revisionSets});

I don't think we should be nesting the indentation here.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:237
> +	   assert.strictEqual(parseInt(group.initialRepetitionCount()), 2);

Use + here too. But we should also assert that the repetition type is
"sequential".

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:239
> +	      
assert.strictEqual(parseInt(group.repetitionCountForCommitSet(commitSet)), 2);

We need to assert order here as well as the number of distinct commit sets.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:251
> +	   assert.strictEqual(buildRequestsForFirstCommitSet[3].order(), 3)

We probably want to check all the orders here.
We should also make sure build requests kept the same IDs & retained the
original sorting order
e.g. 1st build request for a commit set didn't become 3rd, etc...
So just store the build request IDs early, and then assert that they're in the
same order here.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:260
> +    it('should not shift request order if adding build request to commit set
representing last configuration in sequential test group', async () => {

Hm... what's important here is the fact the order of the first configuration so
I'd rephrase it like this:
it should not modify the order of preceding build requests when adding new
build requests in a sequential test group

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:264
> +	   let result = await PrivilegedAPI.sendRequest('create-test-group',

const?

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:266
> +	       {name: 'test', taskName: 'other task', platform:
MockData.somePlatformId(), repetitionCount: 2,
> +		   test: MockData.someTestId(), needsNotification: false,
repetitionType: 'sequential', revisionSets});

Wrong indentation again.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:269
> +	   const testGroups = await TestGroup.fetchForTask(result['taskId'],
true);

Ditto about noCache.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:274
> +	   for (const commitSet of group.requestedCommitSets())

Same thing about the number of distinct commit sets & order.

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:318
> +	   await assertThrows('CommitSetNotInTestGroup', () =>
> +	       PrivilegedAPI.sendRequest('add-build-requests', {group:
insertedGroupId, addCount: 2, commitSet}));

Maybe we need another test case for a sequential test group?

>
Websites/perf.webkit.org/server-tests/privileged-api-add-build-requests-tests.j
s:341
> +	   await assertThrows('InvalidCommitSet', () =>
> +	       PrivilegedAPI.sendRequest('add-build-requests', {group:
insertedGroupId, addCount: 2, commitSet}));

Ditto.

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:686
> +    it('should create an analysis task with test group with "sequential"
mode when specified', async () => {

I think we can just say:
it should be able to create an analysis task with a sequential test group

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:694
> +	   await db.insert('tests', {id: 1, name: 'Suite'});
> +	   await db.insert('tests', {id: test1Id, name: 'test1', parent: 1});

Do we really need two tests? It seems like one test will be enough?

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:735
> +	   assert.ok(testGroup.needsNotification());

Check the repetition type & repetition count here too?

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:754
> +    it('should reject with "InvalidRepetitionType" when test mode is neither
"alternating" nor "sequential"', async () => {

Is "test mode" the old terminology we used?
We should be consistent and say the "repetition type".
Also, I think this will read better: "not 'alternating' or 'sequential'"

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:757
> +	   const test1Id = 2;

Hm... maybe subTestId? "test1" is so non-descriptive.

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:762
> +	   await db.insert('tests', {id: 1, name: 'Suite'});
> +	   await db.insert('tests', {id: test1Id, name: 'test1', parent: 1});

Do we really need two tests? It seems like a single test will suffice for this
test??

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:776
> +	   let test1 = Test.findById(test1Id);
> +	   let somePlatform = Platform.findById(platformId);

const?

>
Websites/perf.webkit.org/server-tests/privileged-api-create-analysis-task-tests
.js:786
> +	   await assertThrows('InvalidRepetitionType', () =>
> +	       PrivilegedAPI.sendRequest('create-analysis-task', {name:
'confirm', repetitionCount: 2,
> +		   testGroupName: 'Confirm', revisionSets: [oneRevisionSet,
anotherRevisionSet], repetitionType: 'invalid-mode',
> +		   startRun: testRuns[0]['id'], endRun: testRuns[1]['id'],
needsNotification: true}));

These multiple line statements need { ~ }

>
Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js
:1342
> +    it('should create a test group with an analysis task with "sequential"
mode', async () => {

just say: should create a sequential test group with an analysis task

>
Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js
:1357
> +	   assert.strictEqual(group.initialRepetitionCount(), 2);

Check the repetition type.

>
Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js
:1367
> +	   assert(requests[0].commitSet().equals(requests[1].commitSet()));

Let's first assert that the number of distinct commit sets is 2.

>
Websites/perf.webkit.org/server-tests/privileged-api-create-test-group-tests.js
:1380
> +    it('should reject with "InvalidMode" if test mode is neither
"alternating" nor "sequential"', async () => {

Ditto about the test name.

>
Websites/perf.webkit.org/server-tests/privileged-api-update-test-group-tests.js
:280
> +    it('should cancel a test group with "may_need_more_requests" flag
cleared', async () => {

I think it would be better to say:
should be able to cancel a test group and the "may need more requests" flag

There is no reason to put the exact database column name in the description.

>
Websites/perf.webkit.org/server-tests/privileged-api-update-test-group-tests.js
:285
> +	   const result = await PrivilegedAPI.sendRequest('create-test-group',
> +	       {name: 'test', taskName: 'other task', platform:
MockData.somePlatformId(), test: MockData.someTestId(), needsNotification:
false, revisionSets});

Should we add another test case for a sequential test group?

> Websites/perf.webkit.org/server-tests/resources/mock-data.js:67
> +    addMockData: function (db, statusList, needsNotification = true, urlList
= null, commitSetList = null, repetitionType='alternating',
mayNeedMoreRequests=false)

Haha, you fixed the existing code but then forgot to add spaces around = in the
new arguments :)


More information about the webkit-reviews mailing list