186 lines
4.6 KiB
Python
Executable file
186 lines
4.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# MMGen Wallet, a terminal-based cryptocurrency wallet
|
|
# Copyright (C)2013-2026 The MMGen Project <mmgen@tuta.io>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
"""
|
|
test.cmdtest_d.include.common: Shared routines and data for the cmdtest.py test suite
|
|
"""
|
|
|
|
import sys, os
|
|
|
|
from mmgen.cfg import gc
|
|
from mmgen.color import green, blue, gray
|
|
from mmgen.util import msg
|
|
|
|
from ...include.common import cfg, getrand, text_jp, text_zh, ascii_cyr_gr, lat_cyr_gr
|
|
|
|
rt_pw = 'abc-α'
|
|
ref_wallet_brainpass = 'abc'
|
|
ref_wallet_hash_preset = '1'
|
|
ref_wallet_incog_offset = 123
|
|
|
|
dfl_addr_idx_list = '1010,500-501,31-33,1,33,500,1011'
|
|
dfl_wpasswd = 'reference password'
|
|
|
|
pwfile = 'passwd_file'
|
|
hincog_fn = 'rand_data'
|
|
hincog_bytes = 1024*1024
|
|
hincog_offset = 98765
|
|
hincog_seedlen = 256
|
|
|
|
incog_id_fn = 'incog_id'
|
|
non_mmgen_fn = 'coinkey'
|
|
|
|
ref_dir = os.path.join('test', 'ref')
|
|
|
|
dfl_sid = '98831F3A'
|
|
dfl_words_file = os.path.join(ref_dir, '98831F3A.mmwords')
|
|
dfl_bip39_file = os.path.join(ref_dir, '98831F3A.bip39')
|
|
|
|
from mmgen.obj import MMGenTxComment, TwComment
|
|
|
|
tx_comment_jp = text_jp
|
|
tx_comment_zh = text_zh
|
|
|
|
lcg = ascii_cyr_gr if gc.platform == 'win32' else lat_cyr_gr # MSYS2 popen_spawn issue
|
|
tx_comment_lat_cyr_gr = lcg[:MMGenTxComment.max_len] # 72 chars
|
|
|
|
tw_comment_zh = text_zh[:TwComment.max_screen_width // 2]
|
|
tw_comment_lat_cyr_gr = lcg[:TwComment.max_screen_width] # 80 chars
|
|
|
|
ref_bw_hash_preset = '1'
|
|
ref_bw_file = 'wallet.mmbrain'
|
|
ref_bw_file_spc = 'wallet-spaced.mmbrain'
|
|
|
|
ref_enc_fn = 'sample-text.mmenc'
|
|
tool_enc_passwd = "Scrypt it, don't hash it!"
|
|
chksum_pat = r'\b[A-F0-9]{4} [A-F0-9]{4} [A-F0-9]{4} [A-F0-9]{4}\b'
|
|
|
|
Ctrl_U = '\x15'
|
|
|
|
eth_inbound_addr = (28 * '0') + 'feedbeefcafe'
|
|
|
|
thorchain_router_addr_file = 'test/data_dir/thorchain_router_addr'
|
|
|
|
def ok_msg():
|
|
if cfg.profile:
|
|
return
|
|
sys.stderr.write(green('\nOK\n') if cfg.exact_output or cfg.verbose else ' OK\n')
|
|
|
|
def skip(name, reason=None):
|
|
msg(gray('Skipping {}{}'.format(name, f' ({reason})' if reason else '')))
|
|
return 'skip'
|
|
|
|
def confirm_continue():
|
|
from mmgen.ui import keypress_confirm
|
|
if keypress_confirm(
|
|
cfg,
|
|
blue('Continue? (Y/n): '),
|
|
default_yes = True,
|
|
complete_prompt = True):
|
|
if cfg.verbose or cfg.exact_output:
|
|
sys.stderr.write('\n')
|
|
else:
|
|
raise KeyboardInterrupt('Exiting at user request')
|
|
|
|
def randbool():
|
|
return getrand(1).hex()[0] in '02468ace'
|
|
|
|
def cleanup_env(cfg):
|
|
ret = dict(os.environ)
|
|
if cfg.debug_utf8:
|
|
return ret
|
|
for k in cfg._env_opts:
|
|
if k[:11] == 'MMGEN_DEBUG' and k in ret:
|
|
del ret[k]
|
|
return ret | {'EXEC_WRAPPER_DO_RUNTIME_MSG': ''}
|
|
|
|
def get_file_with_ext(
|
|
tdir,
|
|
ext,
|
|
delete = True,
|
|
no_dot = False,
|
|
return_list = False,
|
|
delete_all = False,
|
|
subdir = None,
|
|
substr = False):
|
|
|
|
dot = '' if no_dot else '.'
|
|
|
|
def have_match(fn):
|
|
return (
|
|
fn == ext
|
|
or fn.endswith(dot + ext)
|
|
or (substr and ext in fn))
|
|
|
|
if subdir:
|
|
tdir = os.path.join(tdir, subdir)
|
|
|
|
# Don’t use os.scandir here - it returns broken paths under Windows/MSYS2
|
|
flist = [os.path.join(tdir, name) for name in os.listdir(tdir) if have_match(name)]
|
|
|
|
if not flist:
|
|
return False
|
|
|
|
if return_list:
|
|
return flist
|
|
|
|
if len(flist) > 1 or delete_all:
|
|
if delete or delete_all:
|
|
if (cfg.exact_output or cfg.verbose) and not cfg.quiet:
|
|
if delete_all:
|
|
msg(f'Deleting all *{dot}{ext} files in ‘{tdir}’')
|
|
else:
|
|
msg(f'Multiple *{dot}{ext} files in ‘{tdir}’ - deleting')
|
|
for f in flist:
|
|
os.unlink(f)
|
|
return False
|
|
else:
|
|
return flist[0]
|
|
|
|
def get_comment(do_shuffle=False):
|
|
labels = [
|
|
'Automotive',
|
|
'Travel expenses',
|
|
'Healthcare',
|
|
tx_comment_jp[:40],
|
|
tx_comment_zh[:40],
|
|
'Alice’s allowance',
|
|
'Bob’s bequest',
|
|
'House purchase',
|
|
'Real estate fund',
|
|
'Job 1',
|
|
'XYZ Corp.',
|
|
'Eddie’s endowment',
|
|
'Emergency fund',
|
|
'Real estate fund',
|
|
'Ian’s inheritance',
|
|
'',
|
|
'Rainy day',
|
|
'Fred’s funds',
|
|
'Job 2',
|
|
'Carl’s capital',
|
|
]
|
|
from random import shuffle
|
|
global label_iter
|
|
try:
|
|
return next(label_iter)
|
|
except:
|
|
if do_shuffle:
|
|
shuffle(labels)
|
|
label_iter = iter(labels)
|
|
return next(label_iter)
|