Chromium Code Reviews| Index: scripts/slave/unittests/expect_tests/pipeline.py |
| diff --git a/scripts/slave/unittests/expect_tests/pipeline.py b/scripts/slave/unittests/expect_tests/pipeline.py |
| index fff0b3d792d7b941a5c5b4b804057adf57271d9f..6d5ddbf5b98211b931d0d19dfcc434cea8ea7092 100644 |
| --- a/scripts/slave/unittests/expect_tests/pipeline.py |
| +++ b/scripts/slave/unittests/expect_tests/pipeline.py |
| @@ -4,6 +4,7 @@ |
| import Queue |
| import glob |
| +import inspect |
| import logging |
| import multiprocessing |
| import re |
| @@ -60,7 +61,13 @@ def gen_loop_process(gen, test_queue, result_queue, opts, kill_switch, |
| paths_seen = set() |
| seen_tests = False |
| try: |
| - for root_test in gen(): |
| + with cover_ctx: |
| + gen_inst = gen() |
| + |
| + while not kill_switch.is_set(): |
| + with cover_ctx: |
| + root_test = next(gen_inst) |
| + |
| if kill_switch.is_set(): |
|
Vadim Sh.
2014/06/27 18:06:48
Is it still needed here?
iannucci
2014/06/28 08:58:17
I guess not, but it doesn't hurt, especially if ne
|
| break |
| @@ -95,6 +102,8 @@ def gen_loop_process(gen, test_queue, result_queue, opts, kill_switch, |
| if not seen_tests: |
| result_queue.put_nowait(NoMatchingTestsError()) |
| + except StopIteration: |
| + pass |
| except KeyboardInterrupt: |
| pass |
| finally: |
| @@ -103,9 +112,8 @@ def gen_loop_process(gen, test_queue, result_queue, opts, kill_switch, |
| next_stage = (result_queue if opts.handler.SKIP_RUNLOOP else test_queue) |
| - with cover_ctx: |
| - opts.handler.gen_stage_loop(opts, generate_tests(), next_stage.put_nowait, |
| - result_queue.put_nowait) |
| + opts.handler.gen_stage_loop(opts, generate_tests(), next_stage.put_nowait, |
| + result_queue.put_nowait) |
| def run_loop_process(test_queue, result_queue, opts, kill_switch, cover_ctx): |
| @@ -113,6 +121,7 @@ def run_loop_process(test_queue, result_queue, opts, kill_switch, cover_ctx): |
| into opts.run_stage_loop(). |
| Generates coverage data as a side-effect. |
| + |
| @type test_queue: multiprocessing.Queue() |
| @type result_queue: multiprocessing.Queue() |
| @type opts: argparse.Namespace |
| @@ -130,7 +139,8 @@ def run_loop_process(test_queue, result_queue, opts, kill_switch, cover_ctx): |
| SKIP = object() |
| def process_test(subtest): |
| logstream.reset() |
| - subresult = subtest.run() |
| + with cover_ctx(include=subtest.coverage_includes()): |
| + subresult = subtest.run() |
| if isinstance(subresult, TestError): |
| result_queue.put_nowait(subresult) |
| return SKIP |
| @@ -163,9 +173,8 @@ def run_loop_process(test_queue, result_queue, opts, kill_switch, cover_ctx): |
| except KeyboardInterrupt: |
| pass |
| - with cover_ctx: |
| - opts.handler.run_stage_loop(opts, generate_tests_results(), |
| - result_queue.put_nowait) |
| + opts.handler.run_stage_loop(opts, generate_tests_results(), |
| + result_queue.put_nowait) |
| def result_loop(test_gen, cover_ctx, opts): |
| @@ -181,8 +190,17 @@ def result_loop(test_gen, cover_ctx, opts): |
| test_queue = multiprocessing.Queue() |
| result_queue = multiprocessing.Queue() |
| + gen_cover_ctx = cover_ctx |
| + if cover_ctx.enabled: |
| + if hasattr(test_gen, '_covers'): |
| + # decorated with expect_tests.covers |
| + gen_cover = test_gen._covers() # pylint: disable=W0212 |
|
Vadim Sh.
2014/06/27 18:06:48
I forgot what type test_gen has here. Why do you
iannucci
2014/06/28 08:58:17
it's a user function. Moved this all to util and u
|
| + else: |
| + gen_cover = [inspect.getabsfile(test_gen)] |
|
Vadim Sh.
2014/06/27 18:06:48
Cover single file? Also, have you verified it work
iannucci
2014/06/28 08:58:17
It seems to always give back a .py file. I have py
|
| + gen_cover_ctx = cover_ctx(include=gen_cover) |
| + |
| test_gen_args = ( |
| - test_gen, test_queue, result_queue, opts, kill_switch, cover_ctx) |
| + test_gen, test_queue, result_queue, opts, kill_switch, gen_cover_ctx) |
| procs = [] |
| if opts.handler.SKIP_RUNLOOP: |