Browse Source

test_daemon.py,rpc.py: various cleanups

The MMGen Project 5 years ago
parent
commit
fe8fdabdab
6 changed files with 61 additions and 44 deletions
  1. 2 4
      mmgen/rpc.py
  2. 34 31
      mmgen/test_daemon.py
  3. 5 0
      mmgen/util.py
  4. 7 3
      test/test.py
  5. 6 1
      test/test_py_d/ts_ethdev.py
  6. 7 5
      test/test_py_d/ts_ref_altcoin.py

+ 2 - 4
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,

+ 34 - 31
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'
-
-	def __init__(self,network_id,datadir,desc='test suite daemon',rpc_port=None):
+	rpc_port = 18181
 
-		super().__init__(network_id,datadir,desc=desc)
+	@property
+	def shared_args(self):
+		return ['--zmq-rpc-bind-port={}'.format(self.rpc_port+1),'--rpc-bind-port={}'.format(self.rpc_port)]
 
-		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()

+ 5 - 0
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]

+ 7 - 3
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

+ 6 - 1
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)

+ 7 - 5
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()