BAPI: Update service API to report LaCrOS version

The LaCrOS version is determined following the same approach used for
Chrome.

BUG=b:235371788
TEST=./unit_tests

Change-Id: I0a961c6f8fc7a6dd0d5cf510380c12f8473513c0
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4205801
Tested-by: Gilberto Contreras <gcontreras@google.com>
Commit-Queue: Gilberto Contreras <gcontreras@google.com>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index cd79b88..feafe40 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -155,7 +155,9 @@
 def GetChromeVersion(input_proto, output_proto, _config):
     """Returns the chrome version."""
     build_target = controller_util.ParseBuildTarget(input_proto.build_target)
-    chrome_version = packages.determine_chrome_version(build_target)
+    chrome_version = packages.determine_package_version(
+        constants.CHROME_CP, build_target
+    )
     if chrome_version:
         output_proto.version = chrome_version
 
@@ -169,6 +171,7 @@
     output_proto.platform_version = "12438.0.0"
     output_proto.milestone_version = "78"
     output_proto.full_version = "R78-12438.0.0"
+    output_proto.lacros_version = "111.0.5550.0"
 
 
 @faux.success(_GetTargetVersionsResponse)
@@ -191,6 +194,7 @@
     output_proto.platform_version = target_versions.platform_version or ""
     output_proto.milestone_version = target_versions.milestone_version or ""
     output_proto.full_version = target_versions.full_version or ""
+    output_proto.lacros_version = target_versions.lacros_version or ""
 
 
 def _GetBuilderMetadataResponse(input_proto, output_proto, _config):
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index f0c7b19..30a5f50 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -293,7 +293,7 @@
     def testValidateOnly(self):
         """Verify a validate-only call does not execute any logic."""
         chrome_version = self.PatchObject(
-            packages_service, "determine_chrome_version"
+            packages_service, "determine_package_version"
         )
         request = self._GetRequest(board="betty")
         packages_controller.GetChromeVersion(
@@ -304,7 +304,7 @@
     def testMockCall(self):
         """Test a mock call does not execute logic, returns mocked value."""
         chrome_version = self.PatchObject(
-            packages_service, "determine_chrome_version"
+            packages_service, "determine_package_version"
         )
         request = self._GetRequest(board="betty")
         packages_controller.GetChromeVersion(
@@ -318,7 +318,7 @@
         chrome_version = "76.0.1.2"
         chrome_version_mock = self.PatchObject(
             packages_service,
-            "determine_chrome_version",
+            "determine_package_version",
             return_value=chrome_version,
         )
         request = self._GetRequest(board="betty")
@@ -326,14 +326,16 @@
             request, self.response, self.api_config
         )
         self.assertEqual(self.response.version, chrome_version)
-        # Verify call to determine_chrome_version passes a build_target object.
+        # Verify call to determine_package_version passes a build_target object.
         build_target = build_target_lib.BuildTarget("betty")
-        chrome_version_mock.assert_called_with(build_target)
+        chrome_version_mock.assert_called_with(
+            constants.CHROME_CP, build_target
+        )
 
     def testGetChromeVersionHandleNone(self):
         """Verify basic return values."""
         self.PatchObject(
-            packages_service, "determine_chrome_version", return_value=None
+            packages_service, "determine_package_version", return_value=None
         )
         request = self._GetRequest(board="betty")
         packages_controller.GetChromeVersion(
@@ -404,10 +406,11 @@
         # Mock that chrome is built and set the chrome_version.
         self.PatchObject(packages_service, "builds", return_value=True)
         chrome_version = "76.0.1.2"
-        chrome_version_mock = self.PatchObject(
+        lacros_version = "100.0.0.1"
+        package_version_mock = self.PatchObject(
             packages_service,
-            "determine_chrome_version",
-            return_value=chrome_version,
+            "determine_package_version",
+            side_effect=[chrome_version, lacros_version],
         )
         android_package = "chromeos-base/android-container-pi-10.3"
         self.PatchObject(
@@ -450,9 +453,15 @@
         self.assertEqual(self.response.platform_version, platform_version)
         self.assertEqual(self.response.milestone_version, milestone_version)
         self.assertEqual(self.response.full_version, full_version)
+        self.assertEqual(self.response.lacros_version, lacros_version)
         # Verify call to determine_chrome_version passes a build_target object.
         build_target = build_target_lib.BuildTarget("betty")
-        chrome_version_mock.assert_called_with(build_target)
+        package_version_mock.assert_has_calls(
+            calls=[
+                mock.call(constants.CHROME_CP, build_target),
+                mock.call(constants.LACROS_CP, build_target),
+            ]
+        )
         # Verify call to determine_android_branch passes a board name.
         android_branch_mock.assert_called_with("betty")
 
@@ -466,10 +475,11 @@
         )
         # Mock that chrome is built and set the chrome_version.
         chrome_version = "76.0.1.2"
+        lacros_version = "100.0.0.1"
         self.PatchObject(
             packages_service,
-            "determine_chrome_version",
-            return_value=chrome_version,
+            "determine_package_version",
+            side_effect=[chrome_version, lacros_version],
         )
         android_package = "chromeos-base/android-container-pi-10.3"
         self.PatchObject(
@@ -523,11 +533,17 @@
         self.assertEqual(self.response.chrome_version, chrome_version)
         self.assertEqual(self.response.platform_version, platform_version)
         self.assertEqual(self.response.milestone_version, milestone_version)
+        self.assertEqual(self.response.lacros_version, lacros_version)
         # Verify call to packages.builds passes the package list.
-        builds_mock.assert_called_with(
-            constants.CHROME_CP,
-            mock.ANY,  # Match the build target object
-            packages=cpv_package_list,
+        builds_mock.assert_has_calls(
+            calls=[
+                mock.call(
+                    constants.CHROME_CP, mock.ANY, packages=cpv_package_list
+                ),
+                mock.call(
+                    constants.LACROS_CP, mock.ANY, packages=cpv_package_list
+                ),
+            ]
         )
 
     def testGetTargetVersionNoAndroidNoChrome(self):