ts_tool.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2023 The MMGen Project <mmgen@tuta.io>
  5. #
  6. # Project source code repository: https://github.com/mmgen/mmgen
  7. # Licensed according to the terms of GPL Version 3. See LICENSE for details.
  8. """
  9. test.test_py_d.ts_tool: tool tests for the MMGen test.py test suite
  10. """
  11. import os
  12. from mmgen.cfg import gc
  13. from mmgen.util import suf
  14. from mmgen.color import cyan
  15. from ..include.common import (
  16. cfg,
  17. vmsg,
  18. read_from_file,
  19. write_to_file,
  20. cmp_or_die,
  21. joinpath,
  22. getrand
  23. )
  24. from .common import hincog_fn,incog_id_fn,hincog_offset,tool_enc_passwd,ref_dir
  25. from .ts_base import TestSuiteBase
  26. from .ts_main import TestSuiteMain
  27. class TestSuiteTool(TestSuiteMain,TestSuiteBase):
  28. "interactive 'mmgen-tool' commands"
  29. networks = ('btc',)
  30. segwit_opts_ok = False
  31. tmpdir_nums = [9]
  32. enc_infn = 'tool_encrypt.in'
  33. cmd_group = (
  34. ('tool_find_incog_data', (9,"'mmgen-tool find_incog_data'", [[[hincog_fn],1],[[incog_id_fn],1]])),
  35. ('tool_rand2file', (9,"'mmgen-tool rand2file'", [])),
  36. ('tool_encrypt', (9,"'mmgen-tool encrypt' (random data)", [])),
  37. ('tool_decrypt', (9,"'mmgen-tool decrypt' (random data)", [[[enc_infn+'.mmenc'],9]])),
  38. ('tool_twview_bad_comment',(9,"'mmgen-tool twview' (with bad comment)", [])),
  39. ('tool_extract_key_from_geth_wallet',(9,"'mmgen-tool extract_key_from_geth_wallet'", [])),
  40. ('tool_api', (9,'tool API (initialization, config methods, wif2addr)',[])),
  41. # ('tool_encrypt_ref', (9,"'mmgen-tool encrypt' (reference text)", [])),
  42. )
  43. def tool_rand2file(self):
  44. from mmgen.util2 import parse_bytespec
  45. for nbytes in ('1','1023','1K','1048575','1M','1048577','123M'):
  46. t = self.spawn(
  47. 'mmgen-tool',
  48. ['-d',self.tmpdir,'-r0','rand2file','rand2file.out',nbytes],
  49. extra_desc='({} byte{})'.format( nbytes, suf(parse_bytespec(nbytes)) )
  50. )
  51. t.expect('random data written to file')
  52. t.read()
  53. t.p.wait()
  54. t.ok()
  55. t.skip_ok = True
  56. return t
  57. def tool_encrypt(self):
  58. infile = joinpath(self.tmpdir,self.enc_infn)
  59. write_to_file(infile,getrand(1033),binary=True)
  60. t = self.spawn('mmgen-tool',['-d',self.tmpdir,self.usr_rand_arg,'encrypt',infile])
  61. t.usr_rand(self.usr_rand_chars)
  62. t.hash_preset('data','1')
  63. t.passphrase_new('data',tool_enc_passwd)
  64. t.written_to_file('Encrypted data')
  65. return t
  66. def tool_decrypt(self,f1):
  67. out_fn = 'tool_encrypt.out'
  68. t = self.spawn('mmgen-tool',['-d',self.tmpdir,'decrypt',f1,'outfile='+out_fn,'hash_preset=1'])
  69. t.passphrase('data',tool_enc_passwd)
  70. t.written_to_file('Decrypted data')
  71. d1 = self.read_from_tmpfile(self.enc_infn,binary=True)
  72. d2 = self.read_from_tmpfile(out_fn,binary=True)
  73. cmp_or_die(d1,d2)
  74. return t
  75. def tool_find_incog_data(self,f1,f2):
  76. i_id = read_from_file(f2).rstrip()
  77. vmsg(f'Incog ID: {cyan(i_id)}')
  78. t = self.spawn('mmgen-tool',['-d',self.tmpdir,'find_incog_data',f1,i_id])
  79. o = t.expect_getend(f'Incog data for ID {i_id} found at offset ')
  80. if not gc.platform == 'win':
  81. os.unlink(f1) # causes problems with MSYS2
  82. cmp_or_die(hincog_offset,int(o))
  83. return t
  84. def tool_twview_bad_comment(self): # test correct operation of get_tw_label()
  85. t = self.spawn(
  86. 'mmgen-tool',
  87. ['twview'],
  88. env = { 'MMGEN_BOGUS_UNSPENT_DATA': joinpath(ref_dir,'bad-comment-unspent.json') })
  89. t.expect('cannot be converted to TwComment')
  90. t.req_exit_val = 2
  91. return t
  92. def tool_extract_key_from_geth_wallet(self):
  93. if cfg.no_altcoin:
  94. return 'skip'
  95. fn = 'test/ref/ethereum/geth-wallet.json'
  96. key = '9627ddb68354f5e0ff45fb2da49d7a20a013b7257a83ef4adbbbd87aeaccc75e'
  97. t = self.spawn('mmgen-tool',['-d',self.tmpdir,'extract_key_from_geth_wallet',fn])
  98. t.expect('Enter passphrase: ','\n')
  99. t.expect(key)
  100. return t
  101. def tool_api(self):
  102. t = self.spawn(
  103. 'tool_api_test.py',
  104. (['no_altcoin'] if cfg.no_altcoin else []),
  105. cmd_dir = 'test/misc' )
  106. t.expect('legacy.*compressed.*segwit.*bech32',regex=True)
  107. return t