2018-02-14 10:19:04 +01:00
|
|
|
import json
|
2018-04-10 17:29:25 +02:00
|
|
|
import base64
|
2017-12-06 11:12:45 +01:00
|
|
|
from queue import Queue
|
|
|
|
|
2018-02-14 10:19:04 +01:00
|
|
|
from aiohttp import ClientSession
|
2017-12-06 11:12:45 +01:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
2018-04-10 17:29:25 +02:00
|
|
|
@pytest.mark.tendermint
|
2017-12-06 11:12:45 +01:00
|
|
|
def test_process_event_new_block():
|
|
|
|
from bigchaindb.tendermint.event_stream import process_event
|
|
|
|
|
2018-04-26 11:09:38 +02:00
|
|
|
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 } } } } } }'
|
2017-12-06 11:12:45 +01:00
|
|
|
|
|
|
|
event_queue = Queue()
|
|
|
|
process_event(event_queue, event, 'test_stream_id')
|
|
|
|
assert not event_queue.empty()
|
2018-04-03 12:08:00 +02:00
|
|
|
block = event_queue.get()
|
|
|
|
assert isinstance(block.data['height'], int)
|
2017-12-06 11:12:45 +01:00
|
|
|
|
|
|
|
|
2018-04-10 17:29:25 +02:00
|
|
|
@pytest.mark.tendermint
|
2017-12-06 11:12:45 +01:00
|
|
|
def test_process_event_empty_block():
|
|
|
|
from bigchaindb.tendermint.event_stream import process_event
|
|
|
|
|
2018-04-26 11:09:38 +02:00
|
|
|
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}}}}}}'
|
2017-12-06 11:12:45 +01:00
|
|
|
|
|
|
|
event_queue = Queue()
|
|
|
|
process_event(event_queue, event, 'test_stream_id')
|
|
|
|
assert event_queue.empty()
|
|
|
|
|
|
|
|
|
2018-04-10 17:29:25 +02:00
|
|
|
@pytest.mark.tendermint
|
2017-12-06 11:12:45 +01:00
|
|
|
def test_process_unknown_event():
|
|
|
|
from bigchaindb.tendermint.event_stream import process_event
|
|
|
|
|
|
|
|
event = '{"jsonrpc": "2.0", "id": "test_stream_id#event",'\
|
2018-04-26 11:09:38 +02:00
|
|
|
' "result": { "query": "tm.event=\'UnknownEvent\'" }}'
|
2017-12-06 11:12:45 +01:00
|
|
|
|
|
|
|
event_queue = Queue()
|
|
|
|
process_event(event_queue, event, 'test_stream_id')
|
|
|
|
assert event_queue.empty()
|
2018-02-14 10:19:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
2018-05-03 16:42:43 +02:00
|
|
|
@pytest.mark.abci
|
2018-04-10 17:29:25 +02:00
|
|
|
async def test_subscribe_events(tendermint_ws_url, b):
|
2018-02-14 10:19:04 +01:00
|
|
|
from bigchaindb.tendermint.event_stream import subscribe_events
|
2018-04-10 17:29:25 +02:00
|
|
|
from bigchaindb.common.crypto import generate_key_pair
|
|
|
|
from bigchaindb.models import Transaction
|
|
|
|
|
2018-02-14 10:19:04 +01:00
|
|
|
session = ClientSession()
|
|
|
|
ws = await session.ws_connect(tendermint_ws_url)
|
|
|
|
stream_id = 'bigchaindb_stream_01'
|
|
|
|
await subscribe_events(ws, stream_id)
|
|
|
|
msg = await ws.receive()
|
|
|
|
assert msg.data
|
|
|
|
msg_data_dict = json.loads(msg.data)
|
|
|
|
assert msg_data_dict['id'] == stream_id
|
|
|
|
assert msg_data_dict['jsonrpc'] == '2.0'
|
2018-03-23 15:39:47 +01:00
|
|
|
assert msg_data_dict['result'] == {}
|
2018-04-10 17:29:25 +02:00
|
|
|
|
|
|
|
alice = generate_key_pair()
|
|
|
|
tx = Transaction.create([alice.public_key],
|
|
|
|
[([alice.public_key], 1)],
|
|
|
|
asset=None)\
|
|
|
|
.sign([alice.private_key])
|
|
|
|
|
|
|
|
b.post_transaction(tx, 'broadcast_tx_async')
|
|
|
|
msg = await ws.receive()
|
|
|
|
msg_data_dict = json.loads(msg.data)
|
2018-04-26 11:09:38 +02:00
|
|
|
raw_txn = msg_data_dict['result']['data']['value']['block']['data']['txs'][0]
|
2018-04-10 17:29:25 +02:00
|
|
|
transaction = json.loads(base64.b64decode(raw_txn).decode('utf8'))
|
|
|
|
|
|
|
|
assert transaction == tx.to_dict()
|