Browse Source

test.py: fix resuming functionality, add --step option

The MMGen Project 3 years ago
parent
commit
3b7e96ccfc
1 changed files with 31 additions and 26 deletions
  1. 31 26
      test/test.py

+ 31 - 26
test/test.py

@@ -125,6 +125,7 @@ opts_data = {
 -q, --quiet          Produce minimal output.  Suppress dependency info
 -r, --resume=c       Resume at command 'c' after interrupted run
 -R, --resume-after=c Same, but resume at command following 'c'
+-t, --step           After resuming, execute one command and stop
 -s, --system         Test scripts and modules installed on system rather
                      than those in the repo root
 -S, --skip-deps      Skip dependency checking for command
@@ -157,13 +158,16 @@ from test.test_py_d.common import *
 data_dir = get_data_dir() # include/common.py
 
 # step 1: delete data_dir symlink in ./test;
-if not ('resume' in po.user_opts or 'skip_deps' in po.user_opts):
+resuming = any(k in po.user_opts for k in ('resume','resume_after'))
+skipping_deps = resuming or 'skip_deps' in po.user_opts
+
+if not skipping_deps:
 	try: os.unlink(data_dir)
 	except: pass
 
-opts.UserOpts._reset_ok += ('skip_deps','no_daemon_autostart','names','no_timings')
+opts.UserOpts._reset_ok += ('no_daemon_autostart','names','no_timings','exit_after')
 
-# step 2: opts.init will create new data_dir in ./test (if not 'resume' or 'skip_deps'):
+# step 2: opts.init will create new data_dir in ./test (if not skipping_deps)
 usr_args = opts.init(opts_data)
 
 network_id = g.coin.lower() + ('_tn' if opt.testnet else '')
@@ -174,7 +178,7 @@ proto = init_proto_from_opts()
 # step 3: move data_dir to /dev/shm and symlink it back to ./test:
 trash_dir = os.path.join('test','trash')
 
-if not (opt.resume or opt.skip_deps):
+if not skipping_deps:
 	shm_dir = create_shm_dir(data_dir,trash_dir)
 
 check_segwit_opts()
@@ -193,12 +197,8 @@ if opt.exact_output:
 	def msg(s): pass
 	qmsg = qmsg_r = vmsg = vmsg_r = msg_r = msg
 
-if opt.resume or opt.resume_after:
-	opt.skip_deps = True
+if skipping_deps:
 	opt.no_daemon_autostart = True
-	resume = opt.resume or opt.resume_after
-else:
-	resume = False
 
 cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses
 	'1':  { 'wpasswd':       'Dorian-α',
@@ -421,14 +421,14 @@ def list_cmds():
 def do_between():
 	if opt.pause:
 		confirm_continue()
-	elif (opt.verbose or opt.exact_output) and not opt.skip_deps:
+	elif (opt.verbose or opt.exact_output) and not skipping_deps:
 		sys.stderr.write('\n')
 
 def list_tmpdirs():
 	return {k:cfgs[k]['tmpdir'] for k in cfgs}
 
 def clean(usr_dirs=None,clean_overlay=True):
-	if opt.skip_deps:
+	if skipping_deps:
 		return
 	all_dirs = list_tmpdirs()
 	dirnums = map(int,(usr_dirs if usr_dirs is not None else all_dirs))
@@ -650,6 +650,7 @@ class TestSuiteRunner(object):
 		self.gm = CmdGroupMgr()
 		self.repo_root = repo_root
 		self.skipped_warnings = []
+		self.resume_cmd = None
 
 		if opt.log:
 			self.log_fd = open(log_file,'a')
@@ -728,9 +729,9 @@ class TestSuiteRunner(object):
 		os.environ['MMGEN_FORCE_COLOR'] = '1' if self.ts.color else ''
 
 		env = { 'EXEC_WRAPPER_SPAWN':'1' }
-		if 'exec_wrapper_init' in globals(): # test.py itself is running under exec_wrapper
-			# Python 3.9: OR the dicts
-			env.update({ 'EXEC_WRAPPER_NO_TRACEBACK':'1' })
+		if 'exec_wrapper_init' in globals():
+			# test.py itself is running under exec_wrapper, so disable traceback file writing for spawned script
+			env.update({ 'EXEC_WRAPPER_NO_TRACEBACK':'1' }) # Python 3.9: OR the dicts
 		env.update(os.environ)
 
 		from test.include.pexpect import MMGenPexpect
@@ -799,10 +800,13 @@ class TestSuiteRunner(object):
 				'=' + getattr(opt,k) if getattr(opt,k) != True else ''
 			) for k in self.ts.base_passthru_opts + self.ts.passthru_opts if getattr(opt,k)]
 
-		if opt.resume_after:
-			global resume
-			resume = self.gm.cmd_list[self.gm.cmd_list.index(resume)+1]
-			omsg(f'INFO → Resuming at command {resume!r}')
+		if resuming:
+			rc = opt.resume or opt.resume_after
+			offset = 1 if opt.resume_after else 0
+			self.resume_cmd = self.gm.cmd_list[self.gm.cmd_list.index(rc)+offset]
+			omsg(f'INFO → Resuming at command {self.resume_cmd!r}')
+			if opt.step:
+				opt.exit_after = self.resume_cmd
 
 		if opt.exit_after and opt.exit_after not in self.gm.cmd_list:
 			die(1,f'{opt.exit_after!r}: command not recognized')
@@ -904,7 +908,7 @@ class TestSuiteRunner(object):
 				for fn in fns:
 					if not root:
 						os.unlink(fn)
-				if not (dpy and opt.skip_deps):
+				if not (dpy and skipping_deps):
 					self.run_test(cmd)
 				if not root:
 					do_between()
@@ -926,13 +930,14 @@ class TestSuiteRunner(object):
 		if hasattr(self.ts,'shared_deps'):
 			arg_list = arg_list[:-len(self.ts.shared_deps)]
 
-		global resume
-		if resume:
-			if cmd != resume:
+		if self.resume_cmd:
+			if cmd != self.resume_cmd:
 				return
-			bmsg(f'Resuming at {cmd!r}')
-			resume = False
-			opt.skip_deps = False
+			bmsg(f'Resuming at {self.resume_cmd!r}')
+			self.resume_cmd = None
+			global skipping_deps,resuming
+			skipping_deps = False
+			resuming = False
 
 		if opt.profile:
 			start = time.time()
@@ -1033,7 +1038,7 @@ class TestSuiteRunner(object):
 
 # main()
 
-if not opt.skip_deps: # do this before list cmds exit, so we stay in sync with shm_dir
+if not skipping_deps: # do this before list cmds exit, so we stay in sync with shm_dir
 	create_tmp_dirs(shm_dir)
 
 if opt.list_cmd_groups: