Browse Source

autosign, led, unit test testdep: minor cleanups

The MMGen Project 6 months ago
parent
commit
0a15307e05

+ 10 - 1
mmgen/autosign.py

@@ -329,6 +329,15 @@ class Autosign:
 	macOS_ramdisk_name = 'AutosignRamDisk'
 	macOS_ramdisk_name = 'AutosignRamDisk'
 	wallet_subdir = 'autosign'
 	wallet_subdir = 'autosign'
 
 
+	cmds = ('setup', 'xmr_setup', 'sign', 'wait')
+
+	util_cmds = (
+		'gen_key',
+		'macos_ramdisk_setup',
+		'macos_ramdisk_delete',
+		'clean',
+		'wipe_key')
+
 	mn_fmts = {
 	mn_fmts = {
 		'mmgen': 'words',
 		'mmgen': 'words',
 		'bip39': 'bip39',
 		'bip39': 'bip39',
@@ -416,7 +425,7 @@ class Autosign:
 		if cfg.xmrwallets and not 'XMR' in self.coins:
 		if cfg.xmrwallets and not 'XMR' in self.coins:
 			self.coins.append('XMR')
 			self.coins.append('XMR')
 
 
-		if not self.coins and cmd not in ('gen_key','wipe_key'):
+		if not self.coins and cmd in self.cmds:
 			ymsg('Warning: no coins specified, defaulting to BTC')
 			ymsg('Warning: no coins specified, defaulting to BTC')
 			self.coins = ['BTC']
 			self.coins = ['BTC']
 
 

+ 1 - 13
mmgen/led.py

@@ -78,10 +78,7 @@ class LEDControl:
 		msg(f'{board.name} board detected')
 		msg(f'{board.name} board detected')
 
 
 		if self.debug:
 		if self.debug:
-			msg(fmt(f"""
-			Status file:  {board.status}
-			Trigger file: {board.trigger}
-			""",indent='  ',strip_char='\t'))
+			msg(f'\n  Status file:  {board.status}\n  Trigger file: {board.trigger}')
 
 
 		def check_access(fn,desc,init_val=None):
 		def check_access(fn,desc,init_val=None):
 			try:
 			try:
@@ -114,15 +111,6 @@ class LEDControl:
 		with open(db.trigger,'w') as fp:
 		with open(db.trigger,'w') as fp:
 			fp.write(db.trigger_states[1]+'\n')
 			fp.write(db.trigger_states[1]+'\n')
 
 
-	@classmethod
-	def delete_dummy_control_files(cls):
-		db = cls.boards['dummy']
-		for fn in (db.status, db.trigger):
-			try:
-				os.unlink(fn)
-			except Exception as e:
-				msg(str(e))
-
 	def noop(self,*args,**kwargs):
 	def noop(self,*args,**kwargs):
 		pass
 		pass
 
 

+ 3 - 14
mmgen/main_autosign.py

@@ -70,8 +70,8 @@ gen_key   - generate the wallet encryption key and copy it to the removable
             configured)
             configured)
 setup     - full setup: run ‘gen_key’ and create temporary signing wallet(s)
 setup     - full setup: run ‘gen_key’ and create temporary signing wallet(s)
             for all configured coins
             for all configured coins
-xmr_setup - set up Monero temporary signing wallet(s).  Not required in normal
-            operation: use ‘setup’ with --xmrwallets instead
+xmr_setup - set up Monero temporary signing wallet(s).  Not required during
+            normal operation: use ‘setup’ with --xmrwallets instead
 macos_ramdisk_setup - set up the ramdisk used for storing the temporary signing
 macos_ramdisk_setup - set up the ramdisk used for storing the temporary signing
             wallet(s) (macOS only).  Required only when creating the wallet(s)
             wallet(s) (macOS only).  Required only when creating the wallet(s)
             manually, without ‘setup’
             manually, without ‘setup’
