test-release.sh, gentest.py, tooltest.py: cleanups

This commit is contained in:
The MMGen Project 2019-11-02 09:34:21 +00:00
commit 5663ca0712
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
3 changed files with 92 additions and 77 deletions

View file

@ -89,21 +89,24 @@ if not 1 <= len(cmd_args) <= 2: opts.usage()
addr_type = MMGenAddrType(opt.type or g.proto.dfl_mmtype)
from collections import namedtuple
ep = namedtuple('external_prog_output',['wif','addr','vk'])
from subprocess import run,PIPE,DEVNULL
def get_cmd_output(cmd,input=None):
return run(cmd,input=input,stdout=PIPE,stderr=DEVNULL).stdout.decode().splitlines()
def ethkey_sec2addr(sec):
o = get_cmd_output(['ethkey','info',sec])
return (o[0].split()[1],o[-1].split()[1])
return ep(o[0].split()[1],o[-1].split()[1],None)
def keyconv_sec2addr(sec):
o = get_cmd_output(['keyconv','-C',g.coin,sec.wif])
return (o[1].split()[1],o[0].split()[1])
return ep(o[1].split()[1],o[0].split()[1],None)
def zcash_mini_sec2addr(sec):
o = get_cmd_output(['zcash-mini','-key','-simple'],input=(sec.wif+'\n').encode())
return (o[1],o[0],o[-1])
return ep(o[1],o[0],o[-1])
def pycoin_sec2addr(sec):
coin = ci.external_tests['testnet']['pycoin'][g.coin] if g.testnet else g.coin
@ -120,11 +123,11 @@ def pycoin_sec2addr(sec):
addr = network.address.for_p2pkh_wit(hash160_c)
else:
addr = key.address()
return (key.wif(),addr)
return ep(key.wif(),addr,None)
def moneropy_sec2addr(sec):
sk_t,vk_t,addr_t = mp_acc.account_from_spend_key(sec) # VERY slow!
return (sk_t,addr_t,vk_t)
return ep(sk_t,addr_t,vk_t)
# pycoin/networks/all.py pycoin/networks/legacy_networks.py
def init_external_prog():
@ -150,7 +153,7 @@ def init_external_prog():
try:
from pycoin.networks.registry import network_for_netcode
except:
raise ImportError("Unable to import pycoin.networks.registry Is pycoin installed and up-to-date?")
raise ImportError("Unable to import pycoin.networks.registry. Is pycoin installed on your system?")
ext_sec2addr = pycoin_sec2addr
ext_prog = 'pycoin'
elif test_support('moneropy'):
@ -172,15 +175,22 @@ def init_external_prog():
b_desc = ext_prog
b = 'ext'
def test_equal(a_addr,b_addr,sec,wif,a,b):
def test_equal(a_addr,b_addr,in_bytes,sec,wif,a,b):
if a_addr != b_addr:
qmsg_r(red('\nERROR: Values do not match!'))
die(3,"""
sec key : {}
WIF key : {}
{a:10}: {}
{b:10}: {}
""".format(sec,wif,a_addr,b_addr,pnm=g.proj_name,a=kg_a.desc,b=b_desc).rstrip())
fs = """
{i:{w}}: {}
{s:{w}}: {}
{W:{w}}: {}
{a:{w}}: {}
{b:{w}}: {}
"""
die(3,
red('\nERROR: Values do not match!')
+ fs.format(
in_bytes.hex(), sec, wif, a_addr, b_addr,
i='input', s='sec key', W='WIF key', a=kg_a.desc, b=b_desc,
w=max(len(e) for e in (kg_a.desc,b_desc)) + 1
).rstrip())
def compare_test():
for k in ('segwit','compressed'):
@ -195,7 +205,7 @@ def compare_test():
global last_t
last_t = time.time()
A = kg_a.desc
B = ext_prog if b == 'ext' else kg_b.desc
B = b_desc
if A == B:
msg('skipping - generation methods A and B are the same ({})'.format(A))
return
@ -208,24 +218,26 @@ def compare_test():
qmsg_r('\rRound {}/{} '.format(i+1,trounds))
last_t = time.time()
sec = PrivKey(in_bytes,compressed=addr_type.compressed,pubkey_type=addr_type.pubkey_type)
ph = kg_a.to_pubhex(sec)
a_addr = ag.to_addr(ph)
a_vk = ag.to_viewkey(ph) if 'viewkey' in addr_type.extra_attrs else None
a_ph = kg_a.to_pubhex(sec)
a_addr = ag.to_addr(a_ph)
a_vk = None
if b == 'ext':
if 'viewkey' in addr_type.extra_attrs:
b_wif,b_addr,b_vk = ext_sec2addr(sec)
test_equal(a_vk,b_vk,sec,sec.wif,a,b)
else:
b_wif,b_addr = ext_sec2addr(sec)
test_equal(sec.wif,b_wif,sec,sec.wif,a,b)
ret = ext_sec2addr(sec)
tinfo = (in_bytes,sec,sec.wif,a,ext_prog)
test_equal(sec.wif,ret.wif,*tinfo)
test_equal(a_addr,ret.addr,*tinfo)
if ret.vk:
a_vk = ag.to_viewkey(a_ph)
test_equal(a_vk,ret.vk,*tinfo)
else:
b_addr = ag.to_addr(kg_b.to_pubhex(sec))
tinfo = (in_bytes,sec,sec.wif,a,b)
test_equal(a_addr,b_addr,*tinfo)
vmsg(ct_fs.format(b=in_bytes.hex(),k=sec.wif,v=a_vk,a=a_addr))
test_equal(a_addr,b_addr,sec,sec.wif,a,ext_prog if b == 'ext' else b)
qmsg_r('\rRound {}/{} '.format(n+1,trounds))
ct_fs = ( '\ninput: {b}\n%-9s {k}\naddr: {a}\n',
'\ninput: {b}\n%-9s {k}\nvkey: {v}\naddr: {a}\n')[
'\ninput: {b}\n%-9s {k}\nviewkey: {v}\naddr: {a}\n')[
'viewkey' in addr_type.extra_attrs] % (addr_type.wif_label + ':')
# test some important private key edge cases:
@ -278,7 +290,8 @@ def dump_test():
die(2,'\nInvalid {}net WIF address in dump file: {}'.format(('main','test')[g.testnet],wif))
b_addr = ag.to_addr(kg_a.to_pubhex(sec))
vmsg('\nwif: {}\naddr: {}\n'.format(wif,b_addr))
test_equal(a_addr,b_addr,sec,wif,3,a)
tinfo = (bytes.fromhex(sec),sec,wif,3,a)
test_equal(a_addr,b_addr,*tinfo)
qmsg(green(('\n','')[bool(opt.verbose)] + 'OK'))
# begin execution

