pyflo/pybtc/test/connector/test.py
2019-04-25 12:18:37 +04:00

99 lines
2.8 KiB
Python

import configparser
import argparse
import asyncio
import sys
import signal
import traceback
import logging
import colorlog
import uvloop
from pybtc.connector import Connector
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
class App:
def __init__(self, loop, logger, config):
self.loop = loop
self.log = logger
self.connector = None
self.config = config
self.log.info("Test server init ...")
signal.signal(signal.SIGINT, self.terminate)
signal.signal(signal.SIGTERM, self.terminate)
asyncio.ensure_future(self.start(config), loop=self.loop)
async def start(self, config):
# init database
try:
zeromq = config['BITCOIND']["zeromq"]
rpc = config['BITCOIND']["rpc"]
self.connector = Connector(rpc, zeromq, self.log,
before_block_handler = self.before_block_handler)
await self.connector.connected
except Exception as err:
self.log.error("Start failed")
self.log.error(str(traceback.format_exc()))
async def orphan_block_handler(self, orphan_hash):
self.log.warning("handler remove orphan %s" % orphan_hash)
async def before_block_handler(self, data):
self.log.warning("handler new block %s" % str(data["hash"]))
async def new_transaction_handler(self, data, ft, a,b,c):
assert data["rawTx"] == data.serialize(hex=False)
def _exc(self, a, b, c):
return
def terminate(self, a, b):
self.loop.create_task(self.terminate_coroutine())
async def terminate_coroutine(self):
sys.excepthook = self._exc
self.log.error('Stop request received')
if self.connector:
self.log.warning("Stop node connector")
await self.connector.stop()
self.log.info("Test server stopped")
self.loop.stop()
def init(loop, argv):
parser = argparse.ArgumentParser(description="Test node connector ...")
args = parser.parse_args()
config_file = "test.conf"
log_level = logging.INFO
logger = colorlog.getLogger('cn')
config = configparser.ConfigParser()
config.read(config_file)
ch = logging.StreamHandler()
ch.setLevel(log_level)
formatter = colorlog.ColoredFormatter('%(log_color)s%(asctime)s %(levelname)s: %(message)s (%(module)s:%(lineno)d)')
ch.setFormatter(formatter)
logger.addHandler(ch)
logger.setLevel(log_level)
logger.info("Start")
loop = asyncio.get_event_loop()
app = App(loop, logger, config)
return app
if __name__ == '__main__':
loop = asyncio.get_event_loop()
app = init(loop, sys.argv[1:])
loop.run_forever()
pending = asyncio.Task.all_tasks()
loop.run_until_complete(asyncio.gather(*pending))
loop.close()