ts_misc.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2022 The MMGen Project <mmgen@tuta.io>
  5. #
  6. # This program is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. """
  19. ts_misc.py: Miscellaneous test groups for the test.py test suite
  20. """
  21. from mmgen.globalvars import g
  22. from ..include.common import *
  23. from .common import *
  24. from .ts_base import *
  25. from .ts_main import TestSuiteMain
  26. class TestSuiteMisc(TestSuiteBase):
  27. 'miscellaneous tests (RPC backends)'
  28. networks = ('btc',)
  29. tmpdir_nums = [99]
  30. passthru_opts = ('daemon_data_dir','rpc_port')
  31. cmd_group = (
  32. ('rpc_backends', 'RPC backends'),
  33. )
  34. def rpc_backends(self):
  35. backends = g.autoset_opts['rpc_backend'][1]
  36. for b in backends:
  37. t = self.spawn_chk('mmgen-tool',[f'--rpc-backend={b}','daemon_version'],extra_desc=f' ({b})')
  38. return t
  39. class TestSuiteHelp(TestSuiteBase):
  40. 'help, info and usage screens'
  41. networks = ('btc','ltc','bch','eth')
  42. tmpdir_nums = []
  43. passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet')
  44. cmd_group = (
  45. ('helpscreens', (1,'help screens', [])),
  46. ('longhelpscreens', (1,'help screens (--longhelp)',[])),
  47. ('opt_show_hash_presets', (1,'info screen (--show-hash-presets)',[])),
  48. ('tool_help', (1,"'mmgen-tool' usage screen",[])),
  49. ('test_help', (1,"'test.py' help screens",[])),
  50. )
  51. def helpscreens(self,
  52. arg = '--help',
  53. scripts = ( 'walletgen','walletconv','walletchk','passchg','subwalletgen',
  54. 'addrgen','keygen','passgen',
  55. 'seedsplit','seedjoin',
  56. 'txcreate','txsign','txsend','txdo','txbump',
  57. 'addrimport','autosign')
  58. ):
  59. if self.test_name == 'helpscreens' and self.proto.base_coin != 'ETH':
  60. scripts += ('regtest','xmrwallet')
  61. for s in scripts:
  62. t = self.spawn_chk(f'mmgen-{s}',[arg],extra_desc=f'(mmgen-{s})',no_output=True)
  63. return t
  64. def longhelpscreens(self):
  65. return self.helpscreens(arg='--longhelp')
  66. def opt_show_hash_presets(self):
  67. return self.helpscreens(
  68. arg = '--show-hash-presets',
  69. scripts = (
  70. 'walletgen','walletconv','walletchk','passchg','subwalletgen',
  71. 'addrgen','keygen','passgen',
  72. 'txsign','txdo','txbump'))
  73. def tool_help(self):
  74. for args in (
  75. ['--help'],
  76. ['--longhelp'],
  77. ['help'],
  78. ['usage'],
  79. ['help','randpair']
  80. ):
  81. t = self.spawn_chk('mmgen-tool',args,extra_desc=f"('mmgen-tool {fmt_list(args,fmt='bare')}')")
  82. return t
  83. def test_help(self):
  84. for args in (
  85. ['--help'],
  86. ['--list-cmds'],
  87. ['--list-cmd-groups']
  88. ):
  89. t = self.spawn_chk('test.py',args,cmd_dir='test',extra_desc=f"('test.py {fmt_list(args,fmt='bare')}')")
  90. return t
  91. class TestSuiteOutput(TestSuiteBase):
  92. 'screen output'
  93. networks = ('btc',)
  94. tmpdir_nums = []
  95. cmd_group = (
  96. ('output_gr', (1,"Greek text", [])),
  97. ('output_ru', (1,"Russian text", [])),
  98. ('output_zh', (1,"Chinese text", [])),
  99. ('output_jp', (1,"Japanese text", [])),
  100. ('oneshot_warning', (1,"Oneshot warnings", []))
  101. )
  102. color = True
  103. def screen_output(self,lang):
  104. t = self.spawn('test/misc/utf8_output.py',[lang],cmd_dir='.')
  105. t.read()
  106. return t
  107. def output_gr(self): return self.screen_output('gr')
  108. def output_ru(self): return self.screen_output('ru')
  109. def output_zh(self): return self.screen_output('zh')
  110. def output_jp(self): return self.screen_output('jp')
  111. def oneshot_warning(self):
  112. nl = '\r\n' if g.platform == 'win' or opt.pexpect_spawn else '\n'
  113. t = self.spawn('test/misc/oneshot_warning.py',cmd_dir='.')
  114. for s in (
  115. f'pw{nl}wg1',
  116. 'foo is experimental',
  117. 'wg2', 'The bar command is dangerous',
  118. 'wg3', 'baz variant alpha',
  119. 'wg4', 'baz variant beta',
  120. 'w1', 'foo variant alpha',
  121. 'w2', 'foo variant beta',
  122. 'w3', 'bar is experimental',
  123. 'pw',
  124. "passphrase from file 'A'",
  125. "passphrase from file 'B'",
  126. f'wg1{nl}wg2{nl}wg3{nl}wg4{nl}w1{nl}w2{nl}w3',
  127. 'pw',
  128. "passphrase from file 'A'",
  129. "passphrase from file 'B'",
  130. f'wg1{nl}wg2{nl}wg3{nl}wg4{nl}w1{nl}w2{nl}w3',
  131. 'bottom',
  132. ):
  133. t.expect(s)
  134. return t
  135. class TestSuiteRefTX(TestSuiteMain,TestSuiteBase):
  136. 'create a reference transaction file (administrative command)'
  137. segwit_opts_ok = False
  138. passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet')
  139. tmpdir_nums = [31,32,33,34]
  140. cmd_group = (
  141. ('ref_tx_addrgen1', (31,'address generation (legacy)', [[[],1]])),
  142. ('ref_tx_addrgen2', (32,'address generation (compressed)', [[[],1]])),
  143. ('ref_tx_addrgen3', (33,'address generation (segwit)', [[[],1]])),
  144. ('ref_tx_addrgen4', (34,'address generation (bech32)', [[[],1]])),
  145. ('ref_tx_txcreate', (31,'transaction creation',
  146. ([['addrs'],31],[['addrs'],32],[['addrs'],33],[['addrs'],34]))),
  147. )
  148. def __init__(self,trunner,cfgs,spawn):
  149. if cfgs:
  150. for n in self.tmpdir_nums:
  151. cfgs[str(n)].update({ 'addr_idx_list': '1-2',
  152. 'segwit': n in (33,34),
  153. 'dep_generators': { 'addrs':'ref_tx_addrgen'+str(n)[-1] }})
  154. return TestSuiteMain.__init__(self,trunner,cfgs,spawn)
  155. def ref_tx_addrgen(self,atype):
  156. if atype not in self.proto.mmtypes:
  157. return
  158. t = self.spawn('mmgen-addrgen',['--outdir='+self.tmpdir,'--type='+atype,dfl_words_file,'1-2'])
  159. t.read()
  160. return t
  161. def ref_tx_addrgen1(self): return self.ref_tx_addrgen(atype='L')
  162. def ref_tx_addrgen2(self): return self.ref_tx_addrgen(atype='C')
  163. def ref_tx_addrgen3(self): return self.ref_tx_addrgen(atype='S')
  164. def ref_tx_addrgen4(self): return self.ref_tx_addrgen(atype='B')
  165. def ref_tx_txcreate(self,f1,f2,f3,f4):
  166. sources = ['31','32']
  167. if 'S' in self.proto.mmtypes: sources += ['33']
  168. if 'B' in self.proto.mmtypes: sources += ['34']
  169. return self.txcreate_common(
  170. addrs_per_wallet = 2,
  171. sources = sources,
  172. add_args = ['--locktime=1320969600'],
  173. do_label = True )