Change some LuciBuildService methods to return Build objects (#2338)

* Change some LuciBuildService methods to return Build objects

* Add validation for rescheduleBuild return object

* Update documentation for rescheduleBuild

* Update documentation for rescheduleUsingCheckRunEvent
diff --git a/app_dart/lib/src/service/luci_build_service.dart b/app_dart/lib/src/service/luci_build_service.dart
index 4b59af7..e3762e3 100644
--- a/app_dart/lib/src/service/luci_build_service.dart
+++ b/app_dart/lib/src/service/luci_build_service.dart
@@ -323,10 +323,13 @@
     return expectedFailedBuilds.toList();
   }
 
-  /// Sends [ScheduleBuildRequest] the buildset, user_agent, and
-  /// github_link tags are applied to match the original build. The build
-  /// properties from the original build are also preserved.
-  Future<bool> rescheduleBuild({
+  /// Sends [ScheduleBuildRequest] using information from a given build's
+  /// [BuildPushMessage].
+  ///
+  /// The buildset, user_agent, and github_link tags are applied to match the
+  /// original build. The build properties and user data from the original build
+  /// are also preserved.
+  Future<Build> rescheduleBuild({
     required String commitSha,
     required String builderName,
     required push_message.BuildPushMessage buildPushMessage,
@@ -336,7 +339,7 @@
     // is expecting just the last part after "."(prod).
     final String bucketName = buildPushMessage.build!.bucket!.split('.').last;
     final Map<String, dynamic>? userData = jsonDecode(buildPushMessage.userData!) as Map<String, dynamic>?;
-    await buildBucketClient.scheduleBuild(
+    return await buildBucketClient.scheduleBuild(
       ScheduleBuildRequest(
         builderId: BuilderId(
           project: buildPushMessage.build!.project,
@@ -356,13 +359,12 @@
         ),
       ),
     );
-    return true;
   }
 
   /// Sends [ScheduleBuildRequest] for [pullRequest] using [checkRunEvent].
   ///
-  /// Returns true if it is able to send the scheduleBuildRequest. Otherwise, false.
-  Future<bool> rescheduleUsingCheckRunEvent(cocoon_checks.CheckRunEvent checkRunEvent) async {
+  /// Returns the [Build] returned by scheduleBuildRequest.
+  Future<Build> rescheduleUsingCheckRunEvent(cocoon_checks.CheckRunEvent checkRunEvent) async {
     final github.RepositorySlug slug = checkRunEvent.repository!.slug();
 
     final String sha = checkRunEvent.checkRun!.headSha!;
@@ -401,7 +403,7 @@
 
     final String buildUrl = 'https://ci.chromium.org/ui/b/${scheduleBuild.id}';
     await githubChecksUtil.updateCheckRun(config, slug, githubCheckRun, detailsUrl: buildUrl);
-    return true;
+    return scheduleBuild;
   }
 
   /// Gets [Build] using its [id] and passing the additional
diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart
index d33a6f0..e2f7235 100644
--- a/app_dart/lib/src/service/scheduler.dart
+++ b/app_dart/lib/src/service/scheduler.dart
@@ -450,7 +450,8 @@
             success = true;
           }
         } else {
-          success = await luciBuildService.rescheduleUsingCheckRunEvent(checkRunEvent);
+          await luciBuildService.rescheduleUsingCheckRunEvent(checkRunEvent);
+          success = true;
         }
 
         log.fine('CheckName: $name State: $success');
diff --git a/app_dart/test/service/luci_build_service_test.dart b/app_dart/test/service/luci_build_service_test.dart
index f3a723a..284e0b7 100644
--- a/app_dart/test/service/luci_build_service_test.dart
+++ b/app_dart/test/service/luci_build_service_test.dart
@@ -740,12 +740,13 @@
 
     test('Reschedule an existing build', () async {
       when(mockBuildBucketClient.scheduleBuild(any)).thenAnswer((_) async => generateBuild(1));
-      final bool rescheduled = await service.rescheduleBuild(
+      final build = await service.rescheduleBuild(
         commitSha: 'abc',
         builderName: 'mybuild',
         buildPushMessage: buildPushMessage,
       );
-      expect(rescheduled, isTrue);
+      expect(build.id, '1');
+      expect(build.status, Status.success);
       verify(mockBuildBucketClient.scheduleBuild(any)).called(1);
     });
   });
diff --git a/app_dart/test/src/utilities/mocks.mocks.dart b/app_dart/test/src/utilities/mocks.mocks.dart
index 273de43..0e33d34 100644
--- a/app_dart/test/src/utilities/mocks.mocks.dart
+++ b/app_dart/test/src/utilities/mocks.mocks.dart
@@ -4763,7 +4763,7 @@
         returnValue: _i17.Future<List<_i9.Build?>>.value(<_i9.Build?>[]),
       ) as _i17.Future<List<_i9.Build?>>);
   @override
-  _i17.Future<bool> rescheduleBuild({
+  _i17.Future<_i9.Build> rescheduleBuild({
     required String? commitSha,
     required String? builderName,
     required _i30.BuildPushMessage? buildPushMessage,
@@ -4778,16 +4778,33 @@
             #buildPushMessage: buildPushMessage,
           },
         ),
-        returnValue: _i17.Future<bool>.value(false),
-      ) as _i17.Future<bool>);
+        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
+          this,
+          Invocation.method(
+            #rescheduleBuild,
+            [],
+            {
+              #commitSha: commitSha,
+              #builderName: builderName,
+              #buildPushMessage: buildPushMessage,
+            },
+          ),
+        )),
+      ) as _i17.Future<_i9.Build>);
   @override
-  _i17.Future<bool> rescheduleUsingCheckRunEvent(_i33.CheckRunEvent? checkRunEvent) => (super.noSuchMethod(
+  _i17.Future<_i9.Build> rescheduleUsingCheckRunEvent(_i33.CheckRunEvent? checkRunEvent) => (super.noSuchMethod(
         Invocation.method(
           #rescheduleUsingCheckRunEvent,
           [checkRunEvent],
         ),
-        returnValue: _i17.Future<bool>.value(false),
-      ) as _i17.Future<bool>);
+        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
+          this,
+          Invocation.method(
+            #rescheduleUsingCheckRunEvent,
+            [checkRunEvent],
+          ),
+        )),
+      ) as _i17.Future<_i9.Build>);
   @override
   _i17.Future<_i9.Build> getBuildById(
     String? id, {