ut_dep.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #!/usr/bin/env python3
  2. """
  3. test.unit_tests_d.ut_dep: dependency unit tests for the MMGen suite
  4. Test whether dependencies are installed and functional.
  5. No data verification is performed.
  6. """
  7. import sys
  8. from subprocess import run,PIPE
  9. from mmgen.util import msg,ymsg,gmsg
  10. from mmgen.exception import NoLEDSupport
  11. from ..include.common import cfg,vmsg,check_solc_ver
  12. class unit_tests:
  13. altcoin_deps = ('pysha3','py_ecc','solc','pycryptodomex')
  14. win_skip = ('pysha3','led')
  15. def led(self,name,ut):
  16. from mmgen.led import LEDControl
  17. try:
  18. LEDControl(enabled=True)
  19. except NoLEDSupport:
  20. ymsg('Warning: no LED support on this platform')
  21. else:
  22. gmsg('LED support found!')
  23. return True
  24. def pysha3(self,name,ut): # ETH,XMR
  25. from mmgen.pyversion import python_version
  26. if python_version >= '3.11':
  27. ut.skip_msg(f'Python version {python_version}')
  28. else:
  29. try:
  30. from sha3 import keccak_256
  31. except ImportError as e:
  32. ymsg(str(e))
  33. return False
  34. return True
  35. def pycryptodomex(self,name,ut): # ETH,XMR (keccak)
  36. from mmgen.pyversion import python_version
  37. if python_version >= '3.11' or sys.platform == 'win32':
  38. try:
  39. from mmgen.util import load_cryptodomex
  40. except Exception as e:
  41. msg(str(e))
  42. ymsg('Please install the ‘pycryptodome’ or ‘pycryptodomex’ package on your system')
  43. return False
  44. elif sys.platform != 'win32':
  45. ut.skip_msg(f'platform {sys.platform!r}')
  46. else:
  47. ut.skip_msg(f'Python version {python_version}')
  48. return True
  49. def py_ecc(self,name,ut): # ETH
  50. from py_ecc.secp256k1 import privtopub
  51. return True
  52. def pysocks(self,name,ut):
  53. import requests,urllib3
  54. urllib3.disable_warnings()
  55. session = requests.Session()
  56. session.trust_env = False
  57. session.proxies.update({'https':'socks5h://127.243.172.8:20677'})
  58. try:
  59. session.get('https://127.188.29.17')
  60. except Exception as e:
  61. if type(e).__name__ == 'ConnectionError':
  62. return True
  63. else:
  64. print(e)
  65. return False
  66. def secp256k1(self,name,ut):
  67. from mmgen.proto.secp256k1.secp256k1 import priv2pub
  68. priv2pub(bytes.fromhex('deadbeef'*8),1)
  69. return True
  70. def cryptography(self,name,ut):
  71. from cryptography.hazmat.primitives.ciphers import Cipher,algorithms,modes
  72. from cryptography.hazmat.backends import default_backend
  73. c = Cipher(algorithms.AES(b'deadbeef'*4),modes.CTR(b'deadbeef'*2),backend=default_backend())
  74. encryptor = c.encryptor()
  75. encryptor.update(b'foo') + encryptor.finalize()
  76. return True
  77. def ecdsa(self,name,ut):
  78. import ecdsa
  79. pko = ecdsa.SigningKey.from_secret_exponent(12345678901234,curve=ecdsa.SECP256k1)
  80. pko.get_verifying_key().to_string().hex()
  81. return True
  82. def ripemd160(self,name,ut):
  83. import hashlib
  84. if hashlib.new.__name__ == 'hashlib_new_wrapper':
  85. ymsg('Warning: RIPEMD160 missing in hashlib, falling back on pure-Python implementation')
  86. hashlib.new('ripemd160')
  87. return True
  88. def gmpy(self,name,ut):
  89. from gmpy2 import context,set_context,sqrt,cbrt
  90. # context() parameters are platform-dependent!
  91. set_context(context(precision=75,round=1)) # OK for gmp 6.1.2 / gmpy 2.1.0
  92. return True
  93. def aiohttp(self,name,ut):
  94. import asyncio,aiohttp
  95. async def do():
  96. async with aiohttp.ClientSession(
  97. headers = { 'Content-Type': 'application/json' },
  98. connector = aiohttp.TCPConnector(),
  99. ):
  100. pass
  101. asyncio.run(do())
  102. return True
  103. def pexpect(self,name,ut):
  104. import pexpect
  105. from pexpect.popen_spawn import PopenSpawn
  106. return True
  107. def scrypt(self,name,ut):
  108. passwd,salt = b'foo',b'bar'
  109. N,r,p = 4,8,16
  110. buflen = 64
  111. vmsg('Testing builtin scrypt module (hashlib)')
  112. from hashlib import scrypt # max N == 14!!
  113. scrypt(password=passwd,salt=salt,n=2**N,r=r,p=p,maxmem=0,dklen=buflen)
  114. vmsg('Testing standalone scrypt module')
  115. import scrypt
  116. scrypt.hash(passwd, salt, N=2**N, r=r, p=p, buflen=buflen)
  117. return True
  118. def solc(self,name,ut):
  119. from mmgen.protocol import init_proto
  120. solc_ok = check_solc_ver()
  121. if solc_ok:
  122. cmd = [
  123. 'python3',
  124. 'scripts/create-token.py',
  125. '--coin=ETH',
  126. '--name=My Fake Token',
  127. '--symbol=FAKE',
  128. '--supply=100000000000000000000000000',
  129. '--decimals=18',
  130. '--stdout',
  131. init_proto( cfg, 'eth' ).checksummed_addr('deadbeef'*5),
  132. ]
  133. cp = run(cmd,stdout=PIPE,stderr=PIPE)
  134. vmsg(cp.stderr.decode())
  135. if cp.returncode:
  136. msg(cp.stderr.decode())
  137. return False
  138. return True