View file

@ -222,7 +222,7 @@ i_hash='Internal hash function implementations'
s_hash='Testing internal hash function implementations'
t_hash="
$python test/hashfunc.py sha256 $rounds_max
$python test/hashfunc.py sha512 $rounds_max # native sha512 not used by MMGen
$python test/hashfunc.py sha512 $rounds_max # native sha512 - not used by MMGen
$python test/hashfunc.py keccak $rounds_max
"
f_hash='Hash function tests complete'
@ -278,7 +278,7 @@ t_alts="
$gentest_py --coin=zec 2:ext $rounds
$gentest_py --coin=zec --type=zcash_z 2:ext $rounds_mid
$gentest_py --all 2:zcash_mini $rounds_mid
$gentest_py --all 2:moneropy $rounds_min
$gentest_py --all 2:moneropy $rounds_mid # very slow, be patient!
"
}
@ -449,23 +449,25 @@ f_tool='tooltest tests completed'
i_gen='Gentest'
s_gen="The following tests will run '$gentest_py' on mainnet and testnet for all supported coins"
t_gen="
$gentest_py -q 2 $REFDIR/btcwallet.dump
$gentest_py -q --type=segwit 2 $REFDIR/btcwallet-segwit.dump
$gentest_py -q --type=bech32 2 $REFDIR/btcwallet-bech32.dump
$gentest_py -q 1:2 $rounds
$gentest_py -q --type=segwit 1:2 $rounds
$gentest_py -q --type=bech32 1:2 $rounds
$gentest_py -q --testnet=1 2 $REFDIR/btcwallet-testnet.dump
$gentest_py -q --testnet=1 1:2 $rounds
$gentest_py -q --testnet=1 --type=segwit 1:2 $rounds
$gentest_py -q --coin=ltc 2 $REFDIR/litecoin/ltcwallet.dump
$gentest_py -q --coin=ltc --type=segwit 2 $REFDIR/litecoin/ltcwallet-segwit.dump
$gentest_py -q --coin=ltc --type=bech32 2 $REFDIR/litecoin/ltcwallet-bech32.dump
$gentest_py -q --coin=ltc 1:2 $rounds
$gentest_py -q --coin=ltc --type=segwit 1:2 $rounds
$gentest_py -q --coin=ltc --testnet=1 2 $REFDIR/litecoin/ltcwallet-testnet.dump
$gentest_py -q --coin=ltc --testnet=1 1:2 $rounds
$gentest_py -q --coin=ltc --testnet=1 --type=segwit 1:2 $rounds
# wallet dumps:
$gentest_py 2 $REFDIR/btcwallet.dump
$gentest_py --type=segwit 2 $REFDIR/btcwallet-segwit.dump
$gentest_py --type=bech32 2 $REFDIR/btcwallet-bech32.dump
$gentest_py --testnet=1 2 $REFDIR/btcwallet-testnet.dump
$gentest_py --coin=ltc 2 $REFDIR/litecoin/ltcwallet.dump
$gentest_py --coin=ltc --type=segwit 2 $REFDIR/litecoin/ltcwallet-segwit.dump
$gentest_py --coin=ltc --type=bech32 2 $REFDIR/litecoin/ltcwallet-bech32.dump
$gentest_py --coin=ltc --testnet=1 2 $REFDIR/litecoin/ltcwallet-testnet.dump
# libsecp256k1 vs python-ecdsa:
$gentest_py 1:2 $rounds
$gentest_py --type=segwit 1:2 $rounds
$gentest_py --type=bech32 1:2 $rounds
$gentest_py --testnet=1 1:2 $rounds
$gentest_py --testnet=1 --type=segwit 1:2 $rounds
$gentest_py --coin=ltc 1:2 $rounds
$gentest_py --coin=ltc --type=segwit 1:2 $rounds
$gentest_py --coin=ltc --testnet=1 1:2 $rounds
$gentest_py --coin=ltc --testnet=1 --type=segwit 1:2 $rounds
"
f_gen='gentest tests completed'

