misc.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2022 The MMGen Project <mmgen@tuta.io>
  5. # Licensed under the GNU General Public License, Version 3:
  6. # https://www.gnu.org/licenses
  7. # Public project repositories:
  8. # https://github.com/mmgen/mmgen-node-tools
  9. # https://gitlab.com/mmgen/mmgen-node-tools
  10. """
  11. test.cmdtest_d.misc: Miscellaneous test groups for the cmdtest.py test suite
  12. """
  13. import os, shutil
  14. from ..include.common import cfg
  15. from .base import CmdTestBase
  16. from .httpd.ticker import TickerServer
  17. refdir = os.path.join('test','ref','ticker')
  18. class CmdTestHelp(CmdTestBase):
  19. 'help, info and usage screens'
  20. networks = ('btc','ltc','bch')
  21. tmpdir_nums = []
  22. passthru_opts = ('daemon_data_dir','rpc_port','coin','testnet')
  23. cmd_group = (
  24. ('version', (1,'version message',[])),
  25. ('helpscreens', (1,'help screens', [])),
  26. ('longhelpscreens', (1,'help screens (--longhelp)',[])),
  27. )
  28. color = True
  29. def version(self):
  30. t = self.spawn('mmnode-netrate', ['--version'])
  31. t.expect('MMNODE-NETRATE version')
  32. return t
  33. def helpscreens(self,arg='--help',scripts=(),expect='USAGE:.*OPTIONS:'):
  34. scripts = list(scripts) or [s for s in os.listdir('cmds') if s.startswith('mmnode-')]
  35. for s in sorted(scripts):
  36. t = self.spawn(s,[arg],extra_desc=f'({s})')
  37. t.expect(expect,regex=True)
  38. t.read()
  39. t.ok()
  40. t.skip_ok = True
  41. return t
  42. def longhelpscreens(self):
  43. return self.helpscreens(arg='--longhelp',expect='USAGE:.*GLOBAL OPTIONS:')
  44. class CmdTestScripts(CmdTestBase):
  45. 'scripts not requiring a coin daemon'
  46. networks = ('btc',)
  47. tmpdir_nums = [2]
  48. passthru_opts = ()
  49. color = True
  50. cmd_group_in = (
  51. ('subgroup.ticker', []),
  52. )
  53. cmd_subgroups = {
  54. 'ticker': (
  55. "'mmnode-ticker' script",
  56. ('ticker1', 'ticker [--help]'),
  57. ('copy_files', 'copying JSON files to cache'),
  58. ('ticker1a', 'ticker [--download=cc] (early caching)'),
  59. ('ticker1b', 'ticker [--download=cc] (late caching)'),
  60. ('ticker2', 'ticker (bad proxy)'),
  61. ('ticker3', 'ticker [--cached-data]'),
  62. ('ticker4', 'ticker [--cached-data --wide]'),
  63. ('ticker5', 'ticker [--cached-data --wide --adjust=-0.766] (usr cfg file)'),
  64. ('ticker6', 'ticker [--cached-data --wide --portfolio] (missing portfolio)'),
  65. ('ticker7', 'ticker [--cached-data --wide --portfolio]'),
  66. ('ticker8', 'ticker [--cached-data --wide --elapsed]'),
  67. ('ticker9', 'ticker [--cached-data --wide --portfolio --elapsed --add-rows=fake-fakecoin:0.0123 --add-precision=2]'),
  68. ('ticker10', 'ticker [--cached-data xmr:17.234]'),
  69. ('ticker11', 'ticker [--cached-data xmr:17.234:btc]'),
  70. ('ticker12', 'ticker [--cached-data --adjust=1.23 xmr:17.234:btc]'),
  71. ('ticker13', 'ticker [--cached-data --wide --elapsed -c inr-indian-rupee:79.5 inr:200000:btc:0.1]'),
  72. ('ticker14', 'ticker [--cached-data --wide --btc]'),
  73. ('ticker15', 'ticker [--cached-data --wide --btc btc:2:usd:45000]'),
  74. ('ticker16', 'ticker [--cached-data --wide --elapsed -c eur,omr-omani-rial:2.59r'),
  75. ('ticker17', 'ticker [--cached-data --wide --elapsed -c bgn-bulgarian-lev:0.5113r:eur'),
  76. ('ticker18', 'ticker [--cached-data --widest --add-columns eurusd=x 10]'),
  77. ('ticker19', 'ticker [--cached-data 1-5]'),
  78. ('ticker20', 'ticker [--cached-data 2-5]'),
  79. ('ticker21', 'ticker [--cached-data 5-5]'),
  80. )
  81. }
  82. def __init__(self, cfg, trunner, cfgs, spawn):
  83. if not trunner:
  84. return
  85. self.ticker_server = TickerServer(cfg)
  86. self.ticker_server.start()
  87. return super().__init__(cfg, trunner, cfgs, spawn)
  88. @property
  89. def nt_datadir(self):
  90. return os.path.join( cfg.data_dir_root, 'node_tools' )
  91. def copy_files(self):
  92. self.spawn('',msg_only=True)
  93. shutil.copy2(os.path.join(refdir,'ticker-finance.json'),self.tmpdir)
  94. shutil.copy2(os.path.join(refdir,'ticker-finance-history.json'),self.tmpdir)
  95. shutil.copy2(os.path.join(refdir,'ticker-btc.json'),self.tmpdir)
  96. return 'ok'
  97. def ticker(
  98. self,
  99. args = [],
  100. expect_list = None,
  101. cached_data = True,
  102. add_opts = [],
  103. use_proxy = True,
  104. exit_val = None):
  105. t = self.spawn(
  106. 'mmnode-ticker',
  107. (['--cached-data'] if cached_data else [])
  108. + [f'--cachedir={self.tmpdir}']
  109. + (['--proxy=http://asdfzxcv:32459'] if use_proxy else [])
  110. + add_opts
  111. + args,
  112. exit_val = exit_val)
  113. if expect_list:
  114. t.match_expect_list(expect_list)
  115. return t
  116. def ticker1(self):
  117. t = self.ticker(['--help'])
  118. t.expect('USAGE:')
  119. return t
  120. def ticker1a(self, first_run=True):
  121. t = self.ticker(
  122. add_opts = ['--proxy', '', '--download=cc'],
  123. cached_data = False,
  124. use_proxy = False)
  125. if first_run and not cfg.skipping_deps:
  126. t.expect('Creating')
  127. t.expect('Creating')
  128. return t
  129. def ticker1b(self):
  130. return self.ticker1a(first_run=False)
  131. def ticker2(self):
  132. t = self.ticker(cached_data=False)
  133. ret = t.expect(['proxy host could not be resolved', 'unexpected keyword'])
  134. t.exit_val = 1 if ret else 3
  135. return t
  136. def ticker3(self):
  137. return self.ticker(
  138. [],
  139. [
  140. 'USD BTC',
  141. 'BTC 23250.77 1.00000000 ETH 1659.66 0.07138094'
  142. ])
  143. def ticker4(self):
  144. return self.ticker(
  145. ['--widest','--add-columns=eurusd=x,inr-indian-rupee:79.5'],
  146. [
  147. r'EURUSD=X \(EUR/USD\) = 1.0642 USD ' +
  148. r'INR \(INDIAN RUPEE\) = 0.012579 USD',
  149. 'USD EURUSD=X INR BTC CHG_1y CHG_30d CHG_7d CHG_24h UPDATED',
  150. 'BITCOIN',
  151. r'ETHEREUM 1,659.66 1,559.5846 131,943.14 0.07138094 \+36.41 \+29.99 \+21.42 \+1.82',
  152. r'MONERO 158.97 149.3870 12,638.36 0.00683732 \+12.38 \+10.19 \+7.28 \+1.21 2022-08-02 18:25:59',
  153. r'S&P 500 4,320.06 4,059.5604 343,444.77 0.18580285 -1.71 \+12.93 \+9.05 -0.23',
  154. r'INDIAN RUPEE 0.01 0.0118 1.00 0.00000054 -- -- -- --',
  155. ])
  156. def ticker5(self):
  157. shutil.copy2(os.path.join(refdir,'ticker-cfg.yaml'),self.nt_datadir)
  158. t = self.ticker(
  159. ['--wide','--adjust=-0.766'],
  160. [
  161. 'Adjusting prices by -0.77%',
  162. 'USD BTC CHG_7d CHG_24h UPDATED',
  163. r'LITECOIN 58.56 0.00251869 \+12.79 \+0.40 2022-08-02 18:25:59',
  164. r'MONERO 157.76 0.00678495 \+7.28 \+1.21'
  165. ])
  166. os.unlink(os.path.join(self.nt_datadir,'ticker-cfg.yaml'))
  167. return t
  168. def ticker6(self):
  169. t = self.ticker(['--wide','--portfolio'], None, exit_val=1)
  170. t.expect('No portfolio')
  171. return t
  172. def ticker7(self): # demo
  173. shutil.copy2(os.path.join(refdir,'ticker-portfolio.yaml'),self.nt_datadir)
  174. t = self.ticker(
  175. ['--wide','--portfolio'],
  176. [
  177. 'USD BTC CHG_7d CHG_24h UPDATED',
  178. r'ETHEREUM 1,659.66 0.07138094 \+21.42 \+1.82 2022-08-02 18:25:59',
  179. 'CARDANO','ALGORAND',
  180. 'PORTFOLIO','BITCOIN','ETHEREUM','MONERO','CARDANO','ALGORAND','TOTAL'
  181. ])
  182. os.unlink(os.path.join(self.nt_datadir,'ticker-portfolio.yaml'))
  183. return t
  184. def ticker8(self):
  185. return self.ticker(
  186. ['--wide','--elapsed'],
  187. [
  188. 'USD BTC CHG_7d CHG_24h UPDATED',
  189. r'BITCOIN 23,250.77 1.00000000 \+11.15 \+0.89 10 minutes ago'
  190. ])
  191. def ticker9(self):
  192. shutil.copy2(
  193. os.path.join(refdir,'ticker-portfolio-bad.yaml'),
  194. os.path.join(self.nt_datadir,'ticker-portfolio.yaml') )
  195. t = self.ticker(
  196. ['--wide','--portfolio','--elapsed','--add-rows=fake-fakecoin:0.0123','--add-precision=2'],
  197. [
  198. 'USD BTC CHG_7d CHG_24h UPDATED',
  199. r'BITCOIN 23,250.7741 1.0000000000 \+11.15 \+0.89 10 minutes ago',
  200. r'FAKECOIN 81.3008 0.0034966927 -- -- --',
  201. r'\(no data for noc-nocoin\)',
  202. ])
  203. os.unlink(os.path.join(self.nt_datadir,'ticker-portfolio.yaml'))
  204. return t
  205. def ticker10(self):
  206. return self.ticker(
  207. ['XMR:17.234'],
  208. [
  209. r'XMR \(MONERO\) = 158.97 USD ' +
  210. 'Amount: 17.234 XMR',
  211. 'SPOT PRICE',
  212. 'BTC 0.11783441',
  213. 'XMR 17.23400000',
  214. 'GC=F',r'\^IXIC',
  215. ])
  216. def ticker11(self):
  217. return self.ticker(
  218. ['XMR:17.234:BTC'],
  219. [
  220. r'XMR \(MONERO\) = 158.97 USD ' +
  221. r'BTC \(BITCOIN\) = 23250.77 USD ' +
  222. 'Amount: 17.234 XMR',
  223. 'SPOT PRICE',
  224. 'XMR 17.23400000 BTC 0.11783441',
  225. ])
  226. def ticker12(self):
  227. return self.ticker(
  228. ['--adjust=1.23','--wide','XMR:17.234:BTC'],
  229. [
  230. r'XMR \(MONERO\) = 158.97 USD ' +
  231. r'BTC \(BITCOIN\) = 23,250.77 USD ' +
  232. 'Amount: 17.234 XMR',
  233. r'Adjusting prices by \+1.23%',
  234. 'SPOT PRICE ADJUSTED PRICE',
  235. 'MONERO 17.23400000 17.44597820 2022-08-02 18:25:59 ' +
  236. 'BITCOIN 0.11783441 0.11928377 2022-08-02 18:25:59',
  237. ])
  238. def ticker13(self):
  239. return self.ticker(
  240. ['-wE','-c','inr-indian-rupee:79.5','inr:200000:btc:0.1'],
  241. [
  242. 'Offer: 200,000 INR',
  243. 'Offered price differs from spot by -7.58%',
  244. 'SPOT PRICE OFFERED PRICE UPDATED',
  245. 'INDIAN RUPEE 200,000.00000000 184,843.65372424 -- ' +
  246. 'BITCOIN 0.10819955 0.10000000 10 minutes ago'
  247. ])
  248. def ticker14(self):
  249. shutil.copy2(os.path.join(refdir,'ticker-portfolio.yaml'),self.nt_datadir)
  250. t = self.ticker(
  251. ['--btc','--wide','--portfolio','--elapsed'],
  252. [
  253. 'PRICES',
  254. r'BITCOIN 23,368.86 \+6.05 -1.87 1 day 9 hours 2 minutes ago',
  255. 'PORTFOLIO',
  256. r'BITCOIN 28,850.44 \+6.05 -1.87 1.23456789'
  257. ])
  258. os.unlink(os.path.join(self.nt_datadir,'ticker-portfolio.yaml'))
  259. return t
  260. def ticker15(self):
  261. return self.ticker(
  262. ['--btc','--wide','--elapsed','-r','inr:79.5','btc:2:usd:45000'],
  263. [
  264. r'BTC \(BITCOIN\) = 23,368.86 USD',
  265. 'Offered price differs from spot by -3.72%',
  266. 'SPOT PRICE OFFERED PRICE UPDATED',
  267. 'BITCOIN 2.00000000 1.92563954 1 day 9 hours 2 minutes ago ' +
  268. 'US DOLLAR 46,737.71911598 45,000.00000000 --',
  269. ])
  270. def ticker16(self):
  271. return self.ticker(
  272. ['--wide','--elapsed','-c','eurusd=x,omr-omani-rial:2.59r'],
  273. [
  274. r'EURUSD=X \(EUR/USD\) = 1.0642 USD ' +
  275. r'OMR \(OMANI RIAL\) = 2.5900 USD',
  276. 'USD EURUSD=X OMR BTC CHG_7d CHG_24h UPDATED',
  277. r'BITCOIN 23,250.77 21,848.7527 8,977.1328 1.00000000 \+11.15 \+0.89 10 minutes ago',
  278. 'OMANI RIAL 2.59 2.4338 1.0000 0.00011139 -- -- --'
  279. ])
  280. def ticker17(self):
  281. # BGN pegged at 0.5113 EUR
  282. return self.ticker(
  283. ['--wide','--elapsed','-c','bgn-bulgarian-lev:0.5113r:eurusd=x'],
  284. [
  285. r'BGN \(BULGARIAN LEV\) = 0.54411 USD',
  286. 'USD BGN BTC CHG_7d CHG_24h UPDATED',
  287. 'BITCOIN 23,250.77 42,731.767 1.00000000',
  288. 'BULGARIAN LEV 0.54 1.000 0.00002340',
  289. ])
  290. def ticker18(self):
  291. return self.ticker(
  292. ['10'],
  293. [
  294. r'1\) BITCOIN 444.33652 23,250.77 21,848.7527 1.00000000 \+18.96 \+15.61 \+11.15 \+0.89',
  295. r'6\) ALGORAND 2.30691 0.33 0.3120 0.00001428 \+16.47 \+13.57 \+9.69 \-0.82'
  296. ],
  297. add_opts = ['--widest', '--add-columns=eurusd=x'])
  298. def ticker19(self):
  299. return self.ticker(
  300. ['1-5'],
  301. [
  302. r'MarketCap\(B\) USD EURUSD=X BTC '
  303. '--------------------------------------------------------- '
  304. r'1\) BTC 444.33652 23250.77 21848.7527 1.00000000',
  305. r'5\) ADA 17.11161 0.51 0.4764 0.00002180'
  306. ' ---------------------------------------------------------'
  307. ],
  308. add_opts = ['--add-columns=eurusd=x'])
  309. def ticker20(self):
  310. return self.ticker(
  311. ['2-5'],
  312. [
  313. r'MarketCap\(B\) USD EURUSD=X BTC '
  314. '--------------------------------------------------------- '
  315. r'2\) ETH 202.15129 1659.66 1559.5846 0.07138094',
  316. r'5\) ADA 17.11161 0.51 0.4764 0.00002180',
  317. ],
  318. add_opts = ['--add-columns=eurusd=x'])
  319. def ticker21(self):
  320. return self.ticker(
  321. ['5-5'],
  322. [
  323. r'MarketCap\(B\) USD EURUSD=X BTC '
  324. '--------------------------------------------------------- '
  325. r'5\) ADA 17.11161 0.51 0.4764 0.00002180',
  326. ],
  327. add_opts = ['--add-columns=eurusd=x'])