test_daemon.py,rpc.py: various cleanups

This commit is contained in:
The MMGen Project 2019-12-08 18:19:12 +00:00
commit fe8fdabdab
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
6 changed files with 61 additions and 44 deletions

View file

@ -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,

View file

@ -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()

View file

@ -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]

View file

@ -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

View file

@ -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)

View file

@ -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()