Skip to content

Commit acefe46

Browse files
Fix FileWatcher ready() method
The ready() method now returns False when an exception is set. Signed-off-by: Daniel Zullo <[email protected]>
1 parent 6d1769f commit acefe46

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/frequenz/channels/file_watcher.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ async def ready(self) -> bool:
185185
self._changes = await anext(self._awatch)
186186
except StopAsyncIteration as err:
187187
self._awatch_stopped_exc = err
188+
return False
188189

189190
return True
190191

tests/test_file_watcher_integration.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import pytest
1111

12-
from frequenz.channels import select, selected_from
12+
from frequenz.channels import ReceiverStoppedError, select, selected_from
1313
from frequenz.channels.file_watcher import Event, EventType, FileWatcher
1414
from frequenz.channels.timer import SkipMissedAndDrift, Timer
1515

@@ -99,3 +99,36 @@ async def test_file_watcher_deletes(tmp_path: pathlib.Path) -> None:
9999
# Can be more because the watcher could take some time to trigger
100100
assert number_of_write >= 3
101101
assert number_of_events == 2
102+
103+
104+
@pytest.mark.integration
105+
async def test_file_watcher_exit_iterator(tmp_path: pathlib.Path) -> None:
106+
"""Test breaking the file watcher iterator.
107+
108+
Args:
109+
tmp_path: A tmp directory to run the file watcher on. Created by pytest.
110+
"""
111+
filename = tmp_path / "test-file"
112+
113+
number_of_writes = 0
114+
expected_number_of_writes = 3
115+
116+
file_watcher = FileWatcher(paths=[str(tmp_path)])
117+
timer = Timer(timedelta(seconds=0.1), SkipMissedAndDrift())
118+
119+
async for selected in select(file_watcher, timer):
120+
if selected_from(selected, timer):
121+
filename.write_text(f"{selected.message}")
122+
elif selected_from(selected, file_watcher):
123+
number_of_writes += 1
124+
if number_of_writes == expected_number_of_writes:
125+
file_watcher._stop_event.set() # pylint: disable=protected-access
126+
break
127+
128+
ready = await file_watcher.ready()
129+
assert ready is False
130+
131+
with pytest.raises(ReceiverStoppedError):
132+
file_watcher.consume()
133+
134+
assert number_of_writes == expected_number_of_writes

0 commit comments

Comments
 (0)