From 5b27f275c0cf8c2246a5a69e483b054a9684a721 Mon Sep 17 00:00:00 2001 From: fioannidis-noris Date: Tue, 13 Jan 2026 10:11:18 +0200 Subject: [PATCH] Fixed server and client shutdown for tests --- CHANGES.md | 5 +++++ tests/base.py | 12 ++++++++++++ tests/test_managesieve.py | 12 ++++++++++++ 3 files changed, 29 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 3bcae4e..985883d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,11 @@ All notable changes to this project will be documented in this file. ### Changed +#### 2026-01-13 + +* `./tests/base.py`: Added close method for `MockClient` to properly shutdown the client. +* `./tests/test_managesieve.py`: Fixed `tearDown` methods to shutdown the client and the server properly. + #### 2025-12-05 * `./pysieved/main.py`: Added file-based logging with `WatchedFileHandler` and removed syslog usage. diff --git a/tests/base.py b/tests/base.py index 048eb15..583d94c 100644 --- a/tests/base.py +++ b/tests/base.py @@ -99,6 +99,15 @@ def __init__(self, server: Server) -> None: self.conn.settimeout(self._default_timeout) self.conn.connect((address, port)) + def close(self) -> None: + """Terminate client.""" + + try: + self.conn.shutdown(socket.SHUT_RDWR) + self.conn.close() + except Exception: + pass + def get_full_response(self) -> bytes: """Read all the received lines until the server stops responding until the timeout.""" @@ -110,6 +119,9 @@ def get_full_response(self) -> bytes: except Exception: break + if not part: + break + full_response += part return full_response diff --git a/tests/test_managesieve.py b/tests/test_managesieve.py index 3b2d686..311d778 100644 --- a/tests/test_managesieve.py +++ b/tests/test_managesieve.py @@ -43,7 +43,13 @@ def setUp(self) -> None: self.password = "12345" def tearDown(self) -> None: + try: + self.client.logout() + finally: + self.client.close() + self.server.shutdown() + self.server.server_close() self._t.join() super().tearDown() @@ -110,7 +116,13 @@ def tearDownClass(cls) -> None: # if not removed: # warnings.warn(f"Could not remove filter '{cls.filter_name}'.") + try: + cls.client.logout() + finally: + cls.client.close() + cls.server.shutdown() + cls.server.server_close() cls._t.join() super().tearDownClass()