From dc90488713d55a1aa65744dffbfa464da88a0b24 Mon Sep 17 00:00:00 2001 From: Kaliko Jack Date: Sun, 31 Dec 2023 11:37:16 +0100 Subject: [PATCH] Improved socket timeout setter, add tests --- musicpd.py | 16 +++++++++++++--- test.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/musicpd.py b/musicpd.py index 3e22598..e61188d 100644 --- a/musicpd.py +++ b/musicpd.py @@ -23,7 +23,7 @@ VERSION = '0.9.0b1' #: Seconds before a connection attempt times out #: (overriden by :envvar:`MPD_TIMEOUT` env. var.) CONNECTION_TIMEOUT = 30 -#: Socket timeout in second (Default is None for no timeout) +#: Socket timeout in second > 0 (Default is :py:obj:`None` for no timeout) SOCKET_TIMEOUT = None log = logging.getLogger(__name__) @@ -727,15 +727,25 @@ class MPDClient: @property def socket_timeout(self): """Socket timeout in second (defaults to :py:obj:`SOCKET_TIMEOUT`). - Use None to disable socket timout.""" + Use :py:obj:`None` to disable socket timout. + + :setter: Set the socket timeout + :type: int or None (integer > 0) + """ return self._socket_timeout @socket_timeout.setter def socket_timeout(self, timeout): - self._socket_timeout = timeout + if timeout is not None: + if int(timeout) <= 0: + raise ValueError('socket_timeout expects a non zero positive integer') + self._socket_timeout = int(timeout) + else: + self._socket_timeout = timeout if getattr(self._sock, 'settimeout', False): self._sock.settimeout(self._socket_timeout) + def disconnect(self): """Closes the MPD connection. The client closes the actual socket, it does not use the diff --git a/test.py b/test.py index 0677905..033fe06 100755 --- a/test.py +++ b/test.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # coding: utf-8 -# SPDX-FileCopyrightText: 2012-2021 kaliko +# SPDX-FileCopyrightText: 2012-2023 kaliko # SPDX-License-Identifier: LGPL-3.0-or-later # pylint: disable=missing-docstring """ @@ -588,6 +588,35 @@ class testConnection(unittest.TestCase): cli.connect() sock.connect.assert_called_with('/run/mpd/socket') + def test_sockettimeout(self): + with mock.patch('musicpd.socket') as socket_mock: + sock = mock.MagicMock(name='socket') + socket_mock.socket.return_value = sock + cli = musicpd.MPDClient() + # Default is no socket timeout + cli.connect() + sock.settimeout.assert_called_with(None) + cli.disconnect() + # set a socket timeout before connection + cli.socket_timeout = 10 + cli.connect() + sock.settimeout.assert_called_with(10) + # Set socket timeout while already connected + cli.socket_timeout = 42 + sock.settimeout.assert_called_with(42) + # set a socket timeout using str + cli.socket_timeout = '10' + sock.settimeout.assert_called_with(10) + # Set socket timeout to None + cli.socket_timeout = None + sock.settimeout.assert_called_with(None) + # Set socket timeout Raises Exception + with self.assertRaises(ValueError): + cli.socket_timeout = 'foo' + with self.assertRaises(ValueError, msg='socket_timeout expects a non zero positive integer'): + cli.socket_timeout = '0' + with self.assertRaises(ValueError, msg='socket_timeout expects a non zero positive integer'): + cli.socket_timeout = '-1' class testException(unittest.TestCase): -- 2.39.2