def test_backend_alive_cycle(mock_datetime_mod): now = datetime.datetime.now() mock_datetime_mod.datetime.now = mock.MagicMock(side_effect=lambda: now) assert TIMEOUT_BACKEND_ALIVE > datetime.timedelta(0) 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) # cycle must send alive for all newly connected frontends: backend._cyclic() assert b'BackendAlive' in mock_clientsocket1.send.call_args[0][0] assert b'BackendAlive' in mock_clientsocket2.send.call_args[0][0] # no new alive message before timeout has expired: now += TIMEOUT_BACKEND_ALIVE * 0.9 mock_clientsocket1.send.reset_mock() mock_clientsocket2.send.reset_mock() backend._cyclic() assert not mock_clientsocket1.called assert not mock_clientsocket2.called # but right after: now += TIMEOUT_BACKEND_ALIVE * 0.15 mock_clientsocket1.send.reset_mock() mock_clientsocket2.send.reset_mock() backend._cyclic() assert b'BackendAlive' in mock_clientsocket1.send.call_args[0][0] assert b'BackendAlive' in mock_clientsocket2.send.call_args[0][0]
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_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_backend_alive_cycle(mock_datetime_mod): now = datetime.datetime.now() mock_datetime_mod.datetime.now = mock.MagicMock(side_effect=lambda: now) assert TIMEOUT_BACKEND_ALIVE > datetime.timedelta(0) 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) # cycle must send alive for all newly connected frontends: backend._cyclic() assert b'BackendAlive' in mock_clientsocket1.send.call_args[0][0] assert b'BackendAlive' in mock_clientsocket2.send.call_args[0][0] # no new alive message before timeout has expired: now += TIMEOUT_BACKEND_ALIVE * 0.9 mock_clientsocket1.send.reset_mock() mock_clientsocket2.send.reset_mock() backend._cyclic() assert not mock_clientsocket1.called assert not mock_clientsocket2.called # but right after: now += TIMEOUT_BACKEND_ALIVE * 0.15 mock_clientsocket1.send.reset_mock() mock_clientsocket2.send.reset_mock() backend._cyclic() assert b'BackendAlive' in mock_clientsocket1.send.call_args[0][0] assert b'BackendAlive' in mock_clientsocket2.send.call_args[0][0]