From 451b52fde543e2edd0a05b3dd569e67aab66be99 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 24 Jul 2011 01:59:32 +0200 Subject: [PATCH] Make sure we prevent timeouts when in idle mode --- mopidy/frontends/mpd/protocol/status.py | 4 ++-- mopidy/utils/network.py | 4 +++- tests/frontends/mpd/protocol/idle_test.py | 4 ---- tests/utils/network/lineprotocol_test.py | 12 ++++++++++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mopidy/frontends/mpd/protocol/status.py b/mopidy/frontends/mpd/protocol/status.py index 5a319a5d..5ac99dfe 100644 --- a/mopidy/frontends/mpd/protocol/status.py +++ b/mopidy/frontends/mpd/protocol/status.py @@ -82,7 +82,7 @@ def idle(context, subsystems=None): active = context.subscriptions.intersection(context.events) if not active: - context.session.connection.disable_timeout() + context.session.prevent_timeout = True return response = [] @@ -100,7 +100,7 @@ def noidle(context): return context.subscriptions = set() context.events = set() - context.session.connection.enable_timeout() + context.session.prevent_timeout = False @handle_request(r'^stats$') def stats(context): diff --git a/mopidy/utils/network.py b/mopidy/utils/network.py index b7cc144d..719def69 100644 --- a/mopidy/utils/network.py +++ b/mopidy/utils/network.py @@ -286,6 +286,7 @@ class LineProtocol(ThreadingActor): def __init__(self, connection): self.connection = connection + self.prevent_timeout = False self.recv_buffer = '' @property @@ -316,7 +317,8 @@ class LineProtocol(ThreadingActor): line = self.decode(line) self.on_line_received(line) - self.connection.enable_timeout() + if not self.prevent_timeout: + self.connection.enable_timeout() def on_stop(self): """Ensure that cleanup when actor stops.""" diff --git a/tests/frontends/mpd/protocol/idle_test.py b/tests/frontends/mpd/protocol/idle_test.py index 0f5d4b06..da16bf33 100644 --- a/tests/frontends/mpd/protocol/idle_test.py +++ b/tests/frontends/mpd/protocol/idle_test.py @@ -42,10 +42,6 @@ class IdleHandlerTest(protocol.BaseTestCase): self.assertNoEvents() self.assertNoResponse() - def test_noidle_does_not_call_enable_timeout(self): - self.sendRequest(u'noidle') - self.assertEqual(0, self.connection.enable_timeout.call_count) - def test_idle_player(self): self.sendRequest(u'idle player') self.assertEqualSubscriptions(['player']) diff --git a/tests/utils/network/lineprotocol_test.py b/tests/utils/network/lineprotocol_test.py index a87f461c..41d3fbf2 100644 --- a/tests/utils/network/lineprotocol_test.py +++ b/tests/utils/network/lineprotocol_test.py @@ -11,11 +11,13 @@ class LineProtocolTest(unittest.TestCase): self.mock = Mock(spec=network.LineProtocol) self.mock.terminator = network.LineProtocol.terminator self.mock.encoding = network.LineProtocol.encoding + self.mock.prevent_timeout = False def test_init_stores_values_in_attributes(self): network.LineProtocol.__init__(self.mock, sentinel.connection) self.assertEqual(sentinel.connection, self.mock.connection) self.assertEqual('', self.mock.recv_buffer) + self.assertFalse(self.mock.prevent_timeout) def test_on_receive_no_new_lines_adds_to_recv_buffer(self): self.mock.connection = Mock(spec=network.Connection) @@ -36,6 +38,16 @@ class LineProtocolTest(unittest.TestCase): self.mock.connection.disable_timeout.assert_called_once_with() self.mock.connection.enable_timeout.assert_called_once_with() + def test_on_receive_toggles_unless_prevent_timeout_is_set(self): + self.mock.connection = Mock(spec=network.Connection) + self.mock.recv_buffer = '' + self.mock.parse_lines.return_value = [] + self.mock.prevent_timeout = True + + network.LineProtocol.on_receive(self.mock, {'received': 'data'}) + self.mock.connection.disable_timeout.assert_called_once_with() + self.assertEqual(0, self.mock.connection.enable_timeout.call_count) + def test_on_receive_no_new_lines_calls_parse_lines(self): self.mock.connection = Mock(spec=network.Connection) self.mock.recv_buffer = ''