@@ -191,18 +191,7 @@ cfg = Config(
 
 
 cmd = cfg._args[0] if len(cfg._args) == 1 else 'sign' if not cfg._args else cfg._opts.usage()
 cmd = cfg._args[0] if len(cfg._args) == 1 else 'sign' if not cfg._args else cfg._opts.usage()
 
 
-valid_cmds = (
-	'gen_key',
-	'setup',
-	'xmr_setup',
-	'macos_ramdisk_setup',
-	'macos_ramdisk_delete',
-	'sign',
-	'wait',
-	'clean',
-	'wipe_key')
-
-if cmd not in valid_cmds:
+if cmd not in Autosign.cmds + Autosign.util_cmds:
 	die(1,f'‘{cmd}’: unrecognized command')
 	die(1,f'‘{cmd}’: unrecognized command')
 
 
 if cmd != 'setup':
 if cmd != 'setup':

+ 9 - 0
mmgen/util.py

@@ -456,3 +456,12 @@ def wrap_ripemd160(called=[]):
 def exit_if_mswin(feature):
 def exit_if_mswin(feature):
 	if sys.platform == 'win32':
 	if sys.platform == 'win32':
 		die(2, capfirst(feature) + ' not supported on the MSWin / MSYS2 platform' )
 		die(2, capfirst(feature) + ' not supported on the MSWin / MSYS2 platform' )
+
+def have_sudo(silent=False):
+	from subprocess import run, DEVNULL
+	redir = DEVNULL if silent else None
+	try:
+		run(['sudo', '--non-interactive', 'true'], stdout=redir, stderr=redir, check=True)
+		return True
+	except:
+		return False

+ 3 - 0
test/cmdtest.py

@@ -1004,6 +1004,9 @@ if __name__ == '__main__':
 		if tr.daemon_started and not cfg.no_daemon_stop:
 		if tr.daemon_started and not cfg.no_daemon_stop:
 			stop_test_daemons(network_id, remove_datadir=True)
 			stop_test_daemons(network_id, remove_datadir=True)
 		tr.warn_skipped()
 		tr.warn_skipped()
+		if hasattr(tr, 'tg'):
+			del tr.tg
+		del tr
 		die(1,yellow('\ntest.py exiting at user request'))
 		die(1,yellow('\ntest.py exiting at user request'))
 	except TestSuiteSpawnedScriptException as e:
 	except TestSuiteSpawnedScriptException as e:
 		# if spawned script is not running under exec_wrapper, output brief error msg:
 		# if spawned script is not running under exec_wrapper, output brief error msg:

+ 17 - 12
test/cmdtest_py_d/ct_automount.py

@@ -83,8 +83,17 @@ class CmdTestAutosignAutomount(CmdTestAutosignThreaded, CmdTestRegtestBDBWallet)
 
 
 		self.opts.append('--alice')
 		self.opts.append('--alice')
 
 
-	def _alice_txcreate(self, chg_addr, opts=[], exit_val=0, expect=None):
+	def _alice_txcreate(self, chg_addr, opts=[], exit_val=0, expect_str=None):
+
+		def do_return():
+			if expect_str:
+				t.expect(expect_str)
+			t.read()
+			self.remove_device_online()
+			return t
+
 		self.insert_device_online()
 		self.insert_device_online()
+
 		sid = self._user_sid('alice')
 		sid = self._user_sid('alice')
 		t = self.spawn(
 		t = self.spawn(
 			'mmgen-txcreate',
 			'mmgen-txcreate',
@@ -92,21 +101,17 @@ class CmdTestAutosignAutomount(CmdTestAutosignThreaded, CmdTestRegtestBDBWallet)
 			+ ['--alice', '--autosign']
 			+ ['--alice', '--autosign']
 			+ [f'{self.burn_addr},1.23456', f'{sid}:{chg_addr}'],
 			+ [f'{self.burn_addr},1.23456', f'{sid}:{chg_addr}'],
 			exit_val = exit_val or None)
 			exit_val = exit_val or None)
+
 		if exit_val:
 		if exit_val:
-			t.expect(expect)
-			t.read()
-			self.remove_device_online()
-			return t
+			return do_return()
+
 		t = self.txcreate_ui_common(
 		t = self.txcreate_ui_common(
 			t,
 			t,
 			inputs          = '1',
 			inputs          = '1',
 			interactive_fee = '32s',
 			interactive_fee = '32s',
 			file_desc       = 'Unsigned automount transaction')
 			file_desc       = 'Unsigned automount transaction')
-		if expect:
-			t.expect(expect)
-		t.read()
-		self.remove_device_online()
-		return t
+
+		return do_return()
 
 
 	def alice_txcreate1(self):
 	def alice_txcreate1(self):
 		return self._alice_txcreate(chg_addr='C:5')
 		return self._alice_txcreate(chg_addr='C:5')
@@ -155,10 +160,10 @@ class CmdTestAutosignAutomount(CmdTestAutosignThreaded, CmdTestRegtestBDBWallet)
 	alice_txsend_abort5 = alice_txsend_abort2
 	alice_txsend_abort5 = alice_txsend_abort2
 
 
 	def alice_txcreate_bad_have_unsigned(self):
 	def alice_txcreate_bad_have_unsigned(self):
-		return self._alice_txcreate(chg_addr='C:5', exit_val=2, expect='already present')
+		return self._alice_txcreate(chg_addr='C:5', exit_val=2, expect_str='already present')
 
 
 	def alice_txcreate_bad_have_unsent(self):
 	def alice_txcreate_bad_have_unsent(self):
-		return self._alice_txcreate(chg_addr='C:5', exit_val=2, expect='unsent transaction')
+		return self._alice_txcreate(chg_addr='C:5', exit_val=2, expect_str='unsent transaction')
 
 
 	def copy_wallet(self):
 	def copy_wallet(self):
 		self.spawn('', msg_only=True)
 		self.spawn('', msg_only=True)

+ 7 - 4
test/cmdtest_py_d/ct_autosign.py

@@ -90,7 +90,10 @@ class CmdTestAutosignBase(CmdTestBase):
 
 
 	def __del__(self):
 	def __del__(self):
 		if hasattr(self,'have_dummy_control_files'):
 		if hasattr(self,'have_dummy_control_files'):
-			LEDControl.delete_dummy_control_files()
+			db = LEDControl.boards['dummy']
+			for fn in (db.status, db.trigger):
+				run('sudo rm -f {fn}'.split(), check=True)
+
 		if hasattr(self, 'txdev'):
 		if hasattr(self, 'txdev'):
 			del self.txdev
 			del self.txdev
 		if not cfg.no_daemon_stop:
 		if not cfg.no_daemon_stop:
@@ -781,7 +784,7 @@ class CmdTestAutosign(CmdTestAutosignBase):
 		tx_desc = Signable.transaction.desc
 		tx_desc = Signable.transaction.desc
 		self.insert_device()
 		self.insert_device()
 
 
-		def do_exit():
+		def do_return():
 			if expect_str:
 			if expect_str:
 				t.expect(expect_str)
 				t.expect(expect_str)
 			t.read()
 			t.read()
@@ -795,7 +798,7 @@ class CmdTestAutosign(CmdTestAutosignBase):
 				exit_val = exc_exit_val or (1 if self.bad_tx_count or (have_msg and self.bad_msg_count) else None))
 				exit_val = exc_exit_val or (1 if self.bad_tx_count or (have_msg and self.bad_msg_count) else None))
 
 
 		if exc_exit_val:
 		if exc_exit_val:
