From 20c9c37c6aa110b850c1933cb4ebd1c10a6beb24 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 2 Aug 2021 19:49:48 +0000 Subject: [PATCH] daemon.py,ut_rpc.py: fixes and cleanups --- mmgen/daemon.py | 48 ++++++++++++++++++++-------------- test/start-coin-daemons.py | 3 ++- test/test_py_d/ts_xmrwallet.py | 1 + test/unit_tests_d/ut_rpc.py | 5 ++-- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/mmgen/daemon.py b/mmgen/daemon.py index 76fb38b0..b4808f05 100755 --- a/mmgen/daemon.py +++ b/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'], ) diff --git a/test/start-coin-daemons.py b/test/start-coin-daemons.py index 99a4b5b2..a457050d 100755 --- a/test/start-coin-daemons.py +++ b/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) diff --git a/test/test_py_d/ts_xmrwallet.py b/test/test_py_d/ts_xmrwallet.py index 8806715d..2d9ee8fe 100755 --- a/test/test_py_d/ts_xmrwallet.py +++ b/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', diff --git a/test/unit_tests_d/ut_rpc.py b/test/unit_tests_d/ut_rpc.py index c34064b9..f20a3653 100755 --- a/test/unit_tests_d/ut_rpc.py +++ b/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) ]