From 3434248912ebeb1baa71a13a99e98f1e9f3fc629 Mon Sep 17 00:00:00 2001 From: nolash Date: Thu, 27 May 2021 17:16:48 +0200 Subject: [PATCH] 80%! add synctx test --- apps/cic-eth/cic_eth/eth/tx.py | 9 ++- apps/cic-eth/tests/task/test_task_tx.py | 64 ++++++++++++++++++- apps/cic-eth/tests/task/test_task_tx_misc.py | 3 + .../tests/unit/test_registry_connect.py | 1 + 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/apps/cic-eth/cic_eth/eth/tx.py b/apps/cic-eth/cic_eth/eth/tx.py index f50da0df..6602fe67 100644 --- a/apps/cic-eth/cic_eth/eth/tx.py +++ b/apps/cic-eth/cic_eth/eth/tx.py @@ -21,6 +21,7 @@ from chainqueue.db.models.tx import Otx from chainqueue.db.models.tx import TxCache from chainqueue.db.enum import StatusBits from chainqueue.error import NotLocalTxError +from potaahto.symbols import snake_and_camel # local imports from cic_eth.db import SessionBase @@ -151,7 +152,7 @@ def send(self, txs, chain_spec_dict): @celery_app.task(bind=True, throws=(NotFoundEthException,), base=CriticalWeb3Task) def sync_tx(self, tx_hash_hex, chain_spec_dict): - """Force update of network status of a simgle transaction + """Force update of network status of a single transaction :param tx_hash_hex: Transaction hash :type tx_hash_hex: str, 0x-hex @@ -176,12 +177,14 @@ def sync_tx(self, tx_hash_hex, chain_spec_dict): # TODO: apply receipt in tx object to validate and normalize input if rcpt != None: + rcpt = snake_and_camel(rcpt) success = rcpt['status'] == 1 - logg.debug('sync tx {} mined block {} success {}'.format(tx_hash_hex, rcpt['blockNumber'], success)) + logg.debug('sync tx {} mined block {} tx index {} success {}'.format(tx_hash_hex, rcpt['blockNumber'], rcpt['transactionIndex'], success)) s = celery.signature( 'cic_eth.queue.state.set_final', [ + chain_spec_dict, tx_hash_hex, rcpt['blockNumber'], rcpt['transactionIndex'], @@ -189,12 +192,14 @@ def sync_tx(self, tx_hash_hex, chain_spec_dict): ], queue=queue, ) + # TODO: it's not entirely clear how we can reliable determine that its in mempool without explicitly checking else: logg.debug('sync tx {} mempool'.format(tx_hash_hex)) s = celery.signature( 'cic_eth.queue.state.set_sent', [ + chain_spec_dict, tx_hash_hex, ], queue=queue, diff --git a/apps/cic-eth/tests/task/test_task_tx.py b/apps/cic-eth/tests/task/test_task_tx.py index 939b800b..ba5cfb54 100644 --- a/apps/cic-eth/tests/task/test_task_tx.py +++ b/apps/cic-eth/tests/task/test_task_tx.py @@ -4,16 +4,27 @@ import logging # external imports import pytest import celery -from chainlib.eth.gas import Gas +from chainlib.eth.gas import ( + OverrideGasOracle, + Gas, + ) from chainlib.eth.nonce import RPCNonceOracle from chainlib.eth.tx import ( TxFormat, unpack, transaction, receipt, + raw, ) from hexathon import strip_0x from chainqueue.db.models.otx import Otx +from chainqueue.tx import create as queue_create +from chainqueue.state import ( + set_reserved, + set_ready, + set_sent, + ) +from chainqueue.db.enum import StatusBits # local imports from cic_eth.queue.tx import register_tx @@ -22,6 +33,7 @@ from cic_eth.eth.gas import cache_gas_data logg = logging.getLogger() +@pytest.mark.skip() def test_tx_send( init_database, default_chain_spec, @@ -60,14 +72,62 @@ def test_tx_send( def test_sync_tx( + init_database, default_chain_spec, eth_rpc, eth_signer, + agent_roles, celery_session_worker, ): - pass + + nonce_oracle = RPCNonceOracle(agent_roles['ALICE'], conn=eth_rpc) + gas_oracle = OverrideGasOracle(price=1000000000, limit=21000) + c = Gas(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) + (tx_hash_hex, tx_signed_raw_hex) = c.create(agent_roles['ALICE'], agent_roles['BOB'], 100 * (10 ** 6), tx_format=TxFormat.RLP_SIGNED) + + queue_create( + default_chain_spec, + 42, + agent_roles['ALICE'], + tx_hash_hex, + tx_signed_raw_hex, + session=init_database, + ) + cache_gas_data( + tx_hash_hex, + tx_signed_raw_hex, + default_chain_spec.asdict(), + ) + set_ready(default_chain_spec, tx_hash_hex, session=init_database) + set_reserved(default_chain_spec, tx_hash_hex, session=init_database) + set_sent(default_chain_spec, tx_hash_hex, session=init_database) + + o = raw(tx_signed_raw_hex) + r = eth_rpc.do(o) + + o = receipt(tx_hash_hex) + r = eth_rpc.do(o) + assert r['status'] == 1 + + s = celery.signature( + 'cic_eth.eth.tx.sync_tx', + [ + tx_hash_hex, + default_chain_spec.asdict(), + ], + queue=None + ) + t = s.apply_async() + r = t.get_leaf() + assert t.successful() + + init_database.commit() + + o = Otx.load(tx_hash_hex, session=init_database) + assert o.status & StatusBits.FINAL == StatusBits.FINAL +@pytest.mark.skip() def test_resend_with_higher_gas( init_database, default_chain_spec, diff --git a/apps/cic-eth/tests/task/test_task_tx_misc.py b/apps/cic-eth/tests/task/test_task_tx_misc.py index 08ccd2d9..63468a2b 100644 --- a/apps/cic-eth/tests/task/test_task_tx_misc.py +++ b/apps/cic-eth/tests/task/test_task_tx_misc.py @@ -163,3 +163,6 @@ def test_hashes_to_txs( o = receipt(tx_hash_hex_two) r = eth_rpc.do(o) assert r['status'] == 1 + + + diff --git a/apps/cic-eth/tests/unit/test_registry_connect.py b/apps/cic-eth/tests/unit/test_registry_connect.py index baf23375..62f14c1e 100644 --- a/apps/cic-eth/tests/unit/test_registry_connect.py +++ b/apps/cic-eth/tests/unit/test_registry_connect.py @@ -7,6 +7,7 @@ def test_registry_connect( address_declarator, token_registry, contract_roles, + purge_lookups, registry, agent_roles, ):