diff --git a/test/unit/conftest.py b/test/unit/conftest.py index 2a1f806..c1b4d6f 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -4,13 +4,19 @@ import requests from time import sleep from shutil import rmtree from threading import Thread +from hashlib import sha256 +from binascii import unhexlify from pisa.conf import DB_PATH +from apps.cli.blob import Blob from pisa.api import start_api from pisa.responder import Job from pisa.watcher import Watcher +from pisa.tools import bitcoin_cli from pisa.db_manager import DBManager from pisa.appointment import Appointment +from test.simulator.utils import sha256d +from test.simulator.transaction import TX from test.simulator.bitcoind_sim import run_simulator, HOST, PORT @@ -52,9 +58,9 @@ def db_manager(): def get_random_value_hex(nbytes): - pseudo_random_value = random.getrandbits(8*nbytes) + pseudo_random_value = random.getrandbits(8 * nbytes) prv_hex = '{:x}'.format(pseudo_random_value) - return prv_hex.zfill(2*nbytes) + return prv_hex.zfill(2 * nbytes) def generate_block(): @@ -67,19 +73,38 @@ def generate_blocks(n): generate_block() -def generate_dummy_appointment(): - locator = get_random_value_hex(32) - encrypted_blob = get_random_value_hex(250) - start_time = 100 - end_time = 120 - dispute_delta = 20 +def generate_dummy_appointment_data(start_time_offset=5, end_time_offset=30): + current_height = bitcoin_cli().getblockcount() + + dispute_tx = TX.create_dummy_transaction() + dispute_txid = sha256d(dispute_tx) + justice_tx = TX.create_dummy_transaction(dispute_txid) + + dummy_appointment_data = {"tx": justice_tx, "tx_id": dispute_txid, "start_time": current_height + start_time_offset, + "end_time": current_height + end_time_offset, "dispute_delta": 20} + cipher = "AES-GCM-128" hash_function = "SHA256" - appointment_data = dict(locator=locator, start_time=start_time, end_time=end_time, dispute_delta=dispute_delta, - encrypted_blob=encrypted_blob, cipher=cipher, hash_function=hash_function, triggered=False) + locator = sha256(unhexlify(dispute_txid)).hexdigest() + blob = Blob(dummy_appointment_data.get("tx"), cipher, hash_function) - return Appointment.from_dict(appointment_data) + encrypted_blob = blob.encrypt((dummy_appointment_data.get("tx_id"))) + + appointment_data = {"locator": locator, "start_time": dummy_appointment_data.get("start_time"), + "end_time": dummy_appointment_data.get("end_time"), + "dispute_delta": dummy_appointment_data.get("dispute_delta"), + "encrypted_blob": encrypted_blob, "cipher": cipher, "hash_function": hash_function, + "triggered": False} + + return appointment_data, dispute_tx + + +def generate_dummy_appointment(start_time_offset=5, end_time_offset=30): + appointment_data, dispute_tx = generate_dummy_appointment_data(start_time_offset=start_time_offset, + end_time_offset=end_time_offset) + + return Appointment.from_dict(appointment_data), dispute_tx def generate_dummy_job(): @@ -91,4 +116,3 @@ def generate_dummy_job(): appointment_end=100) return Job.from_dict(job_data) - diff --git a/test/unit/test_api.py b/test/unit/test_api.py index 9bbeca8..fd8a290 100644 --- a/test/unit/test_api.py +++ b/test/unit/test_api.py @@ -1,16 +1,10 @@ import json import pytest import requests -from hashlib import sha256 -from binascii import unhexlify -from apps.cli.blob import Blob from pisa import HOST, PORT, c_logger -from pisa.tools import bitcoin_cli -from test.simulator.utils import sha256d -from test.simulator.transaction import TX from pisa.utils.auth_proxy import AuthServiceProxy -from test.unit.conftest import generate_blocks, get_random_value_hex +from test.unit.conftest import generate_blocks, get_random_value_hex, generate_dummy_appointment_data from pisa.conf import BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT, MAX_APPOINTMENTS c_logger.disabled = True @@ -22,33 +16,6 @@ appointments = [] locator_dispute_tx_map = {} -def generate_dummy_appointment_data(): - current_height = bitcoin_cli().getblockcount() - - dispute_tx = TX.create_dummy_transaction() - dispute_txid = sha256d(dispute_tx) - justice_tx = TX.create_dummy_transaction(dispute_txid) - - dummy_appointment_data = {"tx": justice_tx, "tx_id": dispute_txid, "start_time": current_height + 5, - "end_time": current_height + 30, "dispute_delta": 20} - - cipher = "AES-GCM-128" - hash_function = "SHA256" - - locator = sha256(unhexlify(dispute_txid)).hexdigest() - blob = Blob(dummy_appointment_data.get("tx"), cipher, hash_function) - - encrypted_blob = blob.encrypt((dummy_appointment_data.get("tx_id"))) - - appointment = {"locator": locator, "start_time": dummy_appointment_data.get("start_time"), - "end_time": dummy_appointment_data.get("end_time"), - "dispute_delta": dummy_appointment_data.get("dispute_delta"), - "encrypted_blob": encrypted_blob, "cipher": cipher, "hash_function": hash_function, - "triggered": False} - - return appointment, dispute_tx - - @pytest.fixture def new_appointment(): appointment, dispute_tx = generate_dummy_appointment_data() diff --git a/test/unit/test_appointment.py b/test/unit/test_appointment.py index cea47b2..4946406 100644 --- a/test/unit/test_appointment.py +++ b/test/unit/test_appointment.py @@ -10,7 +10,6 @@ from test.unit.conftest import get_random_value_hex c_logger.disabled = True # Not much to test here, adding it for completeness - @fixture def appointment_data(): locator = get_random_value_hex(32) diff --git a/test/unit/test_builder.py b/test/unit/test_builder.py index 7881f5a..2366cc2 100644 --- a/test/unit/test_builder.py +++ b/test/unit/test_builder.py @@ -9,7 +9,7 @@ def test_build_appointments(): # Create some appointment data for i in range(10): - appointment = generate_dummy_appointment() + appointment, _ = generate_dummy_appointment() uuid = uuid4().hex appointments_data[uuid] = appointment.to_dict() @@ -17,7 +17,7 @@ def test_build_appointments(): # Add some additional appointments that share the same locator to test all the builder's cases if i % 2 == 0: locator = appointment.locator - appointment = generate_dummy_appointment() + appointment, _ = generate_dummy_appointment() uuid = uuid4().hex appointment.locator = locator diff --git a/test/unit/test_carrier.py b/test/unit/test_carrier.py index e81606a..1595d73 100644 --- a/test/unit/test_carrier.py +++ b/test/unit/test_carrier.py @@ -4,8 +4,7 @@ from pisa import c_logger from pisa.carrier import Carrier from test.simulator.utils import sha256d from test.simulator.transaction import TX -from test.unit.conftest import generate_blocks -from test.unit.conftest import get_random_value_hex +from test.unit.conftest import generate_blocks, get_random_value_hex from pisa.rpc_errors import RPC_VERIFY_ALREADY_IN_CHAIN, RPC_DESERIALIZATION_ERROR c_logger.disabled = True diff --git a/test/unit/test_db_manager.py b/test/unit/test_db_manager.py index 54f37cc..b2bb10f 100644 --- a/test/unit/test_db_manager.py +++ b/test/unit/test_db_manager.py @@ -11,7 +11,7 @@ from pisa.db_manager import WATCHER_LAST_BLOCK_KEY, RESPONDER_LAST_BLOCK_KEY, LO @pytest.fixture(scope='module') def watcher_appointments(): - return {uuid4().hex: generate_dummy_appointment() for _ in range(10)} + return {uuid4().hex: generate_dummy_appointment()[0] for _ in range(10)} @pytest.fixture(scope='module') diff --git a/test/unit/test_responder.py b/test/unit/test_responder.py index 02d32ea..147a182 100644 --- a/test/unit/test_responder.py +++ b/test/unit/test_responder.py @@ -10,8 +10,7 @@ from test.simulator.utils import sha256d from pisa.responder import Responder, Job from test.simulator.bitcoind_sim import TX from pisa.utils.auth_proxy import AuthServiceProxy -from test.unit.conftest import get_random_value_hex -from test.unit.conftest import generate_block, generate_blocks +from test.unit.conftest import generate_block, generate_blocks, get_random_value_hex from pisa.conf import BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT c_logger.disabled = True diff --git a/test/unit/test_tools.py b/test/unit/test_tools.py index 8b706ed..f52e22b 100644 --- a/test/unit/test_tools.py +++ b/test/unit/test_tools.py @@ -1,6 +1,5 @@ from pisa import c_logger -from pisa.tools import check_txid_format -from pisa.tools import can_connect_to_bitcoind, in_correct_network, bitcoin_cli +from pisa.tools import can_connect_to_bitcoind, in_correct_network, bitcoin_cli, check_txid_format c_logger.disabled = True diff --git a/test/unit/test_watcher.py b/test/unit/test_watcher.py index fc397f2..c9b0850 100644 --- a/test/unit/test_watcher.py +++ b/test/unit/test_watcher.py @@ -1,8 +1,6 @@ import pytest from uuid import uuid4 -from hashlib import sha256 from threading import Thread -from binascii import unhexlify from queue import Queue, Empty from cryptography.hazmat.backends import default_backend @@ -12,17 +10,13 @@ from cryptography.hazmat.primitives.asymmetric import ec from cryptography.exceptions import InvalidSignature from pisa import c_logger -from apps.cli.blob import Blob from pisa.watcher import Watcher from pisa.responder import Responder -from pisa.conf import MAX_APPOINTMENTS -from pisa.appointment import Appointment from pisa.tools import check_txid_format -from test.simulator.utils import sha256d -from test.simulator.transaction import TX from pisa.utils.auth_proxy import AuthServiceProxy -from test.unit.conftest import generate_block, generate_blocks -from pisa.conf import EXPIRY_DELTA, BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT, PISA_SECRET_KEY +from test.unit.conftest import generate_block, generate_blocks, generate_dummy_appointment +from pisa.conf import EXPIRY_DELTA, BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT, PISA_SECRET_KEY, \ + MAX_APPOINTMENTS c_logger.disabled = True @@ -42,37 +36,14 @@ def watcher(db_manager): return Watcher(db_manager) -def generate_dummy_appointment(): - bitcoin_cli = AuthServiceProxy("http://%s:%s@%s:%d" % (BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT)) - - dispute_tx = TX.create_dummy_transaction() - dispute_txid = sha256d(dispute_tx) - justice_tx = TX.create_dummy_transaction(dispute_txid) - - start_time = bitcoin_cli.getblockcount() + 1 - end_time = start_time + 1 - dispute_delta = 20 - - cipher = "AES-GCM-128" - hash_function = "SHA256" - - locator = sha256(unhexlify(dispute_txid)).hexdigest() - blob = Blob(justice_tx, cipher, hash_function) - - encrypted_blob = blob.encrypt(dispute_txid) - - appointment = Appointment(locator, start_time, end_time, dispute_delta, encrypted_blob, cipher, hash_function) - - return appointment, dispute_tx - - def create_appointments(n): locator_uuid_map = dict() appointments = dict() dispute_txs = [] for i in range(n): - appointment, dispute_tx = generate_dummy_appointment() + appointment, dispute_tx = generate_dummy_appointment(start_time_offset=START_TIME_OFFSET, + end_time_offset=END_TIME_OFFSET) uuid = uuid4().hex appointments[uuid] = appointment @@ -85,7 +56,7 @@ def create_appointments(n): def is_signature_valid(appointment, signature, pk): # verify the signature try: - data = appointment.to_json().encode('utf-8') + data = appointment.serialize() pk.verify(signature, data, ec.ECDSA(hashes.SHA256())) except InvalidSignature: return False @@ -109,7 +80,8 @@ def test_add_appointment(run_bitcoind, watcher): # We should be able to add appointments up to the limit for _ in range(10): - appointment, dispute_tx = generate_dummy_appointment() + appointment, dispute_tx = generate_dummy_appointment(start_time_offset=START_TIME_OFFSET, + end_time_offset=END_TIME_OFFSET) added_appointment, sig = watcher.add_appointment(appointment) assert added_appointment is True @@ -117,7 +89,8 @@ def test_add_appointment(run_bitcoind, watcher): def test_sign_appointment(watcher): - appointment, _ = generate_dummy_appointment() + appointment, _ = generate_dummy_appointment(start_time_offset=START_TIME_OFFSET, + end_time_offset=END_TIME_OFFSET) signature = watcher.sign_appointment(appointment) assert is_signature_valid(appointment, signature, public_key) @@ -127,13 +100,15 @@ def test_add_too_many_appointments(watcher): watcher.appointments = dict() for _ in range(MAX_APPOINTMENTS): - appointment, dispute_tx = generate_dummy_appointment() + appointment, dispute_tx = generate_dummy_appointment(start_time_offset=START_TIME_OFFSET, + end_time_offset=END_TIME_OFFSET) added_appointment, sig = watcher.add_appointment(appointment) assert added_appointment is True assert is_signature_valid(appointment, sig, public_key) - appointment, dispute_tx = generate_dummy_appointment() + appointment, dispute_tx = generate_dummy_appointment(start_time_offset=START_TIME_OFFSET, + end_time_offset=END_TIME_OFFSET) added_appointment, sig = watcher.add_appointment(appointment) assert added_appointment is False