def test_doRead_removes_self_from_reactor_on_error(self): listener = PostgresListenerService() connection = self.patch(listener, "connection") connection.connection.poll.side_effect = OperationalError() self.patch(reactor, "removeReader") self.patch(listener, "connectionLost") failure = listener.doRead() # No failure is returned; see the comment in # PostgresListenerService.doRead() that explains why we don't do that. self.assertThat(failure, Is(None)) # The listener has begun disconnecting. self.assertThat(listener.disconnecting, IsInstance(Deferred)) # Wait for disconnection to complete. yield listener.disconnecting # The listener has removed itself from the reactor. self.assertThat(reactor.removeReader, MockCalledOnceWith(listener)) # connectionLost() has been called with a simple ConnectionLost. self.assertThat(listener.connectionLost, MockCalledOnceWith(ANY)) [failure] = listener.connectionLost.call_args[0] self.assertThat(failure, IsInstance(Failure)) self.assertThat(failure.value, IsInstance(error.ConnectionLost))
def test__doRead_adds_notifies_to_notifications(self): listener = PostgresListenerService() notifications = [ FakeNotify(channel=factory.make_name("channel_action"), payload=factory.make_name("payload")) for _ in range(3) ] connection = self.patch(listener, "connection") connection.connection.poll.return_value = None # Add the notifications twice, so it can test that duplicates are # accumulated together. connection.connection.notifies = notifications + notifications self.patch(listener, "handleNotify") listener.doRead() self.assertItemsEqual(listener.notifications, set(notifications))