diff --git a/test/cmdtest.py b/test/cmdtest.py index 9d5ef442..a0160f01 100755 --- a/test/cmdtest.py +++ b/test/cmdtest.py @@ -1012,46 +1012,46 @@ class CmdTestRunner: else: return None -# main() +if __name__ == '__main__': -if not cfg.skipping_deps: # do this before list cmds exit, so we stay in sync with shm_dir - create_tmp_dirs(shm_dir) + if not cfg.skipping_deps: # do this before list cmds exit, so we stay in sync with shm_dir + create_tmp_dirs(shm_dir) -if cfg.list_cmd_groups: - 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.list_cmd_groups: + 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() + if cfg.pause: + set_restore_term_at_exit() -from mmgen.exception import TestSuiteException,TestSuiteFatalException,TestSuiteSpawnedScriptException + from mmgen.exception import TestSuiteException,TestSuiteFatalException,TestSuiteSpawnedScriptException -try: - tr = CmdTestRunner(data_dir,trash_dir) - tr.run_tests(cmd_args) - tr.warn_skipped() - if tr.daemon_started: - stop_test_daemons(network_id) -except KeyboardInterrupt: - if tr.daemon_started: - stop_test_daemons(network_id) - tr.warn_skipped() - die(1,'\ntest.py exiting at user request') -except TestSuiteException as e: - die(2,e.args[0]) -except TestSuiteFatalException as e: - die(4,e.args[0]) -except TestSuiteSpawnedScriptException as e: - # if spawned script is not running under exec_wrapper, output brief error msg: - if os.getenv('MMGEN_EXEC_WRAPPER'): - Msg(red(str(e))) - Msg(blue('cmdtest.py: spawned script exited with error')) -except Exception: - # if cmdtest.py itself is running under exec_wrapper, re-raise so exec_wrapper can handle exception: - if os.getenv('MMGEN_EXEC_WRAPPER') or not os.getenv('MMGEN_IGNORE_TEST_PY_EXCEPTION'): - raise - die(1,red('Test script exited with error')) + try: + tr = CmdTestRunner(data_dir,trash_dir) + tr.run_tests(cmd_args) + tr.warn_skipped() + if tr.daemon_started: + stop_test_daemons(network_id) + except KeyboardInterrupt: + if tr.daemon_started: + stop_test_daemons(network_id) + tr.warn_skipped() + die(1,'\ntest.py exiting at user request') + except TestSuiteException as e: + die(2,e.args[0]) + except TestSuiteFatalException as e: + die(4,e.args[0]) + except TestSuiteSpawnedScriptException as e: + # if spawned script is not running under exec_wrapper, output brief error msg: + if os.getenv('MMGEN_EXEC_WRAPPER'): + Msg(red(str(e))) + Msg(blue('cmdtest.py: spawned script exited with error')) + except Exception: + # if cmdtest.py itself is running under exec_wrapper, re-raise so exec_wrapper can handle exception: + if os.getenv('MMGEN_EXEC_WRAPPER') or not os.getenv('MMGEN_IGNORE_TEST_PY_EXCEPTION'): + raise + die(1,red('Test script exited with error')) diff --git a/test/colortest.py b/test/colortest.py index c72af97e..5963092d 100755 --- a/test/colortest.py +++ b/test/colortest.py @@ -44,4 +44,5 @@ def test_color(): ret = get_terminfo_colors() msg(f'{os.getenv("TERM")} (this terminal): {orange(str(ret))}') -test_color() +if __name__ == '__main__': + test_color() diff --git a/test/gentest.py b/test/gentest.py index 923b2f79..809abf81 100755 --- a/test/gentest.py +++ b/test/gentest.py @@ -582,4 +582,5 @@ vmsg = cfg._util.vmsg proto = cfg._proto -main() +if __name__ == '__main__': + main() diff --git a/test/hashfunc.py b/test/hashfunc.py index 03b15ccf..5f713271 100755 --- a/test/hashfunc.py +++ b/test/hashfunc.py @@ -27,15 +27,7 @@ try: except ImportError: from test.include import test_init -from mmgen.util import die - -assert len(sys.argv) in (2,3),"Test takes 1 or 2 arguments: test name, plus optional rounds count" -test = sys.argv[1].capitalize() -assert test in ('Sha256','Sha512','Keccak'), "Valid choices for test are 'sha256','sha512' or 'keccak'" -random_rounds = int(sys.argv[2]) if len(sys.argv) == 3 else 500 - -def msg(s): - sys.stderr.write(s) +from mmgen.util import msg,msg_r,die def green(s): return '\033[32;1m' + s + '\033[0m' @@ -43,7 +35,7 @@ def green(s): class TestHashFunc: def test_constants(self): - msg('Testing generated constants: ') + msg_r('Testing generated constants: ') h = self.t_cls(b'foo') if h.H_init != self.H_ref: m = 'Generated constants H[] differ from reference value:\nReference:\n{}\nGenerated:\n{}' @@ -51,7 +43,7 @@ class TestHashFunc: if h.K != self.K_ref: m = 'Generated constants K[] differ from reference value:\nReference:\n{}\nGenerated:\n{}' die(3,m.format([hex(n) for n in self.K_ref],[hex(n) for n in h.K])) - msg('OK\n') + msg('OK') def compare_hashes(self,data,chk=None): if chk is None: @@ -63,19 +55,19 @@ class TestHashFunc: def test_ref(self): for i,data in enumerate(self.vectors): - msg(f'\rTesting reference input data: {i+1:4}/{len(self.vectors)} ') + msg_r(f'\rTesting reference input data: {i+1:4}/{len(self.vectors)} ') self.compare_hashes(data.encode(), chk=self.vectors[data]) - msg('OK\n') + msg('OK') def test_random(self,rounds): if not self.hashlib: return for i in range(rounds): if i+1 in (1,rounds) or not (i+1) % 10: - msg(f'\rTesting random input data: {i+1:4}/{rounds} ') + msg_r(f'\rTesting random input data: {i+1:4}/{rounds} ') dlen = int(getrand(4).hex(),16) >> 18 self.compare_hashes(getrand(dlen)) - msg('OK\n') + msg('OK') class TestKeccak(TestHashFunc): desc = 'keccak_256' @@ -180,13 +172,18 @@ class TestSha512(TestSha2): 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 ) -from test.include.common import getrand,set_globals -from mmgen.cfg import Config +if __name__ == '__main__': + from test.include.common import getrand,set_globals + from mmgen.cfg import Config -set_globals(Config()) + assert len(sys.argv) in (2,3),"Test takes 1 or 2 arguments: test name, plus optional rounds count" + test = sys.argv[1].capitalize() + assert test in ('Sha256','Sha512','Keccak'), "Valid choices for test are 'sha256','sha512' or 'keccak'" + random_rounds = int(sys.argv[2]) if len(sys.argv) == 3 else 500 -t = globals()['Test'+test]() -msg(f'Testing internal implementation of {t.desc}\n') -t.test_constants() -t.test_ref() -t.test_random(random_rounds) + set_globals(Config()) + t = globals()['Test'+test]() + msg(f'Testing internal implementation of {t.desc}') + t.test_constants() + t.test_ref() + t.test_random(random_rounds) diff --git a/test/include/coin_daemon_control.py b/test/include/coin_daemon_control.py index 926ac327..5e92a6f9 100755 --- a/test/include/coin_daemon_control.py +++ b/test/include/coin_daemon_control.py @@ -15,6 +15,7 @@ test.include.coin_daemon_control: Start and stop daemons for the MMGen test suit from mmgen.cfg import Config,gc from mmgen.util import msg,die,oneshot_warning,async_run from mmgen.protocol import init_proto +from mmgen.daemon import CoinDaemon xmr_wallet_network_ids = { 'xmrw': 'mainnet', @@ -58,10 +59,6 @@ Valid network IDs: {nid}, {xmrw_nid}, all, no_xmr } } -cfg = Config(opts_data=opts_data) - -from mmgen.daemon import CoinDaemon - class warn_missing_exec(oneshot_warning): color = 'nocolor' message = 'daemon executable {!r} not found on this system!' @@ -118,27 +115,31 @@ def run(network_id=None,proto=None,daemon_id=None,missing_exec_ok=False): else: d.cmd(action,quiet=cfg.quiet) -if cfg.daemon_ids: - print('\n'.join(CoinDaemon.all_daemon_ids())) -elif 'all' in cfg._args or 'no_xmr' in cfg._args: - if len(cfg._args) != 1: - die(1,"'all' or 'no_xmr' must be the sole argument") - for coin in CoinDaemon.coins: - if coin == 'XMR' and cfg._args[0] == 'no_xmr': - continue - for daemon_id in CoinDaemon.get_daemon_ids(cfg,coin): - for network in CoinDaemon.get_daemon(cfg,coin,daemon_id).networks: - run( - proto = init_proto( cfg, coin=coin, network=network ), - daemon_id = daemon_id, - missing_exec_ok = True ) -else: - ids = cfg._args - network_ids = CoinDaemon.get_network_ids(cfg) - if not ids: - cfg._opts.usage() - for i in ids: - if i not in network_ids + list(xmr_wallet_network_ids): - die(1,f'{i!r}: invalid network ID') - for network_id in ids: - run(network_id=network_id.lower()) +def main(): + + if cfg.daemon_ids: + print('\n'.join(CoinDaemon.all_daemon_ids())) + elif 'all' in cfg._args or 'no_xmr' in cfg._args: + if len(cfg._args) != 1: + die(1,"'all' or 'no_xmr' must be the sole argument") + for coin in CoinDaemon.coins: + if coin == 'XMR' and cfg._args[0] == 'no_xmr': + continue + for daemon_id in CoinDaemon.get_daemon_ids(cfg,coin): + for network in CoinDaemon.get_daemon(cfg,coin,daemon_id).networks: + run( + proto = init_proto( cfg, coin=coin, network=network ), + daemon_id = daemon_id, + missing_exec_ok = True ) + else: + ids = cfg._args + network_ids = CoinDaemon.get_network_ids(cfg) + if not ids: + cfg._opts.usage() + for i in ids: + if i not in network_ids + list(xmr_wallet_network_ids): + die(1,f'{i!r}: invalid network ID') + for network_id in ids: + run(network_id=network_id.lower()) + +cfg = Config(opts_data=opts_data) diff --git a/test/objattrtest.py b/test/objattrtest.py index 727253c3..8186e24f 100755 --- a/test/objattrtest.py +++ b/test/objattrtest.py @@ -178,4 +178,5 @@ def do_loop(): proto = cfg._proto -do_loop() +if __name__ == '__main__': + do_loop() diff --git a/test/objtest.py b/test/objtest.py index debef590..a4e70610 100755 --- a/test/objtest.py +++ b/test/objtest.py @@ -215,4 +215,5 @@ def do_loop(): proto = cfg._proto -do_loop() +if __name__ == '__main__': + do_loop() diff --git a/test/scrambletest.py b/test/scrambletest.py index 215d7477..31e670c2 100755 --- a/test/scrambletest.py +++ b/test/scrambletest.py @@ -151,10 +151,11 @@ def do_passwd_tests(): s = fs.format('','') do_test(cmd,tdata,s+' '*(40-len(s)),'password') -start_time = int(time.time()) +if __name__ == '__main__': + start_time = int(time.time()) -cmds = cfg._args or ('coin','pw') -for cmd in cmds: - {'coin': do_coin_tests, 'pw': do_passwd_tests }[cmd]() + cmds = cfg._args or ('coin','pw') + for cmd in cmds: + {'coin': do_coin_tests, 'pw': do_passwd_tests }[cmd]() -end_msg(int(time.time()) - start_time) + end_msg(int(time.time()) - start_time) diff --git a/test/start-coin-daemons.py b/test/start-coin-daemons.py index c75cf7e2..35229566 100755 --- a/test/start-coin-daemons.py +++ b/test/start-coin-daemons.py @@ -5,6 +5,8 @@ test/start-coin-daemons.py: Start daemons for the MMGen test suite """ try: - import include.coin_daemon_control + from include.coin_daemon_control import main except ImportError: - import test.include.coin_daemon_control + from test.include.coin_daemon_control import main + +main() diff --git a/test/stop-coin-daemons.py b/test/stop-coin-daemons.py index c5fdbec9..f725c1cc 100755 --- a/test/stop-coin-daemons.py +++ b/test/stop-coin-daemons.py @@ -5,6 +5,8 @@ test/stop-coin-daemons.py: Stop daemons for the MMGen test suite """ try: - import include.coin_daemon_control + from include.coin_daemon_control import main except ImportError: - import test.include.coin_daemon_control + from test.include.coin_daemon_control import main + +main() diff --git a/test/tooltest.py b/test/tooltest.py index 00b2f999..e3b61298 100755 --- a/test/tooltest.py +++ b/test/tooltest.py @@ -486,28 +486,29 @@ def do_cmds(cmd_group): cmdline = [cmd] + [os.path.join(tcfg['tmpdir'],fn) for fn in fns] getattr(tc,cmd)(*cmdline) -try: - if cfg._args: - if len(cfg._args) != 1: - die(1,'Only one command may be specified') - cmd = cfg._args[0] - if cmd in cmd_data: - cleandir(tcfg['tmpdir'],do_msg=True) - msg('Running tests for {}:'.format( cmd_data[cmd]['desc'] )) - do_cmds(cmd) - elif cmd == 'clean': - cleandir(tcfg['tmpdir'],do_msg=True) - sys.exit(0) +if __name__ == '__main__': + try: + if cfg._args: + if len(cfg._args) != 1: + die(1,'Only one command may be specified') + cmd = cfg._args[0] + if cmd in cmd_data: + cleandir(tcfg['tmpdir'],do_msg=True) + msg('Running tests for {}:'.format( cmd_data[cmd]['desc'] )) + do_cmds(cmd) + elif cmd == 'clean': + cleandir(tcfg['tmpdir'],do_msg=True) + sys.exit(0) + else: + die(1,f'{cmd!r}: unrecognized command') else: - die(1,f'{cmd!r}: unrecognized command') - else: - cleandir(tcfg['tmpdir'],do_msg=True) - for cmd in cmd_data: - msg('Running tests for {}:'.format( cmd_data[cmd]['desc'] )) - do_cmds(cmd) - if cmd is not list(cmd_data.keys())[-1]: - msg('') -except KeyboardInterrupt: - die(1,green('\nExiting at user request')) + cleandir(tcfg['tmpdir'],do_msg=True) + for cmd in cmd_data: + msg('Running tests for {}:'.format( cmd_data[cmd]['desc'] )) + do_cmds(cmd) + if cmd is not list(cmd_data.keys())[-1]: + msg('') + except KeyboardInterrupt: + die(1,green('\nExiting at user request')) -end_msg(int(time.time()) - start_time) + end_msg(int(time.time()) - start_time) diff --git a/test/tooltest2.py b/test/tooltest2.py index d1d89f83..f5ed6495 100755 --- a/test/tooltest2.py +++ b/test/tooltest2.py @@ -1013,6 +1013,6 @@ async def main(): except KeyboardInterrupt: die(1,green('\nExiting at user request')) -async_run(main()) - -end_msg(int(time.time()) - start_time) +if __name__ == '__main__': + async_run(main()) + end_msg(int(time.time()) - start_time) diff --git a/test/unit_tests.py b/test/unit_tests.py index 49feeefe..0130ed8a 100755 --- a/test/unit_tests.py +++ b/test/unit_tests.py @@ -203,16 +203,17 @@ def run_test(test,subtest=None): if not mod.unit_test().run_test(test,UnitTestHelpers(test)): die(4,'Unit test {test!r} failed') -try: - for test in (cfg._args or all_tests): - if '.' in test: - test,subtest = test.split('.') - else: - subtest = None - if test not in all_tests: - die(1,f'{test!r}: test not recognized') - if test not in exclude: - run_test(test,subtest=subtest) - end_msg(int(time.time()) - start_time) -except KeyboardInterrupt: - die(1,green('\nExiting at user request')) +if __name__ == '__main__': + try: + for test in (cfg._args or all_tests): + if '.' in test: + test,subtest = test.split('.') + else: + subtest = None + if test not in all_tests: + die(1,f'{test!r}: test not recognized') + if test not in exclude: + run_test(test,subtest=subtest) + end_msg(int(time.time()) - start_time) + except KeyboardInterrupt: + die(1,green('\nExiting at user request'))