diff --git a/app_dart/lib/server.dart b/app_dart/lib/server.dart index 6457eee21..3291b1319 100644 --- a/app_dart/lib/server.dart +++ b/app_dart/lib/server.dart @@ -7,9 +7,9 @@ import 'dart:math'; import 'cocoon_service.dart'; import 'src/request_handlers/get_engine_artifacts_ready.dart'; -import 'src/request_handlers/get_presubmit_checks.dart'; import 'src/request_handlers/get_presubmit_guard.dart'; import 'src/request_handlers/get_presubmit_guard_summaries.dart'; +import 'src/request_handlers/get_presubmit_jobs.dart'; import 'src/request_handlers/get_tree_status_changes.dart'; import 'src/request_handlers/github_webhook_replay.dart'; import 'src/request_handlers/lookup_hash.dart'; @@ -196,7 +196,7 @@ Server createServer({ authenticationProvider: authProvider, firestore: firestore, ), - '/api/get-presubmit-checks': GetPresubmitChecks( + '/api/get-presubmit-jobs': GetPresubmitJobs( config: config, authenticationProvider: authProvider, firestore: firestore, diff --git a/app_dart/lib/src/model/common/failed_presubmit_checks.dart b/app_dart/lib/src/model/common/failed_presubmit_jobs.dart similarity index 69% rename from app_dart/lib/src/model/common/failed_presubmit_checks.dart rename to app_dart/lib/src/model/common/failed_presubmit_jobs.dart index 329467a22..6bcc42ca6 100644 --- a/app_dart/lib/src/model/common/failed_presubmit_checks.dart +++ b/app_dart/lib/src/model/common/failed_presubmit_jobs.dart @@ -2,22 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/// @docImport 'failed_presubmit_checks.dart'; +/// @docImport 'failed_presubmit_jobs.dart'; library; import 'package:github/github.dart'; import '../firestore/base.dart'; -/// Contains the list of failed checks that are proposed to be re-run. +/// Contains the list of failed jobs that are proposed to be re-run. /// -/// See: [UnifiedCheckRun.reInitializeFailedChecks] -class FailedChecksForRerun { +/// See: [UnifiedCheckRun.reInitializeFailedJobs] +class FailedJobsForRerun { final CheckRun checkRunGuard; final CiStage stage; final List checkNames; - const FailedChecksForRerun({ + const FailedJobsForRerun({ required this.checkRunGuard, required this.stage, required this.checkNames, @@ -26,7 +26,7 @@ class FailedChecksForRerun { @override bool operator ==(Object other) => identical(this, other) || - (other is FailedChecksForRerun && + (other is FailedJobsForRerun && other.checkRunGuard == checkRunGuard && other.stage == stage && other.checkNames == checkNames); @@ -36,5 +36,5 @@ class FailedChecksForRerun { @override String toString() => - 'FailedChecksForRerun("$checkRunGuard", "$stage", "$checkNames")'; + 'FailedJobsForRerun("$checkRunGuard", "$stage", "$checkNames")'; } diff --git a/app_dart/lib/src/model/common/presubmit_completed_check.dart b/app_dart/lib/src/model/common/presubmit_completed_check.dart index 2a9759eb0..87a76495d 100644 --- a/app_dart/lib/src/model/common/presubmit_completed_check.dart +++ b/app_dart/lib/src/model/common/presubmit_completed_check.dart @@ -15,7 +15,7 @@ import '../firestore/base.dart'; import '../firestore/presubmit_guard.dart'; import '../github/checks.dart' as cocoon_checks; import 'checks_extension.dart'; -import 'presubmit_check_state.dart'; +import 'presubmit_job_state.dart'; /// Unified representation of a completed presubmit check. /// @@ -134,8 +134,8 @@ class PresubmitCompletedCheck { ); } - PresubmitCheckState get state { - return PresubmitCheckState( + PresubmitJobState get state { + return PresubmitJobState( buildName: name, status: status, attemptNumber: attempt, diff --git a/app_dart/lib/src/model/common/presubmit_check_state.dart b/app_dart/lib/src/model/common/presubmit_job_state.dart similarity index 83% rename from app_dart/lib/src/model/common/presubmit_check_state.dart rename to app_dart/lib/src/model/common/presubmit_job_state.dart index 13eeb2a50..75c28a5dd 100644 --- a/app_dart/lib/src/model/common/presubmit_check_state.dart +++ b/app_dart/lib/src/model/common/presubmit_job_state.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/// @docImport 'presubmit_check_state.dart'; +/// @docImport 'presubmit_job_state.dart'; library; import 'package:buildbucket/buildbucket_pb.dart' as bbv2; @@ -12,7 +12,7 @@ import '../../service/luci_build_service/build_tags.dart'; import '../bbv2_extension.dart'; /// Represents the current state of a check run. -class PresubmitCheckState { +class PresubmitJobState { final String buildName; final TaskStatus status; final int attemptNumber; //static int _currentAttempt(BuildTags buildTags) @@ -21,7 +21,7 @@ class PresubmitCheckState { final String? summary; final int? buildNumber; - const PresubmitCheckState({ + const PresubmitJobState({ required this.buildName, required this.status, required this.attemptNumber, @@ -32,8 +32,8 @@ class PresubmitCheckState { }); } -extension BuildToPresubmitCheckState on bbv2.Build { - PresubmitCheckState toPresubmitCheckState() => PresubmitCheckState( +extension BuildToPresubmitJobState on bbv2.Build { + PresubmitJobState toPresubmitJobState() => PresubmitJobState( buildName: builder.builder, status: status.toTaskStatus(), attemptNumber: BuildTags.fromStringPairs(tags).currentAttempt, diff --git a/app_dart/lib/src/model/firestore/presubmit_check.dart b/app_dart/lib/src/model/firestore/presubmit_job.dart similarity index 83% rename from app_dart/lib/src/model/firestore/presubmit_check.dart rename to app_dart/lib/src/model/firestore/presubmit_job.dart index a19d0e7ed..99d0398d0 100644 --- a/app_dart/lib/src/model/firestore/presubmit_check.dart +++ b/app_dart/lib/src/model/firestore/presubmit_job.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/// @docImport 'presubmit_check.dart'; +/// @docImport 'presubmit_job.dart'; library; import 'package:buildbucket/buildbucket_pb.dart' as bbv2; @@ -16,8 +16,8 @@ import '../bbv2_extension.dart'; import 'base.dart'; @immutable -final class PresubmitCheckId extends AppDocumentId { - PresubmitCheckId({ +final class PresubmitJobId extends AppDocumentId { + PresubmitJobId({ required this.checkRunId, required this.buildName, required this.attemptNumber, @@ -33,27 +33,27 @@ final class PresubmitCheckId extends AppDocumentId { } } - /// Parse the inverse of [PresubmitCheckId.documentName]. - factory PresubmitCheckId.parse(String documentName) { + /// Parse the inverse of [PresubmitJobId.documentName]. + factory PresubmitJobId.parse(String documentName) { final result = tryParse(documentName); if (result == null) { throw FormatException( - 'Unexpected firestore presubmit check document name: "$documentName"', + 'Unexpected firestore presubmit job document name: "$documentName"', ); } return result; } - /// Tries to parse the inverse of [PresubmitCheckId.documentName]. + /// Tries to parse the inverse of [PresubmitJobId.documentName]. /// /// If could not be parsed, returns `null`. - static PresubmitCheckId? tryParse(String documentName) { + static PresubmitJobId? tryParse(String documentName) { if (_parseDocumentName.matchAsPrefix(documentName) case final match?) { final checkRunId = int.tryParse(match.group(1)!); final buildName = match.group(2)!; final attemptNumber = int.tryParse(match.group(3)!); if (checkRunId != null && attemptNumber != null) { - return PresubmitCheckId( + return PresubmitJobId( checkRunId: checkRunId, buildName: buildName, attemptNumber: attemptNumber, @@ -80,12 +80,12 @@ final class PresubmitCheckId extends AppDocumentId { } @override - AppDocumentMetadata get runtimeMetadata => - PresubmitCheck.metadata; + AppDocumentMetadata get runtimeMetadata => + PresubmitJob.metadata; } -final class PresubmitCheck extends AppDocument { - static const collectionId = 'presubmit_checks'; +final class PresubmitJob extends AppDocument { + static const collectionId = 'presubmit_jobs'; static const fieldCheckRunId = 'checkRunId'; static const fieldBuildName = 'buildName'; static const fieldBuildNumber = 'buildNumber'; @@ -96,12 +96,12 @@ final class PresubmitCheck extends AppDocument { static const fieldEndTime = 'endTime'; static const fieldSummary = 'summary'; - static AppDocumentId documentIdFor({ + static AppDocumentId documentIdFor({ required int checkRunId, required String buildName, required int attemptNumber, }) { - return PresubmitCheckId( + return PresubmitJobId( checkRunId: checkRunId, buildName: buildName, attemptNumber: attemptNumber, @@ -124,24 +124,24 @@ final class PresubmitCheck extends AppDocument { } @override - AppDocumentMetadata get runtimeMetadata => metadata; + AppDocumentMetadata get runtimeMetadata => metadata; - static final metadata = AppDocumentMetadata( + static final metadata = AppDocumentMetadata( collectionId: collectionId, - fromDocument: PresubmitCheck.fromDocument, + fromDocument: PresubmitJob.fromDocument, ); - static Future fromFirestore( + static Future fromFirestore( FirestoreService firestoreService, - AppDocumentId id, + AppDocumentId id, ) async { final document = await firestoreService.getDocument( p.posix.join(kDatabase, 'documents', collectionId, id.documentId), ); - return PresubmitCheck.fromDocument(document); + return PresubmitJob.fromDocument(document); } - factory PresubmitCheck({ + factory PresubmitJob({ required int checkRunId, required String buildName, required TaskStatus status, @@ -152,7 +152,7 @@ final class PresubmitCheck extends AppDocument { int? endTime, String? summary, }) { - return PresubmitCheck._( + return PresubmitJob._( { fieldCheckRunId: checkRunId.toValue(), fieldBuildName: buildName.toValue(), @@ -172,17 +172,17 @@ final class PresubmitCheck extends AppDocument { ); } - factory PresubmitCheck.fromDocument(Document document) { - return PresubmitCheck._(document.fields!, name: document.name!); + factory PresubmitJob.fromDocument(Document document) { + return PresubmitJob._(document.fields!, name: document.name!); } - factory PresubmitCheck.init({ + factory PresubmitJob.init({ required String buildName, required int checkRunId, required int creationTime, int? attemptNumber, }) { - return PresubmitCheck( + return PresubmitJob( buildName: buildName, attemptNumber: attemptNumber ?? 1, checkRunId: checkRunId, @@ -195,7 +195,7 @@ final class PresubmitCheck extends AppDocument { ); } - PresubmitCheck._(Map fields, {required String name}) { + PresubmitJob._(Map fields, {required String name}) { this ..fields = fields ..name = name; diff --git a/app_dart/lib/src/request_handlers/get_presubmit_checks.dart b/app_dart/lib/src/request_handlers/get_presubmit_jobs.dart similarity index 69% rename from app_dart/lib/src/request_handlers/get_presubmit_checks.dart rename to app_dart/lib/src/request_handlers/get_presubmit_jobs.dart index 3f3ced517..47f484830 100644 --- a/app_dart/lib/src/request_handlers/get_presubmit_checks.dart +++ b/app_dart/lib/src/request_handlers/get_presubmit_jobs.dart @@ -11,13 +11,13 @@ import '../../cocoon_service.dart'; import '../request_handling/api_request_handler.dart'; import '../service/firestore/unified_check_run.dart'; -/// Returns all checks for a specific presubmit check run. +/// Returns all job run attempts for a specific presubmit job. /// -/// GET: /api/get-presubmit-checks +/// GET: /api/get-presubmit-jobs /// /// Parameters: /// check_run_id: (int in query) mandatory. The GitHub Check Run ID. -/// build_name: (string in query) mandatory. The name of the check/build. +/// build_name: (string in query) mandatory. The name of the job/build. /// /// Response: Status 200 OK /// [ @@ -28,11 +28,11 @@ import '../service/firestore/unified_check_run.dart'; /// "start_time": 1620134240000, /// "end_time": 1620134250000, /// "status": "Succeeded", -/// "summary": "Check passed" +/// "summary": "Job passed" /// } /// ] -final class GetPresubmitChecks extends ApiRequestHandler { - const GetPresubmitChecks({ +final class GetPresubmitJobs extends ApiRequestHandler { + const GetPresubmitJobs({ required super.config, required super.authenticationProvider, required FirestoreService firestore, @@ -65,33 +65,33 @@ final class GetPresubmitChecks extends ApiRequestHandler { }, statusCode: HttpStatus.badRequest); } - final checks = await UnifiedCheckRun.getPresubmitCheckDetails( + final jobs = await UnifiedCheckRun.getPresubmitJobDetails( firestoreService: _firestore, checkRunId: checkRunId, buildName: buildName, ); - if (checks.isEmpty) { + if (jobs.isEmpty) { return Response.json({ 'error': - 'No checks found for check_run_id $checkRunId and build_name $buildName', + 'No jobs found for check_run_id $checkRunId and build_name $buildName', }, statusCode: HttpStatus.notFound); } - final rpcChecks = [ - for (final check in checks) - PresubmitCheckResponse( - attemptNumber: check.attemptNumber, - buildName: check.buildName, - creationTime: check.creationTime, - startTime: check.startTime, - endTime: check.endTime, - status: check.status.value, - summary: check.summary, - buildNumber: check.buildNumber, + final rpcJobs = [ + for (final job in jobs) + PresubmitJobResponse( + attemptNumber: job.attemptNumber, + buildName: job.buildName, + creationTime: job.creationTime, + startTime: job.startTime, + endTime: job.endTime, + status: job.status.value, + summary: job.summary, + buildNumber: job.buildNumber, ), ]; - return Response.json(rpcChecks); + return Response.json(rpcJobs); } } 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 8e26dddbb..bc76e6fce 100644 --- a/app_dart/lib/src/service/firestore/unified_check_run.dart +++ b/app_dart/lib/src/service/firestore/unified_check_run.dart @@ -12,13 +12,13 @@ import 'package:github/github.dart'; import 'package:googleapis/firestore/v1.dart' hide Status; import 'package:meta/meta.dart'; -import '../../model/common/failed_presubmit_checks.dart'; -import '../../model/common/presubmit_check_state.dart'; +import '../../model/common/failed_presubmit_jobs.dart'; import '../../model/common/presubmit_guard_conclusion.dart'; +import '../../model/common/presubmit_job_state.dart'; import '../../model/firestore/base.dart'; import '../../model/firestore/ci_staging.dart'; -import '../../model/firestore/presubmit_check.dart'; import '../../model/firestore/presubmit_guard.dart'; +import '../../model/firestore/presubmit_job.dart'; import '../config.dart'; import '../firestore.dart'; @@ -59,16 +59,16 @@ final class UnifiedCheckRun { failedBuilds: 0, builds: {for (final task in tasks) task: TaskStatus.waitingForBackfill}, ); - final checks = [ + final jobs = [ for (final task in tasks) - PresubmitCheck.init( + PresubmitJob.init( buildName: task, checkRunId: checkRun.id!, creationTime: creationTime, ), ]; await firestoreService.writeViaTransaction( - documentsToWrites([...checks, guard], exists: false), + documentsToWrites([...jobs, guard], exists: false), ); } else { // Initialize the CiStaging document. @@ -83,7 +83,7 @@ final class UnifiedCheckRun { } } - static Future reInitializeFailedChecks({ + static Future reInitializeFailedJobs({ required FirestoreService firestoreService, required RepositorySlug slug, required int pullRequestId, @@ -91,12 +91,12 @@ final class UnifiedCheckRun { @visibleForTesting DateTime Function() utcNow = DateTime.timestamp, }) async { final logCrumb = - 'reInitializeFailedChecks(${slug.fullName}, $pullRequestId, $checkRunId)'; + 'reInitializeFailedJobs(${slug.fullName}, $pullRequestId, $checkRunId)'; - log.info('$logCrumb Re-Running failed checks.'); + log.info('$logCrumb Re-Running failed jobs.'); final transaction = await firestoreService.beginTransaction(); - // New guard created only if previous is succeeded so failed checks might be + // New guard created only if previous is succeeded so failed jobs might be // only in latest guard. final guard = await getLatestPresubmitGuardForCheckRun( firestoreService: firestoreService, @@ -122,14 +122,14 @@ final class UnifiedCheckRun { builds[buildName] = TaskStatus.waitingForBackfill; } guard.builds = builds; - final checks = [ + final jobs = [ for (final buildName in failedBuildNames) - PresubmitCheck.init( + PresubmitJob.init( buildName: buildName, checkRunId: checkRunId, creationTime: creationTime, attemptNumber: - ((await getLatestPresubmitCheck( + ((await getLatestPresubmitJob( firestoreService: firestoreService, checkRunId: checkRunId, buildName: buildName, @@ -142,33 +142,33 @@ final class UnifiedCheckRun { try { final response = await firestoreService.commit( transaction, - documentsToWrites([...checks, guard]), + documentsToWrites([...jobs, guard]), ); log.info( '$logCrumb: results = ${response.writeResults?.map((e) => e.toJson())}', ); - return FailedChecksForRerun( + return FailedJobsForRerun( checkRunGuard: guard.checkRun, checkNames: failedBuildNames, stage: guard.stage, ); } catch (e) { - log.info('$logCrumb: failed to update presubmit check', e); + log.info('$logCrumb: failed to update presubmit job', e); rethrow; } } return null; } - /// Returns _all_ checks running against the specified github [checkRunId]. - static Future> queryAllPresubmitChecksForGuard({ + /// Returns _all_ jobs running against the specified github [checkRunId]. + static Future> queryAllPresubmitJobsForGuard({ required FirestoreService firestoreService, required int checkRunId, TaskStatus? status, String? buildName, Transaction? transaction, }) async { - return await _queryPresubmitChecks( + return await _queryPresubmitJobs( firestoreService: firestoreService, checkRunId: checkRunId, buildName: buildName, @@ -177,16 +177,16 @@ final class UnifiedCheckRun { ); } - /// Returns check for the specified github [checkRunId] and + /// Returns job for the specified github [checkRunId] and /// [buildName] and [attemptNumber]. - static Future queryPresubmitCheck({ + static Future queryPresubmitJob({ required FirestoreService firestoreService, required int checkRunId, required String buildName, required int attemptNumber, Transaction? transaction, }) async { - return (await _queryPresubmitChecks( + return (await _queryPresubmitJobs( firestoreService: firestoreService, checkRunId: checkRunId, buildName: buildName, @@ -196,15 +196,15 @@ final class UnifiedCheckRun { )).firstOrNull; } - /// Returns the latest [PresubmitCheck] for the specified github [checkRunId] and + /// Returns the latest [PresubmitJob] for the specified github [checkRunId] and /// [buildName]. - static Future getLatestPresubmitCheck({ + static Future getLatestPresubmitJob({ required FirestoreService firestoreService, required int checkRunId, required String buildName, Transaction? transaction, }) async { - return (await _queryPresubmitChecks( + return (await _queryPresubmitJobs( firestoreService: firestoreService, checkRunId: checkRunId, buildName: buildName, @@ -290,23 +290,23 @@ final class UnifiedCheckRun { return [...documents.map(PresubmitGuard.fromDocument)]; } - /// Returns detailed information for a specific presubmit check identified by + /// Returns detailed information for a specific presubmit job identified by /// [checkRunId] and [buildName]. /// /// The results are ordered by attempt number descending. - static Future> getPresubmitCheckDetails({ + static Future> getPresubmitJobDetails({ required FirestoreService firestoreService, required int checkRunId, required String buildName, }) async { - return await _queryPresubmitChecks( + return await _queryPresubmitJobs( firestoreService: firestoreService, checkRunId: checkRunId, buildName: buildName, ); } - static Future> _queryPresubmitChecks({ + static Future> _queryPresubmitJobs({ required FirestoreService firestoreService, required int checkRunId, String? buildName, @@ -315,24 +315,24 @@ final class UnifiedCheckRun { int? attemptNumber, // By default order by attempt number descending. Map? orderMap = const { - PresubmitCheck.fieldAttemptNumber: kQueryOrderDescending, + PresubmitJob.fieldAttemptNumber: kQueryOrderDescending, }, int? limit, }) async { final filterMap = { - '${PresubmitCheck.fieldCheckRunId} =': checkRunId, - '${PresubmitCheck.fieldBuildName} =': ?buildName, - '${PresubmitCheck.fieldStatus} =': ?status?.value, - '${PresubmitCheck.fieldAttemptNumber} =': ?attemptNumber, + '${PresubmitJob.fieldCheckRunId} =': checkRunId, + '${PresubmitJob.fieldBuildName} =': ?buildName, + '${PresubmitJob.fieldStatus} =': ?status?.value, + '${PresubmitJob.fieldAttemptNumber} =': ?attemptNumber, }; final documents = await firestoreService.query( - PresubmitCheck.collectionId, + PresubmitJob.collectionId, filterMap, limit: limit, orderMap: orderMap, transaction: transaction, ); - return [...documents.map(PresubmitCheck.fromDocument)]; + return [...documents.map(PresubmitJob.fromDocument)]; } /// Mark a [buildName] for a given [stage] with [conclusion]. @@ -344,7 +344,7 @@ final class UnifiedCheckRun { static Future markConclusion({ required FirestoreService firestoreService, required PresubmitGuardId guardId, - required PresubmitCheckState state, + required PresubmitJobState state, }) async { final changeCrumb = '${guardId.slug.owner}_${guardId.slug.name}_${guardId.pullRequestId}_${guardId.checkRunId}'; @@ -362,7 +362,7 @@ final class UnifiedCheckRun { var valid = false; late final PresubmitGuard presubmitGuard; - late final PresubmitCheck presubmitCheck; + late final PresubmitJob presubmitJob; // transaction block try { // First: read the fields we want to change. @@ -390,21 +390,21 @@ final class UnifiedCheckRun { checkRunGuard: presubmitGuard.checkRunJson, failed: presubmitGuard.failedBuilds, summary: - 'Check run "${state.buildName}" not present in ${guardId.stage} CI stage', + 'Job run "${state.buildName}" not present in ${guardId.stage} CI stage', details: 'Change $changeCrumb', ); } - final checkDocName = PresubmitCheck.documentNameFor( + final checkDocName = PresubmitJob.documentNameFor( checkRunId: guardId.checkRunId, buildName: state.buildName, attemptNumber: state.attemptNumber, ); - final presubmitCheckDocument = await firestoreService.getDocument( + final presubmitJobDocument = await firestoreService.getDocument( checkDocName, transaction: transaction, ); - presubmitCheck = PresubmitCheck.fromDocument(presubmitCheckDocument); + presubmitJob = PresubmitJob.fromDocument(presubmitJobDocument); remaining = presubmitGuard.remainingBuilds; failed = presubmitGuard.failedBuilds; @@ -413,15 +413,15 @@ final class UnifiedCheckRun { // If build is waiting for backfill, that means its initiated by github // or re-run. So no processing needed, we should only update appropriate - // checks with that [TaskStatus] + // jobs with that [TaskStatus] if (state.status == TaskStatus.waitingForBackfill) { status = state.status; valid = true; - // If build is in progress, we should update apropriate checks with start + // If build is in progress, we should update apropriate jobs with start // time and their status to that [TaskStatus] only if the build is not // completed. } else if (state.status == TaskStatus.inProgress) { - presubmitCheck.startTime = state.startTime!; + presubmitJob.startTime = state.startTime!; // If the build is not completed, update the status. if (!status.isBuildCompleted) { status = state.status; @@ -467,24 +467,24 @@ final class UnifiedCheckRun { valid = true; } - // All checks pass. "valid" is only set to true if there was a change in either the remaining or failed count. + // All jobs pass. "valid" is only set to true if there was a change in either the remaining or failed count. log.info( '$logCrumb: setting remaining to $remaining, failed to $failed', ); presubmitGuard.remainingBuilds = remaining; presubmitGuard.failedBuilds = failed; - presubmitCheck.endTime = state.endTime!; - presubmitCheck.summary = state.summary; - presubmitCheck.buildNumber = state.buildNumber; + presubmitJob.endTime = state.endTime!; + presubmitJob.summary = state.summary; + presubmitJob.buildNumber = state.buildNumber; } builds[state.buildName] = status; presubmitGuard.builds = builds; - presubmitCheck.status = status; + presubmitJob.status = status; } on DetailedApiRequestError catch (e, stack) { if (e.status == 404) { // An attempt to read a document not in firestore should not be retried. log.info( - '$logCrumb: ${PresubmitCheck.collectionId} document not found for $transaction', + '$logCrumb: ${PresubmitJob.collectionId} document not found for $transaction', ); await firestoreService.rollback(transaction); return PresubmitGuardConclusion( @@ -495,7 +495,7 @@ final class UnifiedCheckRun { summary: 'Internal server error', details: ''' -${PresubmitCheck.collectionId} document not found for stage "${guardId.stage}" for $changeCrumb. Got 404 from Firestore. +${PresubmitJob.collectionId} document not found for stage "${guardId.stage}" for $changeCrumb. Got 404 from Firestore. Error: ${e.toString()} $stack ''', @@ -515,7 +515,7 @@ $stack try { final response = await firestoreService.commit( transaction, - documentsToWrites([presubmitGuard, presubmitCheck], exists: true), + documentsToWrites([presubmitGuard, presubmitJob], exists: true), ); log.info( '$logCrumb: results = ${response.writeResults?.map((e) => e.toJson())}', @@ -536,11 +536,11 @@ For CI stage ${guardId.stage}: Pending: $remaining Failed: $failed ''' - : 'Attempted to set the state of check run ${state.buildName} ' + : 'Attempted to set the state of job run ${state.buildName} ' 'to "${state.status.name}".', ); } catch (e) { - log.info('$logCrumb: failed to update presubmit check', e); + log.info('$logCrumb: failed to update presubmit job', e); rethrow; } } diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart index 6b1be4795..d34db25de 100644 --- a/app_dart/lib/src/service/scheduler.dart +++ b/app_dart/lib/src/service/scheduler.dart @@ -21,9 +21,9 @@ import '../model/ci_yaml/ci_yaml.dart'; import '../model/ci_yaml/target.dart'; import '../model/commit_ref.dart'; import '../model/common/checks_extension.dart'; -import '../model/common/presubmit_check_state.dart'; import '../model/common/presubmit_completed_check.dart'; import '../model/common/presubmit_guard_conclusion.dart'; +import '../model/common/presubmit_job_state.dart'; import '../model/firestore/base.dart'; import '../model/firestore/ci_staging.dart'; import '../model/firestore/commit.dart' as fs; @@ -1457,7 +1457,7 @@ $stacktrace Future _markUnifiedCheckRunConclusion({ required PresubmitGuardId guardId, - required PresubmitCheckState state, + required PresubmitJobState state, }) async { final logCrumb = 'checkCompleted(${state.buildName}, ${guardId.stage}, ${guardId.slug}, ${state.status})'; @@ -1710,15 +1710,14 @@ $stacktrace checkRunEvent.checkRun!.headSha!, checkRunEvent.checkRun!.checkSuite!.id!, ); - - final failedChecks = await UnifiedCheckRun.reInitializeFailedChecks( + final failedJobs = await UnifiedCheckRun.reInitializeFailedJobs( firestoreService: _firestore, slug: slug, pullRequestId: pullRequest!.number!, checkRunId: checkRunEvent.checkRun!.id!, ); - if (failedChecks == null) { + if (failedJobs == null) { log.error('$logCrumb: No failed targets found'); return const ProcessCheckRunResult.missingEntity( 'No failed targets found', @@ -1731,9 +1730,9 @@ $stacktrace ); final failedTargets = targets - .where((target) => failedChecks.checkNames.contains(target.name)) + .where((target) => failedJobs.checkNames.contains(target.name)) .toList(); - if (failedTargets.length != failedChecks.checkNames.length) { + if (failedTargets.length != failedJobs.checkNames.length) { log.error( '$logCrumb: Failed to find all failed targets in presubmit targets', ); @@ -1746,8 +1745,8 @@ $stacktrace targets: failedTargets, pullRequest: pullRequest, engineArtifacts: artifacts, - checkRunGuard: failedChecks.checkRunGuard, - stage: failedChecks.stage, + checkRunGuard: failedJobs.checkRunGuard, + stage: failedJobs.stage, ); log.info( diff --git a/app_dart/test/model/common/presubmit_check_state_test.dart b/app_dart/test/model/common/presubmit_job_state_test.dart similarity index 80% rename from app_dart/test/model/common/presubmit_check_state_test.dart rename to app_dart/test/model/common/presubmit_job_state_test.dart index 6d5a4f8ec..37813a624 100644 --- a/app_dart/test/model/common/presubmit_check_state_test.dart +++ b/app_dart/test/model/common/presubmit_job_state_test.dart @@ -5,14 +5,14 @@ import 'package:buildbucket/buildbucket_pb.dart' as bbv2; import 'package:cocoon_common/task_status.dart'; import 'package:cocoon_server_test/test_logging.dart'; -import 'package:cocoon_service/src/model/common/presubmit_check_state.dart'; +import 'package:cocoon_service/src/model/common/presubmit_job_state.dart'; import 'package:fixnum/fixnum.dart'; import 'package:test/test.dart'; void main() { useTestLoggerPerTest(); - group('PresubmitCheckState', () { - test('BuildToPresubmitCheckState extension maps build number', () { + group('PresubmitJobState', () { + test('BuildToPresubmitJobState extension maps build number', () { final build = bbv2.Build( builder: bbv2.BuilderID(builder: 'linux_test'), status: bbv2.Status.SUCCESS, @@ -23,7 +23,7 @@ void main() { tags: [bbv2.StringPair(key: 'github_checkrun', value: '123')], ); - final state = build.toPresubmitCheckState(); + final state = build.toPresubmitJobState(); expect(state.buildName, 'linux_test'); expect(state.status, TaskStatus.succeeded); expect(state.buildNumber, 12345); diff --git a/app_dart/test/model/firestore/presubmit_check_test.dart b/app_dart/test/model/firestore/presubmit_job_test.dart similarity index 53% rename from app_dart/test/model/firestore/presubmit_check_test.dart rename to app_dart/test/model/firestore/presubmit_job_test.dart index b2649a4fb..c3c870e44 100644 --- a/app_dart/test/model/firestore/presubmit_check_test.dart +++ b/app_dart/test/model/firestore/presubmit_job_test.dart @@ -6,7 +6,7 @@ import 'package:buildbucket/buildbucket_pb.dart' as bbv2; import 'package:cocoon_common/task_status.dart'; import 'package:cocoon_integration_test/testing.dart'; import 'package:cocoon_server_test/test_logging.dart'; -import 'package:cocoon_service/src/model/firestore/presubmit_check.dart'; +import 'package:cocoon_service/src/model/firestore/presubmit_job.dart'; import 'package:fixnum/fixnum.dart'; import 'package:googleapis/firestore/v1.dart'; import 'package:test/test.dart'; @@ -14,31 +14,25 @@ import 'package:test/test.dart'; void main() { useTestLoggerPerTest(); - group('PresubmitCheckId', () { + group('PresubmitJobId', () { test('validates checkRunId', () { expect( - () => PresubmitCheckId( - checkRunId: 0, - buildName: 'linux', - attemptNumber: 1, - ), + () => + PresubmitJobId(checkRunId: 0, buildName: 'linux', attemptNumber: 1), throwsA(isA()), ); }); test('validates attemptNumber', () { expect( - () => PresubmitCheckId( - checkRunId: 1, - buildName: 'linux', - attemptNumber: 0, - ), + () => + PresubmitJobId(checkRunId: 1, buildName: 'linux', attemptNumber: 0), throwsA(isA()), ); }); test('generates correct documentId', () { - final id = PresubmitCheckId( + final id = PresubmitJobId( checkRunId: 123, buildName: 'linux_test', attemptNumber: 2, @@ -47,19 +41,19 @@ void main() { }); test('parses valid documentName', () { - final id = PresubmitCheckId.parse('123_linux_test_2'); + final id = PresubmitJobId.parse('123_linux_test_2'); expect(id.checkRunId, 123); expect(id.buildName, 'linux_test'); expect(id.attemptNumber, 2); }); test('tryParse returns null for invalid format', () { - expect(PresubmitCheckId.tryParse('invalid'), isNull); - expect(PresubmitCheckId.tryParse('123_linux'), isNull); + expect(PresubmitJobId.tryParse('invalid'), isNull); + expect(PresubmitJobId.tryParse('123_linux'), isNull); }); }); - group('PresubmitCheck', () { + group('PresubmitJob', () { late FakeFirestoreService firestoreService; setUp(() { @@ -67,25 +61,25 @@ void main() { }); test('init creates correct initial state', () { - final check = PresubmitCheck.init( + final job = PresubmitJob.init( buildName: 'linux', checkRunId: 123, creationTime: 1000, ); - expect(check.buildName, 'linux'); - expect(check.checkRunId, 123); - expect(check.creationTime, 1000); - expect(check.attemptNumber, 1); - expect(check.status, TaskStatus.waitingForBackfill); - expect(check.buildNumber, isNull); - expect(check.startTime, isNull); - expect(check.endTime, isNull); - expect(check.summary, isNull); + expect(job.buildName, 'linux'); + expect(job.checkRunId, 123); + expect(job.creationTime, 1000); + expect(job.attemptNumber, 1); + expect(job.status, TaskStatus.waitingForBackfill); + expect(job.buildNumber, isNull); + expect(job.startTime, isNull); + expect(job.endTime, isNull); + expect(job.summary, isNull); }); test('fromFirestore loads document correctly', () async { - final check = PresubmitCheck( + final job = PresubmitJob( checkRunId: 123, buildName: 'linux', status: TaskStatus.succeeded, @@ -98,37 +92,35 @@ void main() { ); // Use the helper to get the correct document name - final docName = PresubmitCheck.documentNameFor( + final docName = PresubmitJob.documentNameFor( checkRunId: 123, buildName: 'linux', attemptNumber: 1, ); // Manually ensuring the name is set for the fake service, usually done by `putDocument` - // but we should verify the `PresubmitCheck` object has it right via the factory or init. - // Actually `PresubmitCheck` constructor sets name. - firestoreService.putDocument( - Document(name: docName, fields: check.fields), - ); + // but we should verify the `PresubmitJob` object has it right via the factory or init. + // Actually `PresubmitJob` constructor sets name. + firestoreService.putDocument(Document(name: docName, fields: job.fields)); - final loadedCheck = await PresubmitCheck.fromFirestore( + final loadedJob = await PresubmitJob.fromFirestore( firestoreService, - PresubmitCheckId(checkRunId: 123, buildName: 'linux', attemptNumber: 1), + PresubmitJobId(checkRunId: 123, buildName: 'linux', attemptNumber: 1), ); - expect(loadedCheck.checkRunId, 123); - expect(loadedCheck.buildName, 'linux'); - expect(loadedCheck.status, TaskStatus.succeeded); - expect(loadedCheck.attemptNumber, 1); - expect(loadedCheck.creationTime, 1000); - expect(loadedCheck.buildNumber, 456); - expect(loadedCheck.startTime, 2000); - expect(loadedCheck.endTime, 3000); - expect(loadedCheck.summary, 'Success'); + expect(loadedJob.checkRunId, 123); + expect(loadedJob.buildName, 'linux'); + expect(loadedJob.status, TaskStatus.succeeded); + expect(loadedJob.attemptNumber, 1); + expect(loadedJob.creationTime, 1000); + expect(loadedJob.buildNumber, 456); + expect(loadedJob.startTime, 2000); + expect(loadedJob.endTime, 3000); + expect(loadedJob.summary, 'Success'); }); test('updateFromBuild updates fields', () { - final check = PresubmitCheck.init( + final job = PresubmitJob.init( buildName: 'linux', checkRunId: 123, creationTime: 1000, @@ -142,22 +134,22 @@ void main() { status: bbv2.Status.SUCCESS, ); - check.updateFromBuild(build); + job.updateFromBuild(build); - expect(check.buildNumber, 456); - expect(check.creationTime, 2000000); // seconds to millis - expect(check.startTime, 2100000); - expect(check.endTime, 2200000); - expect(check.status, TaskStatus.succeeded); + expect(job.buildNumber, 456); + expect(job.creationTime, 2000000); // seconds to millis + expect(job.startTime, 2100000); + expect(job.endTime, 2200000); + expect(job.status, TaskStatus.succeeded); }); test('updateFromBuild does not update status if already complete', () { - final check = PresubmitCheck.init( + final job = PresubmitJob.init( buildName: 'linux', checkRunId: 123, creationTime: 1000, ); - check.status = TaskStatus.succeeded; + job.status = TaskStatus.succeeded; final build = bbv2.Build( number: 456, @@ -165,23 +157,23 @@ void main() { status: bbv2.Status.STARTED, ); - check.updateFromBuild(build); + job.updateFromBuild(build); - expect(check.status, TaskStatus.succeeded); + expect(job.status, TaskStatus.succeeded); }); test('buildNumber setter updates fields', () { - final check = PresubmitCheck.init( + final job = PresubmitJob.init( buildName: 'linux', checkRunId: 123, creationTime: 1000, ); - check.buildNumber = 789; - expect(check.buildNumber, 789); + job.buildNumber = 789; + expect(job.buildNumber, 789); - check.buildNumber = null; - expect(check.buildNumber, isNull); + job.buildNumber = null; + expect(job.buildNumber, isNull); }); }); } diff --git a/app_dart/test/request_handlers/get_presubmit_checks_test.dart b/app_dart/test/request_handlers/get_presubmit_jobs_test.dart similarity index 73% rename from app_dart/test/request_handlers/get_presubmit_checks_test.dart rename to app_dart/test/request_handlers/get_presubmit_jobs_test.dart index df53c4037..dc53c9204 100644 --- a/app_dart/test/request_handlers/get_presubmit_checks_test.dart +++ b/app_dart/test/request_handlers/get_presubmit_jobs_test.dart @@ -10,32 +10,32 @@ import 'package:cocoon_common/task_status.dart'; import 'package:cocoon_integration_test/testing.dart'; import 'package:cocoon_server_test/test_logging.dart'; import 'package:cocoon_service/cocoon_service.dart'; -import 'package:cocoon_service/src/model/firestore/presubmit_check.dart' as fs; -import 'package:cocoon_service/src/request_handlers/get_presubmit_checks.dart'; +import 'package:cocoon_service/src/model/firestore/presubmit_job.dart' as fs; +import 'package:cocoon_service/src/request_handlers/get_presubmit_jobs.dart'; import 'package:test/test.dart'; import '../src/request_handling/request_handler_tester.dart'; void main() { - group('GetPresubmitChecks', () { + group('GetPresubmitJobs', () { useTestLoggerPerTest(); late FakeConfig config; late RequestHandlerTester tester; - late GetPresubmitChecks handler; + late GetPresubmitJobs handler; late FakeFirestoreService firestoreService; setUp(() { config = FakeConfig(); tester = RequestHandlerTester(); firestoreService = FakeFirestoreService(); - handler = GetPresubmitChecks( + handler = GetPresubmitJobs( config: config, firestore: firestoreService, authenticationProvider: FakeDashboardAuthentication(), ); }); - Future?> getPresubmitCheckResponse( + Future?> getPresubmitJobResponse( Response response, ) async { if (response.statusCode != HttpStatus.ok) { @@ -49,7 +49,7 @@ void main() { } return [ for (final item in jsonBody) - PresubmitCheckResponse.fromJson(item as Map), + PresubmitJobResponse.fromJson(item as Map), ]; } @@ -67,7 +67,7 @@ void main() { expect(response.statusCode, HttpStatus.badRequest); }); - test('returns 404 when no checks found', () async { + test('returns 404 when no jobs found', () async { tester.request = FakeHttpRequest( queryParametersValue: {'check_run_id': '123', 'build_name': 'linux'}, ); @@ -75,8 +75,8 @@ void main() { expect(response.statusCode, HttpStatus.notFound); }); - test('returns checks when found', () async { - final check = fs.PresubmitCheck( + test('returns jobs when found', () async { + final job = fs.PresubmitJob( checkRunId: 123, buildName: 'linux', status: TaskStatus.succeeded, @@ -88,7 +88,7 @@ void main() { buildNumber: 456, ); await firestoreService.writeViaTransaction( - documentsToWrites([check], exists: false), + documentsToWrites([job], exists: false), ); tester.request = FakeHttpRequest( @@ -97,23 +97,23 @@ void main() { final response = await tester.get(handler); expect(response.statusCode, HttpStatus.ok); - final checks = (await getPresubmitCheckResponse(response))!; - expect(checks.length, 1); - expect(checks[0].attemptNumber, 1); - expect(checks[0].buildName, 'linux'); - expect(checks[0].status, 'Succeeded'); - expect(checks[0].buildNumber, 456); + final jobs = (await getPresubmitJobResponse(response))!; + expect(jobs.length, 1); + expect(jobs[0].attemptNumber, 1); + expect(jobs[0].buildName, 'linux'); + expect(jobs[0].status, 'Succeeded'); + expect(jobs[0].buildNumber, 456); }); - test('returns multiple checks in descending order', () async { - final check1 = fs.PresubmitCheck( + test('returns multiple jobs in descending order', () async { + final job1 = fs.PresubmitJob( checkRunId: 123, buildName: 'linux', status: TaskStatus.succeeded, attemptNumber: 1, creationTime: 100, ); - final check2 = fs.PresubmitCheck( + final job2 = fs.PresubmitJob( checkRunId: 123, buildName: 'linux', status: TaskStatus.failed, @@ -121,7 +121,7 @@ void main() { creationTime: 200, ); await firestoreService.writeViaTransaction( - documentsToWrites([check1, check2], exists: false), + documentsToWrites([job1, job2], exists: false), ); tester.request = FakeHttpRequest( @@ -130,10 +130,10 @@ void main() { final response = await tester.get(handler); expect(response.statusCode, HttpStatus.ok); - final checks = (await getPresubmitCheckResponse(response))!; - expect(checks.length, 2); - expect(checks[0].attemptNumber, 2); - expect(checks[1].attemptNumber, 1); + final jobs = (await getPresubmitJobResponse(response))!; + expect(jobs.length, 2); + expect(jobs[0].attemptNumber, 2); + expect(jobs[1].attemptNumber, 1); }); }); } 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 e6a7f0cf1..725e263f0 100644 --- a/app_dart/test/service/firestore/unified_check_run_test.dart +++ b/app_dart/test/service/firestore/unified_check_run_test.dart @@ -5,11 +5,11 @@ import 'package:cocoon_common/task_status.dart'; import 'package:cocoon_integration_test/testing.dart'; import 'package:cocoon_server_test/test_logging.dart'; -import 'package:cocoon_service/src/model/common/presubmit_check_state.dart'; import 'package:cocoon_service/src/model/common/presubmit_guard_conclusion.dart'; +import 'package:cocoon_service/src/model/common/presubmit_job_state.dart'; import 'package:cocoon_service/src/model/firestore/base.dart'; -import 'package:cocoon_service/src/model/firestore/presubmit_check.dart'; import 'package:cocoon_service/src/model/firestore/presubmit_guard.dart'; +import 'package:cocoon_service/src/model/firestore/presubmit_job.dart'; import 'package:cocoon_service/src/service/firestore.dart'; import 'package:cocoon_service/src/service/firestore/unified_check_run.dart'; import 'package:cocoon_service/src/service/flags/dynamic_config.dart'; @@ -45,7 +45,7 @@ void main() { const sha = 'sha'; group('initializeCiStagingDocument', () { - test('creates PresubmitGuard and Checks when enabled for user', () async { + test('creates PresubmitGuard and Jobs when enabled for user', () async { config.dynamicConfig = DynamicConfig.fromJson({ 'unifiedCheckRunFlow': { 'useForUsers': ['dash'], @@ -74,15 +74,15 @@ void main() { ); expect(guardDoc.name, endsWith(guardId.documentId)); - final checkId = PresubmitCheck.documentIdFor( + final jobId = PresubmitJob.documentIdFor( checkRunId: 123, buildName: 'linux', attemptNumber: 1, ); - final checkDoc = await firestoreService.getDocument( - 'projects/flutter-dashboard/databases/cocoon/documents/presubmit_checks/${checkId.documentId}', + final jobDoc = await firestoreService.getDocument( + 'projects/flutter-dashboard/databases/cocoon/documents/presubmit_jobs/${jobId.documentId}', ); - expect(checkDoc.name, endsWith(checkId.documentId)); + expect(jobDoc.name, endsWith(jobId.documentId)); }); test('initializes CiStagingDocument when NOT enabled for user', () async { @@ -145,12 +145,12 @@ void main() { failedBuilds: 0, ); - final check1 = PresubmitCheck.init( + final job1 = PresubmitJob.init( buildName: 'linux', checkRunId: guardId.checkRunId, creationTime: 1000, ); - final check2 = PresubmitCheck.init( + final job2 = PresubmitJob.init( buildName: 'mac', checkRunId: guardId.checkRunId, creationTime: 1000, @@ -159,14 +159,14 @@ void main() { await firestoreService.writeViaTransaction( documentsToWrites([ Document(name: guard.name, fields: guard.fields), - Document(name: check1.name, fields: check1.fields), - Document(name: check2.name, fields: check2.fields), + Document(name: job1.name, fields: job1.fields), + Document(name: job2.name, fields: job2.fields), ], exists: false), ); }); - test('updates check status and remaining count on success', () async { - final state = const PresubmitCheckState( + test('updates job status and remaining count on success', () async { + final state = const PresubmitJobState( buildName: 'linux', status: TaskStatus.succeeded, attemptNumber: 1, @@ -185,26 +185,22 @@ void main() { expect(result.remaining, 1); expect(result.failed, 0); - final checkDoc = await PresubmitCheck.fromFirestore( + final jobDoc = await PresubmitJob.fromFirestore( firestoreService, - PresubmitCheckId( - checkRunId: 123, - buildName: 'linux', - attemptNumber: 1, - ), + PresubmitJobId(checkRunId: 123, buildName: 'linux', attemptNumber: 1), ); - expect(checkDoc.status, TaskStatus.succeeded); - expect(checkDoc.endTime, 3000); - expect(checkDoc.buildNumber, 456); + expect(jobDoc.status, TaskStatus.succeeded); + expect(jobDoc.endTime, 3000); + expect(jobDoc.buildNumber, 456); }); test( - 'update all check status to succeeded lead to complete guard', + 'update all job status to succeeded lead to complete guard', () async { final result1 = await UnifiedCheckRun.markConclusion( firestoreService: firestoreService, guardId: guardId, - state: const PresubmitCheckState( + state: const PresubmitJobState( buildName: 'linux', status: TaskStatus.succeeded, attemptNumber: 1, @@ -222,7 +218,7 @@ void main() { final result2 = await UnifiedCheckRun.markConclusion( firestoreService: firestoreService, guardId: guardId, - state: const PresubmitCheckState( + state: const PresubmitJobState( buildName: 'mac', status: TaskStatus.succeeded, attemptNumber: 1, @@ -237,21 +233,21 @@ void main() { expect(result2.isComplete, true); expect(result2.isPending, false); - final checkDoc = await PresubmitCheck.fromFirestore( + final jobDoc = await PresubmitJob.fromFirestore( firestoreService, - PresubmitCheckId( + PresubmitJobId( checkRunId: 123, buildName: 'linux', attemptNumber: 1, ), ); - expect(checkDoc.status, TaskStatus.succeeded); - expect(checkDoc.endTime, 3000); + expect(jobDoc.status, TaskStatus.succeeded); + expect(jobDoc.endTime, 3000); }, ); - test('updates check status and failed count on failure', () async { - final state = const PresubmitCheckState( + test('updates job status and failed count on failure', () async { + final state = const PresubmitJobState( buildName: 'linux', status: TaskStatus.failed, attemptNumber: 1, @@ -270,8 +266,8 @@ void main() { expect(result.failed, 1); }); - test('handles missing check gracefully', () async { - final state = const PresubmitCheckState( + test('handles missing job gracefully', () async { + final state = const PresubmitJobState( buildName: 'windows', // Missing status: TaskStatus.succeeded, attemptNumber: 1, @@ -286,7 +282,7 @@ void main() { expect(result.result, PresubmitGuardConclusionResult.missing); }); }); - group('reInitializeFailedChecks', () { + group('reInitializeFailedJobs', () { late PresubmitGuardId fusionGuardId; setUp(() async { @@ -311,7 +307,7 @@ void main() { failedBuilds: 1, ); - final check1 = PresubmitCheck( + final job1 = PresubmitJob( buildName: 'linux', checkRunId: fusionGuardId.checkRunId, creationTime: 1000, @@ -319,7 +315,7 @@ void main() { attemptNumber: 1, ); - final check2 = PresubmitCheck( + final job2 = PresubmitJob( buildName: 'mac', checkRunId: fusionGuardId.checkRunId, creationTime: 1000, @@ -330,14 +326,14 @@ void main() { await firestoreService.writeViaTransaction( documentsToWrites([ Document(name: guard.name, fields: guard.fields), - Document(name: check1.name, fields: check1.fields), - Document(name: check2.name, fields: check2.fields), + Document(name: job1.name, fields: job1.fields), + Document(name: job2.name, fields: job2.fields), ], exists: false), ); }); - test('updates fusion failed checks and remaining count', () async { - final result = await UnifiedCheckRun.reInitializeFailedChecks( + test('updates fusion failed jobs and remaining count', () async { + final result = await UnifiedCheckRun.reInitializeFailedJobs( firestoreService: firestoreService, slug: slug, pullRequestId: pullRequest.number!, @@ -358,17 +354,13 @@ void main() { expect(guard.builds['linux'], TaskStatus.waitingForBackfill); expect(guard.builds['mac'], TaskStatus.succeeded); - // Verify new check document created with incremented attempt number - final checkDoc = await PresubmitCheck.fromFirestore( + // Verify new job document created with incremented attempt number + final jobDoc = await PresubmitJob.fromFirestore( firestoreService, - PresubmitCheckId( - checkRunId: 123, - buildName: 'linux', - attemptNumber: 2, - ), + PresubmitJobId(checkRunId: 123, buildName: 'linux', attemptNumber: 2), ); - expect(checkDoc.status, TaskStatus.waitingForBackfill); - expect(checkDoc.attemptNumber, 2); + expect(jobDoc.status, TaskStatus.waitingForBackfill); + expect(jobDoc.attemptNumber, 2); }); test('properly handle if engine and fusion guards are present', () async { @@ -393,7 +385,7 @@ void main() { failedBuilds: 0, ); - final check1 = PresubmitCheck( + final job1 = PresubmitJob( buildName: 'win', checkRunId: engineGuardId.checkRunId, creationTime: 1000, @@ -401,7 +393,7 @@ void main() { attemptNumber: 1, ); - final check2 = PresubmitCheck( + final job2 = PresubmitJob( buildName: 'ios', checkRunId: engineGuardId.checkRunId, creationTime: 1000, @@ -412,12 +404,12 @@ void main() { await firestoreService.writeViaTransaction( documentsToWrites([ Document(name: guard.name, fields: guard.fields), - Document(name: check1.name, fields: check1.fields), - Document(name: check2.name, fields: check2.fields), + Document(name: job1.name, fields: job1.fields), + Document(name: job2.name, fields: job2.fields), ], exists: false), ); - final result = await UnifiedCheckRun.reInitializeFailedChecks( + final result = await UnifiedCheckRun.reInitializeFailedJobs( firestoreService: firestoreService, slug: slug, pullRequestId: pullRequest.number!, @@ -438,21 +430,17 @@ void main() { expect(restartedGuard.builds['linux'], TaskStatus.waitingForBackfill); expect(restartedGuard.builds['mac'], TaskStatus.succeeded); - // Verify new check document created with incremented attempt number - final checkDoc = await PresubmitCheck.fromFirestore( + // Verify new job document created with incremented attempt number + final jobDoc = await PresubmitJob.fromFirestore( firestoreService, - PresubmitCheckId( - checkRunId: 123, - buildName: 'linux', - attemptNumber: 2, - ), + PresubmitJobId(checkRunId: 123, buildName: 'linux', attemptNumber: 2), ); - expect(checkDoc.status, TaskStatus.waitingForBackfill); - expect(checkDoc.attemptNumber, 2); + expect(jobDoc.status, TaskStatus.waitingForBackfill); + expect(jobDoc.attemptNumber, 2); }); - test('returns null when no failed checks', () async { - // Update setup to have no failed checks + test('returns null when no failed jobs', () async { + // Update setup to have no failed jobs var guardDoc = await firestoreService.getDocument( 'projects/flutter-dashboard/databases/cocoon/documents/presubmit_guards/${fusionGuardId.documentId}', ); @@ -465,7 +453,7 @@ void main() { documentsToWrites([guard], exists: true), ); - final result = await UnifiedCheckRun.reInitializeFailedChecks( + final result = await UnifiedCheckRun.reInitializeFailedJobs( firestoreService: firestoreService, slug: slug, pullRequestId: pullRequest.number!, @@ -538,8 +526,8 @@ void main() { expect(guard.checkRunId, 123); }); - test('getPresubmitCheckDetails returns all attempts sorted', () async { - final check1 = PresubmitCheck( + test('getPresubmitJobDetails returns all attempts sorted', () async { + final job1 = PresubmitJob( checkRunId: 1234, buildName: 'linux_test', status: TaskStatus.succeeded, @@ -549,7 +537,7 @@ void main() { endTime: 120, summary: 'attempt 1', ); - final check2 = PresubmitCheck( + final job2 = PresubmitJob( checkRunId: 1234, buildName: 'linux_test', status: TaskStatus.failed, @@ -560,10 +548,10 @@ void main() { summary: 'attempt 2', ); await firestoreService.writeViaTransaction( - documentsToWrites([check1, check2], exists: false), + documentsToWrites([job1, job2], exists: false), ); - final attempts = await UnifiedCheckRun.getPresubmitCheckDetails( + final attempts = await UnifiedCheckRun.getPresubmitJobDetails( firestoreService: firestoreService, checkRunId: 1234, buildName: 'linux_test', diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart index 837ad9a8b..a4928e4ae 100644 --- a/app_dart/test/service/scheduler_test.dart +++ b/app_dart/test/service/scheduler_test.dart @@ -19,8 +19,8 @@ import 'package:cocoon_service/src/model/firestore/base.dart'; import 'package:cocoon_service/src/model/firestore/ci_staging.dart'; import 'package:cocoon_service/src/model/firestore/commit.dart' as fs; import 'package:cocoon_service/src/model/firestore/pr_check_runs.dart'; -import 'package:cocoon_service/src/model/firestore/presubmit_check.dart'; import 'package:cocoon_service/src/model/firestore/presubmit_guard.dart'; +import 'package:cocoon_service/src/model/firestore/presubmit_job.dart'; import 'package:cocoon_service/src/model/firestore/task.dart' as fs; import 'package:cocoon_service/src/model/github/checks.dart' as cocoon_checks; import 'package:cocoon_service/src/service/big_query.dart'; @@ -1176,7 +1176,7 @@ targets: remainingBuilds: 0, ); - final check = PresubmitCheck( + final check = PresubmitJob( buildName: 'Linux A', checkRunId: 1, creationTime: 1000, @@ -1316,7 +1316,7 @@ targets: remainingBuilds: 0, ); - final check = PresubmitCheck( + final check = PresubmitJob( buildName: 'Linux A', checkRunId: 1, creationTime: 2000, @@ -3864,7 +3864,7 @@ targets: // Initialize check run for the task firestore.putDocument( - PresubmitCheck.init( + PresubmitJob.init( buildName: 'Linux engine_build', checkRunId: checkRunGuard.id!, creationTime: DateTime.now().millisecondsSinceEpoch, @@ -3954,7 +3954,7 @@ targets: // Initialize check run for the task firestore.putDocument( - PresubmitCheck.init( + PresubmitJob.init( buildName: 'Linux test', checkRunId: checkRunGuard.id!, creationTime: DateTime.now().millisecondsSinceEpoch, @@ -4037,7 +4037,7 @@ targets: // Initialize check run for the task firestore.putDocument( - PresubmitCheck.init( + PresubmitJob.init( buildName: 'Linux test', checkRunId: checkRunGuard.id!, creationTime: DateTime.now().millisecondsSinceEpoch, diff --git a/conductor/product.md b/conductor/product.md index a7be7308b..2383bdda5 100644 --- a/conductor/product.md +++ b/conductor/product.md @@ -17,9 +17,9 @@ Cocoon is the CI coordination and orchestration system for the Flutter project. ## Key Features * **Offline Integration Testing:** A dedicated testing environment that simulates all backend services (GitHub, Firestore, BigQuery, LUCI) with functional fakes, enabling deterministic, offline verification of frontend and backend logic. * **Tree Status Dashboard:** A Flutter-based web application that provides a visual overview of build health across various commits and branches. -* **Presubmit Check Details:** Backend APIs to retrieve detailed attempt history and status for specific presubmit checks, aiding in debugging and visibility. -* **Presubmit Guard Summaries:** Backend APIs to retrieve summaries of all presubmit checks (Presubmit Guards) of the provided pull request to the dashboard. -* **Presubmit Guard Details:** Displays detailed information and CI check statuses for a specific presubmit check (Presubmit Guard), including the commit SHA in the view header for precise version tracking. +* **Presubmit Job Details:** Backend APIs to retrieve detailed attempt history and status for specific presubmit jobs, aiding in debugging and visibility. +* **Presubmit Guard Summaries:** Backend APIs to retrieve summaries of all presubmit jobs (Presubmit Guards) of the provided pull request to the dashboard. +* **Presubmit Guard Details:** Displays detailed information and CI statuses for a specific presubmit job (Presubmit Guard), including the commit SHA in the view header for precise version tracking. * **Merge Queue Visibility:** APIs for querying and inspecting recent GitHub Merge Queue webhook events to diagnose integration issues. * **Auto-submit Bot:** Handles automated pull request management, including label-based merges, reverts, and validation checks. * **GitHub Integration:** Robust handling of GitHub webhooks to sync commits, manage check runs, and report build statuses back to PRs. diff --git a/conductor/tracks.md b/conductor/tracks.md index 34a1619e7..0cf74bf98 100644 --- a/conductor/tracks.md +++ b/conductor/tracks.md @@ -20,3 +20,9 @@ - [x] **Track: For PreSubmitView move all state change logic to PresubmitState similarly to how BuildDashboardPage use BuildState** *Link: [./archive/refactor_presubmit_state_20260223/](./archive/refactor_presubmit_state_20260223/)* +--- + +- [x] **Track: Rename everything related to PresubmitCheck to PresubmitJob** +*Link: [./tracks/rename_presubmit_check_to_job_20260225/](./tracks/rename_presubmit_check_to_job_20260225/)* + + diff --git a/conductor/tracks/rename_presubmit_check_to_job_20260225/index.md b/conductor/tracks/rename_presubmit_check_to_job_20260225/index.md new file mode 100644 index 000000000..4f88fefb7 --- /dev/null +++ b/conductor/tracks/rename_presubmit_check_to_job_20260225/index.md @@ -0,0 +1,5 @@ +# Track rename_presubmit_check_to_job_20260225 Context + +- [Specification](./spec.md) +- [Implementation Plan](./plan.md) +- [Metadata](./metadata.json) diff --git a/conductor/tracks/rename_presubmit_check_to_job_20260225/metadata.json b/conductor/tracks/rename_presubmit_check_to_job_20260225/metadata.json new file mode 100644 index 000000000..7e0ed6f42 --- /dev/null +++ b/conductor/tracks/rename_presubmit_check_to_job_20260225/metadata.json @@ -0,0 +1,8 @@ +{ + "track_id": "rename_presubmit_check_to_job_20260225", + "type": "refactor", + "status": "new", + "created_at": "2026-02-25T22:31:37Z", + "updated_at": "2026-02-25T22:31:37Z", + "description": "Rename everything related to PresubmitCheck to PresubmitJob" +} diff --git a/conductor/tracks/rename_presubmit_check_to_job_20260225/plan.md b/conductor/tracks/rename_presubmit_check_to_job_20260225/plan.md new file mode 100644 index 000000000..eb22b1474 --- /dev/null +++ b/conductor/tracks/rename_presubmit_check_to_job_20260225/plan.md @@ -0,0 +1,47 @@ +# Implementation Plan: Rename PresubmitCheck to PresubmitJob + +## Phase 1: Shared Packages & Protos + +### Tasks +- [ ] Task: Rename symbols in `packages/cocoon_common` + - [ ] Update `PresubmitCheck` to `PresubmitJob` in code and tests. + - [ ] Update documentation and comments. +- [ ] Task: Update Proto Definitions and Generate Code + - [ ] Find and update all `.proto` files containing `PresubmitCheck`. + - [ ] Run code generation script (`protofu.yaml` or equivalent). + - [ ] Update any manual wrappers or extensions in `app_dart/lib/protos.dart`. +- [ ] Task: Conductor - User Manual Verification 'Phase 1: Shared Packages & Protos' (Protocol in workflow.md) + +## Phase 2: Backend (app_dart & auto_submit) + +### Tasks +- [ ] Task: Refactor `app_dart` Backend + - [ ] Rename classes, variables, and endpoints in `app_dart/lib/`. + - [ ] Update Firestore collection/field references. + - [ ] Update tests in `app_dart/test/`. +- [ ] Task: Refactor `auto_submit` Bot + - [ ] Rename symbols in `auto_submit/lib/`. + - [ ] Update logic for handling presubmit jobs. + - [ ] Update tests in `auto_submit/test/`. +- [ ] Task: Conductor - User Manual Verification 'Phase 2: Backend (app_dart & auto_submit)' (Protocol in workflow.md) + +## Phase 3: Frontend (dashboard) + +### Tasks +- [ ] Task: Refactor `dashboard` Frontend + - [ ] Rename UI components, state variables, and API clients. + - [ ] Update localized strings and display labels. + - [ ] Update tests in `dashboard/test/`. +- [ ] Task: Conductor - User Manual Verification 'Phase 3: Frontend (dashboard)' (Protocol in workflow.md) + +## Phase 4: Infrastructure & Documentation + +### Tasks +- [ ] Task: Update Configuration Files + - [ ] Update `app.yaml`, `config.yaml`, and `.ci.yaml` in all directories. + - [ ] Verify Cloud Build configuration references. +- [ ] Task: Global Documentation Update + - [ ] Update `README.md` files and any other documentation in `docs/`. +- [ ] Task: Final Repository-wide Search and Replace + - [ ] Perform a final case-insensitive search for "PresubmitCheck" to ensure no instances remain. +- [ ] Task: Conductor - User Manual Verification 'Phase 4: Infrastructure & Documentation' (Protocol in workflow.md) diff --git a/conductor/tracks/rename_presubmit_check_to_job_20260225/spec.md b/conductor/tracks/rename_presubmit_check_to_job_20260225/spec.md new file mode 100644 index 000000000..e89391b70 --- /dev/null +++ b/conductor/tracks/rename_presubmit_check_to_job_20260225/spec.md @@ -0,0 +1,35 @@ +# Specification: Rename PresubmitCheck to PresubmitJob + +## Overview +This track aims to standardize the naming of Flutter's presubmit CI tasks. The current term "PresubmitCheck" will be replaced with "PresubmitJob" across all systems to align with common industry terminology and internal preferences. This is a comprehensive refactor that follows a "Clean Break" strategy, immediately replacing all instances without maintaining legacy aliases. + +## Functional Requirements +- **Codebase Refactor:** + - Rename all classes, functions, variables, and constants from `PresubmitCheck` (and its variants like `presubmit_check`, `presubmitCheck`) to `PresubmitJob` (e.g., `PresubmitJob`, `presubmit_job`, `presubmitJob`). + - Target packages: `app_dart`, `auto_submit`, `dashboard`, `packages/cocoon_common`. +- **Infrastructure & Configuration:** + - Update configuration keys in `app.yaml`, `config.yaml`, `.ci.yaml`, and any other YAML/JSON configuration files. + - Ensure any Pub/Sub topic names or Cloud Build configuration references are updated if they contain "PresubmitCheck". +- **Public & Internal APIs:** + - Update REST and gRPC API field names and endpoints. + - Update protocol buffer definitions (`.proto`) and their generated code. +- **Data Persistence:** + - Update Firestore collection names or document fields that store presubmit check data. + - (Note: This may require a data migration script if live data exists). +- **Documentation:** + - Update all `README.md` files, inline comments, and project documentation in the `docs/` and `conductor/` directories. + +## Non-Functional Requirements +- **Consistency:** Ensure the rename is applied consistently across all layers (Frontend, Backend, Infrastructure). +- **Maintainability:** Standardizing the naming improves code readability for new and existing contributors. + +## Acceptance Criteria +- [ ] No instances of the string "PresubmitCheck" (case-insensitive) remain in the codebase, excluding historical logs or external dependencies. +- [ ] The `dashboard` successfully displays "Presubmit Job" details instead of "Presubmit Check". +- [ ] `app_dart` and `auto_submit` services successfully process "PresubmitJob" events and configurations. +- [ ] All automated tests (unit and integration) pass with the new naming. +- [ ] Infrastructure deployments (Cloud Build, App Engine) function correctly with updated configuration keys. + +## Out of Scope +- Renaming legacy logs in BigQuery (historical data). +- Renaming external LUCI/Buildbucket fields that are not controlled by the Cocoon project. diff --git a/dashboard/lib/service/appengine_cocoon.dart b/dashboard/lib/service/appengine_cocoon.dart index 4555df4fe..553c337b2 100644 --- a/dashboard/lib/service/appengine_cocoon.dart +++ b/dashboard/lib/service/appengine_cocoon.dart @@ -326,8 +326,7 @@ class AppEngineCocoonService implements CocoonService { } @override - Future>> - fetchPresubmitCheckDetails({ + Future>> fetchPresubmitJobDetails({ required int checkRunId, required String buildName, }) async { @@ -335,16 +334,16 @@ class AppEngineCocoonService implements CocoonService { 'check_run_id': checkRunId.toString(), 'build_name': buildName, }; - final getChecksUrl = apiEndpoint( - '/api/get-presubmit-checks', + final getJobsUrl = apiEndpoint( + '/api/get-presubmit-jobs', queryParameters: queryParameters, ); - final response = await _client.get(getChecksUrl); + final response = await _client.get(getJobsUrl); if (response.statusCode != HttpStatus.ok) { return CocoonResponse.error( - '/api/get-presubmit-checks returned ${response.statusCode}', + '/api/get-presubmit-jobs returned ${response.statusCode}', statusCode: response.statusCode, ); } @@ -354,7 +353,7 @@ class AppEngineCocoonService implements CocoonService { return CocoonResponse.data( jsonResponse .cast>() - .map(PresubmitCheckResponse.fromJson) + .map(PresubmitJobResponse.fromJson) .toList(), ); } catch (error) { diff --git a/dashboard/lib/service/cocoon.dart b/dashboard/lib/service/cocoon.dart index 2f56e41ae..9778e45b6 100644 --- a/dashboard/lib/service/cocoon.dart +++ b/dashboard/lib/service/cocoon.dart @@ -124,9 +124,8 @@ abstract class CocoonService { required String sha, }); - /// Gets the details for a specific presubmit check. - Future>> - fetchPresubmitCheckDetails({ + /// Gets the details for a specific presubmit job. + Future>> fetchPresubmitJobDetails({ required int checkRunId, required String buildName, }); diff --git a/dashboard/lib/service/dev_cocoon.dart b/dashboard/lib/service/dev_cocoon.dart index abe056c10..c3dbd4865 100644 --- a/dashboard/lib/service/dev_cocoon.dart +++ b/dashboard/lib/service/dev_cocoon.dart @@ -300,13 +300,12 @@ class DevelopmentCocoonService implements CocoonService { } @override - Future>> - fetchPresubmitCheckDetails({ + Future>> fetchPresubmitJobDetails({ required int checkRunId, required String buildName, }) async { return CocoonResponse.data([ - PresubmitCheckResponse( + PresubmitJobResponse( attemptNumber: 1, buildName: buildName, creationTime: now.millisecondsSinceEpoch - 10000, @@ -320,7 +319,7 @@ class DevelopmentCocoonService implements CocoonService { [SUCCESS] All tests passed (452/452) ''', ), - PresubmitCheckResponse( + PresubmitJobResponse( attemptNumber: 2, buildName: buildName, creationTime: now.millisecondsSinceEpoch, diff --git a/dashboard/lib/state/presubmit.dart b/dashboard/lib/state/presubmit.dart index 6896a7463..11a4388fd 100644 --- a/dashboard/lib/state/presubmit.dart +++ b/dashboard/lib/state/presubmit.dart @@ -42,11 +42,11 @@ class PresubmitState extends ChangeNotifier { /// Whether data is currently being fetched. bool get isLoading => - _isSummariesLoading || _isGuardLoading || _isChecksLoading; + _isSummariesLoading || _isGuardLoading || _isJobsLoading; bool _isSummariesLoading = false; bool _isGuardLoading = false; - bool _isChecksLoading = false; + bool _isJobsLoading = false; /// The available SHAs for the current [pr]. List get availableSummaries => _availableSummaries; @@ -57,8 +57,8 @@ class PresubmitState extends ChangeNotifier { String? _selectedCheck; /// The checks/logs for the current [selectedCheck]. - List? get checks => _checks; - List? _checks; + List? get checks => _checks; + List? _checks; /// Track if we have already attempted to fetch summaries for the current [pr]. String? _lastFetchedPr; @@ -123,7 +123,7 @@ class PresubmitState extends ChangeNotifier { // if (isInProgress) { refreshes.add(fetchGuardStatus(refresh: true)); if (selectedCheck != null) { - refreshes.add(fetchCheckDetails(refresh: true)); + refreshes.add(fetchJobDetails(refresh: true)); } // } } @@ -183,7 +183,7 @@ class PresubmitState extends ChangeNotifier { _checks = null; notifyListeners(); if (_selectedCheck != null) { - fetchCheckDetails(); + fetchJobDetails(); } } @@ -290,19 +290,19 @@ class PresubmitState extends ChangeNotifier { notifyListeners(); } - /// Request check details for the current [selectedCheck] and [guardResponse]. - Future fetchCheckDetails({bool refresh = false}) async { - if (selectedCheck == null || guardResponse == null || _isChecksLoading) { + /// Request job details for the current [selectedCheck] and [guardResponse]. + Future fetchJobDetails({bool refresh = false}) async { + if (selectedCheck == null || guardResponse == null || _isJobsLoading) { return; } - _isChecksLoading = true; + _isJobsLoading = true; if (!refresh) { _checks = null; } notifyListeners(); - final response = await cocoonService.fetchPresubmitCheckDetails( + final response = await cocoonService.fetchPresubmitJobDetails( checkRunId: guardResponse!.checkRunId, buildName: selectedCheck!, ); @@ -312,7 +312,7 @@ class PresubmitState extends ChangeNotifier { } else { _checks = response.data; } - _isChecksLoading = false; + _isJobsLoading = false; notifyListeners(); } diff --git a/dashboard/test/logic/presubmit_guard_test.dart b/dashboard/test/logic/presubmit_guard_test.dart index 4b4d810fb..f263de2f3 100644 --- a/dashboard/test/logic/presubmit_guard_test.dart +++ b/dashboard/test/logic/presubmit_guard_test.dart @@ -37,7 +37,7 @@ void main() { }); }); - group('PresubmitCheckResponse', () { + group('PresubmitJobResponse', () { test('fromJson creates a valid object', () { final json = { 'attempt_number': 1, @@ -47,7 +47,7 @@ void main() { 'summary': 'Check passed', }; - final response = PresubmitCheckResponse.fromJson(json); + final response = PresubmitJobResponse.fromJson(json); expect(response.attemptNumber, 1); expect(response.buildName, 'Linux Device Doctor'); diff --git a/dashboard/test/service/presubmit_service_test.dart b/dashboard/test/service/presubmit_service_test.dart index 365dbae79..04c9c8516 100644 --- a/dashboard/test/service/presubmit_service_test.dart +++ b/dashboard/test/service/presubmit_service_test.dart @@ -58,10 +58,10 @@ void main() { }); }); - group('AppEngine CocoonService fetchPresubmitCheckDetails', () { + group('AppEngine CocoonService fetchPresubmitJobDetails', () { late AppEngineCocoonService service; - test('should return expected List', () async { + test('should return expected List', () async { final checkData = [ { 'attempt_number': 1, @@ -78,7 +78,7 @@ void main() { }), ); - final response = await service.fetchPresubmitCheckDetails( + final response = await service.fetchPresubmitJobDetails( checkRunId: 456, buildName: 'test1', ); diff --git a/dashboard/test/utils/mocks.mocks.dart b/dashboard/test/utils/mocks.mocks.dart index 543395673..273f6f133 100644 --- a/dashboard/test/utils/mocks.mocks.dart +++ b/dashboard/test/utils/mocks.mocks.dart @@ -611,30 +611,30 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { as _i8.Future<_i3.CocoonResponse<_i12.PresubmitGuardResponse>>); @override - _i8.Future<_i3.CocoonResponse>> - fetchPresubmitCheckDetails({ + _i8.Future<_i3.CocoonResponse>> + fetchPresubmitJobDetails({ required int? checkRunId, required String? buildName, }) => (super.noSuchMethod( - Invocation.method(#fetchPresubmitCheckDetails, [], { + Invocation.method(#fetchPresubmitJobDetails, [], { #checkRunId: checkRunId, #buildName: buildName, }), returnValue: _i8.Future< - _i3.CocoonResponse> + _i3.CocoonResponse> >.value( - _FakeCocoonResponse_2>( + _FakeCocoonResponse_2>( this, - Invocation.method(#fetchPresubmitCheckDetails, [], { + Invocation.method(#fetchPresubmitJobDetails, [], { #checkRunId: checkRunId, #buildName: buildName, }), ), ), ) - as _i8.Future<_i3.CocoonResponse>>); + as _i8.Future<_i3.CocoonResponse>>); @override _i8.Future<_i3.CocoonResponse>> diff --git a/dashboard/test/views/presubmit_view_test.dart b/dashboard/test/views/presubmit_view_test.dart index e77301948..604679554 100644 --- a/dashboard/test/views/presubmit_view_test.dart +++ b/dashboard/test/views/presubmit_view_test.dart @@ -195,20 +195,20 @@ void main() { ).thenAnswer((_) async => const CocoonResponse.data(guardResponse)); when( - mockCocoonService.fetchPresubmitCheckDetails( + mockCocoonService.fetchPresubmitJobDetails( checkRunId: anyNamed('checkRunId'), buildName: argThat(contains('mac_host_engine'), named: 'buildName'), ), ).thenAnswer( (_) async => CocoonResponse.data([ - PresubmitCheckResponse( + PresubmitJobResponse( attemptNumber: 1, buildName: 'Mac mac_host_engine 1', creationTime: 0, status: 'Succeeded', summary: 'All tests passed (452/452)', ), - PresubmitCheckResponse( + PresubmitJobResponse( attemptNumber: 2, buildName: 'Mac mac_host_engine 1', creationTime: 0, @@ -378,13 +378,13 @@ void main() { ).thenAnswer((_) async => const CocoonResponse.data(guardResponse)); when( - mockCocoonService.fetchPresubmitCheckDetails( + mockCocoonService.fetchPresubmitJobDetails( checkRunId: 456, buildName: 'Mac mac_host_engine', ), ).thenAnswer( (_) async => CocoonResponse.data([ - PresubmitCheckResponse( + PresubmitJobResponse( attemptNumber: 1, buildName: 'Mac mac_host_engine', creationTime: 0, diff --git a/packages/cocoon_common/lib/rpc_model.dart b/packages/cocoon_common/lib/rpc_model.dart index 99bcad1e9..f94dace21 100644 --- a/packages/cocoon_common/lib/rpc_model.dart +++ b/packages/cocoon_common/lib/rpc_model.dart @@ -34,11 +34,10 @@ export 'src/rpc_model/commit_status.dart' show CommitStatus; export 'src/rpc_model/content_hash_lookup.dart' show ContentHashLookup; export 'src/rpc_model/merge_group_hooks.dart' show MergeGroupHook, MergeGroupHooks; -export 'src/rpc_model/presubmit_check_response.dart' - show PresubmitCheckResponse; export 'src/rpc_model/presubmit_guard.dart' show PresubmitGuardResponse, PresubmitGuardStage; export 'src/rpc_model/presubmit_guard_summary.dart' show PresubmitGuardSummary; +export 'src/rpc_model/presubmit_job_response.dart' show PresubmitJobResponse; export 'src/rpc_model/suppressed_test.dart' show SuppressedTest, SuppressionUpdate; export 'src/rpc_model/task.dart' show Task; diff --git a/packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.dart b/packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.dart similarity index 51% rename from packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.dart rename to packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.dart index 4d6b9b444..7323c1a09 100644 --- a/packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.dart +++ b/packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.dart @@ -7,18 +7,18 @@ import 'package:meta/meta.dart'; import 'base.dart'; -part 'presubmit_check_response.g.dart'; +part 'presubmit_job_response.g.dart'; -/// RPC model for a presubmit check. +/// RPC model for a presubmit job. @JsonSerializable( checked: true, fieldRename: FieldRename.snake, includeIfNull: false, ) @immutable -final class PresubmitCheckResponse extends Model { - /// Creates a [PresubmitCheckResponse] with the given properties. - PresubmitCheckResponse({ +final class PresubmitJobResponse extends Model { + /// Creates a [PresubmitJobResponse] with the given properties. + PresubmitJobResponse({ required this.attemptNumber, required this.buildName, required this.creationTime, @@ -29,39 +29,39 @@ final class PresubmitCheckResponse extends Model { this.buildNumber, }); - /// Creates a [PresubmitCheckResponse] from [json] representation. - factory PresubmitCheckResponse.fromJson(Map json) { + /// Creates a [PresubmitJobResponse] from [json] representation. + factory PresubmitJobResponse.fromJson(Map json) { try { - return _$PresubmitCheckResponseFromJson(json); + return _$PresubmitJobResponseFromJson(json); } on CheckedFromJsonException catch (e) { - throw FormatException('Invalid PresubmitCheckResponse: $e', json); + throw FormatException('Invalid PresubmitJobResponse: $e', json); } } - /// The attempt number for this check. + /// The attempt number for this job. final int attemptNumber; /// The name of the build. final String buildName; - /// The time the check was created in milliseconds since the epoch. + /// The time the job was created in milliseconds since the epoch. final int creationTime; - /// The time the check started in milliseconds since the epoch. + /// The time the job started in milliseconds since the epoch. final int? startTime; - /// The time the check ended in milliseconds since the epoch. + /// The time the job ended in milliseconds since the epoch. final int? endTime; - /// The status of the check. + /// The status of the job. final String status; - /// A brief summary of the check result or link to logs. + /// A brief summary of the job result or link to logs. final String? summary; /// The LUCI build number. final int? buildNumber; @override - Map toJson() => _$PresubmitCheckResponseToJson(this); + Map toJson() => _$PresubmitJobResponseToJson(this); } diff --git a/packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.g.dart b/packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.g.dart similarity index 85% rename from packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.g.dart rename to packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.g.dart index e4cbf60c6..d025bf289 100644 --- a/packages/cocoon_common/lib/src/rpc_model/presubmit_check_response.g.dart +++ b/packages/cocoon_common/lib/src/rpc_model/presubmit_job_response.g.dart @@ -1,18 +1,18 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'presubmit_check_response.dart'; +part of 'presubmit_job_response.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** -PresubmitCheckResponse _$PresubmitCheckResponseFromJson( +PresubmitJobResponse _$PresubmitJobResponseFromJson( Map json, ) => $checkedCreate( - 'PresubmitCheckResponse', + 'PresubmitJobResponse', json, ($checkedConvert) { - final val = PresubmitCheckResponse( + final val = PresubmitJobResponse( attemptNumber: $checkedConvert( 'attempt_number', (v) => (v as num).toInt(), @@ -37,8 +37,8 @@ PresubmitCheckResponse _$PresubmitCheckResponseFromJson( }, ); -Map _$PresubmitCheckResponseToJson( - PresubmitCheckResponse instance, +Map _$PresubmitJobResponseToJson( + PresubmitJobResponse instance, ) => { 'attempt_number': instance.attemptNumber, 'build_name': instance.buildName, diff --git a/packages/cocoon_common/test/presubmit_check_response_test.dart b/packages/cocoon_common/test/presubmit_job_response_test.dart similarity index 86% rename from packages/cocoon_common/test/presubmit_check_response_test.dart rename to packages/cocoon_common/test/presubmit_job_response_test.dart index d77f62bf8..4b2cb2d37 100644 --- a/packages/cocoon_common/test/presubmit_check_response_test.dart +++ b/packages/cocoon_common/test/presubmit_job_response_test.dart @@ -6,7 +6,7 @@ import 'package:cocoon_common/rpc_model.dart'; import 'package:test/test.dart'; void main() { - group('PresubmitCheckResponse', () { + group('PresubmitJobResponse', () { test('toJson and fromJson handles buildNumber', () { final json = { 'attempt_number': 1, @@ -16,7 +16,7 @@ void main() { 'build_number': 456, }; - final response = PresubmitCheckResponse.fromJson(json); + final response = PresubmitJobResponse.fromJson(json); expect(response.buildNumber, 456); final backToJson = response.toJson(); @@ -31,7 +31,7 @@ void main() { 'status': 'succeeded', }; - final response = PresubmitCheckResponse.fromJson(json); + final response = PresubmitJobResponse.fromJson(json); expect(response.buildNumber, isNull); final backToJson = response.toJson();