Build API: TestService/BuildTargetUnitTest method cleanup.

BUG=chromium:954609, b:130906048
TEST=run_tests

Change-Id: If2665e7dcddfb11a6733df158b39924cad45760c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1602932
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: David Burger <dburger@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/test.py b/api/controller/test.py
index 3a11a2d..f81fa9b 100644
--- a/api/controller/test.py
+++ b/api/controller/test.py
@@ -15,13 +15,11 @@
 from chromite.api import controller
 from chromite.api.controller import controller_util
 from chromite.api.gen.chromite.api import test_pb2
-from chromite.cbuildbot import commands
+from chromite.lib import build_target_util
 from chromite.lib import constants
 from chromite.lib import cros_build_lib
-from chromite.lib import failures_lib
 from chromite.lib import image_lib
 from chromite.lib import osutils
-from chromite.lib import portage_util
 from chromite.lib import sysroot_lib
 from chromite.scripts import cros_set_lsb_release
 from chromite.service import test
@@ -62,7 +60,8 @@
     cros_build_lib.Die('result_path is required.')
 
   # Method flags.
-  # An empty sysroot means build packages was not run.
+  # An empty sysroot means build packages was not run. This is used for
+  # certain boards that need to use prebuilts (e.g. grunt's unittest-only).
   was_built = not input_proto.flags.empty_sysroot
 
   # Skipped tests.
@@ -71,74 +70,27 @@
   for package_info in blacklisted_package_info:
     blacklist.append(controller_util.PackageInfoToString(package_info))
 
-  # Chroot handling.
-  chroot = input_proto.chroot.path
-  cache_dir = input_proto.chroot.cache_dir
+  build_target = build_target_util.BuildTarget(board)
+  chroot = controller_util.ParseChroot(input_proto.chroot)
 
-  chroot_args = []
-  if chroot:
-    chroot_args.extend(['--chroot', chroot])
-  else:
-    chroot = constants.DEFAULT_CHROOT_PATH
+  result = test.BuildTargetUnitTest(build_target, chroot, blacklist=blacklist,
+                                    was_built=was_built)
 
-  if cache_dir:
-    chroot_args.extend(['--cache_dir', cache_dir])
+  if not result.success:
+    # Failed to run tests or some tests failed.
+    # Record all failed packages.
+    for cpv in result.failed_cpvs:
+      package_info = output_proto.failed_packages.add()
+      controller_util.CPVToPackageInfo(cpv, package_info)
+    if result.failed_cpvs:
+      return controller.RETURN_CODE_UNSUCCESSFUL_RESPONSE_AVAILABLE
+    else:
+      return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
 
-  # TODO(crbug.com/954609) Service implementation.
-  extra_env = {'USE': 'chrome_internal'}
-  base_dir = os.path.join(chroot, 'tmp')
-  # The called code also sets the status file in some cases, but the hacky
-  # call makes it not always work, so set up our own just in case.
-  with osutils.TempDir(base_dir=base_dir) as tempdir:
-    full_sf_path = os.path.join(tempdir, 'status_file')
-    chroot_sf_path = full_sf_path.replace(chroot, '')
-    extra_env[constants.PARALLEL_EMERGE_STATUS_FILE_ENVVAR] = chroot_sf_path
-
-    try:
-      commands.RunUnitTests(constants.SOURCE_ROOT, board, extra_env=extra_env,
-                            chroot_args=chroot_args, build_stage=was_built,
-                            blacklist=blacklist)
-    except failures_lib.PackageBuildFailure as e:
-      # Add the failed packages.
-      for pkg in e.failed_packages:
-        cpv = portage_util.SplitCPV(pkg, strict=False)
-        package_info = output_proto.failed_packages.add()
-        controller_util.CPVToPackageInfo(cpv, package_info)
-
-      if e.failed_packages:
-        return controller.RETURN_CODE_UNSUCCESSFUL_RESPONSE_AVAILABLE
-      else:
-        return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
-    except failures_lib.BuildScriptFailure:
-      # Check our status file for failed packages in case the calling code's
-      # file didn't get set.
-      failed_packages = portage_util.ParseParallelEmergeStatusFile(full_sf_path)
-      for cpv in failed_packages:
-        package_info = output_proto.failed_packages.add()
-        controller_util.CPVToPackageInfo(cpv, package_info)
-
-      if failed_packages:
-        return controller.RETURN_CODE_UNSUCCESSFUL_RESPONSE_AVAILABLE
-      else:
-        return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
-
-    tarball = _BuildUnittestTarball(chroot, board, result_path)
-    if tarball:
-      output_proto.tarball_path = tarball
-
-
-def _BuildUnittestTarball(chroot, board, result_path):
-  """Build the unittest tarball."""
-  tarball = 'unit_tests.tar'
-  tarball_path = os.path.join(result_path, tarball)
-
-  cwd = os.path.join(chroot, 'build', board, constants.UNITTEST_PKG_PATH)
-
-  result = cros_build_lib.CreateTarball(tarball_path, cwd, chroot=chroot,
-                                        compression=cros_build_lib.COMP_NONE,
-                                        error_code_ok=True)
-
-  return tarball_path if result.returncode == 0 else None
+  sysroot = sysroot_lib.Sysroot(build_target.root)
+  tarball = test.BuildTargetUnitTestTarball(chroot, sysroot, result_path)
+  if tarball:
+    output_proto.tarball_path = tarball
 
 
 def ChromiteUnitTest(_input_proto, _output_proto):