Browse Source

daemon.py,ut_rpc.py: fixes and cleanups

The MMGen Project 3 years ago
parent
commit
20c9c37c6a
4 changed files with 34 additions and 23 deletions
  1. 28 20
      mmgen/daemon.py
  2. 2 1
      test/start-coin-daemons.py
  3. 1 0
      test/test_py_d/ts_xmrwallet.py
  4. 3 2
      test/unit_tests_d/ut_rpc.py

+ 28 - 20
mmgen/daemon.py

@@ -47,8 +47,10 @@ class Daemon(MMGenObject):
 	def __init__(self):
 		self.opts = []
 		self._flags = []
+		self.platform = g.platform
 		if self.platform == 'win':
 			self.use_pidfile = False
+			self.use_threads = True
 
 	def subclass_init(self): pass
 
@@ -68,9 +70,10 @@ class Daemon(MMGenObject):
 		p = Popen(cmd,creationflags=CREATE_NEW_CONSOLE,startupinfo=si)
 		p.wait()
 
-	def exec_cmd(self,cmd):
+	def exec_cmd(self,cmd,is_daemon=False):
+		out = None if (is_daemon and 'no_daemonize' in self.opts) else PIPE
 		try:
-			cp = run(cmd,check=False,stdout=PIPE,stderr=PIPE)
+			cp = run(cmd,check=False,stdout=out,stderr=out)
 		except Exception as e:
 			raise MMGenCalledProcessError(f'Error starting executable: {type(e).__name__} [Errno {e.errno}]')
 		if self.debug:
@@ -85,10 +88,10 @@ class Daemon(MMGenObject):
 		if self.debug:
 			msg('\nExecuting: {}'.format(' '.join(cmd)))
 
-		if (self.platform == 'win' or self.use_threads) and is_daemon:
+		if self.use_threads and (is_daemon and not 'no_daemonize' in self.opts):
 			ret = self.exec_cmd_thread(cmd)
 		else:
-			ret = self.exec_cmd(cmd)
+			ret = self.exec_cmd(cmd,is_daemon)
 
 		if isinstance(ret,CompletedProcess):
 			if ret.stdout and (self.debug or not silent):
@@ -126,6 +129,10 @@ class Daemon(MMGenObject):
 			msg(f'Testing port {self.bind_port}')
 		return 'ready' if self.test_socket('localhost',self.bind_port) else 'stopped'
 
+	@property
+	def start_cmds(self):
+		return [self.start_cmd]
+
 	@property
 	def stop_cmd(self):
 		return ['kill','-Wf',self.pid] if self.platform == 'win' else ['kill',self.pid]
@@ -246,6 +253,11 @@ class RPCDaemon(Daemon):
 			self.rpc_type,
 			getattr(self.proto.network_names,self.proto.network),
 			'test suite ' if self.test_suite else '' )
+		self.usr_daemon_args = []
+
+	@property
+	def start_cmd(self):
+		return ([self.exec_fn] + self.daemon_args + self.usr_daemon_args)
 
 class MoneroWalletDaemon(RPCDaemon):
 
@@ -272,7 +284,6 @@ class MoneroWalletDaemon(RPCDaemon):
 		super().__init__()
 
 		self.network = proto.network
-		self.platform = g.platform
 		self.wallet_dir = wallet_dir
 		self.rpc_port = getattr(self.rpc_ports,self.network) + (11 if test_suite else 0)
 		if port_shift:
@@ -314,12 +325,6 @@ class MoneroWalletDaemon(RPCDaemon):
 			['--stagenet',                           self.network == 'testnet'],
 		)
 
-		self.usr_daemon_args = []
-
-	@property
-	def start_cmd(self):
-		return ([self.exec_fn] + self.daemon_args + self.usr_daemon_args )
-
 class CoinDaemon(Daemon):
 	networks = ('mainnet','testnet','regtest')
 	cfg_file_hdr = ''
