Skip to content

Commit 4136cde

Browse files
author
Andrei Neagu
committed
fix flaky test
1 parent cb2662c commit 4136cde

File tree

1 file changed

+37
-42
lines changed

1 file changed

+37
-42
lines changed

services/dynamic-sidecar/tests/unit/test_modules_outputs_event_filter.py

Lines changed: 37 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# pylint:disable=redefined-outer-name
22
# pylint:disable=unused-argument
33

4-
import asyncio
4+
from collections.abc import AsyncIterator
55
from pathlib import Path
6-
from typing import AsyncIterator, Iterator
6+
from typing import Any, Final
77
from unittest.mock import AsyncMock
88

99
import pytest
@@ -24,12 +24,12 @@
2424
from tenacity.stop import stop_after_delay
2525
from tenacity.wait import wait_fixed
2626

27-
_TENACITY_RETRY_PARAMS = dict(
28-
reraise=True,
29-
retry=retry_if_exception_type(AssertionError),
30-
stop=stop_after_delay(10),
31-
wait=wait_fixed(0.01),
32-
)
27+
_TENACITY_RETRY_PARAMS: Final[dict[str, Any]] = {
28+
"reraise": True,
29+
"retry": retry_if_exception_type(AssertionError),
30+
"stop": stop_after_delay(10),
31+
"wait": wait_fixed(0.01),
32+
}
3333

3434
# FIXTURES
3535

@@ -75,11 +75,11 @@ async def outputs_manager(
7575
@pytest.fixture
7676
def mocked_port_key_content_changed(
7777
mocker: MockerFixture, outputs_manager: OutputsManager
78-
) -> Iterator[AsyncMock]:
78+
) -> AsyncMock:
7979
async def _mock_upload_outputs(*args, **kwargs) -> None:
8080
pass
8181

82-
yield mocker.patch.object(
82+
return mocker.patch.object(
8383
outputs_manager, "port_key_content_changed", side_effect=_mock_upload_outputs
8484
)
8585

@@ -101,8 +101,8 @@ def get_wait_interval(self, dir_size: NonNegativeInt) -> NonNegativeFloat:
101101

102102

103103
@pytest.fixture
104-
def mock_get_directory_total_size(mocker: MockerFixture) -> Iterator[AsyncMock]:
105-
yield mocker.patch(
104+
def mock_get_directory_total_size(mocker: MockerFixture) -> AsyncMock:
105+
return mocker.patch(
106106
"simcore_service_dynamic_sidecar.modules.outputs._event_filter.get_directory_total_size",
107107
return_value=1,
108108
)
@@ -120,17 +120,6 @@ async def event_filter(
120120
await event_filter.shutdown()
121121

122122

123-
# UTILS
124-
125-
126-
async def _wait_for_event_to_trigger(event_filter: EventFilter) -> None:
127-
await asyncio.sleep(event_filter.delay_policy.get_min_interval() * 5)
128-
129-
130-
async def _wait_for_event_to_trigger_big_directory(event_filter: EventFilter) -> None:
131-
await asyncio.sleep(event_filter.delay_policy.get_wait_interval(1) * 2)
132-
133-
134123
# TESTS
135124

136125

@@ -141,13 +130,16 @@ async def test_event_triggers_once(
141130
):
142131
# event triggers once
143132
await event_filter.enqueue(port_key_1)
144-
await _wait_for_event_to_trigger(event_filter)
145-
assert mocked_port_key_content_changed.call_count == 1
133+
134+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
135+
with attempt:
136+
assert mocked_port_key_content_changed.call_count == 1
146137

147138
# event triggers a second time
148139
await event_filter.enqueue(port_key_1)
149-
await _wait_for_event_to_trigger(event_filter)
150-
assert mocked_port_key_content_changed.call_count == 2
140+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
141+
with attempt:
142+
assert mocked_port_key_content_changed.call_count == 2
151143

152144

153145
async def test_trigger_once_after_event_chain(
@@ -157,8 +149,9 @@ async def test_trigger_once_after_event_chain(
157149
):
158150
for _ in range(100):
159151
await event_filter.enqueue(port_key_1)
160-
await _wait_for_event_to_trigger(event_filter)
161-
assert mocked_port_key_content_changed.call_count == 1
152+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
153+
with attempt:
154+
assert mocked_port_key_content_changed.call_count == 1
162155

163156

164157
async def test_always_trigger_after_delay(
@@ -170,8 +163,9 @@ async def test_always_trigger_after_delay(
170163
# event trigger after correct interval delay correctly
171164
for expected_call_count in range(1, 10):
172165
await event_filter.enqueue(port_key_1)
173-
await _wait_for_event_to_trigger_big_directory(event_filter)
174-
assert mocked_port_key_content_changed.call_count == expected_call_count
166+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
167+
with attempt:
168+
assert mocked_port_key_content_changed.call_count == expected_call_count
175169

176170

177171
async def test_minimum_amount_of_get_directory_total_size_calls(
@@ -183,14 +177,12 @@ async def test_minimum_amount_of_get_directory_total_size_calls(
183177
await event_filter.enqueue(port_key_1)
184178
# wait a bit for the vent to be picked up
185179
# by the workers and processed
186-
await _wait_for_event_to_trigger(event_filter)
187180
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
188181
with attempt:
189182
assert mock_get_directory_total_size.call_count == 1
190183
assert mocked_port_key_content_changed.call_count == 0
191184

192185
# event finished processing and was dispatched
193-
await _wait_for_event_to_trigger_big_directory(event_filter)
194186
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
195187
with attempt:
196188
assert mock_get_directory_total_size.call_count == 2
@@ -206,24 +198,27 @@ async def test_minimum_amount_of_get_directory_total_size_calls_with_continuous_
206198
await event_filter.enqueue(port_key_1)
207199
# wait a bit for the vent to be picked up
208200
# by the workers and processed
209-
await _wait_for_event_to_trigger(event_filter)
210-
assert mock_get_directory_total_size.call_count == 1
211-
assert mocked_port_key_content_changed.call_count == 0
201+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
202+
with attempt:
203+
assert mock_get_directory_total_size.call_count == 1
204+
assert mocked_port_key_content_changed.call_count == 0
212205

213206
# while changes keep piling up, keep extending the duration
214207
# no event will trigger
215208
# size of directory will not be computed
216209
VERY_LONG_EVENT_CHAIN = 1000
217210
for _ in range(VERY_LONG_EVENT_CHAIN):
218211
await event_filter.enqueue(port_key_1)
219-
await _wait_for_event_to_trigger(event_filter)
220-
assert mock_get_directory_total_size.call_count == 1
221-
assert mocked_port_key_content_changed.call_count == 0
212+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
213+
with attempt:
214+
assert mock_get_directory_total_size.call_count == 1
215+
assert mocked_port_key_content_changed.call_count == 0
222216

223217
# event finished processing and was dispatched
224-
await _wait_for_event_to_trigger_big_directory(event_filter)
225-
assert mock_get_directory_total_size.call_count == 2
226-
assert mocked_port_key_content_changed.call_count == 1
218+
async for attempt in AsyncRetrying(**_TENACITY_RETRY_PARAMS):
219+
with attempt:
220+
assert mock_get_directory_total_size.call_count == 2
221+
assert mocked_port_key_content_changed.call_count == 1
227222

228223

229224
def test_default_delay_policy():

0 commit comments

Comments
 (0)