api+sysroot: Retrieve logdir for build target

Current implementation retrieves the PORTAGE_LOGDIR envvar for the host,
not for the build target associated with the sysroot.

BUG=b:204816060
TEST=./run_tests

Change-Id: I1b0593ae12362036d267b97f36c175174a022359
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3440381
Reviewed-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Lizzy Presland <zland@google.com>
Tested-by: Lizzy Presland <zland@google.com>
Auto-Submit: Lizzy Presland <zland@google.com>
diff --git a/api/controller/controller_util_unittest.py b/api/controller/controller_util_unittest.py
index def3080..4a26066 100644
--- a/api/controller/controller_util_unittest.py
+++ b/api/controller/controller_util_unittest.py
@@ -4,6 +4,8 @@
 
 """controller_util unittests."""
 
+import glob
+
 from chromite.api.controller import controller_util
 from chromite.api.gen.chromite.api import build_api_test_pb2
 from chromite.api.gen.chromite.api import sysroot_pb2
@@ -13,8 +15,7 @@
 from chromite.lib import cros_test_lib
 from chromite.lib.parser import package_info
 from chromite.lib.chroot_lib import Chroot
-from chromite.lib.sysroot_lib import Sysroot
-from chromite.lib.sysroot_lib import PackageInstallError
+from chromite.lib import sysroot_lib
 
 
 class ParseChrootTest(cros_test_lib.MockTestCase):
@@ -54,7 +55,7 @@
     """test successful handling case."""
     path = '/build/rare_pokemon'
     sysroot_message = sysroot_pb2.Sysroot(path=path)
-    expected = Sysroot(path=path)
+    expected = sysroot_lib.Sysroot(path=path)
     result = controller_util.ParseSysroot(sysroot_message)
     self.assertEqual(expected, result)
 
@@ -232,15 +233,57 @@
   assert pkg_info.cpvr == 'foo/bar-1.2.3-r4'
 
 
-def test_retrieve_package_log_paths():
-  error = PackageInstallError(
+def test_retrieve_package_log_paths(monkeypatch):
+  class MockSysroot():
+    """Mock implementation of sysroot."""
+    def __init__(self, path):
+      pass
+    @property
+    def portage_logdir(self):
+      return '/path/to/sysroot/logdir'
+
+  old_time = '20210609-162000'
+  new_time = '20220420-131200'
+  def mock_glob(glob_path):
+    return [glob_path.replace('*', old_time),
+            glob_path.replace('*', new_time)]
+
+  monkeypatch.setattr(sysroot_lib, 'Sysroot', MockSysroot)
+  monkeypatch.setattr(glob, 'glob', mock_glob)
+  error = sysroot_lib.PackageInstallError(
       msg='Failed to install 3 packages',
       result=cros_build_lib.CommandResult(),
       packages=[package_info.parse('foo/bar%d-1.0-r1' % num)
                 for num in range(1, 4)])
   output_proto = sysroot_pb2.InstallPackagesResponse()
-  target_sysroot = Sysroot(path='/path/to/sysroot')
   controller_util.retrieve_package_log_paths(error,
                                              output_proto,
-                                             target_sysroot)
+                                             sysroot_lib.Sysroot('/'))
   assert len(output_proto.failed_package_data) == 3
+  for pd in output_proto.failed_package_data:
+    assert pd.log_path.path != ''
+    assert new_time in pd.log_path.path
+
+
+def test_retrieve_package_log_paths_not_found(monkeypatch):
+  class MockSysroot():
+    """Mock implementation of sysroot."""
+    def __init__(self, path):
+      pass
+    @property
+    def portage_logdir(self):
+      return '/path/to/sysroot/logdir'
+
+  monkeypatch.setattr(sysroot_lib, 'Sysroot', MockSysroot)
+  error = sysroot_lib.PackageInstallError(
+      msg='Failed to install 3 packages',
+      result=cros_build_lib.CommandResult(),
+      packages=[package_info.parse('foo/bar%d-1.0-r1' % num)
+                for num in range(1, 4)])
+  output_proto = sysroot_pb2.InstallPackagesResponse()
+  controller_util.retrieve_package_log_paths(error,
+                                             output_proto,
+                                             sysroot_lib.Sysroot('/'))
+  assert len(output_proto.failed_package_data) == 3
+  for pd in output_proto.failed_package_data:
+    assert pd.log_path.path == ''