android: plumb Android branch via LKGB

- WriteLKGB takes Android branch as an optional param; branch info is
  included in the generated LKGB file.
- uprev_android_lkgb (called by PUpr) reads the branch info from LKGB
  and sends it down to cros_mark_android_as_stable.

BUG=b:259008604
TEST=./run_tests
TEST=./api/contrib/gen_call_scripts; ./api/contrib/call_scripts/android__write_lkgb

Change-Id: I19b2ef4700459f162266f9ebf0297fdfb57e26ef
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4600548
Reviewed-by: Gilberto Contreras <gcontreras@google.com>
Commit-Queue: Shao-Chuan Lee <shaochuan@chromium.org>
Tested-by: Shao-Chuan Lee <shaochuan@chromium.org>
diff --git a/api/controller/android.py b/api/controller/android.py
index faeb29b..ab8111f 100644
--- a/api/controller/android.py
+++ b/api/controller/android.py
@@ -147,6 +147,10 @@
 def WriteLKGB(input_proto, output_proto, _config):
     android_package = input_proto.android_package
     android_version = input_proto.android_version
+    android_branch = (
+        input_proto.android_branch
+        or android.GetAndroidBranchForPackage(android_package)
+    )
     android_package_dir = android.GetAndroidPackageDir(android_package)
 
     # Attempt to read current LKGB, if available.
@@ -171,7 +175,9 @@
         )
 
     lkgb = android.LKGB(
-        build_id=android_version, runtime_artifacts_pin=runtime_artifacts_pin
+        build_id=android_version,
+        branch=android_branch,
+        runtime_artifacts_pin=runtime_artifacts_pin,
     )
 
     # Do nothing if LKGB is already set to the requested version.
diff --git a/api/controller/android_unittest.py b/api/controller/android_unittest.py
index 62b60e4..8e5b3a4 100644
--- a/api/controller/android_unittest.py
+++ b/api/controller/android_unittest.py
@@ -231,6 +231,17 @@
     def setUp(self):
         self._output_proto = android_pb2.WriteLKGBResponse()
 
+        self.PatchObject(
+            service_android,
+            "GetAndroidBranchForPackage",
+            return_value="android-branch",
+        )
+        self.PatchObject(
+            service_android,
+            "GetAndroidPackageDir",
+            return_value="android-package-dir",
+        )
+
         # Mock milestone for FindRuntimeArtifactsPin().
         self.PatchObject(
             packages,
@@ -280,18 +291,13 @@
         mock_read_lkgb = self.PatchObject(
             service_android,
             "ReadLKGB",
-            return_value=dict(build_id="old-version"),
+            return_value=dict(build_id="old-version", branch="android-branch"),
         )
         mock_write_lkgb = self.PatchObject(
             service_android, "WriteLKGB", return_value="mock_file"
         )
         self.PatchObject(
             service_android,
-            "GetAndroidPackageDir",
-            return_value="android-package-dir",
-        )
-        self.PatchObject(
-            service_android,
             "FindRuntimeArtifactsPin",
             return_value=None,
         )
@@ -304,7 +310,7 @@
         mock_read_lkgb.assert_called_once_with("android-package-dir")
         mock_write_lkgb.assert_called_once_with(
             "android-package-dir",
-            dict(build_id="android-version"),
+            dict(build_id="android-version", branch="android-branch"),
         )
         self.assertSequenceEqual(
             self._output_proto.modified_files, ["mock_file"]
@@ -317,14 +323,14 @@
             "ReadLKGB",
             return_value=dict(
                 build_id="android-version",
+                branch="android-branch",
                 runtime_artifacts_pin="runtime-artifacts-pin",
             ),
         )
-        mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
-        self.PatchObject(
+        mock_write_lkgb = self.PatchObject(
             service_android,
-            "GetAndroidPackageDir",
-            return_value="android-package-dir",
+            "WriteLKGB",
+            side_effect=Exception("shouldn't get called"),
         )
         self.PatchObject(
             service_android,
@@ -353,11 +359,6 @@
         )
         self.PatchObject(
             service_android,
-            "GetAndroidPackageDir",
-            return_value="android-package-dir",
-        )
-        self.PatchObject(
-            service_android,
             "FindRuntimeArtifactsPin",
             return_value=None,
         )
@@ -370,7 +371,7 @@
         mock_read_lkgb.assert_called_once_with("android-package-dir")
         mock_write_lkgb.assert_called_once_with(
             "android-package-dir",
-            dict(build_id="android-version"),
+            dict(build_id="android-version", branch="android-branch"),
         )
         self.assertSequenceEqual(
             self._output_proto.modified_files, ["mock_file"]
@@ -388,11 +389,6 @@
         )
         self.PatchObject(
             service_android,
-            "GetAndroidPackageDir",
-            return_value="android-package-dir",
-        )
-        self.PatchObject(
-            service_android,
             "FindRuntimeArtifactsPin",
             return_value=None,
         )
@@ -405,7 +401,7 @@
         mock_read_lkgb.assert_called_once_with("android-package-dir")
         mock_write_lkgb.assert_called_once_with(
             "android-package-dir",
-            dict(build_id="android-version"),
+            dict(build_id="android-version", branch="android-branch"),
         )
         self.assertSequenceEqual(
             self._output_proto.modified_files, ["mock_file"]
@@ -425,11 +421,6 @@
         )
         self.PatchObject(
             service_android,
-            "GetAndroidPackageDir",
-            return_value="android-package-dir",
-        )
-        self.PatchObject(
-            service_android,
             "FindRuntimeArtifactsPin",
             return_value="runtime-artifacts-pin",
         )
@@ -444,6 +435,7 @@
             "android-package-dir",
             dict(
                 build_id="android-version",
+                branch="android-branch",
                 runtime_artifacts_pin="runtime-artifacts-pin",
             ),
         )