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