cbuildbot: simplify paygen unittests

Patching the parallel module internals is a bit dicey and breaks
when using newer versions of mock.  Patch the target function
instead, and switch to the ParallelMock class.  This also speeds
up the tests significantly.

BUG=chromium:1015720
TEST=`./run_tests` passes

Change-Id: Ia42a78d4bab6ef1661c3faaaaff9516a8fbb4141
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2690930
Tested-by: Mike Frysinger <vapier@chromium.org>
Auto-Submit: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Navil Perez <navil@google.com>
Reviewed-by: Navil Perez <navil@google.com>
diff --git a/cbuildbot/stages/release_stages_unittest.py b/cbuildbot/stages/release_stages_unittest.py
index c72ece2..9ef94d1 100644
--- a/cbuildbot/stages/release_stages_unittest.py
+++ b/cbuildbot/stages/release_stages_unittest.py
@@ -16,6 +16,7 @@
 from chromite.lib import constants
 from chromite.lib import failures_lib
 from chromite.lib import parallel
+from chromite.lib import parallel_unittest
 from chromite.lib import results_lib
 from chromite.lib import timeout_util
 from chromite.lib.buildstore import FakeBuildStore
@@ -347,12 +348,12 @@
 
   def testPerformStageSuccess(self):
     """Test that PaygenStage works when signing works."""
-    with patch(release_stages.parallel, 'BackgroundTaskRunner') as background:
-      queue = background().__enter__()
+    with patch(release_stages.PaygenStage, '_RunPaygenInProcess') as runner:
       channels = ['stable', 'beta']
       stage = self.ConstructStage(channels=channels)
 
-      stage.PerformStage()
+      with parallel_unittest.ParallelMock():
+        stage.PerformStage()
 
       metadata_channels = self._run.attrs.metadata.GetValue('channels')
       self.assertEqual(','.join(channels), metadata_channels)
@@ -361,40 +362,38 @@
       self.assertEqual(self.validateMock.call_args_list,
                        [mock.call('auron-yuna')])
 
-      # Verify that we queue up work
-      self.assertEqual(queue.put.call_args_list, [
+      # Verify that we queue up work.
+      runner.assert_has_calls([
           mock.call(
-              ('stable', 'auron-yuna', '0.0.1', False, False, False)),
-          mock.call(('beta', 'auron-yuna', '0.0.1', False, False, False))
+              stage, 'stable', 'auron-yuna', '0.0.1', False, False, False),
+          mock.call(stage, 'beta', 'auron-yuna', '0.0.1', False, False, False),
       ])
 
   def testPerformStageNoChannels(self):
     """Test that PaygenStage works when signing works."""
-    with patch(release_stages.parallel, 'BackgroundTaskRunner') as background:
-      queue = background().__enter__()
-
+    with patch(release_stages.PaygenStage, '_RunPaygenInProcess') as runner:
       stage = self.ConstructStage(channels=[])
 
-      stage.PerformStage()
+      with parallel_unittest.ParallelMock():
+        stage.PerformStage()
 
-      # Verify that we queue up work
-      self.assertEqual(queue.put.call_args_list, [])
+      # Verify that we did not queue up work.
+      runner.assert_not_called()
 
   def testPerformStageTrybot(self):
     """Test the PerformStage alternate behavior for trybot runs."""
-    with patch(release_stages.parallel, 'BackgroundTaskRunner') as background:
-      queue = background().__enter__()
-
+    with patch(release_stages.PaygenStage, '_RunPaygenInProcess') as runner:
       # The stage is constructed differently for trybots, so don't use
       # ConstructStage.
       stage = self.ConstructStage(channels=['foo', 'bar'])
-      stage.PerformStage()
+      with parallel_unittest.ParallelMock():
+        stage.PerformStage()
 
       # Notice that we didn't put anything in _wait_for_channel_signing, but
       # still got results right away.
-      self.assertEqual(queue.put.call_args_list, [
-          mock.call(('foo', 'auron-yuna', '0.0.1', False, False, False)),
-          mock.call(('bar', 'auron-yuna', '0.0.1', False, False, False)),
+      runner.assert_has_calls([
+          mock.call(stage, 'foo', 'auron-yuna', '0.0.1', False, False, False),
+          mock.call(stage, 'bar', 'auron-yuna', '0.0.1', False, False, False),
       ])
 
   def testPerformStageUnknownBoard(self):