diff --git a/changes/388.bugfix.rst b/changes/388.bugfix.rst new file mode 100644 index 0000000..d0ab067 --- /dev/null +++ b/changes/388.bugfix.rst @@ -0,0 +1 @@ +Keep zero-delay reruns running when a large backoff factor would overflow before multiplication by zero. diff --git a/src/pytest_rerunfailures.py b/src/pytest_rerunfailures.py index db3974a..eb1674f 100644 --- a/src/pytest_rerunfailures.py +++ b/src/pytest_rerunfailures.py @@ -1337,7 +1337,12 @@ def pytest_runtest_protocol(item, nextitem): continue report.outcome = "rerun" - time.sleep(delay * delay_backoff_factor ** (item.execution_count - 1)) + rerun_delay = ( + 0 + if delay == 0 + else delay * delay_backoff_factor ** (item.execution_count - 1) + ) + time.sleep(rerun_delay) if not parallel or works_with_current_xdist(): # will rerun test, log intermediate result diff --git a/tests/test_pytest_rerunfailures.py b/tests/test_pytest_rerunfailures.py index 2094448..533c2f2 100644 --- a/tests/test_pytest_rerunfailures.py +++ b/tests/test_pytest_rerunfailures.py @@ -979,6 +979,34 @@ def test_fail(): assert_outcomes(result, passed=0, failed=1, rerun=3) +def test_reruns_with_zero_delay_and_large_backoff_factor(testdir): + testdir.makepyfile( + """ + from pathlib import Path + + def test_recovers_on_fourth_attempt(): + count_file = Path(__file__).with_suffix('.count') + count = int(count_file.read_text()) + 1 if count_file.exists() else 1 + count_file.write_text(str(count)) + assert count == 4 + """ + ) + + time.sleep = mock.MagicMock() + + result = testdir.runpytest( + "--reruns", + "3", + "--reruns-delay", + "0", + "--reruns-delay-backoff-factor", + "1e308", + ) + + assert time.sleep.call_args_list == [mock.call(0)] * 3 + assert_outcomes(result, passed=1, rerun=3) + + def test_reruns_with_delay_backoff_factor_marker(testdir): testdir.makepyfile( """