From fe8fdabdab42920ebcd19bba2c45db7fda59c4bc Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 8 Dec 2019 18:19:12 +0000 Subject: [PATCH] test_daemon.py,rpc.py: various cleanups --- mmgen/rpc.py | 6 +-- mmgen/test_daemon.py | 65 +++++++++++++++++--------------- mmgen/util.py | 5 +++ test/test.py | 10 +++-- test/test_py_d/ts_ethdev.py | 7 +++- test/test_py_d/ts_ref_altcoin.py | 12 +++--- 6 files changed, 61 insertions(+), 44 deletions(-) diff --git a/mmgen/rpc.py b/mmgen/rpc.py index d4158921..e35990c6 100755 --- a/mmgen/rpc.py +++ b/mmgen/rpc.py @@ -34,14 +34,14 @@ class CoinDaemonRPCConnection(MMGenObject): auth = True db_fs = ' host [{h}] port [{p}] user [{u}] passwd [{pw}] auth_cookie [{c}]\n' - def __init__(self,host=None,port=None,user=None,passwd=None,auth_cookie=None): + def __init__(self,host=None,port=None,user=None,passwd=None,auth_cookie=None,socket_timeout=1): dmsg_rpc('=== {}.__init__() debug ==='.format(type(self).__name__)) dmsg_rpc(self.db_fs.format(h=host,p=port,u=user,pw=passwd,c=auth_cookie)) import socket try: - socket.create_connection((host,port),timeout=3).close() + socket.create_connection((host,port),timeout=socket_timeout).close() except: raise SocketError('Unable to connect to {}:{}'.format(host,port)) @@ -287,7 +287,6 @@ def init_daemon_parity(): return addr,sym - from mmgen.rpc import EthereumRPCConnection conn = EthereumRPCConnection( g.rpc_host or 'localhost', g.rpc_port or g.proto.rpc_port) @@ -336,7 +335,6 @@ def init_daemon_bitcoind(): cfg = get_daemon_cfg_options(('rpcuser','rpcpassword')) - from mmgen.rpc import CoinDaemonRPCConnection conn = CoinDaemonRPCConnection( g.rpc_host or 'localhost', g.rpc_port or g.proto.rpc_port, diff --git a/mmgen/test_daemon.py b/mmgen/test_daemon.py index 128ab7ec..65b898ef 100755 --- a/mmgen/test_daemon.py +++ b/mmgen/test_daemon.py @@ -27,7 +27,7 @@ from mmgen.common import * class TestDaemon(MMGenObject): cfg_file_hdr = '' - subclasses_must_implement = ('state','do_stop','stop_cmd') + subclasses_must_implement = ('state','stop_cmd') network_ids = ('btc','btc_tn','bch','bch_tn','ltc','ltc_tn','xmr') debug = False @@ -50,8 +50,13 @@ class TestDaemon(MMGenObject): usr_rpc_port = None - def __new__(cls,network_id,datadir,desc='test suite daemon',rpc_port=None): + def __new__(cls,network_id,datadir=None,rpc_port=None,desc='test suite daemon'): + + network_id = network_id.lower() assert network_id in cls.network_ids, '{!r}: invalid network ID'.format(network_id) + + if not datadir: # hack for throwaway instances + datadir = '/tmp/foo' assert os.path.isabs(datadir), '{!r}: invalid datadir (not an absolute path)'.format(datadir) if network_id.endswith('_tn'): @@ -61,7 +66,9 @@ class TestDaemon(MMGenObject): coinsym = network_id network = 'mainnet' - me = MMGenObject.__new__((BitcoinTestDaemon,MoneroTestDaemon)[coinsym=='xmr']) + me = MMGenObject.__new__( + MoneroTestDaemon if coinsym == 'xmr' + else BitcoinTestDaemon ) me.network_id = network_id me.coinsym = coinsym @@ -72,7 +79,7 @@ class TestDaemon(MMGenObject): me.usr_rpc_port = rpc_port return me - def __init__(self,network_id,datadir,desc='test suite daemon',rpc_port=None): + def __init__(self,network_id,datadir=None,rpc_port=None,desc='test suite daemon'): self.pidfile = '{}/{}-daemon.pid'.format(self.datadir,self.network) @@ -84,6 +91,9 @@ class TestDaemon(MMGenObject): }[self.coinsym] self.net_desc = '{} {}'.format(self.coin,self.network) + self.subclass_init() + + def subclass_init(self): pass def exec_cmd_thread(self,cmd,check): import threading @@ -109,7 +119,6 @@ class TestDaemon(MMGenObject): cp = self.exec_cmd_thread(cmd,check) else: cp = self.exec_cmd(cmd,check) - if cp: out = cp.stdout.decode().rstrip() err = cp.stderr.decode().rstrip() @@ -150,7 +159,14 @@ class TestDaemon(MMGenObject): + list(cmds)) def do_start(self,silent=False): - return self.run_cmd(self.start_cmd,silent=silent,is_daemon=True) + if not silent: + msg('Starting {} {}'.format(self.net_desc,self.desc)) + return self.run_cmd(self.start_cmd,silent=True,is_daemon=True) + + def do_stop(self,silent=False): + if not silent: + msg('Stopping {} {}'.format(self.net_desc,self.desc)) + return self.run_cmd(self.stop_cmd,silent=True) def cli(self,*cmds,silent=False,check=True): return self.run_cmd(self.cli_cmd(*cmds),silent=silent,check=check) @@ -200,12 +216,9 @@ class TestDaemon(MMGenObject): assert k in subcls.__dict__, m.format(k,subcls.__name__) class BitcoinTestDaemon(TestDaemon): - dtype = 'bitcoin' cfg_file_hdr = '# TestDaemon config file\n' - def __init__(self,network_id,datadir,desc='test suite daemon',rpc_port=None): - - super().__init__(network_id,datadir,desc=desc) + def subclass_init(self): if self.platform == 'win' and self.coinsym == 'bch': self.use_pidfile = False @@ -252,24 +265,20 @@ class BitcoinTestDaemon(TestDaemon): def stop_cmd(self): return self.cli_cmd('stop') - def do_stop(self,silent=False): - if not silent: - msg('Stopping {} {}'.format(self.net_desc,self.desc)) - return self.cli('stop',silent=True) - class MoneroTestDaemon(TestDaemon): - dtype = 'monero' + rpc_port = 18181 - def __init__(self,network_id,datadir,desc='test suite daemon',rpc_port=None): + @property + def shared_args(self): + return ['--zmq-rpc-bind-port={}'.format(self.rpc_port+1),'--rpc-bind-port={}'.format(self.rpc_port)] - super().__init__(network_id,datadir,desc=desc) - - self.shared_args = ['--zmq-rpc-bind-port=18182','--rpc-bind-port=18181'] - self.coind_args = [ '--bg-mining-enable', - '--pidfile='+self.pidfile, - '--data-dir='+self.datadir, - '--detach', - '--offline' ] + @property + def coind_args(self): + return ['--bg-mining-enable', + '--pidfile={}'.format(self.pidfile), + '--data-dir={}'.format(self.datadir), + '--detach', + '--offline' ] @property def state(self): @@ -281,14 +290,8 @@ class MoneroTestDaemon(TestDaemon): check=False ) return 'stopped' if 'Error:' in cp.stdout.decode() else 'ready' - def do_start(self,silent=False): - return super().do_start(silent=silent) - @property def stop_cmd(self): return [self.coind_exec] + self.shared_args + ['exit'] - def do_stop(self,silent=False): - return self.run_cmd(self.stop_cmd,silent=silent) - TestDaemon.check_implement() diff --git a/mmgen/util.py b/mmgen/util.py index 7027a2ab..fe3dee04 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -840,3 +840,8 @@ def write_mode(orig_func): die(1,m.format(type(self).__name__,locals()['orig_func'].__name__)) return orig_func(self,*args,**kwargs) return f + +def get_network_id(coin=None,testnet=None): + if coin == None: assert testnet == None + if coin != None: assert testnet != None + return (coin or g.coin).lower() + ('','_tn')[testnet or g.testnet] diff --git a/test/test.py b/test/test.py index d391daf5..7dec7220 100755 --- a/test/test.py +++ b/test/test.py @@ -148,19 +148,23 @@ if not ('resume' in _uopts or 'skip_deps' in _uopts): try: os.unlink(data_dir) except: pass +def get_coin(): + return (_uopts.get('coin') or 'btc').lower() + +network_id = get_network_id(get_coin(),bool(_uopts.get('testnet'))) + sys.argv.insert(1,'--data-dir=' + data_dir) -sys.argv.insert(1,'--daemon-data-dir=test/daemons/' + (_uopts.get('coin') or 'btc')) +sys.argv.insert(1,'--daemon-data-dir=test/daemons/' + get_coin()) # step 2: opts.init will create new data_dir in ./test (if not 'resume' or 'skip_deps'): usr_args = opts.init(opts_data) + # step 3: move data_dir to /dev/shm and symlink it back to ./test: trash_dir = os.path.join('test','trash') if not ('resume' in _uopts or 'skip_deps' in _uopts): shm_dir = create_shm_dir(data_dir,trash_dir) -network_id = g.coin.lower() + ('_tn' if g.testnet else '') - check_segwit_opts() if opt.profile: opt.names = True diff --git a/test/test_py_d/ts_ethdev.py b/test/test_py_d/ts_ethdev.py index 3b189384..d6e430de 100755 --- a/test/test_py_d/ts_ethdev.py +++ b/test/test_py_d/ts_ethdev.py @@ -290,9 +290,14 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): ('stop', 'stopping parity'), ) + def __init__(self,trunner,cfgs,spawn): + self.rpc_port = 8549 + os.environ['MMGEN_BOGUS_WALLET_DATA'] = '' + return TestSuiteBase.__init__(self,trunner,cfgs,spawn) + @property def eth_args(self): - return ['--outdir={}'.format(self.tmpdir),'--coin='+g.coin,'--rpc-port=8549','--quiet'] + return ['--outdir={}'.format(self.tmpdir),'--coin='+g.coin,'--rpc-port={}'.format(self.rpc_port),'--quiet'] def setup(self): self.spawn('',msg_only=True) diff --git a/test/test_py_d/ts_ref_altcoin.py b/test/test_py_d/ts_ref_altcoin.py index 3a0d8600..b8003240 100755 --- a/test/test_py_d/ts_ref_altcoin.py +++ b/test/test_py_d/ts_ref_altcoin.py @@ -88,24 +88,26 @@ class TestSuiteRefAltcoin(TestSuiteRef,TestSuiteBase): coin,token = ('eth','mm1') if k == 'mm1' else (k,None) ref_subdir = self._get_ref_subdir_by_coin(coin) for tn in (False,True): + extra_opts = ['--coin='+coin,'--testnet='+('0','1')[tn]] if tn and coin == 'etc': continue if coin == 'bch': - network_id = 'bch' + ('','_tn')[tn] + network_id = get_network_id('bch',tn) start_test_daemons(network_id) + extra_opts += [ + '--daemon-data-dir=test/daemons/bch' ] g.testnet = tn init_coin(coin) fn = TestSuiteRef.sources['ref_tx_file'][token or coin][bool(tn)] tf = joinpath(ref_dir,ref_subdir,fn) wf = dfl_words_file - e = ['--coin='+coin,'--testnet='+('0','1')[tn]] - e += ['--daemon-data-dir=test/daemons/bch'] - if token: e += ['--token='+token] + if token: + extra_opts += ['--token='+token] t = self.txsign(wf, tf, pf, save = False, has_label = True, extra_desc = '({}{})'.format(token or coin,' testnet' if tn else ''), - extra_opts = e ) + extra_opts = extra_opts ) if coin == 'bch': stop_test_daemons(network_id) ok_msg()