Generalizes get_dummy_appointment (there were multiple instances of it in different tests)

Also refactors some unused imports and modifies the watcher tests to use .serialize instead of to_json
This commit is contained in:
Sergi Delgado Segura
2019-11-07 13:34:50 +00:00
parent e6e577c99e
commit 8174ec61af
9 changed files with 57 additions and 95 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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')

View File

@@ -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

View File

@@ -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

View File

@@ -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