-			return do_exit()
+			return do_return()
 
 
 		t.expect(
 		t.expect(
 			f'{self.tx_count} {tx_desc}{suf(self.tx_count)} signed' if self.tx_count else
 			f'{self.tx_count} {tx_desc}{suf(self.tx_count)} signed' if self.tx_count else
@@ -815,7 +818,7 @@ class CmdTestAutosign(CmdTestAutosignBase):
 					f'{self.bad_msg_count} message file{suf(self.bad_msg_count)}{{0,1}} failed to sign',
 					f'{self.bad_msg_count} message file{suf(self.bad_msg_count)}{{0,1}} failed to sign',
 					regex = True)
 					regex = True)
 
 
-		return do_exit()
+		return do_return()
 
 
 	def sign_quiet(self):
 	def sign_quiet(self):
 		return self.do_sign(['--quiet'])
 		return self.do_sign(['--quiet'])

+ 4 - 4
test/unit_tests_d/ut_testdep.py

@@ -16,7 +16,7 @@ class unit_tests:
 
 
 	altcoin_deps = ('pycoin','monero_python','keyconv','zcash_mini','ethkey','ssh_socks_proxy')
 	altcoin_deps = ('pycoin','monero_python','keyconv','zcash_mini','ethkey','ssh_socks_proxy')
 	win_skip = ('losetup', 'zcash_mini', 'sudo')
 	win_skip = ('losetup', 'zcash_mini', 'sudo')
-	mac_skip = ('losetup', 'sudo')
+	mac_skip = ('losetup',)
 
 
 	def pylint(self,name,ut):
 	def pylint(self,name,ut):
 		try:
 		try:
@@ -76,9 +76,9 @@ class unit_tests:
 		return CmdTestXMRWallet.init_proxy(external_call=True)
 		return CmdTestXMRWallet.init_proxy(external_call=True)
 
 
 	def sudo(self,name,ut):
 	def sudo(self,name,ut):
-		try:
-			run(['sudo', '--non-interactive', 'true'], check=True)
+		from mmgen.util import have_sudo
+		if have_sudo():
 			return True
 			return True
-		except:
+		else:
 			ymsg(f'To run the test suite, please enable sudo without password for user ‘{os.getenv("USER")}’')
 			ymsg(f'To run the test suite, please enable sudo without password for user ‘{os.getenv("USER")}’')
 			return False
 			return False