ut_seedsplit.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env python3
  2. """
  3. test/unit_tests_d/ut_seedsplit: seed splitting unit test for the MMGen suite
  4. """
  5. from mmgen.common import *
  6. class unit_test(object):
  7. def run_test(self,name):
  8. from mmgen.seed import Seed
  9. def basic_ops():
  10. test_data = {
  11. 'default': (
  12. (8,'4710FBF0','B3D9411B','2670E83D','D1FC57ED','AE49CABE','63FFBA62',256),
  13. (6,'9D07ABBD','AF5DC2F6','1A3BBDAC','2548AEE9','B94F7450','1F4E5A12',192),
  14. (4,'43670520','1F72C066','E5AA8DA1','A33966A0','D2BCE0A5','A568C315',128),
  15. ),
  16. 'φυβαρ': (
  17. (8,'4710FBF0','269D658C','9D25889E','6D730ECB','C61A963F','9FE99C05',256),
  18. (6,'9D07ABBD','4998B33E','F00CE041','C612BEE5','35CD3675','41B3BE61',192),
  19. (4,'43670520','77140076','EA82CB30','80F7AEDE','D168D768','77BE57AA',128),
  20. )
  21. }
  22. for id_str in (None,'default','φυβαρ'):
  23. msg_r('Testing basic ops (id_str={!r})...'.format(id_str))
  24. vmsg('')
  25. for a,b,c,d,e,f,h,i in test_data[id_str if id_str is not None else 'default']:
  26. seed_bin = bytes.fromhex('deadbeef' * a)
  27. seed = Seed(seed_bin)
  28. assert seed.sid == b, seed.sid
  29. splitlist = seed.splitlist(2,id_str)
  30. A = len(splitlist)
  31. assert A == 2, A
  32. s = splitlist.format()
  33. vmsg_r('\n{}'.format(s))
  34. assert len(s.strip().split('\n')) == 8, s
  35. A = splitlist.get_split_by_idx(1).sid
  36. B = splitlist.get_split_by_seed_id(c).sid
  37. assert A == B == c, A
  38. A = splitlist.get_split_by_idx(2).sid
  39. B = splitlist.get_split_by_seed_id(d).sid
  40. assert A == B == d, A
  41. splitlist = seed.splitlist(5,id_str)
  42. A = len(splitlist)
  43. assert A == 5, A
  44. s = splitlist.format()
  45. vmsg_r('\n{}'.format(s))
  46. assert len(s.strip().split('\n')) == 11, s
  47. A = splitlist.get_split_by_idx(1).sid
  48. B = splitlist.get_split_by_seed_id(e).sid
  49. assert A == B == e, A
  50. A = splitlist.get_split_by_idx(4).sid
  51. B = splitlist.get_split_by_seed_id(f).sid
  52. assert A == B == f, A
  53. A = splitlist.get_split_by_idx(5).sid
  54. B = splitlist.get_split_by_seed_id(h).sid
  55. assert A == B == h, A
  56. A = splitlist.join().sid
  57. assert A == b, A
  58. msg('OK')
  59. def defaults_and_limits():
  60. msg_r('Testing defaults and limits...')
  61. seed_bin = bytes.fromhex('deadbeef' * 8)
  62. seed = Seed(seed_bin)
  63. splitlist = seed.splitlist(g.max_seed_splits)
  64. s = splitlist.format()
  65. # vmsg_r('\n{}'.format(s))
  66. assert len(s.strip().split('\n')) == 1030, s
  67. A = splitlist.get_split_by_idx(1024).sid
  68. B = splitlist.get_split_by_seed_id('4BA23728').sid
  69. assert A == '4BA23728', A
  70. assert B == '4BA23728', B
  71. A = splitlist.join().sid
  72. B = seed.sid
  73. assert A == B, A
  74. msg('OK')
  75. def collisions():
  76. ss_count,last_sid,collisions_chk = (65535,'B5CBCE0A',3)
  77. msg_r('Testing Seed ID collisions ({} seed splits)...'.format(ss_count))
  78. vmsg('')
  79. seed_bin = bytes.fromhex('1dabcdef' * 4)
  80. seed = Seed(seed_bin)
  81. g.max_seed_splits = ss_count
  82. splitlist = seed.splitlist(g.max_seed_splits)
  83. A = splitlist.get_split_by_idx(ss_count).sid
  84. B = splitlist.get_split_by_seed_id(last_sid).sid
  85. assert A == last_sid, A
  86. assert B == last_sid, B
  87. assert splitlist.nonce_start == 0, splitlist.nonce_start
  88. collisions = 0
  89. for sid in splitlist.data['long']:
  90. collisions += splitlist.data['long'][sid][1]
  91. assert collisions == collisions_chk, collisions
  92. vmsg_r('\n{} collisions, last_sid {}'.format(collisions,last_sid))
  93. msg('OK')
  94. basic_ops()
  95. defaults_and_limits()
  96. collisions()
  97. return True