def test_transport_presence_updates(raiden_network, restart_node, retry_timeout):
    """
    Create transports and test that matrix delivers presence updates
    in the presence of filters which ignore all event updates
    from matrix for broadcast rooms except for the presence events.
    """
    app0, app1, app2 = raiden_network

    app0.raiden.transport.immediate_health_check_for(app1.raiden.address)
    app0.raiden.transport.immediate_health_check_for(app2.raiden.address)

    app1.raiden.transport.immediate_health_check_for(app0.raiden.address)
    app1.raiden.transport.immediate_health_check_for(app2.raiden.address)

    app2.raiden.transport.immediate_health_check_for(app0.raiden.address)
    app2.raiden.transport.immediate_health_check_for(app1.raiden.address)

    wait_for_network_state(app0.raiden, app1.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app0.raiden, app2.raiden.address, NetworkState.REACHABLE, retry_timeout)

    wait_for_network_state(app1.raiden, app0.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app1.raiden, app2.raiden.address, NetworkState.REACHABLE, retry_timeout)

    wait_for_network_state(app2.raiden, app0.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app2.raiden, app1.raiden.address, NetworkState.REACHABLE, retry_timeout)

    # Stop app0
    app0.stop()
    wait_for_network_state(
        app1.raiden, app0.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )
    wait_for_network_state(
        app2.raiden, app0.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )

    # Restart app0
    restart_node(app0)
    app0.raiden.transport.immediate_health_check_for(app1.raiden.address)
    app0.raiden.transport.immediate_health_check_for(app2.raiden.address)
    wait_for_network_state(app1.raiden, app0.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app2.raiden, app0.raiden.address, NetworkState.REACHABLE, retry_timeout)

    # Stop app1
    app1.stop()
    wait_for_network_state(
        app0.raiden, app1.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )
    wait_for_network_state(
        app2.raiden, app1.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )

    # Restart app1
    restart_node(app1)
    app1.raiden.transport.immediate_health_check_for(app0.raiden.address)
    app1.raiden.transport.immediate_health_check_for(app2.raiden.address)
    wait_for_network_state(app0.raiden, app1.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app2.raiden, app1.raiden.address, NetworkState.REACHABLE, retry_timeout)

    # Stop app2
    app2.stop()
    wait_for_network_state(
        app0.raiden, app2.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )
    wait_for_network_state(
        app1.raiden, app2.raiden.address, NetworkState.UNREACHABLE, retry_timeout
    )

    # Restart app0
    app2.start()
    app2.raiden.transport.immediate_health_check_for(app0.raiden.address)
    app2.raiden.transport.immediate_health_check_for(app1.raiden.address)
    wait_for_network_state(app0.raiden, app2.raiden.address, NetworkState.REACHABLE, retry_timeout)
    wait_for_network_state(app1.raiden, app2.raiden.address, NetworkState.REACHABLE, retry_timeout)
Exemple #2
0
def test_recovery_happy_case(
    raiden_network, number_of_nodes, deposit, token_addresses, network_wait
):
    app0, app1, app2 = raiden_network
    token_address = token_addresses[0]

    chain_state = views.state_from_app(app0)
    token_network_registry_address = app0.raiden.default_registry.address
    token_network_address = views.get_token_network_address_by_token_address(
        chain_state, token_network_registry_address, token_address
    )
    assert token_network_address

    # make a few transfers from app0 to app2
    amount = PaymentAmount(1)
    spent_amount = deposit - 2
    for identifier in range(spent_amount):
        transfer_and_assert_path(
            path=raiden_network,
            token_address=token_address,
            amount=amount,
            identifier=PaymentID(identifier),
            timeout=network_wait * number_of_nodes,
        )

    app0.stop()

    waiting.wait_for_network_state(
        app1.raiden, app0.raiden.address, NetworkState.UNREACHABLE, network_wait
    )

    app0.start()

    assert_synced_channel_state(
        token_network_address, app0, deposit - spent_amount, [], app1, deposit + spent_amount, []
    )
    assert_synced_channel_state(
        token_network_address, app1, deposit - spent_amount, [], app2, deposit + spent_amount, []
    )

    # wait for the nodes' healthcheck to update the network statuses
    waiting.wait_for_healthy(app0.raiden, app1.raiden.address, network_wait)
    waiting.wait_for_healthy(app1.raiden, app0.raiden.address, network_wait)

    transfer_and_assert_path(
        path=raiden_network[::-1],
        token_address=token_address,
        amount=amount,
        identifier=create_default_identifier(),
        timeout=network_wait * number_of_nodes,
    )

    transfer_and_assert_path(
        path=raiden_network,
        token_address=token_address,
        amount=amount,
        identifier=create_default_identifier(),
        timeout=network_wait * number_of_nodes,
    )

    assert_succeeding_transfer_invariants(
        token_network_address, app0, deposit - spent_amount, [], app1, deposit + spent_amount, []
    )

    assert_succeeding_transfer_invariants(
        token_network_address, app1, deposit - spent_amount, [], app2, deposit + spent_amount, []
    )