common.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2020 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. common.py: Shared routines and data for the test.py test suite
  20. """
  21. import os
  22. from mmgen.common import *
  23. from ..include.common import *
  24. log_file = 'test.py.log'
  25. rt_pw = 'abc-α'
  26. ref_wallet_brainpass = 'abc'
  27. ref_wallet_hash_preset = '1'
  28. ref_wallet_incog_offset = 123
  29. dfl_seed_id = '98831F3A'
  30. dfl_addr_idx_list = '1010,500-501,31-33,1,33,500,1011'
  31. dfl_wpasswd = 'reference password'
  32. pwfile = 'passwd_file'
  33. hincog_fn = 'rand_data'
  34. hincog_bytes = 1024*1024
  35. hincog_offset = 98765
  36. hincog_seedlen = 256
  37. incog_id_fn = 'incog_id'
  38. non_mmgen_fn = 'coinkey'
  39. ref_dir = os.path.join('test','ref')
  40. dfl_words_file = os.path.join(ref_dir,'98831F3A.mmwords')
  41. from mmgen.obj import MMGenTXLabel,TwComment
  42. tx_label_jp = text_jp
  43. tx_label_zh = text_zh
  44. lcg = ascii_cyr_gr if g.platform == 'win' else lat_cyr_gr # MSYS2 popen_spawn issue
  45. tx_label_lat_cyr_gr = lcg[:MMGenTXLabel.max_len] # 72 chars
  46. tw_label_zh = text_zh[:TwComment.max_screen_width // 2]
  47. tw_label_lat_cyr_gr = lcg[:TwComment.max_screen_width] # 80 chars
  48. ref_bw_hash_preset = '1'
  49. ref_bw_file = 'wallet.mmbrain'
  50. ref_bw_file_spc = 'wallet-spaced.mmbrain'
  51. ref_enc_fn = 'sample-text.mmenc'
  52. tool_enc_passwd = "Scrypt it, don't hash it!"
  53. chksum_pat = r'\b[A-F0-9]{4} [A-F0-9]{4} [A-F0-9]{4} [A-F0-9]{4}\b'
  54. def ok_msg():
  55. if opt.profile: return
  56. sys.stderr.write(green('\nOK\n') if opt.exact_output or opt.verbose else ' OK\n')
  57. def skip(name,reason=None):
  58. msg('Skipping {}{}'.format(name,' ({})'.format(reason) if reason else ''))
  59. return 'skip'
  60. def confirm_continue():
  61. if keypress_confirm(blue('Continue? (Y/n): '),default_yes=True,complete_prompt=True):
  62. if opt.verbose or opt.exact_output: sys.stderr.write('\n')
  63. else:
  64. raise KeyboardInterrupt('Exiting at user request')
  65. def randbool():
  66. return os.urandom(1).hex()[0] in '02468ace'
  67. def disable_debug():
  68. global save_debug
  69. save_debug = {}
  70. for k in g.env_opts:
  71. if k[:11] == 'MMGEN_DEBUG':
  72. save_debug[k] = os.getenv(k)
  73. os.environ[k] = ''
  74. def restore_debug():
  75. for k in save_debug:
  76. os.environ[k] = save_debug[k] or ''
  77. def get_file_with_ext(tdir,ext,delete=True,no_dot=False,return_list=False,delete_all=False):
  78. dot = ('.','')[bool(no_dot)]
  79. flist = [os.path.join(tdir,f) for f in os.listdir(tdir) if f == ext or f[-len(dot+ext):] == dot+ext]
  80. if not flist: return False
  81. if return_list: return flist
  82. if len(flist) > 1 or delete_all:
  83. if delete or delete_all:
  84. if not opt.quiet:
  85. msg("Multiple *.{} files in '{}' - deleting".format(ext,tdir))
  86. for f in flist:
  87. os.unlink(f)
  88. return False
  89. else:
  90. return flist[0]
  91. def get_label(do_shuffle=False):
  92. labels = [
  93. "Automotive",
  94. "Travel expenses",
  95. "Healthcare",
  96. tx_label_jp[:40],
  97. tx_label_zh[:40],
  98. "Alice's allowance",
  99. "Bob's bequest",
  100. "House purchase",
  101. "Real estate fund",
  102. "Job 1",
  103. "XYZ Corp.",
  104. "Eddie's endowment",
  105. "Emergency fund",
  106. "Real estate fund",
  107. "Ian's inheritance",
  108. "",
  109. "Rainy day",
  110. "Fred's funds",
  111. "Job 2",
  112. "Carl's capital",
  113. ]
  114. from random import shuffle
  115. global label_iter
  116. try:
  117. return next(label_iter)
  118. except:
  119. if do_shuffle: shuffle(labels)
  120. label_iter = iter(labels)
  121. return next(label_iter)