Exemple #1
0
def test_sort_servers_closest(monkeypatch):
    cnt = 0

    def random_or_none(url):
        nonlocal cnt
        cnt += 1
        return random.random() if cnt % 3 else None

    mock_get_http_rtt = Mock(
        spec=raiden.network.transport.matrix.utils.get_http_rtt,
        side_effect=random_or_none,
    )

    monkeypatch.setattr(raiden.network.transport.matrix.utils, 'get_http_rtt',
                        mock_get_http_rtt)

    with pytest.raises(TransportError):
        sort_servers_closest(['ftp://server1.com', 'server2.com'])

    server_count = 9
    sorted_servers = sort_servers_closest(
        [f'https://server{i}.xyz' for i in range(server_count)])
    rtts = [rtt for (_, rtt) in sorted_servers]

    assert len(sorted_servers) <= server_count
    assert all(rtts) and rtts == sorted(rtts)
Exemple #2
0
def test_sort_servers_closest(monkeypatch):
    cnt = 0

    def random_or_none(url):  # pylint: disable=unused-argument
        nonlocal cnt
        cnt += 1
        return random.random() if cnt % 3 else None

    mock_get_http_rtt = Mock(
        spec=raiden.network.transport.matrix.utils.get_http_rtt,
        side_effect=random_or_none)

    monkeypatch.setattr(raiden.network.transport.matrix.utils, "get_http_rtt",
                        mock_get_http_rtt)

    with pytest.raises(TransportError):
        sort_servers_closest(["ftp://server1.com", "server2.com"])

    server_count = 9
    sorted_servers = sort_servers_closest(
        [f"https://server{i}.xyz" for i in range(server_count)])
    rtts = list(sorted_servers.values())

    assert len(sorted_servers) <= server_count
    assert all(rtts) and rtts == sorted(rtts)
def test_sort_servers_closest(requests_responses):
    with pytest.raises(TransportError):
        # `ftp://` is not a valid scheme
        sort_servers_closest(["ftp://server1.com"])

    def make_dummy_response(response_times: List[float]):
        response_time_iter = cycle(response_times)

        def response(_):
            gevent.sleep(next(response_time_iter))
            return 200, {}, ""

        return response

    # Average response time := 0.1
    requests_responses.add_callback(responses.HEAD,
                                    "http://url0",
                                    callback=make_dummy_response(
                                        [0.05, 0.05, 0.2]))
    # Average response time := 0.05
    requests_responses.add_callback(responses.HEAD,
                                    "http://url1",
                                    callback=make_dummy_response(
                                        [0.05, 0.05, 0.05]))
    # Exceeds 0.3 max timeout defined below
    requests_responses.add_callback(responses.HEAD,
                                    "http://url2",
                                    callback=make_dummy_response(
                                        [0.5, 0.5, 0.5]))
    # Raises an exception
    requests_responses.add(responses.HEAD,
                           "http://url3",
                           body=requests.RequestException())

    sorted_servers = sort_servers_closest(
        ["http://url0", "http://url1", "http://url2", "http://url3"],
        max_timeout=0.3)
    rtts = [round(rtt, 2) for rtt in sorted_servers.values()]

    assert len(sorted_servers) == 2
    assert all(rtts) and rtts == sorted(rtts)
    assert rtts == [0.05, 0.10]

    with pytest.raises(TransportError):
        # Only invalid servers
        sort_servers_closest(["http://url2", "http://url3"], max_timeout=0.3)