from more_executors import Executors, RetryPolicy


def test_broken_policy(caplog):
    """Executor logs without retry if policy raises exception"""

    policy_error = RuntimeError("error from policy")
    fn_error = RuntimeError("error from fn")

    class BrokenRetryPolicy(RetryPolicy):
        def should_retry(self, attempt, future):
            raise policy_error

    executor = Executors.thread_pool().with_retry(retry_policy=BrokenRetryPolicy())

    def fn():
        raise fn_error

    # Start the callable
    future = executor.submit(fn)

    # It should fail with the error raised from the fn
    assert future.exception(10.0) is fn_error

    if not caplog:
        # TODO: remove me when py2.6 support is dropped
        return

    records = caplog.records
    error_log = records[-1]

    # It should have logged a message about the error
    assert "Exception while evaluating retry policy" in error_log.message
    assert "BrokenRetryPolicy" in error_log.message
    assert "error from policy" in error_log.exc_text
