adding cic-eth as sub dir
This commit is contained in:
43
apps/cic-eth/tests/unit/sync/test_head.py
Normal file
43
apps/cic-eth/tests/unit/sync/test_head.py
Normal file
@@ -0,0 +1,43 @@
|
||||
# standard imports
|
||||
import logging
|
||||
|
||||
# local imports
|
||||
from cic_eth.sync.head import HeadSyncer
|
||||
from cic_eth.sync.backend import SyncerBackend
|
||||
|
||||
logg = logging.getLogger()
|
||||
|
||||
|
||||
def test_head(
|
||||
init_rpc,
|
||||
init_database,
|
||||
init_eth_tester,
|
||||
mocker,
|
||||
eth_empty_accounts,
|
||||
):
|
||||
|
||||
#backend = SyncBackend(eth_empty_accounts[0], 'foo')
|
||||
block_number = init_rpc.w3.eth.blockNumber
|
||||
backend = SyncerBackend.live('foo:666', block_number)
|
||||
syncer = HeadSyncer(backend)
|
||||
|
||||
#init_eth_tester.mine_block()
|
||||
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)
|
||||
|
||||
block_number = init_rpc.w3.eth.blockNumber
|
||||
backend.set(block_number, 0)
|
||||
b = syncer.get(init_rpc.w3)
|
||||
|
||||
tx = init_rpc.w3.eth.getTransactionByBlock(b[0], 0)
|
||||
|
||||
assert tx.hash.hex() == tx_hash_one.hex()
|
||||
194
apps/cic-eth/tests/unit/sync/test_history.py
Normal file
194
apps/cic-eth/tests/unit/sync/test_history.py
Normal file
@@ -0,0 +1,194 @@
|
||||
# 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
|
||||
79
apps/cic-eth/tests/unit/sync/test_syncer_scratch.py
Normal file
79
apps/cic-eth/tests/unit/sync/test_syncer_scratch.py
Normal file
@@ -0,0 +1,79 @@
|
||||
# third-party imports
|
||||
import pytest
|
||||
|
||||
# local imports
|
||||
from cic_eth.db.models.sync import BlockchainSync
|
||||
from cic_eth.sync.backend import SyncerBackend
|
||||
|
||||
|
||||
def test_scratch(
|
||||
init_database,
|
||||
):
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
s = SyncerBackend('Testchain:666', 13)
|
||||
|
||||
syncer = SyncerBackend.live('Testchain:666', 13)
|
||||
|
||||
s = SyncerBackend('Testchain:666', syncer.object_id)
|
||||
|
||||
|
||||
|
||||
def test_live(
|
||||
init_database,
|
||||
):
|
||||
|
||||
s = SyncerBackend.live('Testchain:666', 13)
|
||||
|
||||
s.connect()
|
||||
assert s.db_object.target() == None
|
||||
s.disconnect()
|
||||
|
||||
assert s.get() == (13, 0)
|
||||
|
||||
s.set(14, 1)
|
||||
assert s.get() == (14, 1)
|
||||
|
||||
|
||||
def test_resume(
|
||||
init_database,
|
||||
):
|
||||
|
||||
live = SyncerBackend.live('Testchain:666', 13)
|
||||
live.set(13, 2)
|
||||
|
||||
resumes = SyncerBackend.resume('Testchain:666', 26)
|
||||
|
||||
assert len(resumes) == 1
|
||||
resume = resumes[0]
|
||||
|
||||
assert resume.get() == (13, 2)
|
||||
|
||||
resume.set(13, 4)
|
||||
assert resume.get() == (13, 4)
|
||||
assert resume.start() == (13, 2)
|
||||
assert resume.target() == 26
|
||||
|
||||
|
||||
def test_unsynced(
|
||||
init_database,
|
||||
):
|
||||
|
||||
live = SyncerBackend.live('Testchain:666', 13)
|
||||
live.set(13, 2)
|
||||
|
||||
resumes = SyncerBackend.resume('Testchain:666', 26)
|
||||
live = SyncerBackend.live('Testchain:666', 26)
|
||||
resumes[0].set(18, 12)
|
||||
|
||||
resumes = SyncerBackend.resume('Testchain:666', 42)
|
||||
|
||||
assert len(resumes) == 2
|
||||
|
||||
assert resumes[0].start() == (13, 2)
|
||||
assert resumes[0].get() == (18, 12)
|
||||
assert resumes[0].target() == 26
|
||||
|
||||
assert resumes[1].start() == (26, 0)
|
||||
assert resumes[1].get() == (26, 0)
|
||||
assert resumes[1].target() == 42
|
||||
Reference in New Issue
Block a user