def test_connectionMade_drops_connections_if_authentication_errors(self): logger = self.useFixture(TwistedLoggerFixture()) service = RegionService(sentinel.ipcWorker) service.running = True # Pretend it's running. service.factory.protocol = HandshakingRegionServer protocol = service.factory.buildProtocol(addr=None) # addr is unused. protocol.transport = MagicMock() exception_type = factory.make_exception_type() self.patch_authenticate_for_error(protocol, exception_type()) self.assertDictEqual({}, service.connections) connectionMade = wait_for_reactor(protocol.connectionMade) connectionMade() # The protocol is not added to the connection set. self.assertDictEqual({}, service.connections) # The transport is instructed to lose the connection. self.assertThat(protocol.transport.loseConnection, MockCalledOnceWith()) # The log was written to. self.assertDocTestMatches( """\ Rack controller '...' could not be authenticated; dropping connection. Check that /var/lib/maas/secret...""", logger.dump(), )
def test_connectionMade_does_not_update_services_connection_set(self): service = RegionService(sentinel.ipcWorker) service.running = True # Pretend it's running. service.factory.protocol = HandshakingRegionServer protocol = service.factory.buildProtocol(addr=None) # addr is unused. self.assertDictEqual({}, service.connections) protocol.connectionMade() self.assertDictEqual({}, service.connections)
def test_connectionMade_drops_connection_if_service_not_running(self): service = RegionService(sentinel.ipcWorker) service.running = False # Pretend it's not running. service.factory.protocol = HandshakingRegionServer protocol = service.factory.buildProtocol(addr=None) # addr is unused. transport = self.patch(protocol, "transport") self.assertDictEqual({}, service.connections) protocol.connectionMade() # The protocol is not added to the connection set. self.assertDictEqual({}, service.connections) # The transport is instructed to lose the connection. self.assertThat(transport.loseConnection, MockCalledOnceWith())
def test_connectionLost_updates_services_connection_set(self): service = RegionService(sentinel.ipcWorker) service.running = True # Pretend it's running. service.factory.protocol = HandshakingRegionServer protocol = service.factory.buildProtocol(addr=None) # addr is unused. protocol.ident = factory.make_name("node") connectionLost_up_call = self.patch(amp.AMP, "connectionLost") service.connections[protocol.ident] = {protocol} protocol.connectionLost(reason=None) # The connection is removed from the set, but the key remains. self.assertDictEqual({protocol.ident: set()}, service.connections) # connectionLost() is called on the superclass. self.assertThat(connectionLost_up_call, MockCalledOnceWith(None))
def test_connectionLost_uses_ipcWorker_to_unregister(self): ipcWorker = MagicMock() service = RegionService(ipcWorker) service.running = True # Pretend it's running. service.factory.protocol = HandshakingRegionServer protocol = service.factory.buildProtocol(addr=None) # addr is unused. protocol.ident = factory.make_name("node") protocol.host = Mock() protocol.host.host = sentinel.host protocol.host.port = sentinel.port protocol.hostIsRemote = True connectionLost_up_call = self.patch(amp.AMP, "connectionLost") service.connections[protocol.ident] = {protocol} protocol.connectionLost(reason=None) self.assertThat(ipcWorker.rpcUnregisterConnection, MockCalledOnceWith(protocol.connid)) # The connection is removed from the set, but the key remains. self.assertDictEqual({protocol.ident: set()}, service.connections) # connectionLost() is called on the superclass. self.assertThat(connectionLost_up_call, MockCalledOnceWith(None))
def make_running_server(self): service = RegionService(sentinel.ipcWorker) service.running = True # Pretend it's running. # service.factory.protocol = RegionServer return service.factory.buildProtocol(addr=None) # addr is unused.