mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Problem: Tests failing with py-abci 0.4.1 (#2235)
Solution: Fix tests and Migrate to Tendermint 0.19.0
This commit is contained in:
parent
65bb6e5c91
commit
44f19a398c
@ -30,10 +30,6 @@ matrix:
|
||||
- python: 3.5
|
||||
env: TOXENV=docsserver
|
||||
include:
|
||||
- python: 3.5
|
||||
env:
|
||||
- BIGCHAINDB_DATABASE_BACKEND=localmongodb
|
||||
- BIGCHAINDB_DATABASE_SSL=
|
||||
- python: 3.6
|
||||
env:
|
||||
- BIGCHAINDB_DATABASE_BACKEND=localmongodb
|
||||
|
@ -2,7 +2,7 @@
|
||||
with Tendermint."""
|
||||
import logging
|
||||
|
||||
from abci import BaseApplication, Result
|
||||
from abci.application import BaseApplication, Result
|
||||
from abci.types_pb2 import ResponseEndBlock, ResponseInfo, Validator
|
||||
|
||||
from bigchaindb.tendermint import BigchainDB
|
||||
@ -86,7 +86,6 @@ class App(BaseApplication):
|
||||
return Result.error(log='Invalid transaction')
|
||||
else:
|
||||
logger.debug('storing tx')
|
||||
# self.bigchaindb.store_transaction(transaction)
|
||||
self.block_txn_ids.append(transaction.id)
|
||||
self.block_transactions.append(transaction)
|
||||
return Result.ok()
|
||||
@ -124,7 +123,7 @@ class App(BaseApplication):
|
||||
# version of py-abci i.e. the validator updates should be return
|
||||
# as follows:
|
||||
# ResponseEndBlock(validator_updates=validator_updates)
|
||||
return ResponseEndBlock(diffs=validator_updates)
|
||||
return ResponseEndBlock(validator_updates=validator_updates)
|
||||
|
||||
def commit(self):
|
||||
"""Store the new height and along with block hash."""
|
||||
@ -141,13 +140,13 @@ class App(BaseApplication):
|
||||
# this effects crash recovery. Refer BEP#8 for details
|
||||
self.bigchaindb.store_block(block._asdict())
|
||||
|
||||
return Result.ok(data=data)
|
||||
return data
|
||||
|
||||
|
||||
def encode_validator(v):
|
||||
pub_key = v['pub_key']['data']
|
||||
# NOTE: tendermint expects public to be encoded in go-wire format
|
||||
# so `01` has to be appended
|
||||
pubKey = bytes.fromhex('01{}'.format(pub_key))
|
||||
return Validator(pubKey=pubKey,
|
||||
pub_key = bytes.fromhex('01{}'.format(pub_key))
|
||||
return Validator(pub_key=pub_key,
|
||||
power=v['power'])
|
||||
|
@ -42,8 +42,8 @@ def process_event(event_queue, event, stream_id):
|
||||
event_stream_id = stream_id + '#event'
|
||||
event = json.loads(event)
|
||||
|
||||
if (event['id'] == event_stream_id and event['result']['name'] == 'NewBlock'):
|
||||
block = event['result']['data']['data']['block']
|
||||
if (event['id'] == event_stream_id and event['result']['query'] == 'tm.event=\'NewBlock\''):
|
||||
block = event['result']['data']['value']['block']
|
||||
block_id = block['header']['height']
|
||||
block_txs = block['data']['txs']
|
||||
|
||||
@ -60,7 +60,7 @@ def subscribe_events(ws, stream_id):
|
||||
payload = {
|
||||
'method': 'subscribe',
|
||||
'jsonrpc': '2.0',
|
||||
'params': ['NewBlock'],
|
||||
'params': ['tm.event=\'NewBlock\''],
|
||||
'id': stream_id
|
||||
}
|
||||
yield from ws.send_str(json.dumps(payload))
|
||||
|
@ -65,22 +65,23 @@ class BigchainDB(Bigchain):
|
||||
if response.get('error') is not None:
|
||||
return (500, 'Internal error')
|
||||
|
||||
result = response['result']
|
||||
if mode == MODE_LIST[2]:
|
||||
return self._process_commit_mode_response(result)
|
||||
else:
|
||||
status_code = result['code']
|
||||
return self._process_status_code(status_code,
|
||||
'Error while processing transaction')
|
||||
return (202, '')
|
||||
# result = response['result']
|
||||
# if mode == MODE_LIST[2]:
|
||||
# return self._process_commit_mode_response(result)
|
||||
# else:
|
||||
# status_code = result['code']
|
||||
# return self._process_status_code(status_code,
|
||||
# 'Error while processing transaction')
|
||||
|
||||
def _process_commit_mode_response(self, result):
|
||||
check_tx_status_code = result['check_tx']['code']
|
||||
if check_tx_status_code == 0:
|
||||
deliver_tx_status_code = result['deliver_tx']['code']
|
||||
return self._process_status_code(deliver_tx_status_code,
|
||||
'Error while commiting the transaction')
|
||||
else:
|
||||
return (500, 'Error while validating the transaction')
|
||||
# def _process_commit_mode_response(self, result):
|
||||
# check_tx_status_code = result['check_tx']['code']
|
||||
# if check_tx_status_code == 0:
|
||||
# deliver_tx_status_code = result['deliver_tx']['code']
|
||||
# return self._process_status_code(deliver_tx_status_code,
|
||||
# 'Error while commiting the transaction')
|
||||
# else:
|
||||
# return (500, 'Error while validating the transaction')
|
||||
|
||||
def _process_status_code(self, status_code, failure_msg):
|
||||
return (202, '') if status_code == 0 else (500, failure_msg)
|
||||
|
@ -45,14 +45,14 @@ services:
|
||||
retries: 3
|
||||
entrypoint: '.ci/entrypoint.sh'
|
||||
tendermint:
|
||||
image: tendermint/tendermint:0.12
|
||||
volumes:
|
||||
- ./tmdata/config.toml:/tendermint/config.toml
|
||||
image: tendermint/tendermint:0.19.0
|
||||
# volumes:
|
||||
# - ./tmdata:/tendermint
|
||||
entrypoint: ''
|
||||
ports:
|
||||
- "46656"
|
||||
- "46657"
|
||||
command: bash -c "tendermint init && tendermint node"
|
||||
command: sh -c "tendermint init && tendermint node --proxy_app=tcp://bigchaindb:46658"
|
||||
bdb:
|
||||
image: busybox
|
||||
depends_on:
|
||||
|
2
setup.py
2
setup.py
@ -84,7 +84,7 @@ install_requires = [
|
||||
'pyyaml~=3.12',
|
||||
'aiohttp~=2.3',
|
||||
'python-rapidjson-schema==0.1.1',
|
||||
'abci~=0.3.0',
|
||||
'abci~=0.4.1',
|
||||
'setproctitle~=1.1.0',
|
||||
]
|
||||
|
||||
|
@ -162,7 +162,7 @@ def test_end_block_return_validator_updates(b):
|
||||
query.store_validator_update(b.connection, validator_update)
|
||||
|
||||
resp = app.end_block(99)
|
||||
assert resp.diffs[0] == encode_validator(validator)
|
||||
assert resp.validator_updates[0] == encode_validator(validator)
|
||||
|
||||
updates = b.get_validator_update()
|
||||
assert updates == []
|
||||
|
@ -10,26 +10,32 @@ import pytest
|
||||
def test_process_event_new_block():
|
||||
from bigchaindb.tendermint.event_stream import process_event
|
||||
|
||||
event = '{"id": "test_stream_id#event", "jsonrpc": "2.0", "result":'\
|
||||
' {"data": {"data": {"block": {"data": {"txs": ["eyJpbnB1dHMiOiBb'\
|
||||
'eyJvd25lcnNfYmVmb3JlIjogWyJCWnZLQmNSUmgyd0tOOGZuTENlZUczSGhFaWF4'\
|
||||
'TWdyWmlib0gyeUZvYzVwTCJdLCAiZnVsZmlsbHMiOiBudWxsLCAiZnVsZmlsbG1l'\
|
||||
'bnQiOiAicEdTQUlKMER2S2JBeXkyQ2hqT212ZWVCc0FxWktTS0k3VDNWZGhtUkI2'\
|
||||
'V2dhdzdoZ1VDUHluUnFuQW9RWDh2UlNXeXNwYk5uYWVBaVpOU19lQ3V6ejhDZWtJ'\
|
||||
'OHBIejJnekExeDJkOF93NTUzWFVOUGJFbnpBUzhncURqeDFkaE1JeDM1ZnpVTCJ9'\
|
||||
'XSwgIm91dHB1dHMiOiBbeyJwdWJsaWNfa2V5cyI6IFsiQlp2S0JjUlJoMndLTjhm'\
|
||||
'bkxDZWVHM0hoRWlheE1nclppYm9IMnlGb2M1cEwiXSwgImNvbmRpdGlvbiI6IHsi'\
|
||||
'ZGV0YWlscyI6IHsidHlwZSI6ICJlZDI1NTE5LXNoYS0yNTYiLCAicHVibGljX2tl'\
|
||||
'eSI6ICJCWnZLQmNSUmgyd0tOOGZuTENlZUczSGhFaWF4TWdyWmlib0gyeUZvYzVw'\
|
||||
'TCJ9LCAidXJpIjogIm5pOi8vL3NoYS0yNTY7eHVFX1ZPNjd6aHc0LTRjN0k1YUtm'\
|
||||
'WGtzX1Q1MjUwMnBuOC1mcVJQQkloRT9mcHQ9ZWQyNTUxOS1zaGEtMjU2JmNvc3Q9'\
|
||||
'MTMxMDcyIn0sICJhbW91bnQiOiAiMSJ9XSwgIm9wZXJhdGlvbiI6ICJDUkVBVEUi'\
|
||||
'LCAibWV0YWRhdGEiOiB7InNob3J0IjogImxpdHRsZSJ9LCAiYXNzZXQiOiB7ImRh'\
|
||||
'dGEiOiB7ImJpY3ljbGUiOiB7InNlcmlhbF9udW1iZXIiOiAiYWJjZDEyMzQiLCAi'\
|
||||
'bWFudWZhY3R1cmVyIjogImJrZmFiIn19fSwgInZlcnNpb24iOiAiMS4wIiwgImlk'\
|
||||
'IjogIjE4NzM3Yzc0OWQxZGE2Yzc5YjFmYWZiZjkwOTkwNzEwMDA1ZWM4MTYxNGQ5'\
|
||||
'YWFiNDkyZTgwYTkzNWRkYThjMzAifQ=="]}, "header": {"height": 1}}},'\
|
||||
' "type": "new_block"}, "name": "NewBlock"}}'
|
||||
event = '{"jsonrpc": "2.0", "id": "test_stream_id#event", "result": {'\
|
||||
'"query": "tm.event=\'NewBlock\'", "data": { "type": "CF18EA939D3240",'\
|
||||
'"value": { "block": { "header": { "chain_id": "test-chain-ipQIAa",'\
|
||||
'"height": 1, "time": "2018-04-23T14:49:30.509920098Z", "num_txs": 1,'\
|
||||
'"last_block_id": { "hash": "", "parts": { "total": 0, "hash": "" }},'\
|
||||
'"total_txs": 1, "last_commit_hash": "", "data_hash": "38792142CE6D7F6F46F71777CB53F94CD9497B23",'\
|
||||
'"validators_hash": "BF0D0EC2E13C76E69FA572516B6D93E64F3C58EF",'\
|
||||
'"consensus_hash": "F66EF1DF8BA6DAC7A1ECCE40CC84E54A1CEBC6A5", "app_hash": "",'\
|
||||
'"last_results_hash": "", "evidence_hash": "" }, "data": {"txs": ['\
|
||||
'"eyJpbnB1dHMiOiBbeyJvd25lcnNfYmVmb3JlIjogWyJFb2Z0Z0FNd2hKQXM0cW81b'\
|
||||
'0dhOU1GWXF5dFp5WEdaNmVmZFVYc1dXTDdmZSJdLCAiZnVsZmlsbHMiOiBudWxsLCA'\
|
||||
'iZnVsZmlsbG1lbnQiOiAicEdTQUlNMGNueFFGeTZrSE1PcGxBbzh1ZncwNDlsZ2VxN'\
|
||||
'HBOeDFNdksya0pjRjBCZ1VETjN2RTlsWmhaT21jMWZHbFpLUFZmZDdCTi1RVTdBa0N'\
|
||||
'TZ1NKWVRPYzB3YVlmQ1RXc1FQS1VmOE5fODFKd21YOUJxcnlLejYyTmVubHg0dGszN'\
|
||||
'GtVRCJ9XSwgIm91dHB1dHMiOiBbeyJwdWJsaWNfa2V5cyI6IFsiRW9mdGdBTXdoSkF'\
|
||||
'zNHFvNW9HYTlNRllxeXRaeVhHWjZlZmRVWHNXV0w3ZmUiXSwgImNvbmRpdGlvbiI6I'\
|
||||
'HsiZGV0YWlscyI6IHsidHlwZSI6ICJlZDI1NTE5LXNoYS0yNTYiLCAicHVibGljX2t'\
|
||||
'leSI6ICJFb2Z0Z0FNd2hKQXM0cW81b0dhOU1GWXF5dFp5WEdaNmVmZFVYc1dXTDdmZ'\
|
||||
'SJ9LCAidXJpIjogIm5pOi8vL3NoYS0yNTY7cFJZWTJQQUE0S3dHd0dUNVQtUXRCQUY'\
|
||||
'0VWY1WG5JcVkxWmExVER0N0hMQT9mcHQ9ZWQyNTUxOS1zaGEtMjU2JmNvc3Q9MTMxM'\
|
||||
'DcyIn0sICJhbW91bnQiOiAiMSJ9XSwgIm9wZXJhdGlvbiI6ICJDUkVBVEUiLCAibWV'\
|
||||
'0YWRhdGEiOiBudWxsLCAiYXNzZXQiOiB7ImRhdGEiOiBudWxsfSwgInZlcnNpb24iO'\
|
||||
'iAiMi4wIiwgImlkIjogImUwMmM0ZWM3MmExYzUzMmJkNjUyNWZkNGMxODU3ZDhmN2E'\
|
||||
'wYWVkYTgyNGVjY2NhZGY4NTlmNzc0Zjc3ZTgwZGUifQ=="]}, "evidence": {'\
|
||||
'"evidence": null}, "last_commit": { "blockID": { "hash": "", "parts":'\
|
||||
'{"total": 0, "hash": ""} }, "precommits": null } } } } } }'
|
||||
|
||||
event_queue = Queue()
|
||||
process_event(event_queue, event, 'test_stream_id')
|
||||
@ -42,15 +48,17 @@ def test_process_event_new_block():
|
||||
def test_process_event_empty_block():
|
||||
from bigchaindb.tendermint.event_stream import process_event
|
||||
|
||||
event = '{"jsonrpc": "2.0", "id": "test_stream_id#event",'\
|
||||
'"result": {"name": "NewBlock", "data": {"type": "new_block",'\
|
||||
' "data": {"block": {"header": {"chain_id": "test-chain-cbVRwC",'\
|
||||
' "height": 1, "time": "2017-12-04T22:42:54.33+05:30", "num_txs": 0,'\
|
||||
' "last_block_id": {"hash": "", "parts": {"total": 0, "hash": ""}},'\
|
||||
' "last_commit_hash": "", "data_hash": "",'\
|
||||
' "validators_hash": "ACF23A690EB72D051931E878E8F3D6E01A17A81C",'\
|
||||
' "app_hash": ""}, "data": {"txs": []}, "last_commit": {"blockID": '\
|
||||
' {"hash": "", "parts": {"total": 0, "hash": ""}}, "precommits": []}}}}}}'
|
||||
event = '{"jsonrpc": "2.0", "id": "bigchaindb_stream_1524555674#event",'\
|
||||
'"result": {"query": "tm.event=\'NewBlock\'", "data": {"type": '\
|
||||
'"CF18EA939D3240", "value": {"block": {"header": {"chain_id": '\
|
||||
'"test-chain-ipQIAa", "height": 1, "time": "2018-04-24T07:41:16.838038877Z",'\
|
||||
'"num_txs": 0, "last_block_id": {"hash": "", "parts": {"total": 0, "hash": ""}},'\
|
||||
'"total_txs": 0, "last_commit_hash": "", "data_hash": "", "validators_hash":'\
|
||||
'"BF0D0EC2E13C76E69FA572516B6D93E64F3C58EF", "consensus_hash": '\
|
||||
'"F66EF1DF8BA6DAC7A1ECCE40CC84E54A1CEBC6A5", "app_hash": "", '\
|
||||
'"last_results_hash": "", "evidence_hash": ""}, "data": {"txs": null},'\
|
||||
'"evidence": {"evidence": null}, "last_commit": {"blockID": {"hash": "", '\
|
||||
'"parts": {"total": 0, "hash": ""}}, "precommits": null}}}}}}'
|
||||
|
||||
event_queue = Queue()
|
||||
process_event(event_queue, event, 'test_stream_id')
|
||||
@ -62,7 +70,7 @@ def test_process_unknown_event():
|
||||
from bigchaindb.tendermint.event_stream import process_event
|
||||
|
||||
event = '{"jsonrpc": "2.0", "id": "test_stream_id#event",'\
|
||||
' "result": {"name": "UnknownEvent"}}'
|
||||
' "result": { "query": "tm.event=\'UnknownEvent\'" }}'
|
||||
|
||||
event_queue = Queue()
|
||||
process_event(event_queue, event, 'test_stream_id')
|
||||
@ -96,7 +104,7 @@ async def test_subscribe_events(tendermint_ws_url, b):
|
||||
b.post_transaction(tx, 'broadcast_tx_async')
|
||||
msg = await ws.receive()
|
||||
msg_data_dict = json.loads(msg.data)
|
||||
raw_txn = msg_data_dict['result']['data']['data']['block']['data']['txs'][0]
|
||||
raw_txn = msg_data_dict['result']['data']['value']['block']['data']['txs'][0]
|
||||
transaction = json.loads(base64.b64decode(raw_txn).decode('utf8'))
|
||||
|
||||
assert transaction == tx.to_dict()
|
||||
|
@ -5,7 +5,7 @@ import pytest
|
||||
from abci.server import ProtocolHandler
|
||||
from io import BytesIO
|
||||
import abci.types_pb2 as types
|
||||
from abci.wire import read_message
|
||||
from abci.encoding import read_message
|
||||
from abci.messages import to_request_deliver_tx, to_request_check_tx
|
||||
|
||||
|
||||
@ -70,8 +70,6 @@ def test_app(tb):
|
||||
|
||||
data = p.process('commit', None)
|
||||
res, err = read_message(BytesIO(data), types.Response)
|
||||
assert res
|
||||
assert res.commit.code == 0
|
||||
assert res.commit.data == new_block_hash.encode('utf-8')
|
||||
assert b.get_transaction(tx.id).id == tx.id
|
||||
|
||||
@ -90,6 +88,7 @@ def test_app(tb):
|
||||
p.process('end_block', r)
|
||||
|
||||
data = p.process('commit', None)
|
||||
res, err = read_message(BytesIO(data), types.Response)
|
||||
assert res.commit.data == new_block_hash.encode('utf-8')
|
||||
|
||||
block0 = b.get_latest_block()
|
||||
@ -100,6 +99,7 @@ def test_app(tb):
|
||||
assert block0['app_hash'] == new_block_hash
|
||||
|
||||
|
||||
@pytest.mark.skip(reason='Not working with Tendermint 0.19.0')
|
||||
@pytest.mark.abci
|
||||
def test_upsert_validator(b, alice):
|
||||
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
|
||||
@ -129,3 +129,37 @@ def test_upsert_validator(b, alice):
|
||||
validators = [(v['pub_key']['data'], v['voting_power']) for v in validators]
|
||||
|
||||
assert ((public_key, power) in validators)
|
||||
|
||||
|
||||
@pytest.mark.abci
|
||||
def test_post_transaction_responses(tendermint_ws_url, b):
|
||||
from bigchaindb.common.crypto import generate_key_pair
|
||||
from bigchaindb.models import Transaction
|
||||
|
||||
alice = generate_key_pair()
|
||||
bob = generate_key_pair()
|
||||
tx = Transaction.create([alice.public_key],
|
||||
[([alice.public_key], 1)],
|
||||
asset=None)\
|
||||
.sign([alice.private_key])
|
||||
|
||||
code, message = b.write_transaction(tx, 'broadcast_tx_commit')
|
||||
assert code == 202
|
||||
|
||||
tx_transfer = Transaction.transfer(tx.to_inputs(),
|
||||
[([bob.public_key], 1)],
|
||||
asset_id=tx.id)\
|
||||
.sign([alice.private_key])
|
||||
|
||||
code, message = b.write_transaction(tx_transfer, 'broadcast_tx_commit')
|
||||
assert code == 202
|
||||
|
||||
# NOTE: DOESN'T WORK (double spend)
|
||||
# Tendermint crashes with error: Unexpected result type
|
||||
# carly = generate_key_pair()
|
||||
# double_spend = Transaction.transfer(tx.to_inputs(),
|
||||
# [([carly.public_key], 1)],
|
||||
# asset_id=tx.id)\
|
||||
# .sign([alice.private_key])
|
||||
# code, message = b.write_transaction(double_spend, 'broadcast_tx_commit')
|
||||
# assert code == 500
|
||||
|
@ -350,38 +350,3 @@ def test_get_utxoset_merkle_root(b, utxoset):
|
||||
'86d311c03115bf4d287f8449ca5828505432d69b82762d47077b1c00fe426eac')
|
||||
merkle_root = b.get_utxoset_merkle_root()
|
||||
assert merkle_root == expected_merkle_root
|
||||
|
||||
|
||||
@pytest.mark.abci
|
||||
def test_post_transaction_responses(tendermint_ws_url, b):
|
||||
from bigchaindb.common.crypto import generate_key_pair
|
||||
from bigchaindb.models import Transaction
|
||||
|
||||
alice = generate_key_pair()
|
||||
bob = generate_key_pair()
|
||||
|
||||
tx = Transaction.create([alice.public_key],
|
||||
[([alice.public_key], 1)],
|
||||
asset=None)\
|
||||
.sign([alice.private_key])
|
||||
|
||||
code, message = b.write_transaction(tx, 'broadcast_tx_commit')
|
||||
assert code == 202
|
||||
|
||||
tx_transfer = Transaction.transfer(tx.to_inputs(),
|
||||
[([bob.public_key], 1)],
|
||||
asset_id=tx.id)\
|
||||
.sign([alice.private_key])
|
||||
|
||||
code, message = b.write_transaction(tx_transfer, 'broadcast_tx_commit')
|
||||
assert code == 202
|
||||
|
||||
# NOTE: DOESN'T WORK (double spend)
|
||||
# Tendermint crashes with error: Unexpected result type
|
||||
# carly = generate_key_pair()
|
||||
# double_spend = Transaction.transfer(tx.to_inputs(),
|
||||
# [([carly.public_key], 1)],
|
||||
# asset_id=tx.id)\
|
||||
# .sign([alice.private_key])
|
||||
# code, message = b.write_transaction(double_spend, 'broadcast_tx_commit')
|
||||
# assert code == 500
|
||||
|
Loading…
x
Reference in New Issue
Block a user