Browse Source

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

The MMGen Project 2 years ago
parent
commit
1dd08cd80a
4 changed files with 86 additions and 57 deletions
  1. 48 39
      mmgen/xmrwallet.py
  2. 3 0
      test/test.py
  3. 10 4
      test/test_py_d/ts_autosign.py
  4. 25 14
      test/test_py_d/ts_xmrwallet.py

+ 48 - 39
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
 

+ 3 - 0
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:

+ 10 - 4
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:

+ 25 - 14
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(