@@ -402,14 +407,18 @@ class CoinDaemon(Daemon):
 
 		self.shared_args = []
 		self.usr_coind_args = []
-		self.platform = g.platform
+
+		for k,v in self.daemon_data._asdict().items():
+			setattr(self,k,v)
 
 		if opts:
 			if type(opts) not in (list,tuple):
 				die(1,f'{opts!r}: illegal value for opts (must be list or tuple)')
 			for o in opts:
-				if o not in self.avail_opts:
-					die(1,f'{o!r}: unrecognized opt')
+				if o not in CoinDaemon.avail_opts:
+					die(1,f'{o!r}: unrecognized option')
+				elif o not in self.avail_opts:
+					die(1,f'{o!r}: option not supported for {self.coind_name} daemon')
 			self.opts = list(opts)
 
 		if flags:
@@ -418,9 +427,6 @@ class CoinDaemon(Daemon):
 			for flag in flags:
 				self.add_flag(flag)
 
-		for k,v in self.daemon_data._asdict().items():
-			setattr(self,k,v)
-
 		if self.network == 'regtest' and isinstance(self,bitcoin_core_daemon):
 			if test_suite:
 				rel_datadir = os.path.join(
@@ -433,7 +439,7 @@ class CoinDaemon(Daemon):
 		elif test_suite:
 			rel_datadir = os.path.join('test','daemons',self.coin.lower())
 		else:
-			dfl_datadir = os.path.join(*self.datadirs[g.platform])
+			dfl_datadir = os.path.join(*self.datadirs[self.platform])
 
 		if test_suite:
 			dfl_datadir = os.path.join(os.getcwd(),rel_datadir)
@@ -580,10 +586,12 @@ class monero_daemon(CoinDaemon):
 
 	def subclass_init(self):
 
+		self.p2p_port = self.rpc_port - 1
+
 		self.shared_args = list_gen(
-			[f'--p2p-bind-port={self.rpc_port-1}'],
+			[f'--no-zmq'],
+			[f'--p2p-bind-port={self.p2p_port}'],
 			[f'--rpc-bind-port={self.rpc_port}'],
-			[f'--zmq-rpc-bind-port={self.rpc_port+1}'],
 			['--stagenet', self.network == 'testnet'],
 		)
 

+ 2 - 1
test/start-coin-daemons.py

@@ -53,7 +53,8 @@ def run(network_id=None,proto=None,daemon_id=None):
 	if opt.get_state:
 		print(d.state_msg())
 	elif opt.testing:
-		print(' '.join(getattr(d,action+'_cmd')))
+		for cmd in d.start_cmds if action == 'start' else [d.stop_cmd]:
+			print(' '.join(cmd))
 	else:
 		d.cmd(action,quiet=opt.quiet)
 

+ 1 - 0
test/test_py_d/ts_xmrwallet.py

@@ -228,6 +228,7 @@ class TestSuiteXMRWallet(TestSuiteBase):
 			)
 			wd = MoneroWalletDaemon(
 				proto      = self.proto,
+				test_suite = True,
 				wallet_dir = udir,
 				user       = 'foo',
 				passwd     = 'bar',

+ 3 - 2
test/unit_tests_d/ut_rpc.py

@@ -62,7 +62,7 @@ class init_test:
 
 	etc = eth
 
-def run_test(coin,auth):
+def run_test(coin,auth): # TODO: run all available networks simultaneously
 
 	proto = init_proto(coin)
 
@@ -110,9 +110,10 @@ class unit_tests:
 		async def run():
 			networks = init_proto('xmr').networks
 			daemons = [(
-					CoinDaemon(proto=proto),
+					CoinDaemon(proto=proto,test_suite=True),
 					MoneroWalletDaemon(
 						proto      = proto,
+						test_suite = True,
 						wallet_dir = 'test/trash',
 						passwd     = 'ut_rpc_passw0rd' )
 				) for proto in (init_proto('xmr',network=network) for network in networks) ]