From 69890d831b0ecbad7ce33a6d776c446784f1d112 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 8 Dec 2019 18:29:46 +0000 Subject: [PATCH] TestDaemon: use non-standard RPC ports --- mmgen/main_autosign.py | 4 +++ mmgen/test_daemon.py | 47 ++++++++++++++++---------- test/start-coin-daemons.py | 4 +++ test/test-release.sh | 2 +- test/test.py | 2 ++ test/test_py_d/ts_ethdev.py | 5 +-- test/test_py_d/ts_main.py | 2 +- test/test_py_d/ts_misc.py | 4 +-- test/test_py_d/ts_ref.py | 2 +- test/test_py_d/ts_ref_altcoin.py | 4 ++- test/unit_tests_d/ut_tx_deserialize.py | 3 ++ 11 files changed, 53 insertions(+), 26 deletions(-) diff --git a/mmgen/main_autosign.py b/mmgen/main_autosign.py index ac7395e4..424a06f4 100755 --- a/mmgen/main_autosign.py +++ b/mmgen/main_autosign.py @@ -113,6 +113,8 @@ import mmgen.tx import mmgen.altcoins.eth.tx from mmgen.txsign import txsign from mmgen.protocol import CoinProtocol,init_coin +if g.test_suite: + from mmgen.test_daemon import TestDaemon if opt.stealth_led: opt.led = True @@ -134,6 +136,7 @@ def check_daemons_running(): continue if g.test_suite: g.proto.daemon_data_dir = 'test/daemons/' + coin.lower() + g.rpc_port = TestDaemon(get_network_id(coin,g.testnet)).rpc_port vmsg('Checking {} daemon'.format(coin)) try: rpc_init(reinit=True) @@ -196,6 +199,7 @@ def sign_tx_file(txfile,signed_txs): if g.proto.sign_mode == 'daemon': if g.test_suite: g.proto.daemon_data_dir = 'test/daemons/' + g.coin.lower() + g.rpc_port = TestDaemon(get_network_id(g.coin,g.testnet)).rpc_port rpc_init(reinit=True) if txsign(tx,wfs,None,None): diff --git a/mmgen/test_daemon.py b/mmgen/test_daemon.py index 65b898ef..2868d849 100755 --- a/mmgen/test_daemon.py +++ b/mmgen/test_daemon.py @@ -21,6 +21,7 @@ test_daemon.py: Daemon control classes for MMGen test suite and regtest mode """ from subprocess import run,PIPE +from collections import namedtuple from mmgen.exception import * from mmgen.common import * @@ -30,6 +31,18 @@ class TestDaemon(MMGenObject): subclasses_must_implement = ('state','stop_cmd') network_ids = ('btc','btc_tn','bch','bch_tn','ltc','ltc_tn','xmr') + + cd = namedtuple('coin_data',['coin','coind_exec','cli_exec','conf_file','dfl_rpc','dfl_rpc_tn']) + coins = { + 'btc': cd('Bitcoin', 'bitcoind', 'bitcoin-cli', 'bitcoin.conf', 8333,18333), + 'bch': cd('Bcash', 'bitcoind-abc','bitcoin-cli', 'bitcoin.conf', 8442,18442), # MMGen RPC dfls + 'ltc': cd('Litecoin', 'litecoind', 'litecoin-cli','litecoin.conf', 9333,19335), + 'xmr': cd('Monero', 'monerod', 'monerod', 'bitmonero.conf',18082,28082), + 'eth': cd('Ethereum', 'parity', 'parity', 'parity.conf', 8545,8545), + 'etc': cd('Ethereum Classic','parity', 'parity', 'parity.conf', 8545,8545) + } + port_shift = 1000 + debug = False wait = True use_pidfile = True @@ -83,12 +96,12 @@ class TestDaemon(MMGenObject): self.pidfile = '{}/{}-daemon.pid'.format(self.datadir,self.network) - self.coin,self.coind_exec,self.cli_exec,self.conf_file = { - 'btc': ('Bitcoin', 'bitcoind', 'bitcoin-cli', 'bitcoin.conf'), - 'ltc': ('Litecoin','litecoind', 'litecoin-cli','litecoin.conf'), - 'bch': ('Bcash', 'bitcoind-abc','bitcoin-cli', 'bitcoin.conf'), - 'xmr': ('Monero', 'monerod', 'monerod', 'bitmonero.conf') - }[self.coinsym] + for k in self.coins[self.coinsym]._fields: + setattr(self,k,getattr(self.coins[self.coinsym],k)) + + self.rpc_port = self.usr_rpc_port or ( + (self.dfl_rpc,self.dfl_rpc_tn)[self.network=='testnet'] + self.port_shift + ) self.net_desc = '{} {}'.format(self.coin,self.network) self.subclass_init() @@ -226,11 +239,16 @@ class BitcoinTestDaemon(TestDaemon): if self.network=='testnet': self.testnet_arg = ['--testnet'] - self.shared_args = ['--datadir='+self.datadir] - if self.usr_rpc_port: - self.shared_args += ['--rpcport={}'.format(self.usr_rpc_port)] + self.shared_args = [ + '--datadir={}'.format(self.datadir), + '--rpcport={}'.format(self.rpc_port) ] + + self.coind_args = [ + '--listen=0', + '--keypool=1', + '--rpcallowip=127.0.0.1', + '--rpcbind=127.0.0.1:{}'.format(self.rpc_port) ] - self.coind_args = ['--listen=0','--keypool=1'] if self.use_pidfile: self.coind_args += ['--pid='+self.pidfile] @@ -238,13 +256,7 @@ class BitcoinTestDaemon(TestDaemon): self.coind_args += ['--daemon'] if self.coinsym == 'bch': - port = self.usr_rpc_port or (8442,18442)[self.network=='testnet'] - self.coin_specific_coind_args = [ - '--rpcallowip=127.0.0.1', - '--rpcbind=127.0.0.1:{}'.format(port), - '--usecashaddr=0' ] - if not self.usr_rpc_port: - self.coin_specific_cli_args = ['--rpcport={}'.format(port)] + self.coin_specific_coind_args = ['--usecashaddr=0'] elif self.coinsym == 'ltc': self.coin_specific_coind_args = ['--mempoolreplacement=1'] @@ -266,7 +278,6 @@ class BitcoinTestDaemon(TestDaemon): return self.cli_cmd('stop') class MoneroTestDaemon(TestDaemon): - rpc_port = 18181 @property def shared_args(self): diff --git a/test/start-coin-daemons.py b/test/start-coin-daemons.py index 11b6f92d..99bd3575 100755 --- a/test/start-coin-daemons.py +++ b/test/start-coin-daemons.py @@ -58,6 +58,10 @@ else: if i not in TestDaemon.network_ids: die(1,'{!r}: invalid network ID'.format(i)) +if 'eth' in ids and 'etc' in ids: + msg('Cannot run ETH and ETC simultaneously, so skipping ETC') + ids.remove('etc') + for network_id in ids: network_id = network_id.lower() coin = network_id.replace('_tn','') diff --git a/test/test-release.sh b/test/test-release.sh index eb94c56a..ad84771e 100755 --- a/test/test-release.sh +++ b/test/test-release.sh @@ -327,7 +327,7 @@ t_xmr=" " f_xmr='Monero tests completed' -mmgen_tool_xmr="$mmgen_tool --rpc-port=18181 -q --accept-defaults --outdir $TMPDIR" +mmgen_tool_xmr="$mmgen_tool --rpc-port=19082 -q --accept-defaults --outdir $TMPDIR" [ "$MSYS2" ] || { # password file descriptor issues, cannot use popen_spawn() t_xmr+=" diff --git a/test/test.py b/test/test.py index 7dec7220..3a23d920 100755 --- a/test/test.py +++ b/test/test.py @@ -77,6 +77,7 @@ try: os.unlink(os.path.join(repo_root,'my.err')) except: pass from mmgen.common import * +from mmgen.test_daemon import TestDaemon from test.common import * from test.test_py_d.common import * @@ -155,6 +156,7 @@ 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/' + get_coin()) +sys.argv.insert(1,'--rpc-port={}'.format(TestDaemon(network_id).rpc_port)) # step 2: opts.init will create new data_dir in ./test (if not 'resume' or 'skip_deps'): usr_args = opts.init(opts_data) diff --git a/test/test_py_d/ts_ethdev.py b/test/test_py_d/ts_ethdev.py index d6e430de..69e8dc68 100755 --- a/test/test_py_d/ts_ethdev.py +++ b/test/test_py_d/ts_ethdev.py @@ -291,7 +291,8 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): ) def __init__(self,trunner,cfgs,spawn): - self.rpc_port = 8549 + from mmgen.test_daemon import TestDaemon + self.rpc_port = TestDaemon(g.coin).rpc_port os.environ['MMGEN_BOGUS_WALLET_DATA'] = '' return TestSuiteBase.__init__(self,trunner,cfgs,spawn) @@ -602,7 +603,7 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): return self.token_compile(token_data) def _rpc_init(self): - g.proto.rpc_port = 8549 + g.proto.rpc_port = self.rpc_port rpc_init() def token_deploy(self,num,key,gas,mmgen_cmd='txdo',tx_fee='8G'): diff --git a/test/test_py_d/ts_main.py b/test/test_py_d/ts_main.py index 9c9e88eb..f72e0a84 100755 --- a/test/test_py_d/ts_main.py +++ b/test/test_py_d/ts_main.py @@ -63,7 +63,7 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): 'basic operations with emulated tracking wallet' tmpdir_nums = [1,2,3,4,5,14,15,16,20,21] networks = ('btc','btc_tn','ltc','ltc_tn','bch','bch_tn') - passthru_opts = ('daemon_data_dir','coin','testnet') + passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet') segwit_opts_ok = True cmd_group = ( ('walletgen_dfl_wallet', (15,'wallet generation (default wallet)',[[[],15]])), diff --git a/test/test_py_d/ts_misc.py b/test/test_py_d/ts_misc.py index 6e40408a..348b00d5 100755 --- a/test/test_py_d/ts_misc.py +++ b/test/test_py_d/ts_misc.py @@ -31,7 +31,7 @@ class TestSuiteHelp(TestSuiteBase): 'help, info and usage screens' networks = ('btc','ltc','bch','eth') tmpdir_nums = [] - passthru_opts = ('daemon_data_dir','coin','testnet') + passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet') cmd_group = ( ('helpscreens', (1,'help screens', [])), ('longhelpscreens', (1,'help screens (--longhelp)',[])), @@ -257,7 +257,7 @@ class TestSuiteTool(TestSuiteMain,TestSuiteBase): class TestSuiteRefTX(TestSuiteMain,TestSuiteBase): 'create a reference transaction file (administrative command)' segwit_opts_ok = False - passthru_opts = ('daemon_data_dir','coin','testnet') + passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet') tmpdir_nums = [31,32,33,34] cmd_group = ( ('ref_tx_addrgen1', (31,'address generation (legacy)', [[[],1]])), diff --git a/test/test_py_d/ts_ref.py b/test/test_py_d/ts_ref.py index a8c80cb0..cece846d 100755 --- a/test/test_py_d/ts_ref.py +++ b/test/test_py_d/ts_ref.py @@ -37,7 +37,7 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): 'saved reference address, password and transaction files' tmpdir_nums = [8] networks = ('btc','btc_tn','ltc','ltc_tn') - passthru_opts = ('daemon_data_dir','coin','testnet') + passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet') sources = { 'ref_addrfile': '98831F3A{}[1,31-33,500-501,1010-1011]{}.addrs', 'ref_segwitaddrfile':'98831F3A{}-S[1,31-33,500-501,1010-1011]{}.addrs', diff --git a/test/test_py_d/ts_ref_altcoin.py b/test/test_py_d/ts_ref_altcoin.py index b8003240..ea3ef2d9 100755 --- a/test/test_py_d/ts_ref_altcoin.py +++ b/test/test_py_d/ts_ref_altcoin.py @@ -84,6 +84,7 @@ class TestSuiteRefAltcoin(TestSuiteRef,TestSuiteBase): self.write_to_tmpfile(pwfile,dfl_wpasswd) pf = joinpath(self.tmpdir,pwfile) from mmgen.protocol import init_coin + from mmgen.test_daemon import TestDaemon for k in ('bch','eth','mm1','etc'): coin,token = ('eth','mm1') if k == 'mm1' else (k,None) ref_subdir = self._get_ref_subdir_by_coin(coin) @@ -95,7 +96,8 @@ class TestSuiteRefAltcoin(TestSuiteRef,TestSuiteBase): network_id = get_network_id('bch',tn) start_test_daemons(network_id) extra_opts += [ - '--daemon-data-dir=test/daemons/bch' ] + '--daemon-data-dir=test/daemons/bch', + '--rpc-port={}'.format(TestDaemon(network_id).rpc_port) ] g.testnet = tn init_coin(coin) fn = TestSuiteRef.sources['ref_tx_file'][token or coin][bool(tn)] diff --git a/test/unit_tests_d/ut_tx_deserialize.py b/test/unit_tests_d/ut_tx_deserialize.py index 0068665e..4371360d 100755 --- a/test/unit_tests_d/ut_tx_deserialize.py +++ b/test/unit_tests_d/ut_tx_deserialize.py @@ -107,13 +107,16 @@ class unit_test(object): ('bch',False,'test/ref/460D4D-BCH[10.19764,tl=1320969600].rawtx') ) from mmgen.protocol import init_coin from mmgen.tx import MMGenTX + from mmgen.test_daemon import TestDaemon print_info('test/ref/*rawtx','MMGen reference transactions') for n,(coin,tn,fn) in enumerate(fns): init_coin(coin,tn) g.proto.daemon_data_dir = 'test/daemons/' + g.coin.lower() + g.rpc_port = TestDaemon(coin + ('','_tn')[tn]).rpc_port rpc_init(reinit=True) test_tx(MMGenTX(fn).hex,fn,n+1) init_coin('btc',False) + g.rpc_port = TestDaemon('btc').rpc_port rpc_init(reinit=True) Msg('OK')