Changeset View
Changeset View
Standalone View
Standalone View
contrib/devtools/test/fetch-chainparams-test.py
- This file was added.
Property | Old Value | New Value |
---|---|---|
File Mode | null | 100755 |
#!/usr/bin/env python3 | |||||
# Copyright (c) 2019 The Bitcoin developers | |||||
# Distributed under the MIT software license, see the accompanying | |||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
from enum import Enum | |||||
from http.server import HTTPServer, BaseHTTPRequestHandler | |||||
import json | |||||
import subprocess | |||||
import threading | |||||
import unittest | |||||
class Chain(Enum): | |||||
main = 1 | |||||
test = 2 | |||||
class MockRequestHandler(BaseHTTPRequestHandler): | |||||
chain = None | |||||
def do_GET(self): | |||||
if self.path == '/rest/chaininfo.json': | |||||
self.wfile.write(str('{"chain":"' + self.chain.name + | |||||
'","bestblockhash":"0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44"' | |||||
',"chainwork":"00000000000000000000000000000000000000000000004b3c801b9507361f33"}').encode()) | |||||
elif self.path == '/rest/block/0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44.json': | |||||
# Valid block hash | |||||
self.wfile.write( | |||||
'{"chainwork":"00000000000000000000000000000000000000000000004b3c801b9507361f33"}'.encode()) | |||||
elif self.path == '/rest/block/0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45.json': | |||||
# Valid hash for non-existent block | |||||
self.wfile.write( | |||||
"0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45 not found".encode()) | |||||
elif self.path == '/rest/block/abc.json': | |||||
# Invalid hash | |||||
self.wfile.write("Invalid hash: abc".encode()) | |||||
else: | |||||
self.server.failTest = "Unexpected request sent to mock server: {}".format( | |||||
self.path) | |||||
self.send_response(404) | |||||
return | |||||
self.send_response(200) | |||||
def log_request(self, code): | |||||
# Do not log requests otherwise it messes with the test framework output | |||||
pass | |||||
class MainnetMockRequestHandler(MockRequestHandler): | |||||
chain = Chain.main | |||||
class TestnetMockRequestHandler(MockRequestHandler): | |||||
chain = Chain.test | |||||
def CheckResult(test, args, expectedExitCode, expectedOutput='', outputContains=None): | |||||
try: | |||||
r = subprocess.run('../fetch-chainparams.py {}'.format(args), | |||||
shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |||||
test.assertEqual(expectedExitCode, r.returncode, "Incorrect exit code: {}\nExpected exit code was: {}\nStderr returned:\n{}".format( | |||||
r.returncode, expectedExitCode, r.stderr)) | |||||
actualOutput = r.stdout.decode('utf-8').rstrip() | |||||
if outputContains is None: | |||||
if len(actualOutput) > 0: | |||||
actualOutput = json.loads(actualOutput) | |||||
test.assertEqual(expectedOutput, actualOutput, "Expected output didn't match!\nActual:\n{}\nExpected:\n{}".format( | |||||
actualOutput, expectedOutput)) | |||||
else: | |||||
test.assertIn(outputContains, actualOutput) | |||||
except: | |||||
raise | |||||
class MockHTTPServer(HTTPServer): | |||||
timeout = 1 | |||||
failTest = None | |||||
def __init__(self, addr, handler, test): | |||||
self.test = test | |||||
super(HTTPServer, self).__init__(addr, handler) | |||||
def handle_timeout(self): | |||||
self.test.fail("Request timed out.") | |||||
class MainnetTests(unittest.TestCase): | |||||
maxDiff = None | |||||
def setUp(self): | |||||
self.server = MockHTTPServer( | |||||
('', 8332), MainnetMockRequestHandler, self) | |||||
threading.Thread(target=self.server.serve_forever, daemon=True).start() | |||||
def tearDown(self): | |||||
self.server.shutdown() | |||||
self.server.server_close() | |||||
if self.server.failTest is not None: | |||||
self.fail(self.server.failTest) | |||||
def test_help(self): | |||||
CheckResult(self, '-h', 0, | |||||
outputContains="usage: fetch-chainparams.py") | |||||
CheckResult(self, '-t -h', 0, | |||||
outputContains="usage: fetch-chainparams.py") | |||||
def test_mainnet_args_on_mainnet(self): | |||||
expectedOutput = {'chainwork': '00000000000000000000000000000000000000000000004b3c801b9507361f33', | |||||
'blockhash': '0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44'} | |||||
CheckResult(self, '', 0, expectedOutput) | |||||
CheckResult(self, '-a localhost', 0, expectedOutput) | |||||
CheckResult(self, '-a notlocalhost', 1) | |||||
CheckResult(self, '-p 9999', 1) | |||||
CheckResult(self, '-p 8332', 0, expectedOutput) | |||||
CheckResult(self, '-a localhost -p 8332', 0, expectedOutput) | |||||
CheckResult(self, '-a notlocalhost -p 8332', 1) | |||||
CheckResult(self, '-b abc', 2) | |||||
CheckResult( | |||||
self, '-b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45', 2) | |||||
CheckResult( | |||||
self, '-b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44', 0, expectedOutput) | |||||
def test_testnet_args_on_mainnet(self): | |||||
CheckResult(self, '-t', 1) | |||||
CheckResult(self, '-t -a localhost', 1) | |||||
CheckResult(self, '-t -a notlocalhost', 1) | |||||
CheckResult(self, '-t -p 9999', 1) | |||||
CheckResult(self, '-t -p 8332', 3) | |||||
CheckResult(self, '-t -a localhost -p 8332', 3) | |||||
CheckResult(self, '-t -a notlocalhost -p 8332', 1) | |||||
CheckResult(self, '-t -p 8332 -b abc', 3) | |||||
CheckResult( | |||||
self, '-t -p 8332 -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45', 3) | |||||
CheckResult( | |||||
self, '-t -p 8332 -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44', 3) | |||||
class TestnetTests(unittest.TestCase): | |||||
maxDiff = None | |||||
def setUp(self): | |||||
self.server = MockHTTPServer( | |||||
('', 18332), TestnetMockRequestHandler, self) | |||||
threading.Thread(target=self.server.serve_forever, daemon=True).start() | |||||
def tearDown(self): | |||||
self.server.shutdown() | |||||
self.server.server_close() | |||||
def test_help(self): | |||||
CheckResult(self, '-h', 0, | |||||
outputContains="usage: fetch-chainparams.py") | |||||
CheckResult(self, '-t -h', 0, | |||||
outputContains="usage: fetch-chainparams.py") | |||||
def test_mainnet_args_on_testnet(self): | |||||
CheckResult(self, '', 1) | |||||
CheckResult(self, '-a localhost', 1) | |||||
CheckResult(self, '-a notlocalhost', 1) | |||||
CheckResult(self, '-p 99999', 1) | |||||
CheckResult(self, '-p 18332', 3) | |||||
CheckResult(self, '-a localhost -p 18332', 3) | |||||
CheckResult(self, '-a notlocalhost -p 18332', 1) | |||||
CheckResult(self, '-p 18332 -b abc', 3) | |||||
CheckResult( | |||||
self, '-p 18332 -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45', 3) | |||||
CheckResult( | |||||
self, '-p 18332 -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44', 3) | |||||
def test_testnet_args_on_mainnet(self): | |||||
expectedOutput = {'chainwork': '00000000000000000000000000000000000000000000004b3c801b9507361f33', | |||||
'blockhash': '0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44'} | |||||
CheckResult(self, '-t', 0, expectedOutput) | |||||
CheckResult(self, '-t -a localhost', 0, expectedOutput) | |||||
CheckResult(self, '-t -a notlocalhost', 1) | |||||
CheckResult(self, '-t -p 99999', 1) | |||||
CheckResult(self, '-t -p 18332', 0, expectedOutput) | |||||
CheckResult(self, '-t -a localhost -p 18332', 0, expectedOutput) | |||||
CheckResult(self, '-t -a notlocalhost -p 18332', 1) | |||||
CheckResult(self, '-t -b abc', 2) | |||||
CheckResult( | |||||
self, '-t -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c45', 2) | |||||
CheckResult( | |||||
self, '-t -b 0000000000073b088995d4dac03809c1c647c231523f69e2db99bbfb1c574c44', 0, expectedOutput) | |||||
unittest.main() |