ut_msg.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env python3
  2. """
  3. test.unit_tests_d.ut_msg: message signing unit tests for the MMGen suite
  4. """
  5. import os
  6. from test.include.common import silence,end_silence,restart_test_daemons,stop_test_daemons
  7. from mmgen.opts import opt
  8. from mmgen.util import msg,bmsg,pumsg
  9. from mmgen.protocol import CoinProtocol
  10. from mmgen.msg import NewMsg,UnsignedMsg,SignedMsg,SignedOnlineMsg,ExportedMsgSigs
  11. from mmgen.addr import MMGenID
  12. def get_obj(coin,network):
  13. if coin == 'bch':
  14. addrlists = 'DEADBEEF:C:1-20 98831F3A:C:8,2 A091ABAA:L:111 A091ABAA:C:1'
  15. elif coin == 'eth':
  16. addrlists = 'DEADBEEF:E:1-20 98831F3A:E:8,2 A091ABAA:E:111'
  17. else:
  18. # A091ABAA = 98831F3A:5S
  19. addrlists = 'DEADBEEF:C:1-20 98831F3A:B:8,2 A091ABAA:S:10-11 A091ABAA:111 A091ABAA:C:1'
  20. return NewMsg(
  21. coin = coin,
  22. network = network,
  23. message = '08/Jun/2021 Bitcoin Law Enacted by El Salvador Legislative Assembly',
  24. addrlists = addrlists )
  25. async def run_test(network_id):
  26. coin,network = CoinProtocol.Base.parse_network_id(network_id)
  27. if not opt.verbose:
  28. silence()
  29. bmsg(f'\nTesting {coin.upper()} {network.upper()}:\n')
  30. restart_test_daemons(network_id)
  31. pumsg('\nTesting data creation:\n')
  32. m = get_obj(coin,network)
  33. tmpdir = os.path.join('test','trash2')
  34. os.makedirs(tmpdir,exist_ok=True)
  35. m.write_to_file(
  36. outdir = tmpdir,
  37. ask_overwrite = False )
  38. pumsg('\nTesting signing:\n')
  39. m = UnsignedMsg( infile = os.path.join(tmpdir,get_obj(coin,network).filename) )
  40. await m.sign(wallet_files=['test/ref/98831F3A.mmwords'])
  41. m = SignedMsg( data=m.__dict__ )
  42. m.write_to_file(
  43. outdir = tmpdir,
  44. ask_overwrite = False )
  45. pumsg('\nTesting display:\n')
  46. m = SignedOnlineMsg( infile = os.path.join(tmpdir,get_obj(coin,network).signed_filename) )
  47. msg(m.format())
  48. single_addr = 'A091ABAA:E:111' if m.proto.base_proto == 'Ethereum' else 'A091ABAA:111'
  49. single_addr_coin = m.sigs[MMGenID(m.proto,single_addr)]['addr']
  50. pumsg('\nTesting single address display:\n')
  51. msg(m.format(single_addr))
  52. pumsg('\nTesting verification:\n')
  53. await m.verify(summary=opt.verbose)
  54. pumsg('\nTesting single address verification:\n')
  55. await m.verify(single_addr,summary=opt.verbose)
  56. pumsg('\nTesting JSON dump for export:\n')
  57. msg( m.get_json_for_export() )
  58. pumsg('\nTesting single address JSON dump for export:\n')
  59. msg( m.get_json_for_export(single_addr) )
  60. from mmgen.fileutil import write_data_to_file
  61. exported_sigs = os.path.join(tmpdir,'signatures.json')
  62. write_data_to_file(
  63. outfile = exported_sigs,
  64. data = m.get_json_for_export(),
  65. desc = 'signature data',
  66. ask_overwrite = False )
  67. m = ExportedMsgSigs( infile=exported_sigs )
  68. pumsg('\nTesting verification (exported data):\n')
  69. await m.verify(summary=opt.verbose)
  70. pumsg('\nTesting single address verification (exported data):\n')
  71. await m.verify(single_addr_coin,summary=opt.verbose)
  72. pumsg('\nTesting display (exported data):\n')
  73. msg(m.format())
  74. pumsg('\nTesting single address display (exported data):\n')
  75. msg(m.format(single_addr_coin))
  76. stop_test_daemons(network_id)
  77. msg('\n')
  78. if not opt.verbose:
  79. end_silence()
  80. return True
  81. class unit_tests:
  82. altcoin_deps = ('ltc','bch','eth')
  83. def btc(self,name,ut):
  84. return run_test('btc')
  85. def btc_tn(self,name,ut):
  86. return run_test('btc_tn')
  87. def btc_rt(self,name,ut):
  88. return run_test('btc_rt')
  89. def ltc(self,name,ut):
  90. return run_test('ltc')
  91. def bch(self,name,ut):
  92. return run_test('bch')
  93. def eth(self,name,ut):
  94. return run_test('eth')