Browse Source

new command: test/clean.py

The MMGen Project 7 months ago
parent
commit
bd63c36bee
7 changed files with 126 additions and 81 deletions
  1. 1 1
      mmgen/data/version
  2. 53 0
      test/clean.py
  3. 9 69
      test/cmdtest.py
  4. 6 0
      test/cmdtest_py_d/cfg.py
  5. 15 0
      test/include/cfg.py
  6. 41 10
      test/include/common.py
  7. 1 1
      test/test-release.sh

+ 1 - 1
mmgen/data/version

@@ -1 +1 @@
-14.1.0
+15.0.dev0

+ 53 - 0
test/clean.py

@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+#
+# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
+# Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
+# Licensed under the GNU General Public License, Version 3:
+#   https://www.gnu.org/licenses
+# Public project repositories:
+#   https://github.com/mmgen/mmgen-wallet
+#   https://gitlab.com/mmgen/mmgen-wallet
+
+"""
+test/clean.py: Clean the test directory
+"""
+
+import sys, os
+
+from mmgen.cfg import Config
+
+opts_data = {
+	'text': {
+		'desc': 'Clean the test directory',
+		'usage':'[options]',
+		'options': """
+-h, --help           Print this help message
+--, --longhelp       Print help message for long options (common options)
+""",
+	},
+}
+
+cfg = Config(opts_data=opts_data)
+
+repo_root = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), os.pardir)))
+os.chdir(repo_root)
+sys.path[0] = repo_root
+
+from test.overlay import get_overlay_tree_dir
+overlay_tree_dir = get_overlay_tree_dir(repo_root)
+if os.path.exists(overlay_tree_dir):
+	from shutil import rmtree
+	rmtree(overlay_tree_dir, ignore_errors=True)
+	print(f'Removed {os.path.relpath(overlay_tree_dir)!r}')
+
+from test.include.common import clean, set_globals
+
+set_globals(cfg)
+
+from test.include.cfg import clean_cfgs
+
+data_dir = Config.test_datadir
+trash_dir = os.path.join('test', 'trash')
+trash_dir2 = os.path.join('test', 'trash2')
+
+clean(clean_cfgs, extra_dirs=[data_dir, trash_dir, trash_dir2])

+ 9 - 69
test/cmdtest.py

@@ -75,23 +75,11 @@ def create_shm_dir(data_dir,trash_dir):
 
 
 import sys, os, time, asyncio
 import sys, os, time, asyncio
 
 
-if sys.argv[-1] == 'clean':
-	os.environ['MMGEN_TEST_SUITE'] = '1'
-	repo_root = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),os.pardir)))
-	os.chdir(repo_root)
-	sys.path[0] = repo_root
-
-	from shutil import rmtree
-	from test.overlay import get_overlay_tree_dir
-	overlay_tree_dir = get_overlay_tree_dir(repo_root)
-	rmtree(overlay_tree_dir,ignore_errors=True)
-	print(f'Removed {os.path.relpath(overlay_tree_dir)!r}')
-else:
-	# overlay must be set up before importing mmgen mods!
-	try:
-		from include.test_init import repo_root
-	except ImportError:
-		from test.include.test_init import repo_root
+# overlay must be set up before importing mmgen mods!
+try:
+	from include.test_init import repo_root
+except ImportError:
+	from test.include.test_init import repo_root
 
 
 from mmgen.cfg import Config,gc
 from mmgen.cfg import Config,gc
 from mmgen.color import red,yellow,green,blue,cyan,gray,nocolor,init_color
 from mmgen.color import red,yellow,green,blue,cyan,gray,nocolor,init_color
@@ -102,7 +90,6 @@ from test.include.common import (
 	cmdtest_py_log_fn,
 	cmdtest_py_log_fn,
 	cmdtest_py_error_fn,
 	cmdtest_py_error_fn,
 	mk_tmpdir,
 	mk_tmpdir,
-	cleandir,
 	iqmsg,
 	iqmsg,
 	omsg,
 	omsg,
 	omsg_r,
 	omsg_r,
@@ -110,6 +97,7 @@ from test.include.common import (
 	start_test_daemons,
 	start_test_daemons,
 	stop_test_daemons,
 	stop_test_daemons,
 	init_coverage,
 	init_coverage,
+	clean,
 )
 )
 
 
 try:
 try:
@@ -267,17 +255,7 @@ else:
 if cfg.skipping_deps:
 if cfg.skipping_deps:
 	cfg.no_daemon_autostart = True
 	cfg.no_daemon_autostart = True
 
 
