OLD | NEW |
1 # Copyright 2012 the V8 project authors. All rights reserved. | 1 # Copyright 2012 the V8 project authors. All rights reserved. |
2 # Redistribution and use in source and binary forms, with or without | 2 # Redistribution and use in source and binary forms, with or without |
3 # modification, are permitted provided that the following conditions are | 3 # modification, are permitted provided that the following conditions are |
4 # met: | 4 # met: |
5 # | 5 # |
6 # * Redistributions of source code must retain the above copyright | 6 # * Redistributions of source code must retain the above copyright |
7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
8 # * Redistributions in binary form must reproduce the above | 8 # * Redistributions in binary form must reproduce the above |
9 # copyright notice, this list of conditions and the following | 9 # copyright notice, this list of conditions and the following |
10 # disclaimer in the documentation and/or other materials provided | 10 # disclaimer in the documentation and/or other materials provided |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 self.indicator.Starting() | 207 self.indicator.Starting() |
208 self._RunInternal(jobs) | 208 self._RunInternal(jobs) |
209 self.indicator.Done() | 209 self.indicator.Done() |
210 if self.failed or self.remaining: | 210 if self.failed or self.remaining: |
211 return 1 | 211 return 1 |
212 return 0 | 212 return 0 |
213 | 213 |
214 def _RunInternal(self, jobs): | 214 def _RunInternal(self, jobs): |
215 pool = Pool(jobs) | 215 pool = Pool(jobs) |
216 test_map = {} | 216 test_map = {} |
217 # TODO(machenbach): Instead of filling the queue completely before | 217 queued_exception = [None] |
218 # pool.imap_unordered, make this a generator that already starts testing | 218 def gen_tests(): |
219 # while the queue is filled. | 219 for test in self.tests: |
220 queue = [] | 220 assert test.id >= 0 |
221 queued_exception = None | 221 test_map[test.id] = test |
222 for test in self.tests: | 222 try: |
223 assert test.id >= 0 | 223 yield [self._GetJob(test)] |
224 test_map[test.id] = test | 224 except Exception, e: |
225 try: | 225 # If this failed, save the exception and re-raise it later (after |
226 queue.append([self._GetJob(test)]) | 226 # all other tests have had a chance to run). |
227 except Exception, e: | 227 queued_exception[0] = e |
228 # If this failed, save the exception and re-raise it later (after | 228 continue |
229 # all other tests have had a chance to run). | |
230 queued_exception = e | |
231 continue | |
232 try: | 229 try: |
233 it = pool.imap_unordered(RunTest, queue) | 230 it = pool.imap_unordered(RunTest, gen_tests()) |
234 for result in it: | 231 for result in it: |
235 if result.heartbeat: | 232 if result.heartbeat: |
236 self.indicator.Heartbeat() | 233 self.indicator.Heartbeat() |
237 continue | 234 continue |
238 test = test_map[result.value[0]] | 235 test = test_map[result.value[0]] |
239 if self.context.predictable: | 236 if self.context.predictable: |
240 update_perf = self._ProcessTestPredictable(test, result.value, pool) | 237 update_perf = self._ProcessTestPredictable(test, result.value, pool) |
241 else: | 238 else: |
242 update_perf = self._ProcessTestNormal(test, result.value, pool) | 239 update_perf = self._ProcessTestNormal(test, result.value, pool) |
243 if update_perf: | 240 if update_perf: |
244 self._RunPerfSafe(lambda: self.perfdata.UpdatePerfData(test)) | 241 self._RunPerfSafe(lambda: self.perfdata.UpdatePerfData(test)) |
245 finally: | 242 finally: |
246 self._VerbosePrint("Closing process pool.") | 243 self._VerbosePrint("Closing process pool.") |
247 pool.terminate() | 244 pool.terminate() |
248 self._VerbosePrint("Closing database connection.") | 245 self._VerbosePrint("Closing database connection.") |
249 self._RunPerfSafe(lambda: self.perf_data_manager.close()) | 246 self._RunPerfSafe(lambda: self.perf_data_manager.close()) |
250 if self.perf_failures: | 247 if self.perf_failures: |
251 # Nuke perf data in case of failures. This might not work on windows as | 248 # Nuke perf data in case of failures. This might not work on windows as |
252 # some files might still be open. | 249 # some files might still be open. |
253 print "Deleting perf test data due to db corruption." | 250 print "Deleting perf test data due to db corruption." |
254 shutil.rmtree(self.datapath) | 251 shutil.rmtree(self.datapath) |
255 if queued_exception: | 252 if queued_exception[0]: |
256 raise queued_exception | 253 raise queued_exception[0] |
257 | 254 |
258 # Make sure that any allocations were printed in predictable mode (if we | 255 # Make sure that any allocations were printed in predictable mode (if we |
259 # ran any tests). | 256 # ran any tests). |
260 assert ( | 257 assert ( |
261 not self.total or | 258 not self.total or |
262 not self.context.predictable or | 259 not self.context.predictable or |
263 self.printed_allocations | 260 self.printed_allocations |
264 ) | 261 ) |
265 | 262 |
266 def _VerbosePrint(self, text): | 263 def _VerbosePrint(self, text): |
(...skipping 15 matching lines...) Expand all Loading... |
282 test.suite.GetFlagsForTestCase(test, self.context) + | 279 test.suite.GetFlagsForTestCase(test, self.context) + |
283 self.context.extra_flags) | 280 self.context.extra_flags) |
284 return cmd | 281 return cmd |
285 | 282 |
286 | 283 |
287 class BreakNowException(Exception): | 284 class BreakNowException(Exception): |
288 def __init__(self, value): | 285 def __init__(self, value): |
289 self.value = value | 286 self.value = value |
290 def __str__(self): | 287 def __str__(self): |
291 return repr(self.value) | 288 return repr(self.value) |
OLD | NEW |