Index: build/android/pylib/sharded_tests_queue.py |
diff --git a/build/android/pylib/sharded_tests_queue.py b/build/android/pylib/sharded_tests_queue.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d2b3779695d294c8a25b9ccddd73c6c010f97dad |
--- /dev/null |
+++ b/build/android/pylib/sharded_tests_queue.py |
@@ -0,0 +1,36 @@ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+ |
+"""A module that contains a queue for running sharded tests.""" |
+ |
+import multiprocessing |
+ |
+ |
+class ShardedTestsQueue(object): |
+ """A queue for managing pending tests across different runners. |
+ |
+ This class should only be used when sharding. |
+ |
+ Attributes: |
+ num_devices: an integer; the number of attached Android devices. |
+ tests: a list of tests to be run. |
+ tests_queue: if sharding, a JoinableQueue object that holds tests from |
+ |tests|. Otherwise, a list holding tests. |
+ results_queue: a Queue object to hold TestResults objects. |
+ """ |
+ _STOP_SENTINEL = 'STOP' # sentinel value for iter() |
+ |
+ def __init__(self, num_devices, tests): |
+ assert num_devices > 1, 'At least two devices must be attached.' |
+ self.num_devices = num_devices |
+ self.tests_queue = multiprocessing.Queue() |
+ for test in tests: |
+ self.tests_queue.put(test) |
+ for _ in xrange(self.num_devices): |
+ self.tests_queue.put(ShardedTestsQueue._STOP_SENTINEL) |
+ |
+ def __iter__(self): |
+ """Returns an iterator with the test cases.""" |
+ return iter(self.tests_queue.get, ShardedTestsQueue._STOP_SENTINEL) |