chainsyncer/chainsyncer/unittest/base.py

158 lines
3.4 KiB
Python
Raw Normal View History

2021-04-15 11:15:48 +02:00
# standard imports
import os
2021-04-15 14:11:06 +02:00
import logging
2022-03-17 23:07:19 +01:00
import hashlib
2021-04-15 11:15:48 +02:00
# external imports
from hexathon import add_0x
2022-03-17 23:07:19 +01:00
from shep.state import State
2021-04-15 11:15:48 +02:00
# local imports
2022-03-17 23:07:19 +01:00
#from chainsyncer.driver.history import HistorySyncer
2021-04-15 11:15:48 +02:00
from chainsyncer.error import NoBlockForYou
2022-03-18 02:11:30 +01:00
from chainsyncer.driver import SyncDriver
2021-04-15 11:15:48 +02:00
logging.STATETRACE = 5
2021-04-15 14:11:06 +02:00
logg = logging.getLogger().getChild(__name__)
2021-04-15 11:15:48 +02:00
def state_event_handler(k, v_old, v_new):
logg.log(logging.STATETRACE, 'sync state change key {}: {} -> {}'.format(k, v_old, v_new))
def filter_state_event_handler(k, v_old, v_new):
logg.log(logging.STATETRACE, 'filter state change key {}: {} -> {}'.format(k, v_old, v_new))
2022-03-21 22:03:24 +01:00
class MockFilterError(Exception):
pass
class MockConn:
2021-08-27 14:16:46 +02:00
"""Noop connection mocker.
2021-08-27 14:16:46 +02:00
:param o: Object to execute rpc call for
:type o: dict
"""
def do(self, o):
pass
2021-04-15 11:15:48 +02:00
class MockTx:
2021-08-27 14:16:46 +02:00
"""Minimal mocked tx object.
2021-04-15 11:15:48 +02:00
2021-08-27 14:16:46 +02:00
:param index: Transaction index in block
:type index: int
:param tx_hash: Transaction hash
:type tx_hash: str
"""
2021-04-15 14:11:06 +02:00
def __init__(self, index, tx_hash):
2021-04-15 11:15:48 +02:00
self.hash = tx_hash
self.index = index
def apply_receipt(self, rcpt):
2021-08-27 14:16:46 +02:00
"""Save receipt source in mock tx object.
:param rcpt: Transaction receipt
:type rcpt: dict
"""
self.rcpt = rcpt
2021-04-15 11:15:48 +02:00
class MockBlock:
def __init__(self, number, txs):
2021-08-27 14:16:46 +02:00
"""Minimal mocked block object.
:param number: Block number
:type number: int
:param txs: Transaction list to include in block
:type txs: list
"""
2021-04-15 11:15:48 +02:00
self.number = number
self.txs = txs
def tx(self, i):
2021-08-27 14:16:46 +02:00
"""Get block transaction at given index.
:param i: Transaction index
:type i: int
"""
2021-04-15 11:15:48 +02:00
return MockTx(i, self.txs[i])
2022-03-17 23:07:19 +01:00
class MockStore(State):
2021-04-15 11:15:48 +02:00
2022-03-17 23:07:19 +01:00
def __init__(self, bits=0):
super(MockStore, self).__init__(bits, check_alias=False)
2021-04-15 11:15:48 +02:00
2022-03-17 23:07:19 +01:00
2022-03-18 00:48:23 +01:00
def start(self, offset=0, target=-1):
2022-03-17 23:07:19 +01:00
pass
2021-04-15 11:15:48 +02:00
2021-08-27 14:16:46 +02:00
2022-03-17 23:07:19 +01:00
class MockFilter:
2022-03-21 22:03:24 +01:00
def __init__(self, name, brk=None, brk_hard=None, z=None):
2022-03-17 23:07:19 +01:00
self.name = name
if z == None:
h = hashlib.sha256()
h.update(self.name.encode('utf-8'))
z = h.digest()
self.z = z
self.brk = brk
2022-03-21 22:03:24 +01:00
self.brk_hard = brk_hard
2022-03-18 00:48:23 +01:00
self.contents = []
2022-03-17 23:07:19 +01:00
def sum(self):
return self.z
def common_name(self):
return self.name
def filter(self, conn, block, tx):
2022-03-21 22:03:24 +01:00
r = False
2022-03-18 00:48:23 +01:00
self.contents.append((block.number, tx.index, tx.hash,))
2022-03-21 22:03:24 +01:00
if self.brk_hard != None:
r = True
if self.brk_hard > 0:
r = True
self.brk_hard -= 1
if r:
raise MockFilterError()
if self.brk != None:
if self.brk > 0:
r = True
self.brk -= 1
logg.debug('filter {} r {} block {}'.format(self.common_name(), r, block.number))
2022-03-21 22:03:24 +01:00
return r
2022-03-17 23:07:19 +01:00
2022-03-18 02:11:30 +01:00
class MockDriver(SyncDriver):
def __init__(self, store, offset=0, target=-1):
super(MockDriver, self).__init__(store, offset=offset, target=target)
self.blocks = {}
def add_block(self, block):
self.blocks[block.number] = block
def get(self, conn, item):
return self.blocks[item.cursor]
def process(self, conn, item, block, tx_start):
i = tx_start
while True:
tx = block.tx(i)
self.process_single(conn, block, tx)
item.next()
i += 1