BuildTargetUnitTest: Add package blacklist support.

BUG=chromium:964128
TEST=run_tests

Change-Id: Icae780e987389057f8a4d477e0432c4ba0b70d97
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1615655
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Evan Hernandez <evanhernandez@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/test.py b/api/controller/test.py
index aa0d541..bdc089f 100644
--- a/api/controller/test.py
+++ b/api/controller/test.py
@@ -59,6 +59,12 @@
   # An empty sysroot means build packages was not run.
   was_built = not input_proto.flags.empty_sysroot
 
+  # Skipped tests.
+  blacklisted_package_info = input_proto.package_blacklist
+  blacklist = []
+  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
@@ -84,7 +90,8 @@
 
     try:
       commands.RunUnitTests(constants.SOURCE_ROOT, board, extra_env=extra_env,
-                            chroot_args=chroot_args, build_stage=was_built)
+                            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:
diff --git a/api/controller/test_unittest.py b/api/controller/test_unittest.py
index 4ffdf34..48a151b 100644
--- a/api/controller/test_unittest.py
+++ b/api/controller/test_unittest.py
@@ -26,12 +26,18 @@
   """Tests for the UnitTest function."""
 
   def _GetInput(self, board=None, result_path=None, chroot_path=None,
-                cache_dir=None, empty_sysroot=None):
+                cache_dir=None, empty_sysroot=None, blacklist=None):
     """Helper to build an input message instance."""
+    formatted_blacklist = []
+    for pkg in blacklist or []:
+      formatted_blacklist.append({'category': pkg.category,
+                                  'package_name': pkg.package})
+
     return test_pb2.BuildTargetUnitTestRequest(
         build_target={'name': board}, result_path=result_path,
         chroot={'path': chroot_path, 'cache_dir': cache_dir},
-        flags={'empty_sysroot': empty_sysroot}
+        flags={'empty_sysroot': empty_sysroot},
+        package_blacklist=formatted_blacklist,
     )
 
   def _GetOutput(self):
@@ -123,8 +129,10 @@
     self.PatchObject(portage_util, 'ParseParallelEmergeStatusFile',
                      return_value=[])
 
+    pkgs = ['foo/bar', 'cat/pkg']
+    blacklist = [portage_util.SplitCPV(p, strict=False) for p in pkgs]
     input_msg = self._GetInput(board='board', result_path=self.tempdir,
-                               empty_sysroot=True)
+                               empty_sysroot=True, blacklist=blacklist)
     output_msg = self._GetOutput()
 
     rc = test_controller.BuildTargetUnitTest(input_msg, output_msg)
@@ -132,7 +140,8 @@
     self.assertNotEqual(0, rc)
     self.assertFalse(output_msg.failed_packages)
     patch.assert_called_with(constants.SOURCE_ROOT, 'board', extra_env=mock.ANY,
-                             chroot_args=mock.ANY, build_stage=False)
+                             chroot_args=mock.ANY, build_stage=False,
+                             blacklist=pkgs)
 
 
 class VmTestTest(cros_test_lib.MockTestCase):