ut_baseconv.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/env python3
  2. """
  3. test/unit_tests_d/ut_baseconv.py: Base conversion unit test for the MMGen suite
  4. """
  5. from mmgen.common import *
  6. from mmgen.exception import *
  7. class unit_test(object):
  8. vectors = {
  9. 'b58': (
  10. (('00',None),''),
  11. (('00',1),'1'),
  12. (('00',2),'11'),
  13. (('01',None),'2'),
  14. (('01',1),'2'),
  15. (('01',2),'12'),
  16. (('0f',None),'G'),
  17. (('0f',1),'G'),
  18. (('0f',2),'1G'),
  19. (('deadbeef',None),'6h8cQN'),
  20. (('deadbeef',20),'111111111111116h8cQN'),
  21. (('00000000',None),''),
  22. (('00000000',20),'11111111111111111111'),
  23. (('ffffffff',None),'7YXq9G'),
  24. (('ffffffff',20),'111111111111117YXq9G'),
  25. ),
  26. # MMGen-flavored base32 using simple base conversion
  27. 'b32': (
  28. (('00',None),''),
  29. (('00',1),'A'),
  30. (('00',2),'AA'),
  31. (('01',None),'B'),
  32. (('01',1),'B'),
  33. (('01',2),'AB'),
  34. (('0f',None),'P'),
  35. (('0f',1),'P'),
  36. (('0f',2),'AP'),
  37. (('deadbeef',None),'DPK3PXP'),
  38. (('deadbeef',20),'AAAAAAAAAAAAADPK3PXP'),
  39. (('00000000',None),''),
  40. (('00000000',20),'AAAAAAAAAAAAAAAAAAAA'),
  41. (('ffffffff',None),'D777777'),
  42. (('ffffffff',20),'AAAAAAAAAAAAAD777777'),
  43. ),
  44. 'b16': (
  45. (('00',None),''),
  46. (('00',1),'0'),
  47. (('00',2),'00'),
  48. (('01',None),'1'),
  49. (('01',1),'1'),
  50. (('01',2),'01'),
  51. (('0f',None),'f'),
  52. (('0f',1),'f'),
  53. (('0f',2),'0f'),
  54. (('deadbeef',None),'deadbeef'),
  55. (('deadbeef',20),'000000000000deadbeef'),
  56. (('00000000',None),''),
  57. (('00000000',20),'00000000000000000000'),
  58. (('ffffffff',None),'ffffffff'),
  59. (('ffffffff',20),'000000000000ffffffff'),
  60. ),
  61. 'b10': (
  62. (('00',None),''),
  63. (('00',1),'0'),
  64. (('00',2),'00'),
  65. (('01',None),'1'),
  66. (('01',1),'1'),
  67. (('01',2),'01'),
  68. (('0f',None),'15'),
  69. (('0f',1),'15'),
  70. (('0f',2),'15'),
  71. (('deadbeef',None),'3735928559'),
  72. (('deadbeef',20),'00000000003735928559'),
  73. (('00000000',None),''),
  74. (('00000000',20),'00000000000000000000'),
  75. (('ffffffff',None),'4294967295'),
  76. (('ffffffff',20),'00000000004294967295'),
  77. ),
  78. 'b8': (
  79. (('00',None),''),
  80. (('00',1),'0'),
  81. (('00',2),'00'),
  82. (('01',None),'1'),
  83. (('01',1),'1'),
  84. (('01',2),'01'),
  85. (('0f',None),'17'),
  86. (('0f',1),'17'),
  87. (('0f',2),'17'),
  88. (('deadbeef',None),'33653337357'),
  89. (('deadbeef',20),'00000000033653337357'),
  90. (('00000000',None),''),
  91. (('00000000',20),'00000000000000000000'),
  92. (('ffffffff',None),'37777777777'),
  93. (('ffffffff',20),'00000000037777777777'),
  94. ),
  95. }
  96. def run_test(self,name):
  97. msg_r('Testing base conversion routines...')
  98. from mmgen.util import baseconv
  99. perr = "length of {!r} less than pad length ({})"
  100. rerr = "return value ({!r}) does not match reference value ({!r})"
  101. qmsg_r('\nChecking hex-to-base conversion:')
  102. fs = " {h:10} {p:6} {r}"
  103. for base,data in self.vectors.items():
  104. if not opt.verbose: qmsg_r(' {}'.format(base))
  105. vmsg('\nBase: {}'.format(base))
  106. vmsg(fs.format(h='Input',p='Pad',r='Output'))
  107. for (hexstr,pad),ret_chk in data:
  108. ret = baseconv.fromhex(hexstr,wl_id=base,pad=pad,tostr=True)
  109. assert len(ret) >= (pad or 0), perr.format(ret,pad)
  110. assert ret == ret_chk, rerr.format(ret,ret_chk)
  111. vmsg(fs.format(h=hexstr,r=ret,p=str(pad)))
  112. # msg("(('{h}',{p}),'{r}'),".format(h=hexstr,r=ret,c=ret_chk,p=pad))
  113. # msg('')
  114. # return True
  115. qmsg_r('\nChecking base-to-hex conversion:')
  116. fs = " {h:24} {p:<6} {r}"
  117. for base,data in self.vectors.items():
  118. if not opt.verbose: qmsg_r(' {}'.format(base))
  119. vmsg('\nBase: {}'.format(base))
  120. vmsg(fs.format(h='Input',p='Pad',r='Output'))
  121. for (hexstr,pad),ret_chk in data:
  122. ret = baseconv.tohex(ret_chk,wl_id=base,pad=len(hexstr))
  123. assert ret == hexstr, rerr.format(ret,ret_chk)
  124. vmsg(fs.format(h=ret_chk,r=ret,p=len(hexstr)))
  125. # msg("(('{h}',{p}),'{r}'),".format(h=hexstr,r=ret_chk,c=ret_chk,p=pad))
  126. qmsg('')
  127. msg('OK')
  128. return True