195 lines
5.8 KiB
Python
195 lines
5.8 KiB
Python
# standard imports
|
||
import logging
|
||
|
||
# third-party imports
|
||
import pytest
|
||
from web3.exceptions import BlockNotFound
|
||
from cic_registry import CICRegistry
|
||
|
||
# local imports
|
||
from cic_eth.sync.history import HistorySyncer
|
||
from cic_eth.sync.head import HeadSyncer
|
||
#from cic_eth.sync import Syncer
|
||
from cic_eth.db.models.otx import OtxSync
|
||
from cic_eth.db.models.base import SessionBase
|
||
from cic_eth.sync.backend import SyncerBackend
|
||
|
||
logg = logging.getLogger()
|
||
|
||
class FinishedError(Exception):
|
||
pass
|
||
|
||
|
||
class DebugFilter:
|
||
|
||
def __init__(self, address):
|
||
self.txs = []
|
||
self.monitor_to_address = address
|
||
|
||
def filter(self, w3, tx, rcpt, chain_spec):
|
||
logg.debug('sync filter {}'.format(tx['hash'].hex()))
|
||
if tx['to'] == self.monitor_to_address:
|
||
self.txs.append(tx)
|
||
# hack workaround, latest block hash not found in eth_tester for some reason
|
||
if len(self.txs) == 2:
|
||
raise FinishedError('intentionally finished on tx {}'.format(tx))
|
||
|
||
|
||
def test_history(
|
||
init_rpc,
|
||
init_database,
|
||
init_eth_tester,
|
||
#celery_session_worker,
|
||
eth_empty_accounts,
|
||
):
|
||
|
||
nonce = init_rpc.w3.eth.getTransactionCount(init_rpc.w3.eth.accounts[0], 'pending')
|
||
logg.debug('nonce {}'.format(nonce))
|
||
tx = {
|
||
'from': init_rpc.w3.eth.accounts[0],
|
||
'to': eth_empty_accounts[0],
|
||
'value': 404,
|
||
'gas': 21000,
|
||
'gasPrice': init_rpc.w3.eth.gasPrice,
|
||
'nonce': nonce,
|
||
}
|
||
tx_hash_one = init_rpc.w3.eth.sendTransaction(tx)
|
||
|
||
nonce = init_rpc.w3.eth.getTransactionCount(init_rpc.w3.eth.accounts[0], 'pending')
|
||
logg.debug('nonce {}'.format(nonce))
|
||
tx = {
|
||
'from': init_rpc.w3.eth.accounts[1],
|
||
'to': eth_empty_accounts[0],
|
||
'value': 404,
|
||
'gas': 21000,
|
||
'gasPrice': init_rpc.w3.eth.gasPrice,
|
||
'nonce': nonce,
|
||
}
|
||
tx_hash_two = init_rpc.w3.eth.sendTransaction(tx)
|
||
init_eth_tester.mine_block()
|
||
|
||
block_number = init_rpc.w3.eth.blockNumber
|
||
|
||
live_syncer = SyncerBackend.live('foo:666', 0)
|
||
HeadSyncer(live_syncer)
|
||
|
||
history_syncers = SyncerBackend.resume('foo:666', block_number)
|
||
|
||
for history_syncer in history_syncers:
|
||
logg.info('history syncer start {} target {}'.format(history_syncer.start(), history_syncer.target()))
|
||
|
||
backend = history_syncers[0]
|
||
|
||
syncer = HistorySyncer(backend)
|
||
fltr = DebugFilter(eth_empty_accounts[0])
|
||
syncer.filter.append(fltr.filter)
|
||
|
||
logg.debug('have txs {} {}'.format(tx_hash_one.hex(), tx_hash_two.hex()))
|
||
|
||
try:
|
||
syncer.loop(0.1)
|
||
except FinishedError:
|
||
pass
|
||
except BlockNotFound as e:
|
||
logg.error('the last block given in loop does not seem to exist :/ {}'.format(e))
|
||
|
||
check_hashes = []
|
||
for h in fltr.txs:
|
||
check_hashes.append(h['hash'].hex())
|
||
assert tx_hash_one.hex() in check_hashes
|
||
assert tx_hash_two.hex() in check_hashes
|
||
|
||
|
||
def test_history_multiple(
|
||
init_rpc,
|
||
init_database,
|
||
init_eth_tester,
|
||
#celery_session_worker,
|
||
eth_empty_accounts,
|
||
):
|
||
|
||
block_number = init_rpc.w3.eth.blockNumber
|
||
live_syncer = SyncerBackend.live('foo:666', block_number)
|
||
HeadSyncer(live_syncer)
|
||
|
||
nonce = init_rpc.w3.eth.getTransactionCount(init_rpc.w3.eth.accounts[0], 'pending')
|
||
logg.debug('nonce {}'.format(nonce))
|
||
tx = {
|
||
'from': init_rpc.w3.eth.accounts[0],
|
||
'to': eth_empty_accounts[0],
|
||
'value': 404,
|
||
'gas': 21000,
|
||
'gasPrice': init_rpc.w3.eth.gasPrice,
|
||
'nonce': nonce,
|
||
}
|
||
tx_hash_one = init_rpc.w3.eth.sendTransaction(tx)
|
||
|
||
|
||
init_eth_tester.mine_block()
|
||
block_number = init_rpc.w3.eth.blockNumber
|
||
history_syncers = SyncerBackend.resume('foo:666', block_number)
|
||
for history_syncer in history_syncers:
|
||
logg.info('halfway history syncer start {} target {}'.format(history_syncer.start(), history_syncer.target()))
|
||
live_syncer = SyncerBackend.live('foo:666', block_number)
|
||
HeadSyncer(live_syncer)
|
||
|
||
nonce = init_rpc.w3.eth.getTransactionCount(init_rpc.w3.eth.accounts[0], 'pending')
|
||
logg.debug('nonce {}'.format(nonce))
|
||
tx = {
|
||
'from': init_rpc.w3.eth.accounts[1],
|
||
'to': eth_empty_accounts[0],
|
||
'value': 404,
|
||
'gas': 21000,
|
||
'gasPrice': init_rpc.w3.eth.gasPrice,
|
||
'nonce': nonce,
|
||
}
|
||
tx_hash_two = init_rpc.w3.eth.sendTransaction(tx)
|
||
|
||
init_eth_tester.mine_block()
|
||
block_number = init_rpc.w3.eth.blockNumber
|
||
history_syncers = SyncerBackend.resume('foo:666', block_number)
|
||
live_syncer = SyncerBackend.live('foo:666', block_number)
|
||
HeadSyncer(live_syncer)
|
||
|
||
for history_syncer in history_syncers:
|
||
logg.info('history syncer start {} target {}'.format(history_syncer.start(), history_syncer.target()))
|
||
|
||
assert len(history_syncers) == 2
|
||
|
||
backend = history_syncers[0]
|
||
syncer = HistorySyncer(backend)
|
||
fltr = DebugFilter(eth_empty_accounts[0])
|
||
syncer.filter.append(fltr.filter)
|
||
try:
|
||
syncer.loop(0.1)
|
||
except FinishedError:
|
||
pass
|
||
except BlockNotFound as e:
|
||
logg.error('the last block given in loop does not seem to exist :/ {}'.format(e))
|
||
|
||
check_hashes = []
|
||
for h in fltr.txs:
|
||
check_hashes.append(h['hash'].hex())
|
||
assert tx_hash_one.hex() in check_hashes
|
||
|
||
|
||
backend = history_syncers[1]
|
||
syncer = HistorySyncer(backend)
|
||
fltr = DebugFilter(eth_empty_accounts[0])
|
||
syncer.filter.append(fltr.filter)
|
||
try:
|
||
syncer.loop(0.1)
|
||
except FinishedError:
|
||
pass
|
||
except BlockNotFound as e:
|
||
logg.error('the last block given in loop does not seem to exist :/ {}'.format(e))
|
||
|
||
check_hashes = []
|
||
for h in fltr.txs:
|
||
check_hashes.append(h['hash'].hex())
|
||
assert tx_hash_two.hex() in check_hashes
|
||
|
||
history_syncers = SyncerBackend.resume('foo:666', block_number)
|
||
|
||
assert len(history_syncers) == 0
|