cbuildbot.py: Add a --mock-slave-status option

This CL adds a cbuildbot option to mock out the _FetchSlaveStatuses
function used by MasterSlaveSyncCompletionStage to get results from
slave builders. This is useful for cbuildbot testing purposes.

BUG=None
TEST=Unit tests pass. Supplied a pickle file with an empty dictionary
with this flag, verified that CommitQueueCompletionStage passed without
waiting on status from real CQ slave builders.

Change-Id: Ib08f2928317ffda1b45203094ade7b81dd203f5f
Reviewed-on: https://chromium-review.googlesource.com/187919
Tested-by: Aviv Keshet <akeshet@chromium.org>
Reviewed-by: Yu-Ju Hong <yjhong@chromium.org>
Commit-Queue: Aviv Keshet <akeshet@chromium.org>
diff --git a/scripts/cbuildbot.py b/scripts/cbuildbot.py
index 4d4f481..a90da1c 100644
--- a/scripts/cbuildbot.py
+++ b/scripts/cbuildbot.py
@@ -17,6 +17,7 @@
 import logging
 import optparse
 import os
+import pickle
 import sys
 import time
 import traceback
@@ -1255,6 +1256,13 @@
                                'in conjunction with --debug, the tree status '
                                'will not be ignored as it usually is in a '
                                '--debug run.')
+  group.add_remote_option('--mock-slave-status', dest='mock_slave_status',
+                          default=None, action='store',
+                          metavar='MOCK_SLAVE_STATUS_PICKLE_FILE',
+                          help='Override the result of the _FetchSlaveStatuses '
+                               'method of MasterSlaveSyncCompletionStage, by '
+                               'specifying a file with a pickle of the result '
+                               'to be returned.')
 
   parser.add_option_group(group)
 
@@ -1678,4 +1686,10 @@
       stack.Add(mock.patch.object, timeout_util, '_GetStatus',
                 return_value=options.mock_tree_status)
 
+    if options.mock_slave_status is not None:
+      with open(options.mock_slave_status, 'r') as f:
+        mock_status = pickle.load(f)
+      stack.Add(mock.patch.object, stages.MasterSlaveSyncCompletionStage,
+                '_FetchSlaveStatuses', return_value=mock_status)
+
     _RunBuildStagesWrapper(options, build_config)