diff --git a/test/functional/interface_rest.py b/test/functional/interface_rest.py index 0a924e3149b..2ee33aa8690 100755 --- a/test/functional/interface_rest.py +++ b/test/functional/interface_rest.py @@ -3,21 +3,22 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the REST API.""" + +import binascii from decimal import Decimal from enum import Enum from io import BytesIO import json -from codecs import encode from struct import pack, unpack import http.client import urllib.parse -from test_framework.messages import deser_uint256 from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( assert_equal, assert_greater_than, + assert_greater_than_or_equal, hex_str_to_bytes, ) @@ -131,19 +132,15 @@ class RESTTest (BitcoinTestFramework): self.log.info("Query the TXOs using the /getutxos URI with a binary response") - bb_hash = self.nodes[0].getbestblockhash() - bin_request = b'\x01\x02' for txid, n in [spending, spent]: bin_request += hex_str_to_bytes(txid) bin_request += pack("i", n) bin_response = self.test_rest_request("/getutxos", http_method='POST', req_type=ReqType.BIN, body=bin_request, ret_type=RetType.BYTES) - output = BytesIO() - output.write(bin_response) - output.seek(0) - chain_height = unpack("i", output.read(4))[0] - response_hash = hex(deser_uint256(output))[2:].zfill(64) + output = BytesIO(bin_response) + chain_height, = unpack("i", output.read(4)) + response_hash = binascii.hexlify(output.read(32)[::-1]).decode('ascii') assert_equal(bb_hash, response_hash) # check if getutxo's chaintip during calculation was fine assert_equal(chain_height, 102) # chain height must be 102 @@ -199,30 +196,30 @@ class RESTTest (BitcoinTestFramework): self.sync_all() self.log.info("Test the /block and /headers URIs") + bb_hash = self.nodes[0].getbestblockhash() # Check binary format response = self.test_rest_request("/block/{}".format(bb_hash), req_type=ReqType.BIN, ret_type=RetType.OBJ) assert_greater_than(int(response.getheader('content-length')), 80) - response_str = response.read() + response_bytes = response.read() # Compare with block header response_header = self.test_rest_request("/headers/1/{}".format(bb_hash), req_type=ReqType.BIN, ret_type=RetType.OBJ) assert_equal(int(response_header.getheader('content-length')), 80) - response_header_str = response_header.read() - assert_equal(response_str[0:80], response_header_str) + response_header_bytes = response_header.read() + assert_equal(response_bytes[:80], response_header_bytes) # Check block hex format response_hex = self.test_rest_request("/block/{}".format(bb_hash), req_type=ReqType.HEX, ret_type=RetType.OBJ) assert_greater_than(int(response_hex.getheader('content-length')), 160) - response_hex_str = response_hex.read() - assert_equal(encode(response_str, "hex_codec")[0:160], response_hex_str[0:160]) + response_hex_bytes = response_hex.read().strip(b'\n') + assert_equal(binascii.hexlify(response_bytes), response_hex_bytes) # Compare with hex block header response_header_hex = self.test_rest_request("/headers/1/{}".format(bb_hash), req_type=ReqType.HEX, ret_type=RetType.OBJ) assert_greater_than(int(response_header_hex.getheader('content-length')), 160) - response_header_hex_str = response_header_hex.read() - assert_equal(response_hex_str[0:160], response_header_hex_str[0:160]) - assert_equal(encode(response_header_str, "hex_codec")[0:160], response_header_hex_str[0:160]) + response_header_hex_bytes = response_header_hex.read(160) + assert_equal(binascii.hexlify(response_bytes[:80]), response_header_hex_bytes) # Check json format block_json_obj = self.test_rest_request("/block/{}".format(bb_hash)) @@ -252,7 +249,8 @@ class RESTTest (BitcoinTestFramework): # Check hex format response hex_response = self.test_rest_request("/tx/{}".format(tx_hash), req_type=ReqType.HEX, ret_type=RetType.OBJ) - assert_greater_than(int(hex_response.getheader('content-length')), 10) + assert_greater_than_or_equal(int(hex_response.getheader('content-length')), + json_obj['size']*2) self.log.info("Test tx inclusion in the /mempool and /block URIs")