From 897405b81804572a4167dcef9fd5106ebc658cab Mon Sep 17 00:00:00 2001 From: CarlosFelipeOR Date: Tue, 11 Aug 2026 18:56:46 -0300 Subject: [PATCH 1/2] Fix #2: Fix expect() timeout never firing while the stream keeps producing output Signed-off-by: CarlosFelipeOR --- testflows/uexpect/uexpect.py | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/testflows/uexpect/uexpect.py b/testflows/uexpect/uexpect.py index 0ad868c..4e06ef3 100644 --- a/testflows/uexpect/uexpect.py +++ b/testflows/uexpect/uexpect.py @@ -182,30 +182,30 @@ def expect(self, pattern, timeout=None, escape=False, expect_timeout=False): self._logger.write(self.buffer[self._logger_buffer_pos :]) self._logger_buffer_pos = len(self.buffer) + if timeleft <= 0: + if self._logger and not expect_timeout: + self._logger.write( + (self.buffer or "")[self._logger_buffer_pos :] + "\n" + ) + self._logger.flush() + exception = ExpectTimeoutError(pattern, timeout, self.buffer) + self.before = self.buffer + self.after = None + if not expect_timeout: + self.buffer = None + self._logger_buffer_pos = 0 + if expect_timeout: + return + raise exception + try: - data = None data = self.read(timeout=min(timeleft, 0.1), raise_exception=True) except TimeoutError: - elapsed = time.time() - start_time - timeleft = max(timeleft - elapsed, 0) - if timeleft <= 0: - if self._logger and not expect_timeout: - self._logger.write( - (self.buffer or "")[self._logger_buffer_pos :] + "\n" - ) - self._logger.flush() - exception = ExpectTimeoutError(pattern, timeout, self.buffer) - self.before = self.buffer - self.after = None - if not expect_timeout: - self.buffer = None - self._logger_buffer_pos = 0 - if expect_timeout: - return - raise exception - else: - elapsed = time.time() - start_time - timeleft = max(timeleft - elapsed, 0) + data = None + + elapsed = time.time() - start_time + timeleft = max(timeleft - elapsed, 0) + if data: self.buffer = (self.buffer + data) if self.buffer else data From c3d82a1abadd03ffe99bab010db04985c1a1fe90 Mon Sep 17 00:00:00 2001 From: CarlosFelipeOR Date: Wed, 12 Aug 2026 23:12:42 -0300 Subject: [PATCH 2/2] Attempt one read before the deadline can fire, so expect(timeout=0) tries once Signed-off-by: CarlosFelipeOR --- testflows/uexpect/uexpect.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/testflows/uexpect/uexpect.py b/testflows/uexpect/uexpect.py index 4e06ef3..5224a8b 100644 --- a/testflows/uexpect/uexpect.py +++ b/testflows/uexpect/uexpect.py @@ -163,6 +163,7 @@ def expect(self, pattern, timeout=None, escape=False, expect_timeout=False): timeleft = timeout if timeleft is None: timeleft = sys.maxsize + read_attempted = False while True: start_time = time.time() @@ -182,7 +183,7 @@ def expect(self, pattern, timeout=None, escape=False, expect_timeout=False): self._logger.write(self.buffer[self._logger_buffer_pos :]) self._logger_buffer_pos = len(self.buffer) - if timeleft <= 0: + if read_attempted and timeleft <= 0: if self._logger and not expect_timeout: self._logger.write( (self.buffer or "")[self._logger_buffer_pos :] + "\n" @@ -202,6 +203,7 @@ def expect(self, pattern, timeout=None, escape=False, expect_timeout=False): data = self.read(timeout=min(timeleft, 0.1), raise_exception=True) except TimeoutError: data = None + read_attempted = True elapsed = time.time() - start_time timeleft = max(timeleft - elapsed, 0)