-from test.cmdtest_py_d.cfg import cfgs,fixup_cfgs
-
-for k in cfgs:
-	cfgs[k]['tmpdir'] = os.path.join('test','tmp',str(k))
-
-fixup_cfgs()
-
-utils = {
-#	'check_deps': 'check dependencies for specified command (WIP)', # TODO
-	'clean':      'clean specified tmp dir(s) (specify by integer, no arg = all dirs)',
-}
+from test.cmdtest_py_d.cfg import cfgs
 
 
 def list_cmds():
 def list_cmds():
 
 
@@ -303,13 +281,6 @@ def list_cmds():
 					(data if isinstance(data,str) else data[1]),
 					(data if isinstance(data,str) else data[1]),
 					w = cw )
 					w = cw )
 
 
-		w = max(map(len,utils))
-
-		yield '\n'+green('AVAILABLE UTILITIES:')
-
-		for cmd in sorted(utils):
-			yield f'  {cmd:{w}} - {utils[cmd]}'
-
 	from mmgen.ui import do_pager
 	from mmgen.ui import do_pager
 	do_pager('\n'.join(gen_output()))
 	do_pager('\n'.join(gen_output()))
 
 
@@ -321,34 +292,6 @@ def do_between():
 	elif (cfg.verbose or cfg.exact_output) and not cfg.skipping_deps:
 	elif (cfg.verbose or cfg.exact_output) and not cfg.skipping_deps:
 		sys.stderr.write('\n')
 		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 cfg.skipping_deps:
-		return
-	all_dirs = list_tmpdirs()
-	dirnums = map(int,(usr_dirs if usr_dirs is not None else all_dirs))
-	dirlist = list(map(str,sorted(dirnums)))
-	for d in dirlist:
-		if d in all_dirs:
-			cleandir(all_dirs[d])
-		else:
-			die(1,f'{d}: invalid directory number')
-	if dirlist:
-		iqmsg(green('Cleaned tmp director{} {}'.format(
-			suf(dirlist,'ies'),
-			' '.join(dirlist))
-		))
-	cleandir(data_dir)
-	cleandir(trash_dir)
-	cleandir(trash_dir2)
-	iqmsg(green(f'Cleaned directories {data_dir!r} {trash_dir!r} {trash_dir2!r}'))
-
-	if clean_overlay:
-		cleandir(overlay_tree_dir)
-		iqmsg(green(f'Cleaned directory {os.path.relpath(overlay_tree_dir)!r}'))
-
 def create_tmp_dirs(shm_dir):
 def create_tmp_dirs(shm_dir):
 	if sys.platform == 'win32':
 	if sys.platform == 'win32':
 		for cfg in sorted(cfgs):
 		for cfg in sorted(cfgs):
@@ -753,8 +696,8 @@ class CmdTestRunner:
 				iqmsg(gray(f'INFO → skipping {m} (network={nw})'))
 				iqmsg(gray(f'INFO → skipping {m} (network={nw})'))
 				return None
 				return None
 
 
-		if do_clean:
-			clean(ct_cls.tmpdir_nums,clean_overlay=False)
+		if do_clean and not cfg.skipping_deps:
+			clean(cfgs, tmpdir_ids=ct_cls.tmpdir_nums, extra_dirs=[data_dir, trash_dir, trash_dir2])
 
 
 		if not quiet:
 		if not quiet:
 			bmsg('Executing ' + m)
 			bmsg('Executing ' + m)
@@ -1042,9 +985,6 @@ if __name__ == '__main__':
 		CmdGroupMgr().list_cmd_groups()
 		CmdGroupMgr().list_cmd_groups()
 	elif cfg.list_cmds:
 	elif cfg.list_cmds:
 		list_cmds()
 		list_cmds()
-	elif cmd_args and cmd_args[0] in utils:
-		globals()[cmd_args[0]](*cmd_args[1:])
-		sys.exit(0)
 
 
 	if cfg.pause:
 	if cfg.pause:
 		set_restore_term_at_exit()
 		set_restore_term_at_exit()

+ 6 - 0
test/cmdtest_py_d/cfg.py

@@ -231,6 +231,10 @@ cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses
 
 
 def fixup_cfgs():
 def fixup_cfgs():
 	import os
 	import os
