new command: test/clean.py

This commit is contained in:
The MMGen Project 2024-07-20 16:40:57 +00:00
commit bd63c36bee
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
7 changed files with 126 additions and 81 deletions

View file

@ -1 +1 @@
14.1.0
15.0.dev0

53
test/clean.py Executable file
View file

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

View file

@ -75,23 +75,11 @@ def create_shm_dir(data_dir,trash_dir):
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.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_error_fn,
mk_tmpdir,
cleandir,
iqmsg,
omsg,
omsg_r,
@ -110,6 +97,7 @@ from test.include.common import (
start_test_daemons,
stop_test_daemons,
init_coverage,
clean,
)
try:
@ -267,17 +255,7 @@ else:
if cfg.skipping_deps:
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():
@ -303,13 +281,6 @@ def list_cmds():
(data if isinstance(data,str) else data[1]),
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
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:
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):
if sys.platform == 'win32':
for cfg in sorted(cfgs):
@ -753,8 +696,8 @@ class CmdTestRunner:
iqmsg(gray(f'INFO → skipping {m} (network={nw})'))
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:
bmsg('Executing ' + m)
@ -1042,9 +985,6 @@ if __name__ == '__main__':
CmdGroupMgr().list_cmd_groups()
elif cfg.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:
set_restore_term_at_exit()

View file

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

15
test/include/cfg.py Executable file
View file

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

View file

@ -25,7 +25,7 @@ from subprocess import run,PIPE
from mmgen.cfg import gv
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
def noop(*args,**kwargs):
@ -127,16 +127,19 @@ def cleandir(d,do_msg=False):
try:
files = os.listdir(d_enc)
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):
try:
@ -147,6 +150,34 @@ def mk_tmpdir(d):
else:
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):
return os.path.join(cfg['tmpdir'],fn)

View file

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