In `markConclusion` do not throw exception if remainingJobs is zero (#5113)
In `markConclusion` do not throw exception if remainingJobs is zero but keep it zero
fix: https://github.com/flutter/flutter/issues/189989
diff --git a/app_dart/lib/src/service/firestore/unified_check_run.dart b/app_dart/lib/src/service/firestore/unified_check_run.dart
index 81bafcf..dcb0d89 100644
--- a/app_dart/lib/src/service/firestore/unified_check_run.dart
+++ b/app_dart/lib/src/service/firestore/unified_check_run.dart
@@ -615,11 +615,15 @@
// So if the test existed and either remaining or failed_count is changed;
// the response is valid.
if (state.status.isComplete) {
- // Guard against going negative and log enough info so we can debug.
- if (remaining == 0) {
- throw '$logCrumb: field "${PresubmitGuard.fieldRemainingJobs}" is already zero for $transaction / ${presubmitGuardDocument.fields}';
+ // If remaining is 0 we should not decrement it and we should log
+ // this fact.
+ if (remaining > 0) {
+ remaining -= 1;
+ } else {
+ log.error(
+ '$logCrumb: field "${PresubmitGuard.fieldRemainingJobs}" is already zero for $transaction / ${presubmitGuardDocument.fields}',
+ );
}
- remaining -= 1;
valid = true;
}
diff --git a/app_dart/test/service/firestore/unified_check_run_test.dart b/app_dart/test/service/firestore/unified_check_run_test.dart
index c9353b5..dfb3d79 100644
--- a/app_dart/test/service/firestore/unified_check_run_test.dart
+++ b/app_dart/test/service/firestore/unified_check_run_test.dart
@@ -326,6 +326,51 @@
expect(checkDoc.buildNumber, 456);
expect(checkDoc.buildId, Int64.MAX_VALUE);
});
+ test('keeps remaining jobs at 0 if it is already 0', () async {
+ final guardDoc = await firestoreService.getDocument(
+ 'projects/flutter-dashboard/databases/cocoon/documents/presubmit_guards/${guardId.documentId}',
+ );
+ final guard = PresubmitGuard.fromDocument(guardDoc);
+ guard.remainingJobs = 0;
+ await firestoreService.writeViaTransaction(
+ documentsToWrites([guard], exists: true),
+ );
+
+ final state = const PresubmitJobState(
+ jobName: 'linux',
+ status: TaskStatus.succeeded,
+ attemptNumber: 1,
+ startTime: 2000,
+ endTime: 3000,
+ );
+
+ final result = await UnifiedCheckRun.markConclusion(
+ firestoreService: firestoreService,
+ guardId: guardId,
+ state: state,
+ );
+
+ expect(result.result, PresubmitGuardConclusionResult.ok);
+ expect(result.remaining, 0);
+
+ final updatedGuardDoc = await firestoreService.getDocument(
+ 'projects/flutter-dashboard/databases/cocoon/documents/presubmit_guards/${guardId.documentId}',
+ );
+ final updatedGuard = PresubmitGuard.fromDocument(updatedGuardDoc);
+ expect(updatedGuard.remainingJobs, 0);
+ expect(updatedGuard.jobs['linux'], TaskStatus.succeeded);
+
+ final checkDoc = await PresubmitJob.fromFirestore(
+ firestoreService,
+ PresubmitJobId(
+ slug: slug,
+ checkRunId: 123,
+ jobName: 'linux',
+ attemptNumber: 1,
+ ),
+ );
+ expect(checkDoc.status, TaskStatus.succeeded);
+ });
});
group('reInitializeFailedChecks', () {
late PresubmitGuardId fusionGuardId;