[tests] simplify binary and hex response parsing in interface_rest.py

We use assert_greater_than_or_equal(), since the hex response contains
an extra b'\n' traling byte.
This commit is contained in:
Roman Zeyde 2018-03-23 12:39:54 +03:00
parent ade5964e3f
commit 55efc1f62c
No known key found for this signature in database
GPG key ID: 87CAE5FA46917CBB

View file

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