Exemplo n.º 1
0
async def test_fallback_to_second_if_first_failed():
    rs = jsonrpc.async_client.RequestWithBackups(backups=["backup"])
    client = AsyncClient("primary", rs=rs)

    # primary will fail immediately, backup is slow but success
    client._send_http_request = gen_metadata_response(client, fail="primary", snap="backup")
    metadata = await client.get_metadata()
    assert metadata.script_hash_allow_list == ["backup"]
Exemplo n.º 2
0
async def test_raises_error_if_primary_and_backup_both_failed():
    async with AsyncClient("url", rs=jsonrpc.async_client.RequestWithBackups(backups=["url"])) as client:
        with pytest.raises(aiohttp.InvalidURL):
            assert await client.get_currencies()

    async with AsyncClient("url", rs=jsonrpc.async_client.RequestWithBackups(backups=["url"], fallback=True)) as client:
        with pytest.raises(aiohttp.InvalidURL):
            assert await client.get_currencies()
Exemplo n.º 3
0
async def test_fallback_to_backups_when_primary_failed():
    client = AsyncClient(
        "primary",
        rs=jsonrpc.async_client.RequestWithBackups(backups=["backup"], fallback=True),
    )
    client._send_http_request = gen_metadata_response(client, fail="primary")
    for _ in range(10):
        metadata = await client.get_metadata()
        assert metadata.script_hash_allow_list == ["backup"]
Exemplo n.º 4
0
async def test_fallback_strategy_always_returns_primary_response_if_it_successes():
    client = AsyncClient(
        "primary",
        rs=jsonrpc.async_client.RequestWithBackups(backups=["backup"], fallback=True),
    )
    client._send_http_request = gen_metadata_response(client)
    for _ in range(10):
        metadata = await client.get_metadata()
        assert metadata.script_hash_allow_list == ["primary"]
Exemplo n.º 5
0
async def test_first_success_strategy_returns_first_completed_success_response():
    rs = jsonrpc.async_client.RequestWithBackups(backups=["backup"])
    client = AsyncClient("primary", rs=rs)

    client._send_http_request = gen_metadata_response(client, snap="primary")
    metadata = await client.get_metadata()
    assert metadata.script_hash_allow_list == ["backup"]

    client._send_http_request = gen_metadata_response(client, snap="backup")
    metadata = await client.get_metadata()
    assert metadata.script_hash_allow_list == ["primary"]
Exemplo n.º 6
0
async def test_submit_ignores_stale_resposne_error(client: AsyncClient):
    account = await Faucet(client).gen_account()
    script = stdlib.encode_rotate_dual_attestation_info_script(
        new_url="http://localhost".encode("utf-8"), new_key=account.compliance_public_key_bytes
    )
    txn = account.sign(create_transaction(account, script, 0))
    state = client.get_last_known_state()
    client._last_known_server_state.version = state.version + 1_000_000_000
    await client.submit(txn)
    client._last_known_server_state = state
    ret = await client.wait_for_transaction(txn)
    assert ret
Exemplo n.º 7
0
async def test_handle_stale_response_error(client: AsyncClient):
    last = (await client.get_metadata()).version
    for i in range(0, 20):
        metadata = await client.get_metadata()
        assert metadata.version >= last
        assert client.get_last_known_state().version == metadata.version
        last = metadata.version
Exemplo n.º 8
0
async def test_get_last_known_state(client: AsyncClient):
    metadata = await client.get_metadata()
    assert metadata is not None
    state = client.get_last_known_state()
    assert state is not None

    assert metadata.chain_id == state.chain_id
    assert metadata.version == state.version
    assert metadata.timestamp == state.timestamp_usecs
Exemplo n.º 9
0
def create_client() -> AsyncClient:
    """Create an `AsyncClient` initialized with Testnet JSON-RPC URL"""

    return AsyncClient(os.getenv("DIEM_JSON_RPC_URL") or JSON_RPC_URL)
Exemplo n.º 10
0
async def test_invalid_server_url():
    async with AsyncClient("url") as client:
        with pytest.raises(aiohttp.InvalidURL):
            await client.get_currencies()
Exemplo n.º 11
0
async def test_update_last_known_state(client: AsyncClient):
    assert client.get_last_known_state() is not None

    client.update_last_known_state(2, 2, 2)
    assert client.get_last_known_state() is not None
    assert client.get_last_known_state().chain_id == 2
    assert client.get_last_known_state().version == 2
    assert client.get_last_known_state().timestamp_usecs == 2

    # chain id mismatch will raise invalid server response instead of
    # stale response error
    with pytest.raises(jsonrpc.InvalidServerResponse):
        client.update_last_known_state(1, 1, 1)

    with pytest.raises(jsonrpc.StaleResponseError):
        client.update_last_known_state(2, 1, 2)
    with pytest.raises(jsonrpc.StaleResponseError):
        client.update_last_known_state(2, 2, 1)
    with pytest.raises(jsonrpc.StaleResponseError):
        client.update_last_known_state(2, 1, 1)

    client.update_last_known_state(2, 2, 2)
    assert client.get_last_known_state().chain_id == 2
    assert client.get_last_known_state().version == 2
    assert client.get_last_known_state().timestamp_usecs == 2

    client.update_last_known_state(2, 3, 3)
    assert client.get_last_known_state().chain_id == 2
    assert client.get_last_known_state().version == 3
    assert client.get_last_known_state().timestamp_usecs == 3
Exemplo n.º 12
0
async def test_get_account_state_with_proof(client: AsyncClient):
    state_proof = await client.get_account_state_with_proof(DD_ADDRESS)
    assert state_proof is not None
    assert isinstance(state_proof, jsonrpc.AccountStateWithProof)
    assert state_proof.version == client.get_last_known_state().version