test_daemon.py,rpc.py: various cleanups
This commit is contained in:
parent
041c55b65a
commit
fe8fdabdab
6 changed files with 61 additions and 44 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
10
test/test.py
10
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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue