def test_propagate_content_sync_out_of_sync(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[ MessageSerializer().serialize( ContentSync('/path/to/file', 'new content', 17, 21)), BlockingIOError ]) mock_clientsocket.send = mock.MagicMock() mock_listener = mock.MagicMock() backend = Backend([mock_listener]) mock_content_monitor = mock.MagicMock() mock_content_monitor.synchronize = mock.MagicMock( return_value=SynchronizationResult.OutOfSync) backend.connection[mock_clientsocket] = FrontendConnection( backend, mock_clientsocket, content_monitor=mock_content_monitor) backend._receive(mock_clientsocket) # listeners are called: assert mock_listener.on_content_sync.call_count == 1 mock_content_monitor.synchronize.assert_called_once_with( '/path/to/file', 'new content', 17, 21) assert mock_clientsocket.send.call_count == 1 arg = mock_clientsocket.send.call_args[0][0] assert b'OutOfSync' in arg
def test_propagate_content_sync(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[ MessageSerializer().serialize( ContentSync('/path/to/file', 'new content', 17, 21)), BlockingIOError ]) mock_clientsocket.send = mock.MagicMock() mock_listener = mock.MagicMock() backend = Backend([mock_listener]) mock_content_monitor = mock.MagicMock() mock_content_monitor.synchronize = mock.MagicMock( return_value=SynchronizationResult.Updated) backend.connection[mock_clientsocket] = FrontendConnection( backend, mock_clientsocket, content_monitor=mock_content_monitor) backend._receive(mock_clientsocket) # listeners are called: assert mock_listener.on_content_sync.call_count == 1 mock_content_monitor.synchronize.assert_called_once_with( '/path/to/file', 'new content', 17, 21) assert not mock_clientsocket.send.called arg = mock_listener.on_content_sync.call_args[0][0] assert isinstance(arg, ContentSync) assert arg.file == '/path/to/file' assert arg.data == 'new content' assert arg.start == 17 assert arg.end == 21
def test_receive_empty(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(return_value=None) backend = Backend() backend.connection[mock_clientsocket] = FrontendConnection(backend, mock_clientsocket) backend.sockets.append(mock_clientsocket) backend._receive(mock_clientsocket) assert mock_clientsocket.close.call_count == 1
def test_receive_empty(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(return_value=None) backend = Backend() backend.connection[mock_clientsocket] = FrontendConnection( backend, mock_clientsocket) backend.sockets.append(mock_clientsocket) backend._receive(mock_clientsocket) assert mock_clientsocket.close.call_count == 1
def test_message_context(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[MessageSerializer().serialize(Shutdown()), BlockingIOError]) mock_listener = mock.MagicMock() backend = Backend([mock_listener]) backend.connection[mock_clientsocket] = FrontendConnection(backend, mock_clientsocket) backend._receive(mock_clientsocket) message_context = mock_listener.on_shutdown.call_args[0][0] assert message_context.service is backend assert message_context.sock is mock_clientsocket message_context.send_message(BackendAlive()) assert mock_clientsocket.send.call_count == 1
def test_frontend_timeout(mock_datetime_mod): now = datetime.datetime.now() mock_datetime_mod.datetime.now = mock.MagicMock(side_effect=lambda: now) mock_clientsocket1 = mock.MagicMock() mock_clientsocket2 = mock.MagicMock() backend = Backend() backend.sockets = [ mock.sentinel.SERVER_SOCKET, mock_clientsocket1, mock_clientsocket2 ] backend.connection[mock_clientsocket1] = FrontendConnection( backend, mock_clientsocket1) backend.connection[mock_clientsocket2] = FrontendConnection( backend, mock_clientsocket2) assert TIMEOUT_LAST_MESSAGE > datetime.timedelta(0) # prevent alive message is mixed into communication: backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert not mock_clientsocket2.close.called now += 0.9 * TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert not mock_clientsocket2.close.called # now receive a message from one frontend: mock_clientsocket1.recv = mock.MagicMock(side_effect=[ MessageSerializer().serialize(CompletionRequest('t', 'g', 10)), BlockingIOError ]) backend._receive(mock_clientsocket1) now += 0.2 * TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert mock_clientsocket2.close.called now += TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert mock_clientsocket1.close.called
def test_message_context(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[ MessageSerializer().serialize(Shutdown()), BlockingIOError ]) mock_listener = mock.MagicMock() backend = Backend([mock_listener]) backend.connection[mock_clientsocket] = FrontendConnection( backend, mock_clientsocket) backend._receive(mock_clientsocket) message_context = mock_listener.on_shutdown.call_args[0][0] assert message_context.service is backend assert message_context.sock is mock_clientsocket message_context.send_message(BackendAlive()) assert mock_clientsocket.send.call_count == 1
def test_receive_shutdown(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[MessageSerializer().serialize(Shutdown()), BlockingIOError]) mock_listener1 = mock.MagicMock() mock_listener2 = mock.MagicMock() backend = Backend([mock_listener1, mock_listener2]) backend.connection[mock_clientsocket] = FrontendConnection(backend, mock_clientsocket) assert backend.state is not State.ShutdownPending backend._receive(mock_clientsocket) # listeners are called: assert mock_listener1.on_shutdown.call_count == 1 assert mock_listener2.on_shutdown.call_count == 1 # backend reacted to shutdown: assert backend.state is State.ShutdownPending
def test_propagate_content_sync_out_of_sync(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[MessageSerializer().serialize(ContentSync('/path/to/file', 'new content', 17, 21)), BlockingIOError]) mock_clientsocket.send = mock.MagicMock() mock_listener = mock.MagicMock() backend = Backend([mock_listener]) mock_content_monitor = mock.MagicMock() mock_content_monitor.synchronize = mock.MagicMock(return_value=SynchronizationResult.OutOfSync) backend.connection[mock_clientsocket] = FrontendConnection(backend, mock_clientsocket, content_monitor=mock_content_monitor) backend._receive(mock_clientsocket) # listeners are called: assert mock_listener.on_content_sync.call_count == 1 mock_content_monitor.synchronize.assert_called_once_with('/path/to/file', 'new content', 17, 21) assert mock_clientsocket.send.call_count == 1 arg = mock_clientsocket.send.call_args[0][0] assert b'OutOfSync' in arg
def test_receive_shutdown(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[ MessageSerializer().serialize(Shutdown()), BlockingIOError ]) mock_listener1 = mock.MagicMock() mock_listener2 = mock.MagicMock() backend = Backend([mock_listener1, mock_listener2]) backend.connection[mock_clientsocket] = FrontendConnection( backend, mock_clientsocket) assert backend.state is not State.ShutdownPending backend._receive(mock_clientsocket) # listeners are called: assert mock_listener1.on_shutdown.call_count == 1 assert mock_listener2.on_shutdown.call_count == 1 # backend reacted to shutdown: assert backend.state is State.ShutdownPending
def test_frontend_timeout(mock_datetime_mod): now = datetime.datetime.now() mock_datetime_mod.datetime.now = mock.MagicMock(side_effect=lambda: now) mock_clientsocket1 = mock.MagicMock() mock_clientsocket2 = mock.MagicMock() backend = Backend() backend.sockets = [mock.sentinel.SERVER_SOCKET, mock_clientsocket1, mock_clientsocket2] backend.connection[mock_clientsocket1] = FrontendConnection(backend, mock_clientsocket1) backend.connection[mock_clientsocket2] = FrontendConnection(backend, mock_clientsocket2) assert TIMEOUT_LAST_MESSAGE > datetime.timedelta(0) # prevent alive message is mixed into communication: backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert not mock_clientsocket2.close.called now += 0.9 * TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert not mock_clientsocket2.close.called # now receive a message from one frontend: mock_clientsocket1.recv = mock.MagicMock(side_effect=[MessageSerializer().serialize(CompletionRequest('t', 'g', 10)), BlockingIOError]) backend._receive(mock_clientsocket1) now += 0.2 * TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert not mock_clientsocket1.close.called assert mock_clientsocket2.close.called now += TIMEOUT_LAST_MESSAGE backend.ts_alive_sent = now backend._cyclic() assert mock_clientsocket1.close.called
def test_propagate_content_sync(): mock_clientsocket = mock.MagicMock() mock_clientsocket.recv = mock.MagicMock(side_effect=[MessageSerializer().serialize(ContentSync('/path/to/file', 'new content', 17, 21)), BlockingIOError]) mock_clientsocket.send = mock.MagicMock() mock_listener = mock.MagicMock() backend = Backend([mock_listener]) mock_content_monitor = mock.MagicMock() mock_content_monitor.synchronize = mock.MagicMock(return_value=SynchronizationResult.Updated) backend.connection[mock_clientsocket] = FrontendConnection(backend, mock_clientsocket, content_monitor=mock_content_monitor) backend._receive(mock_clientsocket) # listeners are called: assert mock_listener.on_content_sync.call_count == 1 mock_content_monitor.synchronize.assert_called_once_with('/path/to/file', 'new content', 17, 21) assert not mock_clientsocket.send.called arg = mock_listener.on_content_sync.call_args[0][0] assert isinstance(arg, ContentSync) assert arg.file == '/path/to/file' assert arg.data == 'new content' assert arg.start == 17 assert arg.end == 21