Browse Source

scrambletest.py: code cleanups

MMGen 5 years ago
parent
commit
e12eb13cea
2 changed files with 65 additions and 55 deletions
  1. 2 1
      mmgen/addr.py
  2. 63 54
      test/scrambletest.py

+ 2 - 1
mmgen/addr.py

@@ -340,7 +340,8 @@ class AddrListIDStr(str,Hilite):
 			bc = (g.proto.base_coin,g.coin)[g.proto.base_coin=='ETH']
 			mt = addrlist.al_id.mmtype
 			ret = '{}{}{}[{}]'.format(addrlist.al_id.sid,('-'+bc,'')[bc=='BTC'],('-'+mt,'')[mt in ('L','E')],s)
-			dmsg_sc('id_str',ret[8:].split('[')[0])
+
+		dmsg_sc('id_str',ret[8:].split('[')[0])
 
 		return str.__new__(cls,ret)
 

+ 63 - 54
test/scrambletest.py

@@ -57,66 +57,75 @@ if not opt.system:
 	os.environ['PYTHONPATH'] = repo_root
 
 # TODO: add vectors for 'mmgen-passgen'
-from collections import OrderedDict
-test_data = OrderedDict([
-#                  SCRAMBLED_SEED[:8] SCRAMBLE_KEY      ID_STR LBL          FIRST ADDR
-('btc',           ('456d7f5f1c4bfe3b','(none)',         '',    '',          '1MU7EdgqYy9JX35L25hR6CmXXcSEBDAwyv')),
-('btc_compressed',('bf98a4af5464a4ef','compressed',     '-C',  'COMPRESSED','1F97Jd89wwmu4ELadesAdGDzg3d8Y6j5iP')),
-('btc_segwit',    ('b56962d829ffc678','segwit',         '-S',  'SEGWIT',    '36TvVzU5mxSjJ3D9qKAmYzCV7iUqtTDezF')),
-('btc_bech32',    ('d09eea818f9ad17f','bech32',         '-B',  'BECH32',    'bc1q8snv94j6959y3gkqv4gku0cm5mersnpucsvw5z')),
-('bch',           ('456d7f5f1c4bfe3b','(none)',         '',    '',          '1MU7EdgqYy9JX35L25hR6CmXXcSEBDAwyv')),
-('bch_compressed',('bf98a4af5464a4ef','compressed',     '-C',  'COMPRESSED','1F97Jd89wwmu4ELadesAdGDzg3d8Y6j5iP')),
-('ltc',           ('b11f16632e63ba92','ltc:legacy',     '-LTC','LTC',       'LMxB474SVfxeYdqxNrM1WZDZMnifteSMv1')),
-('ltc_compressed',('7ccf465d466ee7d3','ltc:compressed', '-LTC-C','LTC:COMPRESSED', 'LdkebBKVXSs6NNoPJWGM8KciDnL8LhXXjb')),
-('ltc_segwit',    ('9460f5ba15e82768','ltc:segwit',     '-LTC-S','LTC:SEGWIT',     'MQrY3vEbqKMBgegXrSaR93R2HoTDE5bKrY')),
-('ltc_bech32',    ('dbdbff2e196e27d3','ltc:bech32',     '-LTC-B','LTC:BECH32',     'ltc1qdvgqsz94ht20lr8fyk5v7n884hu9p7d8k9easu')),
-('eth',           ('213ed116869b19f2','eth',          '-ETH',  'ETH', 'e704b6cfd9f0edb2e6cfbd0c913438d37ede7b35')),
-('etc',           ('909def37096f5ab8','etc',          '-ETC',  'ETC', '1a6acbef8c38f52f20d04ecded2992b04d8608d7')),
-('dash',          ('1319d347b021f952','dash:legacy',  '-DASH', 'DASH','XoK491fppGNZQUUS9uEFkT6L9u8xxVFJNJ')),
-('emc',           ('7e1a29853d2db875','emc:legacy',   '-EMC',  'EMC', 'EU4L6x2b5QUb2gRQsBAAuB8TuPEwUxCNZU')),
-('zec',           ('0bf9b5b20af7b5a0','zec:legacy',   '-ZEC',  'ZEC', 't1URz8BHxV38v3gsaN6oHQNKC16s35R9WkY')),
-('zec_zcash_z',   ('b15570d033df9b1a','zec:zcash_z',  '-ZEC-Z','ZEC:ZCASH_Z','zcLMMsnzfFYZWU4avRBnuc83yh4jTtJXbtP32uWrs3ickzu1krMU4ppZCQPTwwfE9hLnRuFDSYF8VFW13aT9eeQK8aov3Ge')),
-('xmr',           ('c76af3b088da3364','xmr:monero',   '-XMR-M','XMR:MONERO','41tmwZd2CdXEGtWqGY9fH9FVtQM8VxZASYPQ3VJQhFjtGWYzQFuidD21vJYTi2yy3tXRYXTNXBTaYVLav62rwUUpFFyicZU')),
-])
-
-cmd_base = 'python3{} cmds/mmgen-addrgen -qS'.format(
-	' -m trace --count --coverdir={} --file={}'.format(*init_coverage()) if opt.coverage else '')
-
-def run_tests():
-	for test in test_data:
-		if test == 'zec_zcash_z' and g.platform == 'win':
+from collections import namedtuple
+td = namedtuple('scrambletest_entry',['seed','str','id_str','lbl','addr'])
+
+coin_data = {
+#                   SCRAMBLED_SEED[:8] SCRAMBLE_KEY     ID_STR   LBL              FIRST ADDR
+'btc':           td('456d7f5f1c4bfe3b','(none)',        '',      '',              '1MU7EdgqYy9JX35L25hR6CmXXcSEBDAwyv'),
+'btc_compressed':td('bf98a4af5464a4ef','compressed',    '-C',    'COMPRESSED',    '1F97Jd89wwmu4ELadesAdGDzg3d8Y6j5iP'),
+'btc_segwit':    td('b56962d829ffc678','segwit',        '-S',    'SEGWIT',        '36TvVzU5mxSjJ3D9qKAmYzCV7iUqtTDezF'),
+'btc_bech32':    td('d09eea818f9ad17f','bech32',        '-B',    'BECH32',        'bc1q8snv94j6959y3gkqv4gku0cm5mersnpucsvw5z'),
+'bch':           td('456d7f5f1c4bfe3b','(none)',        '',      '',              '1MU7EdgqYy9JX35L25hR6CmXXcSEBDAwyv'),
+'bch_compressed':td('bf98a4af5464a4ef','compressed',    '-C',    'COMPRESSED',    '1F97Jd89wwmu4ELadesAdGDzg3d8Y6j5iP'),
+'ltc':           td('b11f16632e63ba92','ltc:legacy',    '-LTC',  'LTC',           'LMxB474SVfxeYdqxNrM1WZDZMnifteSMv1'),
+'ltc_compressed':td('7ccf465d466ee7d3','ltc:compressed','-LTC-C','LTC:COMPRESSED','LdkebBKVXSs6NNoPJWGM8KciDnL8LhXXjb'),
+'ltc_segwit':    td('9460f5ba15e82768','ltc:segwit',    '-LTC-S','LTC:SEGWIT',    'MQrY3vEbqKMBgegXrSaR93R2HoTDE5bKrY'),
+'ltc_bech32':    td('dbdbff2e196e27d3','ltc:bech32',    '-LTC-B','LTC:BECH32',    'ltc1qdvgqsz94ht20lr8fyk5v7n884hu9p7d8k9easu'),
+'eth':           td('213ed116869b19f2','eth',           '-ETH',  'ETH',           'e704b6cfd9f0edb2e6cfbd0c913438d37ede7b35'),
+'etc':           td('909def37096f5ab8','etc',           '-ETC',  'ETC',           '1a6acbef8c38f52f20d04ecded2992b04d8608d7'),
+'dash':          td('1319d347b021f952','dash:legacy',   '-DASH', 'DASH',          'XoK491fppGNZQUUS9uEFkT6L9u8xxVFJNJ'),
+'emc':           td('7e1a29853d2db875','emc:legacy',    '-EMC',  'EMC',           'EU4L6x2b5QUb2gRQsBAAuB8TuPEwUxCNZU'),
+'zec':           td('0bf9b5b20af7b5a0','zec:legacy',    '-ZEC',  'ZEC',           't1URz8BHxV38v3gsaN6oHQNKC16s35R9WkY'),
+'zec_zcash_z':   td('b15570d033df9b1a','zec:zcash_z',   '-ZEC-Z','ZEC:ZCASH_Z',   'zcLMMsnzfFYZWU4avRBnuc83yh4jTtJXbtP32uWrs3ickzu1krMU4ppZCQPTwwfE9hLnRuFDSYF8VFW13aT9eeQK8aov3Ge'),
+'xmr':           td('c76af3b088da3364','xmr:monero',    '-XMR-M','XMR:MONERO',    '41tmwZd2CdXEGtWqGY9fH9FVtQM8VxZASYPQ3VJQhFjtGWYzQFuidD21vJYTi2yy3tXRYXTNXBTaYVLav62rwUUpFFyicZU'),
+}
+
+cvr_opts = ' -m trace --count --coverdir={} --file={}'.format(*init_coverage()) if opt.coverage else ''
+cmd_base = 'python3{} cmds/mmgen-{{}}gen -qS'.format(cvr_opts)
+
+def get_cmd_output(cmd):
+	p = subprocess.Popen(cmd.split(),stdout=subprocess.PIPE,stderr=subprocess.PIPE)
+	o = p.stdout.read().decode()
+	err = p.stderr.read().decode()
+	exit_val = p.wait()
+	if exit_val != 0:
+		ydie(2,'\nSpawned program exited with error code {}:\n{}'.format(exit_val,err))
+	return o.splitlines()
+
+def do_test(cmd,tdata,msg_str,addr_desc):
+	vmsg(green('Executing: {}'.format(cmd)))
+	msg_r('Testing: ' + msg_str)
+
+	lines = get_cmd_output(cmd)
+	cmd_out = dict([e[9:].split(': ') for e in lines if e.startswith('sc_debug_')])
+	cmd_out['addr'] = lines[-2].split(None,1)[-1]
+
+	ref_data = tdata._asdict()
+	vmsg('')
+	for k in ref_data:
+		if cmd_out[k] == ref_data[k]:
+			s = k.replace('seed','seed[:8]').replace('addr',addr_desc)
+			vmsg('  {:9}: {}'.format(s,cmd_out[k]))
+		else:
+			rdie(1,'\nError: sc_{} value {} does not match reference value {}'.format(k,cmd_out[k],ref_data[k]))
+	msg('OK')
+
+def do_coin_tests():
+	bmsg('Testing address scramble strings and list IDs')
+	for tname,tdata in coin_data.items():
+		if tname == 'zec_zcash_z' and g.platform == 'win':
 			msg("Skipping 'zec_zcash_z' test for Windows platform")
 			continue
