From 57682dce3fe8661e38cfc0ec4aec14048abc72db Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 24 Oct 2019 16:21:09 +0000 Subject: [PATCH] test.py: cleanups and fixes throughout --- test/test.py | 9 +- test/test_py_d/ts_autosign.py | 2 +- test/test_py_d/ts_ethdev.py | 13 +- test/test_py_d/ts_main.py | 158 +++++++++++++---------- test/test_py_d/ts_ref.py | 10 +- test/test_py_d/ts_ref_3seed.py | 213 +++++++++++++++---------------- test/test_py_d/ts_ref_altcoin.py | 3 +- test/test_py_d/ts_regtest.py | 19 +-- test/test_py_d/ts_seedsplit.py | 56 ++++---- test/test_py_d/ts_shared.py | 49 ++++--- test/test_py_d/ts_wallet.py | 106 +++++++-------- 11 files changed, 328 insertions(+), 310 deletions(-) diff --git a/test/test.py b/test/test.py index 987afeb3..91640186 100755 --- a/test/test.py +++ b/test/test.py @@ -525,6 +525,12 @@ class CmdGroupMgr(object): cls = self.create_group(gname,**kwargs) return cls(trunner,cfgs,spawn_prog) + def list_cmd_groups(self): + for gname in self.cmd_groups: + clsname,kwargs = self.cmd_groups[gname] + cls = self.load_mod(gname,kwargs['modname'] if 'modname' in kwargs else None) + msg('{:17} - {}'.format(gname,cls.__doc__)) + def find_cmd_in_groups(self,cmd,group=None): """ Search for a test command in specified group or all configured command groups @@ -875,7 +881,8 @@ if not opt.skip_deps: # do this before list cmds exit, so we stay in sync with s create_tmp_dirs(shm_dir) if opt.list_cmd_groups: - Die(0,' '.join(CmdGroupMgr.cmd_groups)) + CmdGroupMgr().list_cmd_groups() + Die(0,'\n'+' '.join(CmdGroupMgr.cmd_groups)) elif opt.list_cmds: list_cmds() diff --git a/test/test_py_d/ts_autosign.py b/test/test_py_d/ts_autosign.py index a2b12885..27482988 100755 --- a/test/test_py_d/ts_autosign.py +++ b/test/test_py_d/ts_autosign.py @@ -226,7 +226,7 @@ class TestSuiteAutosignMinimal(TestSuiteAutosign): ) class TestSuiteAutosignLive(TestSuiteAutosignMinimal): - 'live autosigning operations' + 'live autosigning operations with device insertion/removal and LED check' cmd_group = ( ('autosign_live', 'transaction autosigning (BTC,ETH,ETC - test device insertion/removal + LED)'), ) diff --git a/test/test_py_d/ts_ethdev.py b/test/test_py_d/ts_ethdev.py index 6551e0ca..3b189384 100755 --- a/test/test_py_d/ts_ethdev.py +++ b/test/test_py_d/ts_ethdev.py @@ -722,12 +722,13 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): def token_txcreate(self,args=[],token='',inputs='1',fee='50G'): t = self.spawn('mmgen-txcreate', self.eth_args + ['--token='+token,'-B','--tx-fee='+fee] + args) - t = self.txcreate_ui_common( t, - menu = [], - inputs = inputs, - input_sels_prompt = 'to spend from', - file_desc = 'Ethereum token transaction', - add_comment = tx_label_lat_cyr_gr) + t = self.txcreate_ui_common( + t, + menu = [], + inputs = inputs, + input_sels_prompt = 'to spend from', + file_desc = 'Ethereum token transaction', + add_comment = tx_label_lat_cyr_gr ) t.read() return t def token_txsign(self,ext='',token=''): diff --git a/test/test_py_d/ts_main.py b/test/test_py_d/ts_main.py index 95d972d4..0928a41d 100755 --- a/test/test_py_d/ts_main.py +++ b/test/test_py_d/ts_main.py @@ -22,6 +22,7 @@ ts_main.py: Basic operations tests for the test.py test suite from mmgen.globalvars import g from mmgen.opts import opt +from mmgen.seed import SeedSource,Wallet,MMGenMnemonic,IncogWallet,MMGenSeedFile from test.common import * from test.test_py_d.common import * from test.test_py_d.ts_base import * @@ -165,23 +166,23 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): def subwalletgen_dfl_wallet(self,pf): return self.subwalletgen(wf='default') - def export_seed_dfl_wallet(self,pf,desc='seed data',out_fmt='seed'): - return self.export_seed(wf=None,desc=desc,out_fmt=out_fmt,pf=pf) + def export_seed_dfl_wallet(self,pf,out_fmt='seed'): + return self.export_seed(wf=None,out_fmt=out_fmt,pf=pf) def addrgen_dfl_wallet(self,pf=None,check_ref=False): - return self.addrgen(wf=None,pf=pf,check_ref=check_ref) + return self.addrgen(wf=None,pf=pf,check_ref=check_ref,dfl_wallet=True) def txcreate_dfl_wallet(self,addrfile): return self.txcreate_common(sources=['15']) def txsign_dfl_wallet(self,txfile,pf='',save=True,has_label=False): - return self.txsign(txfile,wf=None,pf=pf,save=save,has_label=has_label) + return self.txsign(None,txfile,pf=pf,save=save,has_label=has_label,dfl_wallet=True) def passchg_dfl_wallet(self,pf): - return self.passchg(wf=None,pf=pf) + return self.passchg(wf=None,pf=pf,dfl_wallet=True) def walletchk_newpass_dfl_wallet(self,pf): - return self.walletchk_newpass(wf=None,pf=pf) + return self.walletchk_newpass(wf=None,wcls=Wallet,pf=pf,dfl_wallet=True) def delete_dfl_wallet(self,pf): self.write_to_tmpfile('del_dw_run',b'',binary=True) @@ -201,12 +202,13 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t.license() t.usr_rand(self.usr_rand_chars) t.expect('Generating') - t.passphrase_new('new MMGen wallet',self.wpasswd) + wcls = Wallet + t.passphrase_new('new '+wcls.desc,self.wpasswd) t.label() if not self.have_dfl_wallet and gen_dfl_wallet: t.expect('move it to the data directory? (Y/n): ','y') self.have_dfl_wallet = True - t.written_to_file('MMGen wallet') + t.written_to_file(capfirst(wcls.desc)) return t def subwalletgen(self,wf): @@ -214,25 +216,30 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): if wf != 'default': args += [wf] t = self.spawn('mmgen-subwalletgen', args + ['10s']) t.license() - t.passphrase('MMGen wallet',self.cfgs['1']['wpasswd']) + wcls = Wallet + t.passphrase(wcls.desc,self.cfgs['1']['wpasswd']) t.expect('Generating subseed 10S') - t.passphrase_new('new MMGen wallet','foo') + t.passphrase_new('new '+wcls.desc,'foo') t.usr_rand(self.usr_rand_chars) - fn = t.written_to_file('MMGen wallet') - assert fn[-6:] == '.mmdat','incorrect file extension: {}'.format(fn[-6:]) + fn = t.written_to_file(capfirst(wcls.desc)) + ext = get_extension(fn) + assert ext,'incorrect file extension: {}'.format(ext) return t def subwalletgen_mnemonic(self,wf): - args = [self.usr_rand_arg,'-p1','-d',self.tr.trash_dir,'-o','words',wf,'3L'] + icls = SeedSource.ext_to_type(get_extension(wf)) + ocls = MMGenMnemonic + args = [self.usr_rand_arg,'-p1','-d',self.tr.trash_dir,'-o',ocls.fmt_codes[0],wf,'3L'] t = self.spawn('mmgen-subwalletgen', args) t.license() - t.passphrase('MMGen wallet',self.cfgs['1']['wpasswd']) + t.passphrase(icls.desc,self.cfgs['1']['wpasswd']) t.expect('Generating subseed 3L') - fn = t.written_to_file('MMGen native mnemonic data') - assert fn[-8:] == '.mmwords','incorrect file extension: {}'.format(fn[-8:]) + fn = t.written_to_file(capfirst(ocls.desc)) + ext = get_extension(fn) + assert ext == ocls.ext,'incorrect file extension: {}'.format(ext) return t - def passchg(self,wf,pf,label_action='cmdline'): + def passchg(self,wf,pf,label_action='cmdline',dfl_wallet=False): silence() self.write_to_tmpfile(pwfile,get_data_from_file(pf)) end_silence() @@ -240,18 +247,19 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): 'keep': ['-d',self.tr.trash_dir,'--keep-label'], 'user': ['-d',self.tr.trash_dir] }[label_action] - t = self.spawn('mmgen-passchg', add_args + [self.usr_rand_arg, '-p2'] + ([],[wf])[bool(wf)]) + t = self.spawn('mmgen-passchg', add_args + [self.usr_rand_arg, '-p2'] + ([wf] if wf else [])) t.license() - t.passphrase('MMGen wallet',self.cfgs['1']['wpasswd'],pwtype='old') + wcls = Wallet + t.passphrase(wcls.desc,self.cfgs['1']['wpasswd'],pwtype='old') t.expect_getend('Hash preset changed to ') - t.passphrase('MMGen wallet',self.wpasswd,pwtype='new') # reuse passphrase? + t.passphrase(wcls.desc,self.wpasswd,pwtype='new') # reuse passphrase? t.expect('Repeat passphrase: ',self.wpasswd+'\n') t.usr_rand(self.usr_rand_chars) if label_action == 'user': t.expect('Enter a wallet label.*: ','Interactive Label (UTF-8) α\n',regex=True) t.expect_getend(('Label changed to ','Reusing label ')[label_action=='keep']) # t.expect_getend('Key ID changed: ') - if not wf: + if dfl_wallet: t.expect("Type uppercase 'YES' to confirm: ",'YES\n') t.written_to_file('New wallet') t.expect('Securely deleting old wallet') @@ -259,7 +267,7 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t.expect('Wallet passphrase has changed') t.expect_getend('has been changed to ') else: - t.written_to_file('MMGen wallet') + t.written_to_file(capfirst(wcls.desc)) return t def passchg_keeplabel(self,wf,pf): @@ -268,8 +276,8 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): def passchg_usrlabel(self,wf,pf): return self.passchg(wf,pf,label_action='user') - def walletchk_newpass(self,wf,pf): - return self.walletchk(wf,pf,pw=True) + def walletchk_newpass(self,wf,pf,wcls=None,dfl_wallet=False): + return self.walletchk(wf,pf,wcls=wcls,dfl_wallet=dfl_wallet) def _write_fake_data_to_file(self,d): unspent_data_file = joinpath(self.tmpdir,'unspent.json') @@ -459,8 +467,8 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t.expect('OK? (Y/n): ','\n') if seed_args: # sign and send t.do_comment(False,has_label=True) - for cnum,desc in (('1','incognito data'),('3','MMGen wallet'),('4','MMGen wallet')): - t.passphrase(desc,self.cfgs[cnum]['wpasswd']) + for cnum,wcls in (('1',IncogWallet),('3',Wallet),('4',Wallet)): + t.passphrase(wcls.desc,self.cfgs[cnum]['wpasswd']) self._do_confirm_send(t,quiet=not g.debug,confirm_send=True) if g.debug: t.written_to_file('Transaction') @@ -486,66 +494,73 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): self.txsend_ui_common(t) return t - def _walletconv_export(self,wf,desc,uargs=[],out_fmt='w',pf=None,out_pw=False): + def _walletconv_export(self,wf,uargs=[],out_fmt='w',pf=None): opts = ['-d',self.tmpdir,'-o',out_fmt] + uargs + \ ([],[wf])[bool(wf)] + ([],['-P',pf])[bool(pf)] t = self.spawn('mmgen-walletconv',opts) t.license() + if not pf: - t.passphrase('MMGen wallet',self.wpasswd) + icls = SeedSource.ext_to_type(get_extension(wf)) + t.passphrase(icls.desc,self.wpasswd) + + ocls = SeedSource.fmt_code_to_type(out_fmt) + out_pw = issubclass(ocls,SeedSourceEnc) and ocls != Brainwallet if out_pw: - t.passphrase_new('new '+desc,self.wpasswd) + t.passphrase_new('new '+ocls.desc,self.wpasswd) t.usr_rand(self.usr_rand_chars) - if ' '.join(desc.split()[-2:]) == 'incognito data': + if ocls.__name__.startswith('Incog'): m = 'Generating encryption key from OS random data ' t.expect(m); t.expect(m) incog_id = t.expect_getend('New Incog Wallet ID: ') t.expect(m) - if desc == 'hidden incognito data': + if ocls == IncogWalletHidden: self.write_to_tmpfile(incog_id_fn,incog_id) t.hincog_create(hincog_bytes) - if out_fmt == 'w': t.label() - return t.written_to_file(capfirst(desc),oo=True),t + elif ocls == Wallet: + t.label() + return t.written_to_file(capfirst(ocls.desc),oo=True),t - def export_seed(self,wf,desc='seed data',out_fmt='seed',pf=None): - f,t = self._walletconv_export(wf,desc=desc,out_fmt=out_fmt,pf=pf) + def export_seed(self,wf,out_fmt='seed',pf=None): + f,t = self._walletconv_export(wf,out_fmt=out_fmt,pf=pf) silence() - msg('{}: {}'.format(capfirst(desc),cyan(get_data_from_file(f,desc)))) + wcls = SeedSource.fmt_code_to_type(out_fmt) + msg('{}: {}'.format(capfirst(wcls.desc),cyan(get_data_from_file(f,wcls.desc)))) end_silence() return t - def export_hex(self,wf,desc='hexadecimal seed data with checksum',out_fmt='mmhex',pf=None): - return self.export_seed(wf,desc=desc,out_fmt=out_fmt,pf=pf) + def export_hex(self,wf,out_fmt='mmhex',pf=None): + return self.export_seed(wf,out_fmt=out_fmt,pf=pf) def export_mnemonic(self,wf): - return self.export_seed(wf,desc='MMGen native mnemonic data',out_fmt='words') + return self.export_seed(wf,out_fmt='words') def export_bip39(self,wf): - return self.export_seed(wf,desc='BIP39 mnemonic data',out_fmt='bip39') + return self.export_seed(wf,out_fmt='bip39') - def export_incog(self,wf,desc='incognito data',out_fmt='i',add_args=[]): + def export_incog(self,wf,out_fmt='i',add_args=[]): uargs = ['-p1',self.usr_rand_arg] + add_args - f,t = self._walletconv_export(wf,desc=desc,out_fmt=out_fmt,uargs=uargs,out_pw=True) + f,t = self._walletconv_export(wf,out_fmt=out_fmt,uargs=uargs) return t def export_incog_hex(self,wf): - return self.export_incog(wf,desc='hex incognito data',out_fmt='xi') + return self.export_incog(wf,out_fmt='xi') # TODO: make outdir and hidden incog compatible (ignore --outdir and warn user?) def export_incog_hidden(self,wf): rf = joinpath(self.tmpdir,hincog_fn) add_args = ['-J','{},{}'.format(rf,hincog_offset)] - return self.export_incog( - wf,desc='hidden incognito data',out_fmt='hi',add_args=add_args) + return self.export_incog(wf,out_fmt='hi',add_args=add_args) - def addrgen_seed(self,wf,foo,desc='seed data',in_fmt='seed'): - stdout = desc == 'seed data' # capture output to screen once + def addrgen_seed(self,wf,foo,in_fmt='seed'): + wcls = SeedSource.fmt_code_to_type(in_fmt) + stdout = wcls == MMGenSeedFile # capture output to screen once add_args = ([],['-S'])[bool(stdout)] + self.segwit_arg t = self.spawn('mmgen-addrgen', add_args + ['-i'+in_fmt,'-d',self.tmpdir,wf,self.addr_idx_list]) t.license() - t.expect_getend('Valid {} for Seed ID '.format(desc)) + t.expect_getend('Valid {} for Seed ID '.format(wcls.desc)) vmsg('Comparing generated checksum with checksum from previous address file') chk = t.expect_getend(r'Checksum for address data .*?: ',regex=True) if stdout: t.read() @@ -555,19 +570,20 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t.req_exit_val = 1 return t - def addrgen_hex(self,wf,foo,desc='hexadecimal seed data with checksum',in_fmt='mmhex'): - return self.addrgen_seed(wf,foo,desc=desc,in_fmt=in_fmt) + def addrgen_hex(self,wf,foo,in_fmt='mmhex'): + return self.addrgen_seed(wf,foo,in_fmt=in_fmt) def addrgen_mnemonic(self,wf,foo): - return self.addrgen_seed(wf,foo,desc='MMGen native mnemonic data',in_fmt='words') + return self.addrgen_seed(wf,foo,in_fmt='words') - def addrgen_incog(self,wf=[],foo='',in_fmt='i',desc='incognito data',args=[]): + def addrgen_incog(self,wf=[],foo='',in_fmt='i',args=[]): t = self.spawn('mmgen-addrgen', args + self.segwit_arg + ['-i'+in_fmt,'-d',self.tmpdir]+ ([],[wf])[bool(wf)] + [self.addr_idx_list]) t.license() t.expect_getend('Incog Wallet ID: ') - t.hash_preset(desc,'1') - t.passphrase('{} \w{{8}}'.format(desc),self.wpasswd) + wcls = SeedSource.fmt_code_to_type(in_fmt) + t.hash_preset(wcls.desc,'1') + t.passphrase('{} \w{{8}}'.format(wcls.desc),self.wpasswd) vmsg('Comparing generated checksum with checksum from address file') chk = t.expect_getend(r'Checksum for address data .*?: ',regex=True) verify_checksum_or_exit(self._get_addrfile_checksum(),chk) @@ -576,11 +592,11 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): return t def addrgen_incog_hex(self,wf,foo): - return self.addrgen_incog(wf,'',in_fmt='xi',desc='hex incognito data') + return self.addrgen_incog(wf,'',in_fmt='xi') def addrgen_incog_hidden(self,wf,foo): rf = joinpath(self.tmpdir,hincog_fn) - return self.addrgen_incog([],'',in_fmt='hi',desc='hidden incognito data', + return self.addrgen_incog([],'',in_fmt='hi', args=['-H','{},{}'.format(rf,hincog_offset),'-l',str(hincog_seedlen)]) def txsign_keyaddr(self,keyaddr_file,txfile): @@ -603,12 +619,13 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): def txcreate2(self,addrfile): return self.txcreate_common(sources=['2']) - def txsign2(self,txf1,wf1,txf2,wf2): + def txsign2(self,wf1,txf1,wf2,txf2): t = self.spawn('mmgen-txsign', ['-d',self.tmpdir,txf1,wf1,txf2,wf2]) t.license() - for cnum in ('1','2'): + for cnum,wf in (('1',wf1),('2',wf2)): + wcls = SeedSource.ext_to_type(get_extension(wf)) t.view_tx('n') - t.passphrase('MMGen wallet',self.cfgs[cnum]['wpasswd']) + t.passphrase(wcls.desc,self.cfgs[cnum]['wpasswd']) self.txsign_end(t,cnum) return t @@ -628,8 +645,9 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t = self.spawn('mmgen-txsign', ['-d',self.tmpdir,wf1,wf2,txf2]) t.license() t.view_tx('n') - for cnum in ('1','3'): - t.passphrase('MMGen wallet',self.cfgs[cnum]['wpasswd']) + for cnum,wf in (('1',wf1),('3',wf2)): + wcls = SeedSource.ext_to_type(get_extension(wf)) + t.passphrase(wcls.desc,self.cfgs[cnum]['wpasswd']) self.txsign_end(t) return t @@ -644,10 +662,11 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): args = ['-d',self.tmpdir,'-p1',self.usr_rand_arg,'-l'+seed_len,'-ib'] t = self.spawn('mmgen-walletconv', args + [bwf]) t.license() - t.passphrase_new('new MMGen wallet',self.wpasswd) + wcls = Wallet + t.passphrase_new('new ' +wcls.desc,self.wpasswd) t.usr_rand(self.usr_rand_chars) t.label() - t.written_to_file('MMGen wallet') + t.written_to_file(capfirst(wcls.desc)) return t def addrgen4(self,wf): @@ -664,8 +683,8 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t.do_decrypt_ka_data(hp='1',pw=self.cfgs['14']['kapasswd']) t.view_tx('t') - for cnum,desc in (('1','incognito data'),('3','MMGen wallet')): - t.passphrase('{}'.format(desc),self.cfgs[cnum]['wpasswd']) + for cnum,wcls in (('1',IncogWallet),('3',Wallet)): + t.passphrase('{}'.format(wcls.desc),self.cfgs[cnum]['wpasswd']) self.txsign_end(t,has_label=True) return t @@ -677,8 +696,8 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): t = self.txcreate_common(sources=['1','2','3','4','14'], non_mmgen_input='4',do_label=True,txdo_args=[f7,f8,f9,f10],add_args=add_args) - for cnum,desc in (('1','incognito data'),('3','MMGen wallet')): - t.passphrase('{}'.format(desc),self.cfgs[cnum]['wpasswd']) + for cnum,wcls in (('1',IncogWallet),('3',Wallet)): + t.passphrase('{}'.format(wcls.desc),self.cfgs[cnum]['wpasswd']) self.txsign_ui_common(t) self.txsend_ui_common(t) @@ -700,12 +719,13 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): def txcreate5(self,addrfile): return self.txcreate_common(sources=['20'],non_mmgen_input='20',non_mmgen_input_compressed=False) - def txsign5(self,txf,wf,bad_vsize=True,add_args=[]): + def txsign5(self,wf,txf,bad_vsize=True,add_args=[]): non_mm_file = joinpath(self.tmpdir,non_mmgen_fn) t = self.spawn('mmgen-txsign', add_args + ['-d',self.tmpdir,'-k',non_mm_file,txf,wf]) t.license() t.view_tx('n') - t.passphrase('MMGen wallet',self.cfgs['20']['wpasswd']) + wcls = SeedSource.ext_to_type(get_extension(wf)) + t.passphrase(wcls.desc,self.cfgs['20']['wpasswd']) if bad_vsize: t.expect('Estimated transaction vsize') t.expect('1 transaction could not be signed') diff --git a/test/test_py_d/ts_ref.py b/test/test_py_d/ts_ref.py index f069d1a7..b2134ee6 100755 --- a/test/test_py_d/ts_ref.py +++ b/test/test_py_d/ts_ref.py @@ -23,6 +23,7 @@ ts_ref.py: Reference file tests for the test.py test suite import os from mmgen.globalvars import g from mmgen.opts import opt +from mmgen.seed import MMGenMnemonic from test.common import * from test.test_py_d.common import * @@ -33,7 +34,7 @@ wpasswd = 'reference password' nw_name = '{} {}'.format(g.coin,('Mainnet','Testnet')[g.testnet]) class TestSuiteRef(TestSuiteBase,TestSuiteShared): - 'saved reference files' + 'saved reference address, password and transaction files' tmpdir_nums = [8] networks = ('btc','btc_tn','ltc','ltc_tn') passthru_opts = ('coin','testnet') @@ -153,12 +154,13 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): def ref_words_to_subwallet_chk(self,ss_idx): wf = dfl_words_file - args = ['-d',self.tr.trash_dir,'-o','words',wf,ss_idx] + ocls = MMGenMnemonic + args = ['-d',self.tr.trash_dir,'-o',ocls.fmt_codes[-1],wf,ss_idx] t = self.spawn('mmgen-subwalletgen',args,extra_desc='(generate subwallet)') t.expect('Generating subseed {}'.format(ss_idx)) chk_sid = self.chk_data['ref_subwallet_sid']['98831F3A:{}'.format(ss_idx)] - fn = t.written_to_file('MMGen native mnemonic data') + fn = t.written_to_file(capfirst(ocls.desc)) assert chk_sid in fn,'incorrect filename: {} (does not contain {})'.format(fn,chk_sid) ok() @@ -258,7 +260,7 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): wf = dfl_words_file self.write_to_tmpfile(pwfile,wpasswd) pf = joinpath(self.tmpdir,pwfile) - return self.txsign(tf,wf,pf,save=False,has_label=True,do_passwd=False,view='y') + return self.txsign(wf,tf,pf,save=False,has_label=True,view='y') def ref_brain_chk_spc3(self): return self.ref_brain_chk(bw_file=ref_bw_file_spc) diff --git a/test/test_py_d/ts_ref_3seed.py b/test/test_py_d/ts_ref_3seed.py index 37253536..78053ee8 100755 --- a/test/test_py_d/ts_ref_3seed.py +++ b/test/test_py_d/ts_ref_3seed.py @@ -23,6 +23,7 @@ ts_ref_3seed.py: Saved and generated reference file tests for 128, 192 and from mmgen.globalvars import g from mmgen.opts import opt +from mmgen.seed import SeedSource from test.common import * from test.test_py_d.common import * from test.test_py_d.ts_base import * @@ -30,7 +31,7 @@ from test.test_py_d.ts_shared import * from test.test_py_d.ts_wallet import TestSuiteWalletConv class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): - 'saved and generated reference data for 128-, 192- and 256-bit seeds' + 'saved wallet files for 128-, 192- and 256-bit seeds + generated filename checks' networks = ('btc','btc_tn','ltc','ltc_tn') passthru_opts = ('coin','testnet') mmtypes = (None,) @@ -42,24 +43,25 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): 'sids': ('FE3C6545', '1378FC64', '98831F3A'), } cmd_group = ( - # reading - ('ref_wallet_chk', ([],'saved reference wallet')), - ('ref_seed_chk', ([],'saved seed file')), - ('ref_hex_chk', ([],'saved mmhex file')), + # reading saved reference wallets + ('ref_wallet_chk', ([],'saved reference wallet')), + ('ref_seed_chk', ([],'saved seed file')), + ('ref_hex_chk', ([],'saved mmhex file')), ('ref_plainhex_chk',([],'saved hex file')), - ('ref_mn_chk', ([],'saved native MMGen mnemonic file')), - ('ref_bip39_chk', ([],'saved BIP39 mnemonic file')), - ('ref_hincog_chk', ([],'saved hidden incog reference wallet')), - ('ref_brain_chk', ([],'saved brainwallet')), # in ts_shared - # generating new reference ('abc' brainwallet) files: - ('ref_walletgen_brain', ([],'generating new reference wallet + filename check (brain)')), - ('ref_walletconv_words', (['mmdat',pwfile],'wallet filename (native mnemonic)')), - ('ref_walletconv_bip39', (['mmdat',pwfile],'wallet filename (bip39)')), - ('ref_walletconv_seed', (['mmdat',pwfile],'wallet filename (seed)')), - ('ref_walletconv_hexseed',(['mmdat',pwfile],'wallet filename (hex seed)')), - ('ref_walletconv_plainhexseed',(['mmdat',pwfile],'wallet filename (plain hex seed)')), - ('ref_walletconv_incog', (['mmdat',pwfile],'wallet filename (incog)')), - ('ref_walletconv_xincog', (['mmdat',pwfile],'wallet filename (hex incog)')), + ('ref_mn_chk', ([],'saved native MMGen mnemonic file')), + ('ref_bip39_chk', ([],'saved BIP39 mnemonic file')), + ('ref_hincog_chk', ([],'saved hidden incog reference wallet')), + ('ref_brain_chk', ([],'saved brainwallet')), # in ts_shared + + # generating new reference ('abc' brainwallet) wallets for filename checks: + ('ref_walletgen_brain', ([],'generating new reference wallet + filename check (brain)')), + ('ref_walletconv_words', ([],'wallet filename (native mnemonic)')), + ('ref_walletconv_bip39', ([],'wallet filename (bip39)')), + ('ref_walletconv_seed', ([],'wallet filename (seed)')), + ('ref_walletconv_hexseed', ([],'wallet filename (hex seed)')), + ('ref_walletconv_plainhexseed',([],'wallet filename (plain hex seed)')), + ('ref_walletconv_incog', ([],'wallet filename (incog)')), + ('ref_walletconv_xincog', ([],'wallet filename (hex incog)')), ) def __init__(self,trunner,cfgs,spawn): @@ -74,11 +76,11 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): def ref_wallet_chk(self): wf = joinpath(ref_dir,TestSuiteWalletConv.sources[str(self.seed_len)]['ref_wallet']) - return self.walletchk(wf,pf=None,pw=True,sid=self.seed_id) + return self.walletchk(wf,pf=None,sid=self.seed_id) def ref_ss_chk(self,ss=None): wf = joinpath(ref_dir,'{}.{}'.format(self.seed_id,ss.ext)) - return self.walletchk(wf,pf=None,desc=ss.desc,sid=self.seed_id) + return self.walletchk(wf,pf=None,wcls=ss,sid=self.seed_id) def ref_seed_chk(self): from mmgen.seed import MMGenSeedFile @@ -132,9 +134,10 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): t = self.spawn('mmgen-walletconv', args + [self.usr_rand_arg]) t.license() t.expect('Enter brainwallet: ', ref_wallet_brainpass+'\n') - t.passphrase_new('new MMGen wallet',self.wpasswd) + ocls = Wallet + t.passphrase_new('new '+ocls.desc,self.wpasswd) t.usr_rand(self.usr_rand_chars) - fn = os.path.split(t.written_to_file('MMGen wallet'))[-1] + fn = os.path.split(t.written_to_file(capfirst(ocls.desc)))[-1] import re idx = int(self.test_name[-1]) - 1 pat = r'{}-[0-9A-F]{{8}}\[{},1\].mmdat'.format( @@ -145,44 +148,39 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): cmp_or_die(sid,self.seed_id,desc='Seed ID') return t - def ref_walletconv(self,fn,pf,ofmt,desc,ext,extra_args=[],re_pat=None): - t = self.spawn('mmgen-walletconv',extra_args+['-d','test/trash','-o',ofmt,'-P'+pf,fn]) - fn = os.path.split(t.written_to_file(desc))[-1] + def ref_walletconv(self,ofmt,extra_args=[],re_pat=None): + wf = self.get_file_with_ext('mmdat') + pf = joinpath(self.tmpdir,pwfile) + t = self.spawn('mmgen-walletconv',extra_args+['-d','test/trash','-o',ofmt,'-P'+pf,wf]) + wcls = SeedSource.fmt_code_to_type(ofmt) + fn = os.path.split(t.written_to_file(capfirst(wcls.desc)))[-1] idx = int(self.test_name[-1]) - 1 sid = self.chk_data['sids'][idx] slen = self.chk_data['lens'][idx] if re_pat: import re - assert re.match(re_pat.format(sid,slen),fn) + pat = re_pat.format(sid,slen) + assert re.match(pat,fn),'{} {}'.format(pat,fn) else: - cmp_or_die('{}[{}].{}'.format(sid,slen,ext),fn) + cmp_or_die('{}[{}].{}'.format(sid,slen,wcls.ext),fn) return t - def ref_walletconv_words(self,fn,pf): - return self.ref_walletconv(fn,pf,ofmt='mn',desc='MMGen native mnemonic data',ext='mmwords') + def ref_walletconv_words(self): return self.ref_walletconv(ofmt='mn') + def ref_walletconv_bip39(self): return self.ref_walletconv(ofmt='bip39') + def ref_walletconv_seed(self): return self.ref_walletconv(ofmt='mmseed') + def ref_walletconv_hexseed(self): return self.ref_walletconv(ofmt='mmhex') + def ref_walletconv_plainhexseed(self): return self.ref_walletconv(ofmt='hex') - def ref_walletconv_bip39(self,fn,pf): - return self.ref_walletconv(fn,pf,ofmt='bip39',desc='BIP39 mnemonic data',ext='bip39') - - def ref_walletconv_seed(self,fn,pf): - return self.ref_walletconv(fn,pf,ofmt='mmseed',desc='Seed data',ext='mmseed') - - def ref_walletconv_hexseed(self,fn,pf): - return self.ref_walletconv(fn,pf,ofmt='mmhex',desc='Hexadecimal seed data with checksum',ext='mmhex') - - def ref_walletconv_plainhexseed(self,fn,pf): - return self.ref_walletconv(fn,pf,ofmt='hex',desc='Plain hexadecimal seed data',ext='hex') - - def ref_walletconv_incog(self,fn,pf,desc='Incognito data',ofmt='incog',ext='mmincog'): + def ref_walletconv_incog(self,ofmt='incog',ext='mmincog'): args = ['-r0','-p1'] pat = r'{}-[0-9A-F]{{8}}-[0-9A-F]{{8}}\[{},1\].' + ext - return self.ref_walletconv(fn,pf,ofmt=ofmt,desc=desc,ext=ext,extra_args=args,re_pat=pat) + return self.ref_walletconv(ofmt=ofmt,extra_args=args,re_pat=pat) - def ref_walletconv_xincog(self,fn,pf): - return self.ref_walletconv_incog(fn,pf,desc='Hex incognito data',ofmt='incog_hex',ext='mmincox') + def ref_walletconv_xincog(self): + return self.ref_walletconv_incog(ofmt='incog_hex',ext='mmincox') class TestSuiteRef3Addr(TestSuiteRef3Seed): - 'generated reference address, key and passwd files for 128-, 192- and 256-bit seeds' + 'generated reference address, key and password files for 128-, 192- and 256-bit seeds' tmpdir_nums = [26,27,28] chk_data = { @@ -314,78 +312,71 @@ class TestSuiteRef3Addr(TestSuiteRef3Seed): } cmd_group = ( - ('ref_walletgen_brain', ([],'generating new reference wallet + filename check (brain)')), - ('refpasswdgen', (['mmdat',pwfile],'new refwallet passwd file chksum')), - ('refpasswdgen_half', (['mmdat',pwfile],'new refwallet passwd file chksum (half-length)')), - ('ref_b32passwdgen', (['mmdat',pwfile],'new refwallet passwd file chksum (base32)')), - ('ref_hexpasswdgen', (['mmdat',pwfile],'new refwallet passwd file chksum (hex)')), - ('ref_hexpasswdgen_half',(['mmdat',pwfile],'new refwallet passwd file chksum (hex, half-length)')), - ('ref_bip39_12_passwdgen',(['mmdat',pwfile],'new refwallet passwd file chksum (BIP39, 12 words)')), - ('ref_bip39_18_passwdgen',(['mmdat',pwfile],'new refwallet passwd file chksum (BIP39, up to 18 words)')), - ('ref_bip39_24_passwdgen',(['mmdat',pwfile],'new refwallet passwd file chksum (BIP39, up to 24 words)')), - ('ref_hex2bip39_24_passwdgen',(['mmdat',pwfile],'new refwallet passwd file chksum (hex-to-BIP39, up to 24 words)')), - ('refaddrgen_legacy', (['mmdat',pwfile],'new refwallet addr chksum (uncompressed)')), - ('refaddrgen_compressed', (['mmdat',pwfile],'new refwallet addr chksum (compressed)')), - ('refaddrgen_segwit', (['mmdat',pwfile],'new refwallet addr chksum (segwit)')), - ('refaddrgen_bech32', (['mmdat',pwfile],'new refwallet addr chksum (bech32)')), - ('refkeyaddrgen_legacy', (['mmdat',pwfile],'new refwallet key-addr chksum (uncompressed)')), - ('refkeyaddrgen_compressed', (['mmdat',pwfile],'new refwallet key-addr chksum (compressed)')), - ('refkeyaddrgen_segwit', (['mmdat',pwfile],'new refwallet key-addr chksum (segwit)')), - ('refkeyaddrgen_bech32', (['mmdat',pwfile],'new refwallet key-addr chksum (bech32)')), + ('ref_walletgen_brain', ([],'generating new reference wallet + filename check (brain)')), + ('refaddrgen_legacy', ([],'new refwallet addr chksum (uncompressed)')), + ('refaddrgen_compressed', ([],'new refwallet addr chksum (compressed)')), + ('refaddrgen_segwit', ([],'new refwallet addr chksum (segwit)')), + ('refaddrgen_bech32', ([],'new refwallet addr chksum (bech32)')), + ('refkeyaddrgen_legacy', ([],'new refwallet key-addr chksum (uncompressed)')), + ('refkeyaddrgen_compressed', ([],'new refwallet key-addr chksum (compressed)')), + ('refkeyaddrgen_segwit', ([],'new refwallet key-addr chksum (segwit)')), + ('refkeyaddrgen_bech32', ([],'new refwallet key-addr chksum (bech32)')), + ('refpasswdgen', ([],'new refwallet passwd file chksum')), + ('refpasswdgen_half', ([],'new refwallet passwd file chksum (half-length)')), + ('ref_b32passwdgen', ([],'new refwallet passwd file chksum (base32)')), + ('ref_hexpasswdgen', ([],'new refwallet passwd file chksum (hex)')), + ('ref_hexpasswdgen_half', ([],'new refwallet passwd file chksum (hex, half-length)')), + ('ref_bip39_12_passwdgen', ([],'new refwallet passwd file chksum (BIP39, 12 words)')), + ('ref_bip39_18_passwdgen', ([],'new refwallet passwd file chksum (BIP39, up to 18 words)')), + ('ref_bip39_24_passwdgen', ([],'new refwallet passwd file chksum (BIP39, up to 24 words)')), + ('ref_hex2bip39_24_passwdgen',([],'new refwallet passwd file chksum (hex-to-BIP39, up to 24 words)')), ) - def refaddrgen_legacy(self,wf,pf): - return self.addrgen(wf,pf=pf,check_ref=True,mmtype='legacy') + def call_addrgen(self,mmtype,pfx='addr'): + wf = self.get_file_with_ext('mmdat') + pf = joinpath(self.tmpdir,pwfile) + return getattr(self,pfx+'gen')(wf,pf=pf,check_ref=True,mmtype=mmtype) - def refaddrgen_compressed(self,wf,pf): - return self.addrgen(wf,pf=pf,check_ref=True,mmtype='compressed') + def refaddrgen_legacy(self): return self.call_addrgen('legacy') + def refaddrgen_compressed(self): return self.call_addrgen('compressed') + def refaddrgen_segwit(self): return self.call_addrgen('segwit') + def refaddrgen_bech32(self): return self.call_addrgen('bech32') - def refaddrgen_segwit(self,wf,pf): - return self.addrgen(wf,pf=pf,check_ref=True,mmtype='segwit') + def refkeyaddrgen_legacy(self): return self.call_addrgen('legacy','keyaddr') + def refkeyaddrgen_compressed(self): return self.call_addrgen('compressed','keyaddr') + def refkeyaddrgen_segwit(self): return self.call_addrgen('segwit','keyaddr') + def refkeyaddrgen_bech32(self): return self.call_addrgen('bech32','keyaddr') - def refaddrgen_bech32(self,wf,pf): - return self.addrgen(wf,pf=pf,check_ref=True,mmtype='bech32') + def pwgen(self,ftype,id_str,pwfmt=None,pwlen=None,extra_args=[],stdout=False): + wf = self.get_file_with_ext('mmdat') + pf = joinpath(self.tmpdir,pwfile) + pwfmt = (['--passwd-fmt='+pwfmt] if pwfmt else []) + pwlen = (['--passwd-len='+str(pwlen)] if pwlen else []) + return self.addrgen(wf, pf, + check_ref = True, + ftype = ftype, + id_str = id_str, + extra_args = pwfmt + pwlen + extra_args, + stdout = stdout ) - def refkeyaddrgen_legacy(self,wf,pf,mmtype='legacy'): - return self.keyaddrgen(wf,pf,check_ref=True) + def refpasswdgen(self): return self.pwgen('pass','alice@crypto.org') + def refpasswdgen_half(self): return self.pwgen('pass','alice@crypto.org',pwlen='h') + def ref_b32passwdgen(self): return self.pwgen('pass32','фубар@crypto.org','b32',17) - def refkeyaddrgen_compressed(self,wf,pf): - return self.keyaddrgen(wf,pf=pf,check_ref=True,mmtype='compressed') + def ref_hexpasswdgen(self): + pwlen = {'1':32,'2':48,'3':64}[self.test_name[-1]] + return self.pwgen('passhex','фубар@crypto.org','hex',pwlen) - def refkeyaddrgen_segwit(self,wf,pf): - return self.keyaddrgen(wf,pf=pf,check_ref=True,mmtype='segwit') + def ref_hexpasswdgen_half(self): + ea = ['--accept-defaults'] + return self.pwgen('passhex','фубар@crypto.org','hex','h',ea,stdout=True) - def refkeyaddrgen_bech32(self,wf,pf): - return self.keyaddrgen(wf,pf=pf,check_ref=True,mmtype='bech32') + def bip39pwgen(self,req_pw_len,pwfmt='bip39',stdout=False): + pwlen = min(req_pw_len,{'1':12,'2':18,'3':24}[self.test_name[-1]]) + ea = ['--accept-defaults'] + return self.pwgen('passbip39','фубар@crypto.org',pwfmt,pwlen,ea,stdout=stdout) - def refpasswdgen(self,wf,pf): - return self.addrgen(wf,pf,check_ref=True,ftype='pass',id_str='alice@crypto.org') - - def refpasswdgen_half(self,wf,pf): - ea = ['--passwd-len=h'] - return self.addrgen(wf,pf,check_ref=True,ftype='pass',id_str='alice@crypto.org',extra_args=ea) - - def ref_b32passwdgen(self,wf,pf): - ea = ['--passwd-fmt=b32','--passwd-len=17'] - return self.addrgen(wf,pf,check_ref=True,ftype='pass32',id_str='фубар@crypto.org',extra_args=ea) - - def ref_hexpasswdgen(self,wf,pf): - pw_len = {'1':32,'2':48,'3':64}[self.test_name[-1]] - ea = ['--passwd-fmt=hex','--passwd-len={}'.format(pw_len)] - return self.addrgen(wf,pf,check_ref=True,ftype='passhex',id_str='фубар@crypto.org',extra_args=ea) - - def ref_hexpasswdgen_half(self,wf,pf): - ea = ['--passwd-fmt=hex','--passwd-len=h','--accept-defaults'] - return self.addrgen(wf,pf,check_ref=True,ftype='passhex',id_str='фубар@crypto.org',extra_args=ea,stdout=1) - - def ref_bip39_passwdgen(self,wf,pf,req_pw_len,pw_fmt='bip39',stdout=False): - pw_len = min(req_pw_len,{'1':12,'2':18,'3':24}[self.test_name[-1]]) - ea = ['--passwd-fmt='+pw_fmt,'--passwd-len={}'.format(pw_len),'--accept-defaults'] - return self.addrgen( - wf,pf,check_ref=True,ftype='passbip39',id_str='фубар@crypto.org',extra_args=ea,stdout=stdout) - - def ref_bip39_12_passwdgen(self,wf,pf): return self.ref_bip39_passwdgen(wf,pf,12,stdout=True) - def ref_bip39_18_passwdgen(self,wf,pf): return self.ref_bip39_passwdgen(wf,pf,18,stdout=True) - def ref_bip39_24_passwdgen(self,wf,pf): return self.ref_bip39_passwdgen(wf,pf,24) - - def ref_hex2bip39_24_passwdgen(self,wf,pf): return self.ref_bip39_passwdgen(wf,pf,24,'hex2bip39') + def ref_bip39_12_passwdgen(self): return self.bip39pwgen(12,stdout=True) + def ref_bip39_18_passwdgen(self): return self.bip39pwgen(18,stdout=True) + def ref_bip39_24_passwdgen(self): return self.bip39pwgen(24) + def ref_hex2bip39_24_passwdgen(self): return self.bip39pwgen(24,'hex2bip39') diff --git a/test/test_py_d/ts_ref_altcoin.py b/test/test_py_d/ts_ref_altcoin.py index 319dd598..3eda6488 100755 --- a/test/test_py_d/ts_ref_altcoin.py +++ b/test/test_py_d/ts_ref_altcoin.py @@ -96,10 +96,9 @@ class TestSuiteRefAltcoin(TestSuiteRef,TestSuiteBase): wf = dfl_words_file e = ['--coin='+coin,'--testnet='+('0','1')[tn]] if token: e += ['--token='+token] - t = self.txsign(tf, wf, pf, + t = self.txsign(wf, tf, pf, save = False, has_label = True, - do_passwd = False, extra_desc = '({}{})'.format(token or coin,' testnet' if tn else ''), extra_opts = e ) ok_msg() diff --git a/test/test_py_d/ts_regtest.py b/test/test_py_d/ts_regtest.py index a5a6bb2a..75e8819f 100755 --- a/test/test_py_d/ts_regtest.py +++ b/test/test_py_d/ts_regtest.py @@ -28,9 +28,11 @@ from mmgen.opts import opt from mmgen.util import die,gmsg,write_data_to_file from mmgen.protocol import CoinProtocol from mmgen.addr import AddrList +from mmgen.seed import Wallet from test.common import * from test.test_py_d.common import * +dfl_wcls = Wallet rt_pw = 'abc-α' rt_data = { 'tx_fee': {'btc':'0.0001','bch':'0.001','ltc':'0.01'}, @@ -262,10 +264,10 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): def walletgen(self,user): t = self.spawn('mmgen-walletgen',['-q','-r0','-p1','--'+user]) - t.passphrase_new('new MMGen wallet',rt_pw) + t.passphrase_new('new '+dfl_wcls.desc,rt_pw) t.label() t.expect('move it to the data directory? (Y/n): ','y') - t.written_to_file('MMGen wallet') + t.written_to_file(capfirst(dfl_wcls.desc)) return t def walletgen_bob(self): return self.walletgen('bob') @@ -282,9 +284,10 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): if subseed_idx in self.usr_subsids[user]: return self.usr_subsids[user][subseed_idx] - fn = get_file_with_ext(self._user_dir(user),'mmdat') + icls = Wallet + fn = get_file_with_ext(self._user_dir(user),icls.ext) t = self.spawn('mmgen-tool',['get_subseed',subseed_idx,'wallet='+fn],no_msg=True) - t.passphrase('MMGen wallet',rt_pw) + t.passphrase(icls.desc,rt_pw) sid = t.read().strip()[:8] self.usr_subsids[user][subseed_idx] = sid return sid @@ -298,7 +301,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): (['--subwallet='+subseed_idx] if subseed_idx else []) + [addr_range], extra_desc='({})'.format(MMGenAddrType.mmtypes[mmtype].name)) - t.passphrase('MMGen wallet',rt_pw) + t.passphrase(dfl_wcls.desc,rt_pw) t.written_to_file('Addresses') ok_msg() t.skip_ok = True @@ -451,7 +454,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): fn = get_file_with_ext(self.tmpdir,'rawtx') t = self.spawn('mmgen-txsign',['-d',self.tmpdir,'--bob','--subseeds=127',fn]) t.view_tx('t') - t.passphrase('MMGen wallet',rt_pw) + t.passphrase(dfl_wcls.desc,rt_pw) t.do_comment(None) t.expect('(Y/n): ','y') t.written_to_file('Signed transaction') @@ -524,7 +527,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): add_comment = tx_label_jp, view = 't',save=True) - t.passphrase('MMGen wallet',rt_pw) + t.passphrase(dfl_wcls.desc,rt_pw) t.written_to_file('Signed transaction') self._do_confirm_send(t) s,exit_val = (('Transaction sent',0),("can't be included",1))[bad_locktime] @@ -597,7 +600,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): t.expect('OK? (Y/n): ','y') # fee OK? t.do_comment(False,has_label=has_label) if signed_tx: - t.passphrase('MMGen wallet',rt_pw) + t.passphrase(dfl_wcls.desc,rt_pw) t.written_to_file('Signed transaction') self.txsend_ui_common(t,caller='txdo',bogus_send=False,file_desc='Signed transaction') else: diff --git a/test/test_py_d/ts_seedsplit.py b/test/test_py_d/ts_seedsplit.py index a78f7d7f..cc388604 100755 --- a/test/test_py_d/ts_seedsplit.py +++ b/test/test_py_d/ts_seedsplit.py @@ -22,6 +22,7 @@ ts_seedsplit.py: Seed split/join tests for the test.py test suite from mmgen.globalvars import g from mmgen.opts import opt +from mmgen.seed import SeedSource,Wallet,IncogWallet,IncogWalletHex,IncogWalletHidden,SeedSourceEnc from test.test_py_d.ts_base import * @@ -29,6 +30,7 @@ ref_wf = 'test/ref/98831F3A.bip39' ref_sid = '98831F3A' wpasswd = 'abc' sh1_passwd = 'xyz' +dfl_wcls = Wallet class TestSuiteSeedSplit(TestSuiteBase): 'splitting and joining seeds' @@ -82,11 +84,11 @@ class TestSuiteSeedSplit(TestSuiteBase): def ss_walletgen(self): t = self.spawn('mmgen-walletgen', ['-r0','-p1']) - t.passphrase_new('new MMGen wallet',wpasswd) + t.passphrase_new('new '+dfl_wcls.desc,wpasswd) t.label() self.write_to_tmpfile('dfl.sid',t.expect_getend('Seed ID: ')) t.expect('move it to the data directory? (Y/n): ','y') - t.written_to_file('MMGen wallet') + t.written_to_file(capfirst(dfl_wcls.desc)) return t def ss_splt(self,tdir,ofmt,spec,add_args=[],wf=None,master=None): @@ -100,7 +102,7 @@ class TestSuiteSeedSplit(TestSuiteBase): + ([wf] if wf else []) + ([spec] if spec else [])) if not wf: - t.passphrase('MMGen wallet',wpasswd) + t.passphrase(dfl_wcls.desc,wpasswd) if spec: from mmgen.obj import SeedSplitSpecifier sss = SeedSplitSpecifier(spec) @@ -108,18 +110,14 @@ class TestSuiteSeedSplit(TestSuiteBase): else: pat = "master share #{}".format(master) t.expect(pat,regex=True) - if ofmt in ('w','incog','incog_hex','hincog'): - desc = {'w': 'MMGen wallet', - 'incog': 'incognito data', - 'incog_hex': 'hex incognito data', - 'hincog': 'hidden incognito data' }[ofmt] - t.hash_preset('new '+desc,'1') - t.passphrase_new('new '+desc,sh1_passwd) - if desc == 'hidden incognito data': + ocls = SeedSource.fmt_code_to_type(ofmt) + pw = issubclass(ocls,SeedSourceEnc) + if pw: + t.hash_preset('new '+ocls.desc,'1') + t.passphrase_new('new '+ocls.desc,sh1_passwd) + if ocls == IncogWalletHidden: t.hincog_create(1234) - t.written_to_file(capfirst(desc)) - else: - t.written_to_file('with checksum' if ofmt == 'mmhex' else 'data') + t.written_to_file(capfirst(ocls.desc)) return t def ss_join(self,tdir,ofmt,in_exts,add_args=[],sid=None,bad_invocation=False,master=None,id_str=None): @@ -137,26 +135,26 @@ class TestSuiteSeedSplit(TestSuiteBase): if bad_invocation: t.read() return t - w_enc = ( 'MMGen wallet' if 'mmdat' in in_exts else - 'incognito data' if 'mmincog' in in_exts else - 'hex incognito data' if 'mmincox' in in_exts else - 'hidden incognito data' if '-H' in add_args else '') - if 'incognito' in w_enc: - t.hash_preset(w_enc,'1') - if w_enc: - t.passphrase(w_enc,sh1_passwd) + icls = ( Wallet if 'mmdat' in in_exts + else IncogWallet if 'mmincog' in in_exts + else IncogWalletHex if 'mmincox' in in_exts + else IncogWalletHidden if '-H' in add_args + else None ) + if icls in (IncogWallet,IncogWalletHex,IncogWalletHidden): + t.hash_preset(icls.desc,'1') + if icls: + t.passphrase(icls.desc,sh1_passwd) if master: fs = "master share #{}, split id '{}', share count {}" - pat = fs.format(master,id_str or 'default',len(shares)+('hidden' in w_enc)) + pat = fs.format(master,id_str or 'default',len(shares)+(icls==IncogWalletHidden)) t.expect(pat,regex=True) sid_cmp = t.expect_getend('Joined Seed ID: ') cmp_or_die(sid,sid_cmp) - if ofmt == 'w': - t.hash_preset('new MMGen wallet','1') - t.passphrase_new('new MMGen wallet',wpasswd) - t.written_to_file('MMGen wallet') - else: - t.written_to_file('with checksum' if ofmt == 'mmhex' else 'data') + ocls = SeedSource.fmt_code_to_type(ofmt) + if ocls == Wallet: + t.hash_preset('new '+ocls.desc,'1') + t.passphrase_new('new '+ocls.desc,wpasswd) + t.written_to_file(capfirst(ocls.desc)) return t def get_hincog_arg(self,tdir,suf='-default-2of2'): diff --git a/test/test_py_d/ts_shared.py b/test/test_py_d/ts_shared.py index 4e05b3de..6b665ec7 100755 --- a/test/test_py_d/ts_shared.py +++ b/test/test_py_d/ts_shared.py @@ -24,6 +24,7 @@ import os from mmgen.globalvars import g from mmgen.opts import opt from mmgen.util import ymsg +from mmgen.seed import SeedSource,SeedSourceEnc,Brainwallet,Wallet,IncogWalletHidden from test.test_py_d.common import * from test.common import * @@ -144,20 +145,23 @@ class TestSuiteShared(object): t.written_to_file('Signed transaction' + (' #' + tnum if tnum else ''), oo=True) return t - def txsign( self, txfile, wf, + def txsign( self, wf, txfile, pf = '', bumpf = '', save = True, has_label = False, - do_passwd = True, extra_opts = [], extra_desc = '', - view = 'n'): + view = 'n', + dfl_wallet = False ): opts = extra_opts + ['-d',self.tmpdir,txfile] + ([wf] if wf else []) t = self.spawn('mmgen-txsign', opts, extra_desc) t.license() t.view_tx(view) - if do_passwd: t.passphrase('MMGen wallet',self.wpasswd) + wcls = Wallet if dfl_wallet else SeedSource.ext_to_type(get_extension(wf)) + pw = issubclass(wcls,SeedSourceEnc) and wcls != Brainwallet + if pw: + t.passphrase(wcls.desc,self.wpasswd) if save: self.txsign_end(t,has_label=has_label) else: @@ -169,26 +173,35 @@ class TestSuiteShared(object): def ref_brain_chk(self,bw_file=ref_bw_file): wf = joinpath(ref_dir,bw_file) add_args = ['-l{}'.format(self.seed_len), '-p'+ref_bw_hash_preset] - return self.walletchk(wf,pf=None,add_args=add_args, - desc='brainwallet',sid=self.ref_bw_seed_id) + return self.walletchk(wf,pf=None,add_args=add_args,sid=self.ref_bw_seed_id) - def walletchk(self,wf,pf,desc='MMGen wallet',add_args=[],sid=None,pw=False,extra_desc=''): - args = [] + def walletchk(self,wf,pf,wcls=None,add_args=[],sid=None,extra_desc='',dfl_wallet=False): hp = self.hash_preset if hasattr(self,'hash_preset') else '1' - wf_arg = [wf] if wf else [] + wcls = wcls or SeedSource.ext_to_type(get_extension(wf)) t = self.spawn('mmgen-walletchk', - add_args+args+['-p',hp]+wf_arg, + ([] if dfl_wallet else ['-i',wcls.fmt_codes[0]]) + + add_args + ['-p',hp] + + ([wf] if wf else []), extra_desc=extra_desc) - if desc != 'hidden incognito data': - t.expect("Getting {} from file '".format(desc)) + if wcls != IncogWalletHidden: + t.expect("Getting {} from file '".format(wcls.desc)) + pw = issubclass(wcls,SeedSourceEnc) and wcls != Brainwallet if pw: - t.passphrase(desc,self.wpasswd) + t.passphrase(wcls.desc,self.wpasswd) t.expect(['Passphrase is OK', 'Passphrase.* are correct'],regex=True) - chk = t.expect_getend('Valid {} for Seed ID '.format(desc))[:8] + chk = t.expect_getend('Valid {} for Seed ID '.format(wcls.desc))[:8] if sid: cmp_or_die(chk,sid) return t - def addrgen(self,wf,pf=None,check_ref=False,ftype='addr',id_str=None,extra_args=[],mmtype=None,stdout=False): + def addrgen(self,wf, + pf = None, + check_ref = False, + ftype = 'addr', + id_str = None, + extra_args = [], + mmtype = None, + stdout = False, + dfl_wallet = False ): passgen = ftype[:4] == 'pass' if not mmtype and not passgen: mmtype = self.segwit_mmtype @@ -202,7 +215,8 @@ class TestSuiteShared(object): [getattr(self,'{}_idx_list'.format(cmd_pfx))], extra_desc='({})'.format(mmtype) if mmtype in ('segwit','bech32') else '') t.license() - t.passphrase('MMGen wallet',self.wpasswd) + wcls = Wallet if dfl_wallet else SeedSource.ext_to_type(get_extension(wf)) + t.passphrase(wcls.desc,self.wpasswd) t.expect('Passphrase is OK') desc = ('address','password')[passgen] chk = t.expect_getend(r'Checksum for {} data .*?: '.format(desc),regex=True) @@ -223,7 +237,8 @@ class TestSuiteShared(object): ([],['--type='+str(mmtype)])[bool(mmtype)] + args, extra_desc='({})'.format(mmtype) if mmtype in ('segwit','bech32') else '') t.license() - t.passphrase('MMGen wallet',self.wpasswd) + wcls = SeedSource.ext_to_type(get_extension(wf)) + t.passphrase(wcls.desc,self.wpasswd) chk = t.expect_getend(r'Checksum for key-address data .*?: ',regex=True) if check_ref: chk_ref = self.chk_data[self.test_name][self.fork][g.testnet] diff --git a/test/test_py_d/ts_wallet.py b/test/test_py_d/ts_wallet.py index 0041fc6c..0ff4876b 100755 --- a/test/test_py_d/ts_wallet.py +++ b/test/test_py_d/ts_wallet.py @@ -22,6 +22,7 @@ ts_wallet.py: Wallet conversion tests for the test.py test suite import os from mmgen.opts import opt +from mmgen.seed import * from test.test_py_d.common import * from test.test_py_d.ts_base import * from test.test_py_d.ts_shared import * @@ -90,77 +91,55 @@ class TestSuiteWalletConv(TestSuiteBase,TestSuiteShared): def ref_wallet_conv(self): wf = joinpath(ref_dir,self.sources[str(self.seed_len)]['ref_wallet']) - return self.walletconv_in(wf,'MMGen wallet',pw=True,oo=True) + return self.walletconv_in(wf,oo=True) - def ref_mn_conv(self,ext='mmwords',desc='MMGen native mnemonic data'): + def ref_mn_conv(self,ext='mmwords'): wf = joinpath(ref_dir,self.seed_id+'.'+ext) - return self.walletconv_in(wf,desc,oo=True) + return self.walletconv_in(wf,oo=True) - def ref_bip39_conv(self): - return self.ref_mn_conv(ext='bip39',desc='BIP39 mnemonic data') - - def ref_seed_conv(self): - return self.ref_mn_conv(ext='mmseed',desc='Seed data') - - def ref_hex_conv(self): - return self.ref_mn_conv(ext='mmhex',desc='Hexadecimal seed data with checksum') - - def ref_plainhex_conv(self): - return self.ref_mn_conv(ext='hex',desc='Plain hexadecimal seed data') + def ref_bip39_conv(self): return self.ref_mn_conv(ext='bip39') + def ref_seed_conv(self): return self.ref_mn_conv(ext='mmseed') + def ref_hex_conv(self): return self.ref_mn_conv(ext='mmhex') + def ref_plainhex_conv(self): return self.ref_mn_conv(ext='hex') def ref_brain_conv(self): uopts = ['-i','b','-p','1','-l',str(self.seed_len)] - return self.walletconv_in(None,'brainwallet',uopts,oo=True) + return self.walletconv_in(None,uopts,oo=True,icls=Brainwallet) - def ref_incog_conv(self,wfk='ic_wallet',in_fmt='i',desc='incognito data'): + def ref_incog_conv(self,wfk='ic_wallet',in_fmt='i'): uopts = ['-i',in_fmt,'-p','1','-l',str(self.seed_len)] wf = joinpath(ref_dir,self.sources[str(self.seed_len)][wfk]) - return self.walletconv_in(wf,desc,uopts,oo=True,pw=True) + return self.walletconv_in(wf,uopts,oo=True) def ref_incox_conv(self): - return self.ref_incog_conv(in_fmt='xi',wfk='ic_wallet_hex',desc='hex incognito data') + return self.ref_incog_conv(in_fmt='xi',wfk='ic_wallet_hex') def ref_hincog_conv(self,wfk='hic_wallet',add_uopts=[]): ic_f = joinpath(ref_dir,self.sources[str(self.seed_len)][wfk]) uopts = ['-i','hi','-p','1','-l',str(self.seed_len)] + add_uopts hi_opt = ['-H','{},{}'.format(ic_f,ref_wallet_incog_offset)] - return self.walletconv_in(None,'hidden incognito data',uopts+hi_opt,oo=True,pw=True) + return self.walletconv_in(None,uopts+hi_opt,oo=True,icls=IncogWalletHidden) def ref_hincog_conv_old(self): return self.ref_hincog_conv(wfk='hic_wallet_old',add_uopts=['-O']) - def ref_wallet_conv_out(self): - return self.walletconv_out('MMGen wallet','w',pw=True) - - def ref_mn_conv_out(self): - return self.walletconv_out('MMGen native mnemonic data','mn') - - def ref_bip39_conv_out(self): - return self.walletconv_out('BIP39 mnemonic data','bip39') - - def ref_seed_conv_out(self): - return self.walletconv_out('seed data','seed') - - def ref_hex_conv_out(self): - return self.walletconv_out('hexadecimal seed data with checksum','hexseed') - - def ref_plainhex_conv_out(self): - return self.walletconv_out('plain hexadecimal seed data','hex') - - def ref_incog_conv_out(self): - return self.walletconv_out('incognito data',out_fmt='i',pw=True) - - def ref_incox_conv_out(self): - return self.walletconv_out('hex incognito data',out_fmt='xi',pw=True) + def ref_wallet_conv_out(self): return self.walletconv_out('w') + def ref_mn_conv_out(self): return self.walletconv_out('mn') + def ref_bip39_conv_out(self): return self.walletconv_out('bip39') + def ref_seed_conv_out(self): return self.walletconv_out('seed') + def ref_hex_conv_out(self): return self.walletconv_out('hexseed') + def ref_plainhex_conv_out(self): return self.walletconv_out('hex') + def ref_incog_conv_out(self): return self.walletconv_out('i') + def ref_incox_conv_out(self): return self.walletconv_out('xi') def ref_hincog_conv_out(self,ic_f=None): - if not ic_f: ic_f = joinpath(self.tmpdir,hincog_fn) + if not ic_f: + ic_f = joinpath(self.tmpdir,hincog_fn) hi_parms = '{},{}'.format(ic_f,ref_wallet_incog_offset) sl_parm = '-l' + str(self.seed_len) - return self.walletconv_out( 'hidden incognito data','hi', + return self.walletconv_out('hi', uopts = ['-J',hi_parms,sl_parm], - uopts_chk = ['-H',hi_parms,sl_parm], - pw = True ) + uopts_chk = ['-H',hi_parms,sl_parm] ) def ref_hincog_blkdev_conv_out(self): def do_run(cmd): @@ -185,58 +164,61 @@ class TestSuiteWalletConv(TestSuiteBase,TestSuiteShared): return 'ok' # wallet conversion tests - def walletconv_in(self,infile,desc,uopts=[],pw=False,oo=False): - opts = ['-d',self.tmpdir,'-o','words',self.usr_rand_arg] + def walletconv_in(self,infile,uopts=[],oo=False,icls=None): + ocls = MMGenMnemonic + opts = ['-d',self.tmpdir,'-o',ocls.fmt_codes[0],self.usr_rand_arg] if_arg = [infile] if infile else [] d = '(convert)' t = self.spawn('mmgen-walletconv',opts+uopts+if_arg,extra_desc=d) t.license() - if desc == 'brainwallet': + icls = icls or SeedSource.ext_to_type(get_extension(infile)) + if icls == Brainwallet: t.expect('Enter brainwallet: ',ref_wallet_brainpass+'\n') + pw = issubclass(icls,SeedSourceEnc) and icls != Brainwallet if pw: - t.passphrase(desc,self.wpasswd) + t.passphrase(icls.desc,self.wpasswd) if self.test_name[:19] == 'ref_hincog_conv_old': t.expect('Is the Seed ID correct? (Y/n): ','\n') else: t.expect(['Passphrase is OK',' are correct']) - # Output - wf = t.written_to_file('MMGen native mnemonic data',oo=oo) + wf = t.written_to_file(capfirst(ocls.desc),oo=oo) t.p.wait() # back check of result msg('' if opt.profile else ' OK') return self.walletchk( wf, pf = None, extra_desc = '(check)', - desc = 'MMGen native mnemonic data', sid = self.seed_id ) - def walletconv_out(self,desc,out_fmt='w',uopts=[],uopts_chk=[],pw=False): + def walletconv_out(self,out_fmt='w',uopts=[],uopts_chk=[]): + wcls = SeedSource.fmt_code_to_type(out_fmt) opts = ['-d',self.tmpdir,'-p1','-o',out_fmt] + uopts infile = joinpath(ref_dir,self.seed_id+'.mmwords') t = self.spawn('mmgen-walletconv',[self.usr_rand_arg]+opts+[infile],extra_desc='(convert)') add_args = ['-l{}'.format(self.seed_len)] t.license() + pw = issubclass(wcls,SeedSourceEnc) and wcls != Brainwallet if pw: - t.passphrase_new('new '+desc,self.wpasswd) + t.passphrase_new('new '+wcls.desc,self.wpasswd) t.usr_rand(self.usr_rand_chars) - if ' '.join(desc.split()[-2:]) == 'incognito data': + if wcls in (IncogWallet,IncogWalletHex,IncogWalletHidden): for i in (1,2,3): t.expect('Generating encryption key from OS random data ') - if desc == 'hidden incognito data': + if wcls == IncogWalletHidden: t.hincog_create(hincog_bytes) - if out_fmt == 'w': t.label() - wf = t.written_to_file(capfirst(desc),oo=True) + if out_fmt == 'w': + t.label() + wf = t.written_to_file(capfirst(wcls.desc),oo=True) pf = None - if desc == 'hidden incognito data': + if wcls == IncogWalletHidden: add_args += uopts_chk wf = None msg('' if opt.profile else ' OK') return self.walletchk( wf, pf = pf, - pw = pw, - desc = desc, + wcls = wcls, extra_desc = '(check)', sid = self.seed_id, add_args = add_args )