From 1dd08cd80a0f4600b132fa20f913bc8515d7b934 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Tue, 18 Apr 2023 18:35:54 +0000 Subject: [PATCH] test.py, autosign, xmrwallet: minor fixes and cleanups --- mmgen/xmrwallet.py | 87 +++++++++++++++++++--------------- test/test.py | 3 ++ test/test_py_d/ts_autosign.py | 14 ++++-- test/test_py_d/ts_xmrwallet.py | 39 +++++++++------ 4 files changed, 86 insertions(+), 57 deletions(-) diff --git a/mmgen/xmrwallet.py b/mmgen/xmrwallet.py index 353b54a9..22e227c8 100755 --- a/mmgen/xmrwallet.py +++ b/mmgen/xmrwallet.py @@ -152,14 +152,15 @@ class MoneroMMGenTX: ) fs = """ - Info for transaction {} [Seed ID: {}. Network: {}]: - TxID: {} - Signed: {} [{}] - Type: {} - From: Wallet {}, account {}{} - Amount: {} XMR - Fee: {} XMR - Dest: {} + Info for transaction {a} [Seed ID: {b}. Network: {c}]: + TxID: {d} + Created: {e:19} [{f}] + Signed: {g:19} [{h}] + Type: {i} + From: Wallet {j}, account {k}{l} + Amount: {m} XMR + Fee: {n} XMR + Dest: {o} """ pmid = d.dest_address.parsed.payment_id @@ -168,19 +169,21 @@ class MoneroMMGenTX: from .util2 import format_elapsed_hr return fmt(fs,strip_char='\t',indent=indent).format( - orange(self.base_chksum.upper()), - d.seed_id.hl(), - yellow(d.network.upper()), - d.txid.hl(), - make_timestr(d.sign_time), - format_elapsed_hr(d.sign_time), - blue(capfirst(d.op)), - d.source.wallet.hl(), - red(f'#{d.source.account}'), - to_entry if d.dest else '', - d.amount.hl(), - d.fee.hl(), - d.dest_address.hl(), + a = orange(self.base_chksum.upper()), + b = d.seed_id.hl(), + c = yellow(d.network.upper()), + d = d.txid.hl(), + e = make_timestr(d.create_time), + f = format_elapsed_hr(d.create_time), + g = make_timestr(d.sign_time), + h = format_elapsed_hr(d.sign_time), + i = blue(capfirst(d.op)), + j = d.source.wallet.hl(), + k = red(f'#{d.source.account}'), + l = to_entry if d.dest else '', + m = d.amount.hl(), + n = d.fee.hl(), + o = d.dest_address.hl(), pmid = pink(pmid.hex()) if pmid else None ) @@ -198,22 +201,28 @@ class MoneroMMGenTX: }, cls = json_encoder, ) - fn = '{}{}-XMR[{!s}]{}.sigtx'.format( - self.base_chksum.upper(), - (lambda s: f'-{s.upper()}' if s else '')(self.full_chksum), - self.data.amount, - (lambda s: '' if s == 'mainnet' else f'.{s}')(self.data.network), + + fn = '{a}{b}-XMR[{c!s}]{d}.{e}'.format( + a = self.base_chksum.upper(), + b = (lambda s: f'-{s.upper()}' if s else '')(self.full_chksum), + c = self.data.amount, + d = (lambda s: '' if s == 'mainnet' else f'.{s}')(self.data.network), + e = self.ext ) + from .fileutil import write_data_to_file write_data_to_file( cfg = self.cfg, outfile = fn, data = out, - desc = 'MoneroMMGenTX data', + desc = self.desc, ask_write = True, ask_write_default_yes = False ) class NewSigned(Base): + signed = True + desc = 'signed transaction data' + ext = 'sigtx' def __init__(self,*args,**kwargs): @@ -434,16 +443,16 @@ class MoneroWalletOps: def get_wallet_fn(self,d): return os.path.join( - self.cfg.wallet_dir or '.','{}-{}-MoneroWallet{}'.format( - self.kal.al_id.sid, - d.idx, - f'.{self.cfg.network}' if self.cfg.network != 'mainnet' else '')) + self.cfg.wallet_dir or '.','{a}-{b}-MoneroWallet{c}'.format( + a = self.kal.al_id.sid, + b = d.idx, + c = f'.{self.cfg.network}' if self.cfg.network != 'mainnet' else '')) async def main(self): - gmsg('\n{}ing {} wallet{}'.format( - self.stem.capitalize(), - len(self.addr_data), - suf(self.addr_data) )) + gmsg('\n{a}ing {b} wallet{c}'.format( + a = self.stem.capitalize(), + b = len(self.addr_data), + c = suf(self.addr_data) )) processed = 0 for n,d in enumerate(self.addr_data): # [d.sec,d.addr,d.wallet_passwd,d.viewkey] fn = self.get_wallet_fn(d) @@ -763,12 +772,11 @@ class MoneroWalletOps: def post_main(self): d = self.accts_data - op = type(self).__name__ for wnum,k in enumerate(d): - if op == 'sync': + if self.name == 'sync': self.rpc(self,self.addr_data[wnum]).print_accts( d[k]['accts'], d[k]['addrs'], indent='') - elif op == 'list': + elif self.name == 'list': fs = ' {:2} {} {} {}' msg('\n' + green(f'Wallet {k}:')) for acct_num,acct in enumerate(d[k]['addrs']): @@ -803,7 +811,8 @@ class MoneroWalletOps: msg(fs.format( 'TOTAL:', fmt_amt(tbals[0]), fmt_amt(tbals[1]) )) class list(sync): - pass + name = 'list' + stem = 'sync' class spec(wallet): # virtual class diff --git a/test/test.py b/test/test.py index f41ea7bc..6837503a 100755 --- a/test/test.py +++ b/test/test.py @@ -87,6 +87,9 @@ else: from mmgen.common import * +from mmgen.devinit import init_dev +init_dev() + try: os.unlink(os.path.join(repo_root,'test.py.err')) except: diff --git a/test/test_py_d/ts_autosign.py b/test/test_py_d/ts_autosign.py index e41f9838..95842731 100755 --- a/test/test_py_d/ts_autosign.py +++ b/test/test_py_d/ts_autosign.py @@ -80,11 +80,15 @@ class TestSuiteAutosignBase(TestSuiteBase): color = True def __init__(self,trunner,cfgs,spawn): + super().__init__(trunner,cfgs,spawn) + if trunner == None: return + if gc.platform == 'win': die(1,f'Test {type(self).__name__} not supported for Windows platform') + self.network_ids = [c+'_tn' for c in self.daemon_coins] + self.daemon_coins if self.simulate and not cfg.exact_output: @@ -151,7 +155,7 @@ class TestSuiteAutosignBase(TestSuiteBase): def make_wallet_bip39(self): return self.make_wallet(mn_type='bip39') - def make_wallet(self,mn_type=None): + def make_wallet(self,mn_type=None,mn_file=None): mn_desc = mn_type or 'default' mn_type = mn_type or 'mmgen' @@ -161,13 +165,14 @@ class TestSuiteAutosignBase(TestSuiteBase): ([] if mn_desc == 'default' else [f'--mnemonic-fmt={mn_type}']) + ['setup'] ) - t.expect('words: ','3') - t.expect('OK? (Y/n): ','\n') - mn_file = { 'mmgen': dfl_words_file, 'bip39': dfl_bip39_file }[mn_type] + mn_file = mn_file or { 'mmgen': dfl_words_file, 'bip39': dfl_bip39_file }[mn_type] mn = read_from_file(mn_file).strip().split() from mmgen.mn_entry import mn_entry entry_mode = 'full' mne = mn_entry( cfg, mn_type, entry_mode ) + + t.expect('words: ',{ 12:'1', 18:'2', 24:'3' }[len(mn)]) + t.expect('OK? (Y/n): ','\n') t.expect('Type a number.*: ',str(mne.entry_modes.index(entry_mode)+1),regex=True) stealth_mnemonic_entry(t,mne,mn,entry_mode) wf = t.written_to_file('Autosign wallet') @@ -298,6 +303,7 @@ class TestSuiteAutosignBase(TestSuiteBase): if 'wait' in args: t.expect('Waiting') + imsg(purple('\nKilling wait loop!')) t.kill(2) t.req_exit_val = 1 else: diff --git a/test/test_py_d/ts_xmrwallet.py b/test/test_py_d/ts_xmrwallet.py index dc73fba3..05e9ffc3 100755 --- a/test/test_py_d/ts_xmrwallet.py +++ b/test/test_py_d/ts_xmrwallet.py @@ -43,6 +43,11 @@ class TestSuiteXMRWallet(TestSuiteBase): dfl_random_txs = 3 color = True socks_port = 49237 + user_data = ( + ('miner', '98831F3A', 130, '1-2', []), + ('bob', '1378FC64', 140, None, ['--restricted-rpc']), + ('alice', 'FE3C6545', 150, '1-4', []), + ) cmd_group = ( ('daemon_version', 'checking daemon version'), @@ -196,7 +201,7 @@ class TestSuiteXMRWallet(TestSuiteBase): from mmgen.proto.xmr.daemon import MoneroWalletDaemon from mmgen.proto.xmr.rpc import MoneroRPCClient,MoneroWalletRPCClient self.users = {} - n = self.tmpdir_nums[0] + tmpdir_num = self.tmpdir_nums[0] ud = namedtuple('user_data',[ 'sid', 'mmwords', @@ -213,12 +218,13 @@ class TestSuiteXMRWallet(TestSuiteBase): 'add_coind_args', ]) # kal_range must be None, a single digit, or a single hyphenated range - for user,sid,shift,kal_range,add_coind_args in ( - ('miner', '98831F3A', 130, '1-2', []), - ('bob', '1378FC64', 140, None, ['--restricted-rpc']), - ('alice', 'FE3C6545', 150, '1-4', []), - ): - udir = os.path.join('test','tmp',str(n),user) + for ( user, + sid, + shift, + kal_range, + add_coind_args ) in self.user_data: + tmpdir = os.path.join('test','tmp',str(tmpdir_num)) + udir = os.path.join(tmpdir,user) datadir = os.path.join(self.datadir_base,user) md = CoinDaemon( cfg = cfg, @@ -306,7 +312,7 @@ class TestSuiteXMRWallet(TestSuiteBase): def create_wallets_miner(self): return self.create_wallets('miner') def create_wallets_alice(self): return self.create_wallets('alice') - def create_wallets(self,user,wallet=None): + def create_wallets(self,user,wallet=None,add_opts=[]): assert wallet is None or is_int(wallet), 'wallet arg' data = self.users[user] run( @@ -316,7 +322,7 @@ class TestSuiteXMRWallet(TestSuiteBase): dir_opt = [f'--wallet-dir={data.udir}'] t = self.spawn( 'mmgen-xmrwallet', - self.extra_opts + dir_opt + [ 'create', data.kafile, (wallet or data.kal_range) ] ) + self.extra_opts + add_opts + dir_opt + [ 'create', data.kafile, (wallet or data.kal_range) ] ) for i in MMGenRange(wallet or data.kal_range).items: write_data_to_file( cfg, @@ -413,7 +419,7 @@ class TestSuiteXMRWallet(TestSuiteBase): def list_wallets_all(self): return self.sync_wallets('alice',op='list') - def sync_wallets(self,user,op='sync',wallets=None,add_opts=None): + def sync_wallets(self,user,op='sync',wallets=None,add_opts=[]): data = self.users[user] cmd_opts = list_gen( [f'--wallet-dir={data.udir}'], @@ -421,7 +427,7 @@ class TestSuiteXMRWallet(TestSuiteBase): ) t = self.spawn( 'mmgen-xmrwallet', - self.extra_opts + cmd_opts + (add_opts or []) + [ op, data.kafile ] + ([wallets] if wallets else []) ) + self.extra_opts + cmd_opts + add_opts + [ op, data.kafile ] + ([wallets] if wallets else []) ) wlist = AddrIdxList(wallets) if wallets else MMGenRange(data.kal_range).items for n,wnum in enumerate(wlist): t.expect('Syncing wallet {}/{} ({})'.format( @@ -468,8 +474,9 @@ class TestSuiteXMRWallet(TestSuiteBase): if return_amt: amt = XMRAmt(strip_ansi_escapes(t.expect_getend('Amount: ')).replace('XMR','').strip()) - t.expect('Save MoneroMMGenTX data? (y/N): ','y') - t.written_to_file('MoneroMMGenTX data') + dtype = 'signed' + t.expect(f'Save {dtype} transaction data? (y/N): ','y') + t.written_to_file(f'{dtype.capitalize()} transaction data') if not no_relay: t.expect(f'Relay {op} transaction? (y/N): ','y') @@ -574,7 +581,11 @@ class TestSuiteXMRWallet(TestSuiteBase): async def open_wallet_user(self,user,wnum): data = self.users[user] silence() - kal = KeyAddrList( cfg, self.proto, data.kafile, key_address_validity_check=False ) + kal = KeyAddrList( + cfg = cfg, + proto = self.proto, + addrfile = data.kafile, + key_address_validity_check = False ) end_silence() self.users[user].wd.start(silent=not (cfg.exact_output or cfg.verbose)) return data.wd_rpc.call(