View file

@ -182,17 +182,17 @@ if opt.list_names:
from mmgen.tx import is_wif,is_coin_addr
msg_w = 33
msg_w = 35
def test_msg(m):
m2 = 'Testing {}'.format(m)
msg_r(green(m2+'\n') if opt.verbose else '{:{w}}'.format(m2,w=msg_w+8))
maybe_compressed = ('','compressed')['C' in g.proto.mmtypes]
maybe_segwit = ('','segwit')['S' in g.proto.mmtypes]
maybe_bech32 = ('','bech32')['B' in g.proto.mmtypes]
maybe_type_compressed = ([],['--type=compressed'])['C' in g.proto.mmtypes]
maybe_type_segwit = ([],['--type=segwit'])['S' in g.proto.mmtypes]
maybe_type_bech32 = ([],['--type=bech32'])['B' in g.proto.mmtypes]
compressed = ('','compressed')['C' in g.proto.mmtypes]
segwit = ('','segwit')['S' in g.proto.mmtypes]
bech32 = ('','bech32')['B' in g.proto.mmtypes]
type_compressed_arg = ([],['--type=compressed'])['C' in g.proto.mmtypes]
type_segwit_arg = ([],['--type=segwit'])['S' in g.proto.mmtypes]
type_bech32_arg = ([],['--type=bech32'])['B' in g.proto.mmtypes]
class MMGenToolTestUtils(object):
@ -291,38 +291,38 @@ class MMGenToolTestCmds(object):
# Cryptocoin
def randwif(self,name):
for n,k in enumerate(['',maybe_compressed]):
for n,k in enumerate(['',compressed]):
ao = ['--type='+k] if k else []
ret = tu.run_cmd_out(name,add_opts=ao,Return=True,fn_idx=n+1)
ok_or_die(ret,is_wif,'WIF key')
def randpair(self,name):
for n,k in enumerate(['',maybe_compressed,maybe_segwit,maybe_bech32]):
for n,k in enumerate(['',compressed,segwit,bech32]):
ao = ['--type='+k] if k else []
wif,addr = tu.run_cmd_out(name,add_opts=ao,Return=True,fn_idx=n+1).split()
wif,addr = tu.run_cmd_out(name,add_opts=ao,Return=True,fn_idx=n+1,literal=True).split()
ok_or_die(wif,is_wif,'WIF key',skip_ok=True)
ok_or_die(addr,is_coin_addr,'Coin address')
def wif2addr(self,name,f1,f2,f3,f4):
for n,f,k,m in (
(1,f1,'',''),
(2,f2,'',maybe_compressed),
(3,f3,maybe_segwit,''),
(4,f4,maybe_bech32,'')
for n,f,k in (
(1,f1,''),
(2,f2,compressed),
(3,f3,segwit),
(4,f4,bech32)
):
ao = ['--type='+k] if k else []
wif = read_from_file(f).split()[0]
tu.run_cmd_out(name,wif,add_opts=ao,fn_idx=n,extra_msg=m)
tu.run_cmd_out(name,wif,add_opts=ao,fn_idx=n)
def wif2hex(self,name,f1,f2,f3,f4):
for n,f,m in (
(1,f1,''),
(2,f2,maybe_compressed),
(3,f3,'{} for {}'.format(maybe_compressed,maybe_segwit)),
(4,f4,'{} for {}'.format(maybe_compressed,maybe_bech32))
(2,f2,compressed),
(3,f3,'{} for {}'.format(compressed or 'uncompressed',segwit or 'p2pkh')),
(4,f4,'{} for {}'.format(compressed or 'uncompressed',bech32 or 'p2pkh'))
):
wif = read_from_file(f).split()[0]
tu.run_cmd_out(name,wif,fn_idx=n,extra_msg=m)
def privhex2addr(self,name,f1,f2,f3,f4):
keys = [read_from_file(f).rstrip() for f in (f1,f2,f3,f4)]
for n,k in enumerate(('',maybe_compressed,maybe_segwit,maybe_bech32)):
for n,k in enumerate(('',compressed,segwit,bech32)):
ao = ['--type='+k] if k else []
ret = tu.run_cmd(name,[keys[n]],add_opts=ao).rstrip()
iaddr = read_from_tmpfile(cfg,'randpair{}.out'.format(n+1)).split()[-1]
@ -330,34 +330,34 @@ class MMGenToolTestCmds(object):
cmp_or_die(iaddr,ret)
ok()
def hex2wif(self,name,f1,f2,f3,f4):
for n,fi,fo,k in ((1,f1,f2,''),(2,f3,f4,maybe_compressed)):
for n,fi,fo,k in ((1,f1,f2,''),(2,f3,f4,compressed)):
ao = ['--type='+k] if k else []
ret = tu.run_cmd_chk(name,fi,fo,add_opts=ao)
def addr2pubhash(self,name,f1,f2,f3,f4):
for n,f,m,ao in (
(1,f1,'',[]),
(2,f2,'from {}'.format(maybe_compressed),[]),
(4,f4,'',maybe_type_bech32),
(2,f2,'from {}'.format(compressed or 'uncompressed'),[]),
(4,f4,'',type_bech32_arg),
):
addr = read_from_file(f).split()[-1]
tu.run_cmd_out(name,addr,fn_idx=n,add_opts=ao,extra_msg=m)
def pubhash2addr(self,name,f1,f2,f3,f4,f5,f6,f7,f8):
for n,fi,fo,m,ao in (
(1,f1,f2,'',[]),
(2,f3,f4,'from {}'.format(maybe_compressed),[]),
(4,f7,f8,'',maybe_type_bech32)
(2,f3,f4,'from {}'.format(compressed or 'uncompressed'),[]),
(4,f7,f8,'',type_bech32_arg)
):
tu.run_cmd_chk(name,fi,fo,add_opts=ao,extra_msg=m)
def privhex2pubhex(self,name,f1,f2,f3): # from Hex2wif
addr = read_from_file(f3).strip()
tu.run_cmd_out(name,addr,add_opts=maybe_type_compressed,fn_idx=3) # what about uncompressed?
tu.run_cmd_out(name,addr,add_opts=type_compressed_arg,fn_idx=3) # what about uncompressed?
def pubhex2redeem_script(self,name,f1,f2,f3): # from above
addr = read_from_file(f3).strip()
tu.run_cmd_out(name,addr,add_opts=maybe_type_segwit,fn_idx=3)
tu.run_cmd_out(name,addr,add_opts=type_segwit_arg,fn_idx=3)
type_save = opt.type
opt.type = 'segwit'
rs = read_from_tmpfile(cfg,'privhex2pubhex3.out').strip()
tu.run_cmd_out('pubhex2addr',rs,add_opts=maybe_type_segwit,fn_idx=3,hush=True)
tu.run_cmd_out('pubhex2addr',rs,add_opts=type_segwit_arg,fn_idx=3,hush=True)
opt.type = type_save
addr1 = read_from_tmpfile(cfg,'pubhex2addr3.out').strip()
addr2 = read_from_tmpfile(cfg,'randpair3.out').split()[1]
@ -365,16 +365,16 @@ class MMGenToolTestCmds(object):
ok()
def wif2redeem_script(self,name,f1,f2,f3): # compare output with above
wif = read_from_file(f3).split()[0]
ret1 = tu.run_cmd_out(name,wif,add_opts=maybe_type_segwit,fn_idx=3,Return=True)
ret1 = tu.run_cmd_out(name,wif,add_opts=type_segwit_arg,fn_idx=3,Return=True)
ret2 = read_from_tmpfile(cfg,'pubhex2redeem_script3.out').strip()
cmp_or_die(ret1,ret2)
ok()
def wif2segwit_pair(self,name,f1,f2): # does its own checking, so just run
wif = read_from_file(f2).split()[0]
tu.run_cmd_out(name,wif,add_opts=maybe_type_segwit,fn_idx=2)
tu.run_cmd_out(name,wif,add_opts=type_segwit_arg,fn_idx=2)
def pubhex2addr(self,name,f1,f2,f3):
addr = read_from_file(f3).strip()
tu.run_cmd_out(name,addr,add_opts=maybe_type_segwit,fn_idx=3)
tu.run_cmd_out(name,addr,add_opts=type_segwit_arg,fn_idx=3)
def pipetest(self,name,f1,f2,f3):
wif = read_from_file(f3).split()[0]