test.py, autosign, xmrwallet: minor fixes and cleanups

This commit is contained in:
The MMGen Project 2023-04-18 18:35:54 +00:00
commit 1dd08cd80a
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
4 changed files with 86 additions and 57 deletions

View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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(