| import time |
| |
| from concurrent.futures import CancelledError |
| from hamcrest import assert_that, equal_to, calling, raises |
| |
| from more_executors import Executors, TimeoutExecutor |
| |
| |
| TIMEOUT = 0.02 |
| |
| |
| def sleep_and_return(sleep_time, retval): |
| time.sleep(sleep_time) |
| return retval |
| |
| |
| def test_success(): |
| with TimeoutExecutor(Executors.thread_pool(), TIMEOUT) as executor: |
| f = executor.submit(sleep_and_return, TIMEOUT / 10, "abc") |
| |
| # Should complete successfully |
| assert_that(f.result(), equal_to("abc")) |
| |
| assert_that(f.done()) |
| assert_that(not f.cancelled()) |
| |
| # Should remain completed successfully through the timeout |
| time.sleep(TIMEOUT * 2) |
| assert_that(f.done()) |
| assert_that(not f.cancelled()) |
| |
| |
| def test_cancel_pending(): |
| called = [] |
| |
| with Executors.thread_pool(max_workers=1).with_timeout(TIMEOUT) as executor: |
| f1 = executor.submit(sleep_and_return, 1.0, "abc") |
| f2 = executor.submit(called.append, True) |
| |
| # f2 should be cancelled while f1 was still running |
| assert_that(calling(f2.result), raises(CancelledError)) |
| |
| # And it should not have been invoked at all |
| assert_that(called, equal_to([])) |
| |
| # Meanwhile, f1 was not cancelable at the timeout, so it should have |
| # completed |
| assert_that(f1.result(), equal_to("abc")) |
| |
| |
| def test_cancel_future_outlives_executor(): |
| called = [] |
| |
| def get_futures(executor): |
| f1 = executor.submit(sleep_and_return, 1.0, "abc") |
| f2 = executor.submit(called.append, True) |
| return (f1, f2) |
| |
| (f1, f2) = get_futures(Executors.thread_pool(max_workers=1).with_timeout(0.5)) |
| |
| # f2 should be cancelled while f1 was still running |
| assert_that(calling(f2.result), raises(CancelledError)) |
| |
| # And it should not have been invoked at all |
| assert_that(called, equal_to([])) |
| |
| # Meanwhile, f1 was not cancelable at the timeout, so it should have |
| # completed |
| assert_that(f1.result(), equal_to("abc")) |