From 9ac2e9e84447185846c1204025ef359253bd8f09 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 26 Jul 2026 20:44:50 -0400 Subject: [PATCH] Found and hopefullyfixed a bug with fenrir watchdog. --- .../screenDriver/vcsaDriver.py | 5 +-- tests/unit/test_vcsa_driver.py | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 tests/unit/test_vcsa_driver.py diff --git a/src/fenrirscreenreader/screenDriver/vcsaDriver.py b/src/fenrirscreenreader/screenDriver/vcsaDriver.py index a71af4a6..fa3bd550 100644 --- a/src/fenrirscreenreader/screenDriver/vcsaDriver.py +++ b/src/fenrirscreenreader/screenDriver/vcsaDriver.py @@ -263,9 +263,10 @@ class driver(screenDriver): while True: # Read from file try: - d += file.readline(1) - if not d: + chunk = file.readline(1) + if not chunk: break + d += chunk except Exception as e: break return d diff --git a/tests/unit/test_vcsa_driver.py b/tests/unit/test_vcsa_driver.py new file mode 100644 index 00000000..24b075bb --- /dev/null +++ b/tests/unit/test_vcsa_driver.py @@ -0,0 +1,35 @@ +from unittest.mock import Mock + +from fenrirscreenreader.screenDriver.vcsaDriver import driver as VcsaDriver + + +class BulkReadFailure: + def __init__(self, chunks): + self.chunks = iter(chunks) + self.readline_calls = 0 + + def seek(self, offset): + assert offset == 0 + + def read(self): + raise OSError(22, "Invalid argument") + + def readline(self, size): + assert size == 1 + self.readline_calls += 1 + if self.readline_calls > 3: + raise RuntimeError("read continued after EOF") + return next(self.chunks) + + +def test_vcsa_read_fallback_stops_at_eof(): + vcsa_driver = VcsaDriver.__new__(VcsaDriver) + vcsa_driver.env = { + "runtime": { + "DebugManager": Mock(), + } + } + screen_file = BulkReadFailure([b"a", b"b", b""]) + + assert vcsa_driver.read_file(screen_file) == b"ab" + assert screen_file.readline_calls == 3