From fe9664412d346f618bc3587242e0b7e9c7408e77 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 17 Mar 2025 10:16:18 +0000 Subject: [PATCH] cmdtest.py: reimplement etherscan server using WSGI framework --- test/cmdtest_d/ct_ethdev.py | 27 ++++++++++++++++---------- test/cmdtest_d/etherscan.py | 32 ------------------------------- test/cmdtest_d/httpd/etherscan.py | 25 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 42 deletions(-) delete mode 100755 test/cmdtest_d/etherscan.py create mode 100755 test/cmdtest_d/httpd/etherscan.py diff --git a/test/cmdtest_d/ct_ethdev.py b/test/cmdtest_d/ct_ethdev.py index 4d3eed62..c5203197 100755 --- a/test/cmdtest_d/ct_ethdev.py +++ b/test/cmdtest_d/ct_ethdev.py @@ -58,7 +58,9 @@ from .common import ( ) from .ct_base import CmdTestBase from .ct_shared import CmdTestShared -from .etherscan import run_etherscan_server +from .httpd.etherscan import EtherscanServer + +etherscan_server = EtherscanServer() del_addrs = ('4', '1') dfl_sid = '98831F3A' @@ -179,12 +181,6 @@ token_bals_getbalance = lambda k: { coin = cfg.coin -def etherscan_server_start(): - import threading - t = threading.Thread(target=run_etherscan_server, name='Etherscan server thread') - t.daemon = True - t.start() - class CmdTestEthdev(CmdTestBase, CmdTestShared): 'Ethereum transacting, token deployment and tracking wallet operations' networks = ('eth', 'etc') @@ -244,8 +240,12 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared): ('txview1_sig', 'viewing the signed transaction'), ('tx_status0_bad', 'getting the transaction status'), ('txsign1_ni', 'signing the transaction (non-interactive)'), + + ('etherscan_server_start','starting the Etherscan server'), ('txsend_etherscan_test','sending the transaction via Etherscan (simulation, with --test)'), ('txsend_etherscan', 'sending the transaction via Etherscan (simulation)'), + ('etherscan_server_stop','stopping the Etherscan server'), + ('txsend1', 'sending the transaction'), ('bal1', f'the {coin} balance'), @@ -459,9 +459,6 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared): self.message = 'attack at dawn' self.spawn_env['MMGEN_BOGUS_SEND'] = '' - if type(self) is CmdTestEthdev: - etherscan_server_start() # TODO: stop server when test group finishes executing - @property async def rpc(self): from mmgen.rpc import rpc_init @@ -778,10 +775,20 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared): return self.tx_status(ext='{}.regtest.sigtx', expect_str='neither in mempool nor blockchain', exit_val=1) def txsign1_ni(self): return self.txsign(ni=True, dev_send=True) + + def etherscan_server_start(self): + self.spawn(msg_only=True) + etherscan_server.start() + return 'ok' def txsend_etherscan_test(self): return self.txsend(add_args=['--tx-proxy=ether', '--test'], test='tx_proxy') def txsend_etherscan(self): return self.txsend(add_args=['--tx-proxy=ethersc']) + def etherscan_server_stop(self): + self.spawn(msg_only=True) + etherscan_server.stop() + return 'ok' + def txsend1(self): return self.txsend() def txview1_sig(self): # do after send so that TxID is displayed diff --git a/test/cmdtest_d/etherscan.py b/test/cmdtest_d/etherscan.py deleted file mode 100755 index 56f9e993..00000000 --- a/test/cmdtest_d/etherscan.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -from http.server import HTTPServer, CGIHTTPRequestHandler - -from mmgen.util import msg -from mmgen.util2 import port_in_use - -class handler(CGIHTTPRequestHandler): - header = b'HTTP/1.1 200 OK\nContent-type: text/html\n\n' - - def do_response(self, target): - with open(f'test/ref/ethereum/etherscan-{target}.html') as fh: - text = fh.read() - self.wfile.write(self.header + text.encode()) - - def do_GET(self): - return self.do_response('form') - - def do_POST(self): - return self.do_response('result') - -def run_etherscan_server(server_class=HTTPServer, handler_class=handler): - - if port_in_use(28800): - msg('Port 28800 in use. Assuming etherscan server is running') - return True - - msg('Etherscan server listening on port 28800') - server_address = ('localhost', 28800) - httpd = server_class(server_address, handler_class) - httpd.serve_forever() - msg('Etherscan server exiting') diff --git a/test/cmdtest_d/httpd/etherscan.py b/test/cmdtest_d/httpd/etherscan.py new file mode 100755 index 00000000..10fa9529 --- /dev/null +++ b/test/cmdtest_d/httpd/etherscan.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# +# MMGen Wallet, a terminal-based cryptocurrency wallet +# Copyright (C)2013-2025 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-wallet +# https://gitlab.com/mmgen/mmgen-wallet + +""" +test.cmdtest_d.httpd.etherscan: Etherscan WSGI http server +""" + +from . import HTTPD + +class EtherscanServer(HTTPD): + name = 'etherscan server' + port = 28800 + content_type = 'text/html' + + def make_response_body(self, method, environ): + targets = {'GET': 'form', 'POST': 'result'} + with open(f'test/ref/ethereum/etherscan-{targets[method]}.html') as fh: + return fh.read().encode()