示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
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
示例#7
0
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
示例#8
0
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
示例#9
0
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
示例#10
0
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
示例#11
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
示例#12
0
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