+
+	for k in cfgs:
+		cfgs[k]['tmpdir'] = os.path.join('test', 'tmp', str(k))
+
 	for src,target in (
 	for src,target in (
 			('6','11'),
 			('6','11'),
 			('7','12'),
 			('7','12'),
@@ -248,3 +252,5 @@ def fixup_cfgs():
 	if cfg.debug_utf8:
 	if cfg.debug_utf8:
 		for k in cfgs:
 		for k in cfgs:
 			cfgs[k]['tmpdir'] += '-α'
 			cfgs[k]['tmpdir'] += '-α'
+
+fixup_cfgs()

+ 15 - 0
test/include/cfg.py

@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+#
+# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
+# Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
+# Licensed under the GNU General Public License, Version 3:
+#   https://www.gnu.org/licenses
+# Public project repositories:
+#   https://github.com/mmgen/mmgen-wallet
+#   https://gitlab.com/mmgen/mmgen-wallet
+
+"""
+test.include.cfg: Configuration for test scripts
+"""
+
+from ..cmdtest_py_d.cfg import cfgs as clean_cfgs

+ 41 - 10
test/include/common.py

@@ -25,7 +25,7 @@ from subprocess import run,PIPE
 
 
 from mmgen.cfg import gv
 from mmgen.cfg import gv
 from mmgen.color import yellow,green,orange
 from mmgen.color import yellow,green,orange
-from mmgen.util import msg,msg_r,Msg,Msg_r,gmsg,die
+from mmgen.util import msg, msg_r, Msg, Msg_r, gmsg, die, suf, fmt_list
 from mmgen.fileutil import write_data_to_file,get_data_from_file
 from mmgen.fileutil import write_data_to_file,get_data_from_file
 
 
 def noop(*args,**kwargs):
 def noop(*args,**kwargs):
@@ -127,16 +127,19 @@ def cleandir(d,do_msg=False):
 	try:
 	try:
 		files = os.listdir(d_enc)
 		files = os.listdir(d_enc)
 	except:
 	except:
-		return
+		return None
 
 
-	from shutil import rmtree
-	if do_msg:
-		gmsg(f'Cleaning directory {d!r}')
-	for f in files:
-		try:
-			os.unlink(os.path.join(d_enc,f))
-		except:
-			rmtree(os.path.join(d_enc,f),ignore_errors=True)
+	if files:
+		from shutil import rmtree
+		if do_msg:
+			gmsg(f'Cleaning directory {d!r}')
+		for f in files:
+			try:
+				os.unlink(os.path.join(d_enc, f))
+			except:
+				rmtree(os.path.join(d_enc,f), ignore_errors=True)
+
+	return files
 
 
 def mk_tmpdir(d):
 def mk_tmpdir(d):
 	try:
 	try:
@@ -147,6 +150,34 @@ def mk_tmpdir(d):
 	else:
 	else:
 		vmsg(f'Created directory {d!r}')
 		vmsg(f'Created directory {d!r}')
 
 
+def clean(cfgs, tmpdir_ids=None, extra_dirs=[]):
+
+	def clean_tmpdirs():
+		cfg_tmpdirs = {k:cfgs[k]['tmpdir'] for k in cfgs}
+		for d in map(str, sorted(map(int, (tmpdir_ids or cfg_tmpdirs)))):
+			if d in cfg_tmpdirs:
+				if cleandir(cfg_tmpdirs[d]):
+					yield d
+			else:
+				die(1, f'{d}: invalid directory number')
+
+	def clean_extra_dirs():
+		for d in extra_dirs:
+			if os.path.exists(d):
+				if cleandir(d):
+					yield os.path.relpath(d)
+
+	for clean_func, list_fmt in (
+				(clean_tmpdirs, 'no_quotes'),
+				(clean_extra_dirs, 'dfl')
+			):
+		if cleaned := list(clean_func()):
+			iqmsg(green('Cleaned director{} {}'.format(
+				suf(cleaned, 'ies'),
+				fmt_list(cleaned, fmt=list_fmt)
+			)))
+
+
 def get_tmpfile(cfg,fn):
 def get_tmpfile(cfg,fn):
 	return os.path.join(cfg['tmpdir'],fn)
 	return os.path.join(cfg['tmpdir'],fn)
 
 

+ 1 - 1
test/test-release.sh

@@ -396,7 +396,7 @@ remove_skipped_tests
 
 
 check_tests
 check_tests
 
 
-test/cmdtest.py clean
+test/clean.py
 
 
 start_time=$(date +%s)
 start_time=$(date +%s)