OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Shards a given test suite and runs the shards in parallel. | 6 """Shards a given test suite and runs the shards in parallel. |
7 | 7 |
8 ShardingSupervisor is called to process the command line options and creates | 8 ShardingSupervisor is called to process the command line options and creates |
9 the specified number of worker threads. These threads then run each shard of | 9 the specified number of worker threads. These threads then run each shard of |
10 the test in a separate process and report on the results. When all the shards | 10 the test in a separate process and report on the results. When all the shards |
11 have been completed, the supervisor reprints any lines indicating a test | 11 have been completed, the supervisor reprints any lines indicating a test |
12 failure for convenience. If only one shard is to be run, a single subprocess | 12 failure for convenience. If only one shard is to be run, a single subprocess |
13 is started for that shard and the output is identical to gtest's output. | 13 is started for that shard and the output is identical to gtest's output. |
14 | |
15 Usage: python sharding_supervisor.py [options] path/to/test [gtest_args] | |
16 """ | 14 """ |
17 | 15 |
18 | 16 |
19 import optparse | 17 import optparse |
20 import os | 18 import os |
21 import pty | 19 import pty |
22 import Queue | 20 import Queue |
23 import subprocess | 21 import subprocess |
24 import sys | 22 import sys |
25 import threading | 23 import threading |
26 | 24 |
27 | 25 |
| 26 USAGE = "Usage: python %prog [options] path/to/test [gtest_args]" |
28 DEFAULT_NUM_CORES = 4 | 27 DEFAULT_NUM_CORES = 4 |
29 DEFAULT_SHARDS_PER_CORE = 5 # num_shards = cores * SHARDS_PER_CORE | 28 DEFAULT_SHARDS_PER_CORE = 5 # num_shards = cores * SHARDS_PER_CORE |
30 DEFAULT_RUNS_PER_CORE = 1 # num_workers = cores * RUNS_PER_CORE | 29 DEFAULT_RUNS_PER_CORE = 1 # num_workers = cores * RUNS_PER_CORE |
31 | 30 |
32 | 31 |
33 def DetectNumCores(): | 32 def DetectNumCores(): |
34 """Detects the number of cores on the machine. | 33 """Detects the number of cores on the machine. |
35 | 34 |
36 Returns: | 35 Returns: |
37 The number of cores on the machine or DEFAULT_NUM_CORES if it could not | 36 The number of cores on the machine or DEFAULT_NUM_CORES if it could not |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 if self.color: | 200 if self.color: |
202 sys.stderr.write("\x1b[0;37m") | 201 sys.stderr.write("\x1b[0;37m") |
203 for line in self.failure_log: | 202 for line in self.failure_log: |
204 sys.stderr.write(line) | 203 sys.stderr.write(line) |
205 if self.color: | 204 if self.color: |
206 sys.stderr.write("\x1b[0;37m") | 205 sys.stderr.write("\x1b[0;37m") |
207 return num_failed | 206 return num_failed |
208 | 207 |
209 | 208 |
210 def main(): | 209 def main(): |
211 parser = optparse.OptionParser() | 210 parser = optparse.OptionParser(usage=USAGE) |
212 parser.add_option( | 211 parser.add_option( |
213 "-n", "--shards_per_core", type="int", default=DEFAULT_SHARDS_PER_CORE, | 212 "-n", "--shards_per_core", type="int", default=DEFAULT_SHARDS_PER_CORE, |
214 help="number of shards to generate per CPU") | 213 help="number of shards to generate per CPU") |
215 parser.add_option( | 214 parser.add_option( |
216 "-r", "--runs_per_core", type="int", default=DEFAULT_RUNS_PER_CORE, | 215 "-r", "--runs_per_core", type="int", default=DEFAULT_RUNS_PER_CORE, |
217 help="number of shards to run in parallel per CPU") | 216 help="number of shards to run in parallel per CPU") |
218 parser.add_option( | 217 parser.add_option( |
219 "-c", "--color", action="store_true", default=sys.stdout.isatty(), | 218 "-c", "--color", action="store_true", default=sys.stdout.isatty(), |
220 help="force color output, also used by gtest if --gtest_color is not" | 219 help="force color output, also used by gtest if --gtest_color is not" |
221 " specified") | 220 " specified") |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 | 255 |
257 # shard and run the whole test | 256 # shard and run the whole test |
258 ss = ShardingSupervisor( | 257 ss = ShardingSupervisor( |
259 args[0], num_shards, num_runs, options.color, gtest_args) | 258 args[0], num_shards, num_runs, options.color, gtest_args) |
260 return ss.ShardTest() | 259 return ss.ShardTest() |
261 | 260 |
262 | 261 |
263 if __name__ == "__main__": | 262 if __name__ == "__main__": |
264 sys.exit(main()) | 263 sys.exit(main()) |
265 | 264 |
OLD | NEW |