From 46381def86b48772ec169f99f7114c614f27d47d Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 27 Jan 2025 16:01:53 +0000 Subject: [PATCH] cmdtest.py opts: cleanups --- test/cmdtest_d/ct_opts.py | 52 +++++++++++++++++++++++---------------- test/misc/opts_main.py | 44 +++++++++------------------------ 2 files changed, 42 insertions(+), 54 deletions(-) diff --git a/test/cmdtest_d/ct_opts.py b/test/cmdtest_d/ct_opts.py index bffcdfe7..e0f75dce 100755 --- a/test/cmdtest_d/ct_opts.py +++ b/test/cmdtest_d/ct_opts.py @@ -67,13 +67,23 @@ class CmdTestOpts(CmdTestBase): ('opt_invalid_16', (41, 'invalid cmdline (overlong arg)', [])), ) - def spawn_prog(self, args, exit_val=None): - return self.spawn('test/misc/opts.py', args, cmd_dir='.', exit_val=exit_val) + def spawn_prog(self, args, opts=[], exit_val=None, need_proto=False): + return self.spawn( + 'test/misc/opts.py', + opts + args, + cmd_dir = '.', + exit_val = exit_val, + env = {'TEST_MISC_OPTS_NEEDS_PROTO': '1' if need_proto else ''}) - def check_vals(self, args, vals): - t = self.spawn_prog(args) - for k, v in vals: - t.expect(rf'{k}:\s+{v}', regex=True) + def check_vals(self, args, vals, check=True, need_proto=False): + show_opts = [a.removeprefix('cfg.') for a, b in vals if a.startswith('cfg.')] + t = self.spawn_prog( + args, + opts = ['--show-opts=' + ','.join(show_opts)] if show_opts else [], + need_proto = need_proto) + if check: + for k, v in vals: + t.expect(rf'{k}:\s+{v}', regex=True) return t def do_run(self, args, expect, exit_val, regex=False): @@ -249,49 +259,49 @@ class CmdTestOpts(CmdTestBase): def opt_bad_autoset(self): return self.do_run(['--fee-estimate-mode=Fubar'], 'not unique substring', 1) - def opt_invalid(self, args, expect, exit_val): + def opt_invalid(self, args, expect, exit_val=1): t = self.spawn_prog(args, exit_val=exit_val) t.expect(expect) return t def opt_invalid_1(self): - return self.opt_invalid(['--x'], 'must be at least', 1) + return self.opt_invalid(['--x'], 'must be at least') def opt_invalid_2(self): - return self.opt_invalid(['---'], 'must be at least', 1) + return self.opt_invalid(['---'], 'must be at least') def opt_invalid_5(self): - return self.opt_invalid(['-l'], 'missing parameter', 1) + return self.opt_invalid(['-l'], 'missing parameter') def opt_invalid_6(self): - return self.opt_invalid(['-l', '-k'], 'missing parameter', 1) + return self.opt_invalid(['-l', '-k'], 'missing parameter') def opt_invalid_7(self): - return self.opt_invalid(['--quiet=1'], 'requires no parameter', 1) + return self.opt_invalid(['--quiet=1'], 'requires no parameter') def opt_invalid_8(self): - return self.opt_invalid(['-w'], 'unrecognized option', 1) + return self.opt_invalid(['-w'], 'unrecognized option') def opt_invalid_9(self): - return self.opt_invalid(['--frobnicate'], 'unrecognized option', 1) + return self.opt_invalid(['--frobnicate'], 'unrecognized option') def opt_invalid_10(self): - return self.opt_invalid(['--label', '-q'], 'missing parameter', 1) + return self.opt_invalid(['--label', '-q'], 'missing parameter') def opt_invalid_11(self): - return self.opt_invalid(['-T', '-10'], 'missing parameter', 1) + return self.opt_invalid(['-T', '-10'], 'missing parameter') def opt_invalid_12(self): - return self.opt_invalid(['-q', '-10'], 'unrecognized option', 1) + return self.opt_invalid(['-q', '-10'], 'unrecognized option') def opt_invalid_13(self): - return self.opt_invalid(['--mi=3'], 'ambiguous option', 1) + return self.opt_invalid(['--mi=3'], 'ambiguous option') def opt_invalid_14(self): - return self.opt_invalid(['--m=3'], 'must be at least', 1) + return self.opt_invalid(['--m=3'], 'must be at least') def opt_invalid_15(self): - return self.opt_invalid(['m'] * 257, 'too many', 1) + return self.opt_invalid(['m'] * 257, 'too many') def opt_invalid_16(self): - return self.opt_invalid(['e' * 4097], 'too long', 1) + return self.opt_invalid(['e' * 4097], 'too long') diff --git a/test/misc/opts_main.py b/test/misc/opts_main.py index 390ea25c..7484cc22 100755 --- a/test/misc/opts_main.py +++ b/test/misc/opts_main.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +import os + from mmgen.cfg import Config from mmgen.util import msg @@ -23,6 +25,7 @@ opts_data = { -L, --label= l Specify a label 'l' for output wallet -m, --minconf= n Minimum number of confirmations required to spend outputs (default: 1) +-o, --show-opts= L List of cfg opts to display -p, --hash-preset= p Use the scrypt hash parameters defined by preset 'p' -P, --passwd-file= f Get wallet passphrase from file 'f' -q, --quiet Be quieter @@ -43,45 +46,20 @@ sample note: {nn} }, 'code': { 'options': lambda cfg, help_notes, s: s.format( - kgs=help_notes('keygen_backends'), - coin_id=help_notes('coin_id'), + kgs = help_notes('keygen_backends'), + coin_id = help_notes('coin_id'), ), 'notes': lambda s: s.format(nn='a note'), } } -cfg = Config(opts_data=opts_data) +cfg = Config(opts_data=opts_data, need_proto=os.getenv('TEST_MISC_OPTS_NEEDS_PROTO')) -for k in ( - 'foo', # added opt - 'print_checksum', # sets 'quiet' - 'quiet', 'verbose', # _incompatible_opts - 'passwd_file', # _infile_opts - check_infile() - 'outdir', # check_outdir() - 'cached_balances', # opt_sets_global - 'minconf', # global_sets_opt - 'hidden_incog_input_params', - 'keep_label', - 'seed_len', - 'hash_preset', - 'label', - 'min_temp', - 'max_temp', - 'coin', - 'pager', - 'point', - 'no_foobleize'): - msg('{:30} {}'.format(f'cfg.{k}:', getattr(cfg, k))) - -msg('') -for k in ( - 'cached_balances', # opt_sets_global - 'minconf'): # global_sets_opt - msg('{:30} {}'.format(f'cfg.{k}:', getattr(cfg, k))) - -msg('') -for k in ('fee_estimate_mode',): # _autoset_opts - msg('{:30} {}'.format(f'cfg.{k}:', getattr(cfg, k))) +if cfg.show_opts: + opts = cfg.show_opts.split(',') + col1_w = max(len(s) for s in opts) + 5 + for opt in opts: + msg('{:{w}} {}'.format(f'cfg.{opt}:', getattr(cfg, opt), w=col1_w)) msg('') for n, arg in enumerate(cfg._args, 1):