From 91437baf09c48c45794930d8f692248c873ce3ee Mon Sep 17 00:00:00 2001 From: Fantix King Date: Wed, 14 Jan 2026 16:52:03 -0500 Subject: [PATCH 1/2] test: fix flaky test_fs_event --- tests/test_fs_event.py | 143 ++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 80 deletions(-) diff --git a/tests/test_fs_event.py b/tests/test_fs_event.py index 743589b5..a14ceae0 100644 --- a/tests/test_fs_event.py +++ b/tests/test_fs_event.py @@ -1,4 +1,5 @@ import asyncio +import contextlib import os.path import tempfile @@ -6,95 +7,77 @@ from uvloop.loop import FileSystemEvent -class Test_UV_FS_EVENT_CHANGE(tb.UVTestCase): - async def _file_writer(self): - f = await self.q.get() - while True: - f.write('hello uvloop\n') - f.flush() - x = await self.q.get() - if x is None: - return - - def fs_event_setup(self): - self.change_event_count = 0 - self.fname = '' - self.q = asyncio.Queue() - - def event_cb(self, ev_fname: bytes, evt: FileSystemEvent): - _d, fn = os.path.split(self.fname) - self.assertEqual(ev_fname, fn) - self.assertEqual(evt, FileSystemEvent.CHANGE) - self.change_event_count += 1 - if self.change_event_count < 4: - self.q.put_nowait(0) - else: - self.q.put_nowait(None) +class Test_UV_FS_Event(tb.UVTestCase): + def setUp(self): + super().setUp() + self.exit_stack = contextlib.ExitStack() + self.tmp_dir = self.exit_stack.enter_context(tempfile.TemporaryDirectory()) + + def tearDown(self): + self.exit_stack.close() + super().tearDown() def test_fs_event_change(self): - self.fs_event_setup() - - async def run(write_task): - self.q.put_nowait(tf) - try: - await asyncio.wait_for(write_task, 4) - except asyncio.TimeoutError: - write_task.cancel() - - with tempfile.NamedTemporaryFile('wt') as tf: - self.fname = tf.name.encode() - h = self.loop._monitor_fs(tf.name, self.event_cb) + change_event_count = 0 + filename = "fs_event_change.txt" + path = os.path.join(self.tmp_dir, filename) + q = asyncio.Queue() + + with open(path, 'wt') as f: + async def file_writer(): + while True: + f.write('hello uvloop\n') + f.flush() + x = await q.get() + if x is None: + return + + def event_cb(ev_fname: bytes, evt: FileSystemEvent): + nonlocal change_event_count + self.assertEqual(ev_fname, filename.encode()) + self.assertEqual(evt, FileSystemEvent.CHANGE) + change_event_count += 1 + if change_event_count < 4: + q.put_nowait(0) + else: + q.put_nowait(None) + + h = self.loop._monitor_fs(path, event_cb) + self.loop.run_until_complete(asyncio.sleep(0.1)) # let monitor start self.assertFalse(h.cancelled()) - self.loop.run_until_complete(run( - self.loop.create_task(self._file_writer()))) + self.loop.run_until_complete(asyncio.wait_for(file_writer(), 4)) h.cancel() self.assertTrue(h.cancelled()) - self.assertEqual(self.change_event_count, 4) - - -class Test_UV_FS_EVENT_RENAME(tb.UVTestCase): - async def _file_renamer(self): - await self.q.get() - os.rename(os.path.join(self.dname, self.changed_name), - os.path.join(self.dname, self.changed_name + "-new")) - await self.q.get() - - def fs_event_setup(self): - self.dname = '' - self.changed_name = "hello_fs_event.txt" - self.changed_set = {self.changed_name, self.changed_name + '-new'} - self.q = asyncio.Queue() - - def event_cb(self, ev_fname: bytes, evt: FileSystemEvent): - ev_fname = ev_fname.decode() - self.assertEqual(evt, FileSystemEvent.RENAME) - self.changed_set.remove(ev_fname) - if len(self.changed_set) == 0: - self.q.put_nowait(None) + self.assertEqual(change_event_count, 4) def test_fs_event_rename(self): - self.fs_event_setup() - - async def run(write_task): - self.q.put_nowait(0) - try: - await asyncio.wait_for(write_task, 4) - except asyncio.TimeoutError: - write_task.cancel() - - with tempfile.TemporaryDirectory() as td_name: - self.dname = td_name - f = open(os.path.join(td_name, self.changed_name), 'wt') + orig_name = "hello_fs_event.txt" + new_name = "hello_fs_event_rename.txt" + changed_set = {orig_name, new_name} + event = asyncio.Event() + + async def file_renamer(): + os.rename(os.path.join(self.tmp_dir, orig_name), + os.path.join(self.tmp_dir, new_name)) + await event.wait() + + def event_cb(ev_fname: bytes, evt: FileSystemEvent): + ev_fname = ev_fname.decode() + self.assertEqual(evt, FileSystemEvent.RENAME) + changed_set.discard(ev_fname) + if len(changed_set) == 0: + event.set() + + with open(os.path.join(self.tmp_dir, orig_name), 'wt') as f: f.write('hello!') - f.close() - h = self.loop._monitor_fs(td_name, self.event_cb) - self.assertFalse(h.cancelled()) + h = self.loop._monitor_fs(self.tmp_dir, event_cb) + self.loop.run_until_complete(asyncio.sleep(0.5)) # let monitor start + self.assertFalse(h.cancelled()) - self.loop.run_until_complete(run( - self.loop.create_task(self._file_renamer()))) - h.cancel() - self.assertTrue(h.cancelled()) + self.loop.run_until_complete(asyncio.wait_for(file_renamer(), 4)) + h.cancel() + self.assertTrue(h.cancelled()) - self.assertEqual(len(self.changed_set), 0) + self.assertEqual(len(changed_set), 0) From 05806540b0d0ca601b7886e4c28f6966a1646208 Mon Sep 17 00:00:00 2001 From: Fantix King Date: Wed, 14 Jan 2026 17:23:52 -0500 Subject: [PATCH 2/2] fix flake8 --- tests/test_fs_event.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_fs_event.py b/tests/test_fs_event.py index a14ceae0..90369d1a 100644 --- a/tests/test_fs_event.py +++ b/tests/test_fs_event.py @@ -11,7 +11,9 @@ class Test_UV_FS_Event(tb.UVTestCase): def setUp(self): super().setUp() self.exit_stack = contextlib.ExitStack() - self.tmp_dir = self.exit_stack.enter_context(tempfile.TemporaryDirectory()) + self.tmp_dir = self.exit_stack.enter_context( + tempfile.TemporaryDirectory() + ) def tearDown(self): self.exit_stack.close() @@ -43,7 +45,9 @@ def event_cb(ev_fname: bytes, evt: FileSystemEvent): q.put_nowait(None) h = self.loop._monitor_fs(path, event_cb) - self.loop.run_until_complete(asyncio.sleep(0.1)) # let monitor start + self.loop.run_until_complete( + asyncio.sleep(0.1) # let monitor start + ) self.assertFalse(h.cancelled()) self.loop.run_until_complete(asyncio.wait_for(file_writer(), 4))