-		try:    coin,mmtype = test.split('_',1)
-		except: coin,mmtype = test,None
+		coin,mmtype = tname.split('_',1) if '_' in tname else (tname,None)
 		type_arg = ' --type='+mmtype if mmtype else ''
-		cmd = '{} --coin={}{} test/ref/98831F3A.mmwords 1'.format(cmd_base,coin,type_arg)
-		vmsg(green('Executing: {}'.format(cmd)))
-		msg_r('Testing: --coin {:4} {:22}'.format(coin.upper(),type_arg))
-		p = subprocess.Popen(cmd.split(),stdout=subprocess.PIPE,stderr=subprocess.PIPE)
-		o = p.stdout.read().decode()
-		err = p.stderr.read().decode()
-		exit_val = p.wait()
-		if exit_val != 0:
-			ydie(2,'\nSpawned program exited with error code {}:\n{}'.format(exit_val,err))
-		vmsg('\nCOMMAND OUTPUT:\n[{}]'.format(o))
-		o = o.splitlines()
-		d = [e for e in o if len(e) > 4 and e[:9] == 'sc_debug_']
-		d.append('sc_debug_addr: ' + o[-2].split()[-1])
-		for n,k in enumerate(['seed','str','id_str','lbl','addr']):
-			kk = 'sc_debug_'+k
-			a = test_data[test][n]
-			b = [e for e in d if e[:len(kk)] == kk][0][len(kk)+2:]
-			if b == a:
-				vmsg('sc_debug_{}: {}'.format(k,a))
-			else:
-				rdie(1,'\nError: sc_{} value {} does not match reference value {}'.format(k,b,a))
-		msg('OK')
+		cmd = cmd_base.format('addr') + ' --coin={}{} test/ref/98831F3A.mmwords 1'.format(coin,type_arg)
+		do_test(cmd,tdata,'--coin {:4} {:22}'.format(coin.upper(),type_arg),'address')
 
 start_time = int(time.time())
 
-run_tests()
+do_coin_tests()
 
 t = int(time.time()) - start_time
-m = '\nAll requested tests finished OK, elapsed time: {:02}:{:02}'
+m = 'All requested tests finished OK, elapsed time: {:02}:{:02}'
 gmsg(m.format(t//60,t%60))