conftest for fulfillments

abstract class without NotImplementedError
This commit is contained in:
diminator 2016-03-21 16:22:44 +01:00
parent f9e5b34591
commit 9f5ff683b3
4 changed files with 213 additions and 115 deletions

View File

@ -17,15 +17,25 @@ class SigningKey(metaclass=ABCMeta):
Args: Args:
data: data:
""" """
raise NotImplementedError
@abstractmethod @abstractmethod
def get_verifying_key(self): def get_verifying_key(self):
raise NotImplementedError """
Get the associated verifying key
Returns:
A VerifyingKey object
"""
@abstractmethod @abstractmethod
def to_ascii(self, prefix, encoding): def to_ascii(self, prefix, encoding):
raise NotImplementedError """
Encode the external value
Args:
prefix:
encoding:
"""
@staticmethod @staticmethod
@abstractmethod @abstractmethod
@ -36,7 +46,6 @@ class SigningKey(metaclass=ABCMeta):
Args: Args:
private_value: private_value:
""" """
raise NotImplementedError
@staticmethod @staticmethod
@abstractmethod @abstractmethod
@ -54,11 +63,26 @@ class VerifyingKey(metaclass=ABCMeta):
@abstractmethod @abstractmethod
def verify(self, data, signature): def verify(self, data, signature):
raise NotImplementedError """
Check the if the signature matches the data and this verifyingkey
Args:
data:
signature:
Returns:
boolean:
"""
@abstractmethod @abstractmethod
def to_ascii(self, prefix, encoding): def to_ascii(self, prefix, encoding):
raise NotImplementedError """
Encode the external value
Args:
prefix:
encoding:
"""
@staticmethod @staticmethod
@abstractmethod @abstractmethod
@ -69,7 +93,6 @@ class VerifyingKey(metaclass=ABCMeta):
Args: Args:
public_value public_value
""" """
raise NotImplementedError
@staticmethod @staticmethod
@abstractmethod @abstractmethod
@ -80,7 +103,6 @@ class VerifyingKey(metaclass=ABCMeta):
Args: Args:
public_base58 (base58): public_base58 (base58):
""" """
raise NotImplementedError
def hash_data(data): def hash_data(data):

View File

@ -2,6 +2,7 @@ import base64
import re import re
from abc import ABCMeta from abc import ABCMeta
import binascii
from six import string_types from six import string_types
from bigchaindb.crypto.buffer import base64_add_padding, base64_remove_padding, Writer, Reader from bigchaindb.crypto.buffer import base64_add_padding, base64_remove_padding, Writer, Reader
@ -41,7 +42,7 @@ class Condition(metaclass=ABCMeta):
raise ValueError('Invalid condition format') raise ValueError('Invalid condition format')
condition = Condition() condition = Condition()
condition.bitmask = int(pieces[2]) condition.bitmask = int(pieces[2], 16)
condition.hash = base64.urlsafe_b64decode(base64_add_padding(pieces[3])) condition.hash = base64.urlsafe_b64decode(base64_add_padding(pieces[3]))
condition.max_fulfillment_length = int(pieces[4]) condition.max_fulfillment_length = int(pieces[4])

87
tests/crypto/conftest.py Normal file
View File

@ -0,0 +1,87 @@
import pytest
VK_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf'
VK_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8'
VK_B58_ILP = b'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU'
SK_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42'
SK_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI'
SK_B58_ILP = b'9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs'
CONDITION_SHA256_URI = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1'
CONDITION_SHA256_HASH = b'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
FULFILLMENT_SHA256_URI = 'cf:1:1:AA'
CONDITION_ED25519_URI = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113'
CONDITION_ED25519_HASH = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5'
FULFILLMENT_ED25519_URI = \
'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \
'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI'
CONDITION_ED25519_URI_2 = 'cc:1:8:_WzTrHvFnv4I-H0cAKWZ6Q3g3Y0Du3aW01nIsaAsio8:116'
CONDITION_ED25519_HASH_2 = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5'
FULFILLMENT_ED25519_URI_2 = \
'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_D0hlbGxvIHVuaXZlcnNlISAbIENvbmRpdGlvbnMgYXJlIGV2ZXJ5d2hlc' \
'mUhQNmD2Cvk7e3EFOo-arA2TKYTP-474Z4okhbYmKij6XxObIbRsDScjXILAJ6mV5hP7Xyqkg5fcSsZbfRYypzlsAM'
CONDITION_THRESHOLD_ED25519_URI = 'cc:1:d:fDM51fekeLlbeF9yj9W1KT76jtqa7u0vMlJAbM4EyiE:230'
FULFILLMENT_THRESHOLD_ED25519_URI = \
'cf:1:4:AgIBAQABCCDsFyuTrV5WO_STLHDhJFA0w1Rn7y79TWTr-BloNGfivwxIZWxsbyB3b3JsZCEgFSBDb25kaXRpb25zIGFyZSBoZXJlI' \
'UBDW6ped9T2wiZUVLyoz-epNFyiTDqyBqNheurnrk7UZ2KyQdrdmbbXX1zOIMw__O3h9Z2U6buK05AMfNYUnacCAQEIIP1s06x7xZ7-CPh9H' \
'AClmekN4N2NA7t2ltNZyLGgLIqPdA'
@pytest.fixture(scope='module')
def vk_ilp():
return {
'hex': VK_HEX_ILP,
'b64': VK_B64_ILP,
'b58': VK_B58_ILP
}
@pytest.fixture(scope='module')
def sk_ilp():
return {
'hex': SK_HEX_ILP,
'b64': SK_B64_ILP,
'b58': SK_B58_ILP
}
@pytest.fixture(scope='module')
def fulfillment_sha256():
return {
'condition_uri': CONDITION_SHA256_URI,
'condition_hash': CONDITION_SHA256_HASH,
'fulfillment_uri': FULFILLMENT_SHA256_URI
}
@pytest.fixture(scope='module')
def fulfillment_ed25519():
return {
'condition_uri': CONDITION_ED25519_URI,
'condition_hash': CONDITION_ED25519_HASH,
'fulfillment_uri': FULFILLMENT_ED25519_URI
}
@pytest.fixture(scope='module')
def fulfillment_ed25519_2():
return {
'condition_uri': CONDITION_ED25519_URI_2,
'condition_hash': CONDITION_ED25519_HASH_2,
'fulfillment_uri': FULFILLMENT_ED25519_URI_2
}
@pytest.fixture(scope='module')
def fulfillment_threshold():
return {
'condition_uri': CONDITION_THRESHOLD_ED25519_URI,
'condition_hash': None,
'fulfillment_uri': FULFILLMENT_THRESHOLD_ED25519_URI
}

View File

@ -13,37 +13,33 @@ from bigchaindb.crypto.fulfillments.threshold_sha256 import ThresholdSha256Fulfi
class TestBigchainILPSha256Condition: class TestBigchainILPSha256Condition:
CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1'
CONDITION_SHA256_HASH = b'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
def test_deserialize_condition(self): def test_deserialize_condition(self, fulfillment_sha256):
example_condition = self.CONDITION_SHA256_ILP example_condition = fulfillment_sha256['condition_uri']
condition = Condition.from_uri(example_condition) condition = Condition.from_uri(example_condition)
assert condition.serialize_uri() == self.CONDITION_SHA256_ILP assert condition.serialize_uri() == fulfillment_sha256['condition_uri']
def test_create_condition(self): def test_create_condition(self, fulfillment_sha256):
sha256condition = Condition() sha256condition = Condition()
sha256condition.bitmask = Sha256Fulfillment._bitmask sha256condition.bitmask = Sha256Fulfillment._bitmask
sha256condition.hash = binascii.unhexlify(self.CONDITION_SHA256_HASH) sha256condition.hash = binascii.unhexlify(fulfillment_sha256['condition_hash'])
sha256condition.max_fulfillment_length = 1 sha256condition.max_fulfillment_length = 1
assert sha256condition.serialize_uri() == self.CONDITION_SHA256_ILP assert sha256condition.serialize_uri() == fulfillment_sha256['condition_uri']
class TestBigchainILPSha256Fulfillment: class TestBigchainILPSha256Fulfillment:
CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1'
FULFILLMENT_SHA256_ILP = 'cf:1:1:AA'
def test_deserialize_and_validate_fulfillment(self): def test_deserialize_and_validate_fulfillment(self, fulfillment_sha256):
fulfillment = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) fulfillment = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri'])
assert fulfillment.serialize_uri() == self.FULFILLMENT_SHA256_ILP assert fulfillment.serialize_uri() == fulfillment_sha256['fulfillment_uri']
assert fulfillment.condition.serialize_uri() == self.CONDITION_SHA256_ILP assert fulfillment.condition.serialize_uri() == fulfillment_sha256['condition_uri']
assert fulfillment.validate() assert fulfillment.validate()
def test_deserialize_condition_and_validate_fulfillment(self): def test_deserialize_condition_and_validate_fulfillment(self, fulfillment_sha256):
condition = Condition.from_uri(self.CONDITION_SHA256_ILP) condition = Condition.from_uri(fulfillment_sha256['condition_uri'])
fulfillment = Sha256Fulfillment() fulfillment = Sha256Fulfillment()
fulfillment.preimage = '' fulfillment.preimage = ''
assert fulfillment.serialize_uri() == self.FULFILLMENT_SHA256_ILP assert fulfillment.serialize_uri() == fulfillment_sha256['fulfillment_uri']
assert fulfillment.condition.serialize_uri() == condition.serialize_uri() assert fulfillment.condition.serialize_uri() == condition.serialize_uri()
assert fulfillment.validate() assert fulfillment.validate()
assert fulfillment.validate() \ assert fulfillment.validate() \
@ -64,40 +60,27 @@ class TestBigchainILPSha256Fulfillment:
class TestBigchainILPEd25519Sha256Fulfillment: class TestBigchainILPEd25519Sha256Fulfillment:
PUBLIC_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf'
PUBLIC_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8'
PUBLIC_B58_ILP = b'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU'
PRIVATE_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42' def test_ilp_keys(self, sk_ilp, vk_ilp):
PRIVATE_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI' sk = Ed25519SigningKey(sk_ilp['b58'])
PRIVATE_B58_ILP = b'9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs' assert sk.to_ascii(encoding='base64') == sk_ilp['b64']
assert binascii.hexlify(sk.to_bytes()[:32]) == sk_ilp['hex']
CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' vk = Ed25519VerifyingKey(vk_ilp['b58'])
FULFILLMENT_ED25519_ILP = \ assert vk.to_ascii(encoding='base64') == vk_ilp['b64']
'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \ assert binascii.hexlify(vk.to_bytes()) == vk_ilp['hex']
'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI'
HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5'
def test_ilp_keys(self): def test_serialize_condition_and_validate_fulfillment(self, sk_ilp, vk_ilp, fulfillment_ed25519):
sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(sk_ilp['b58'])
assert sk.to_ascii(encoding='base64') == self.PRIVATE_B64_ILP vk = Ed25519VerifyingKey(vk_ilp['b58'])
assert binascii.hexlify(sk.to_bytes()[:32]) == self.PRIVATE_HEX_ILP
vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
assert vk.to_ascii(encoding='base64') == self.PUBLIC_B64_ILP
assert binascii.hexlify(vk.to_bytes()) == self.PUBLIC_HEX_ILP
def test_serialize_condition_and_validate_fulfillment(self):
sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
fulfillment.message_prefix = 'Hello world!' fulfillment.message_prefix = 'Hello world!'
fulfillment.max_dynamic_message_length = 32 # defaults to 0 fulfillment.max_dynamic_message_length = 32 # defaults to 0
assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP assert fulfillment.condition.serialize_uri() == fulfillment_ed25519['condition_uri']
assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP assert binascii.hexlify(fulfillment.condition.hash) == fulfillment_ed25519['condition_hash']
fulfillment.message = ' Conditions are here!' fulfillment.message = ' Conditions are here!'
@ -107,17 +90,17 @@ class TestBigchainILPEd25519Sha256Fulfillment:
# Fulfill an ED25519-SHA256 condition # Fulfill an ED25519-SHA256 condition
fulfillment.sign(sk) fulfillment.sign(sk)
assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP assert fulfillment.serialize_uri() == fulfillment_ed25519['fulfillment_uri']
assert fulfillment.validate() assert fulfillment.validate()
def test_deserialize_condition(self): def test_deserialize_condition(self, fulfillment_ed25519):
deserialized_condition = Condition.from_uri(self.CONDITION_ED25519_ILP) deserialized_condition = Condition.from_uri(fulfillment_ed25519['condition_uri'])
assert deserialized_condition.serialize_uri() == self.CONDITION_ED25519_ILP assert deserialized_condition.serialize_uri() == fulfillment_ed25519['condition_uri']
assert binascii.hexlify(deserialized_condition.hash) == self.HASH_ED25519_HEX_ILP assert binascii.hexlify(deserialized_condition.hash) == fulfillment_ed25519['condition_hash']
def test_serialize_deserialize_condition(self): def test_serialize_deserialize_condition(self, vk_ilp):
vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(vk_ilp['b58'])
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -132,19 +115,19 @@ class TestBigchainILPEd25519Sha256Fulfillment:
assert deserialized_condition.max_fulfillment_length == condition.max_fulfillment_length assert deserialized_condition.max_fulfillment_length == condition.max_fulfillment_length
assert deserialized_condition.serialize_uri() == condition.serialize_uri() assert deserialized_condition.serialize_uri() == condition.serialize_uri()
def test_deserialize_fulfillment(self): def test_deserialize_fulfillment(self, vk_ilp, fulfillment_ed25519):
fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri'])
assert isinstance(fulfillment, Ed25519Sha256Fulfillment) assert isinstance(fulfillment, Ed25519Sha256Fulfillment)
assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP assert fulfillment.serialize_uri() == fulfillment_ed25519['fulfillment_uri']
assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP assert fulfillment.condition.serialize_uri() == fulfillment_ed25519['condition_uri']
assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP assert binascii.hexlify(fulfillment.condition.hash) == fulfillment_ed25519['condition_hash']
assert fulfillment.public_key.to_ascii(encoding='hex') == self.PUBLIC_HEX_ILP assert fulfillment.public_key.to_ascii(encoding='hex') == vk_ilp['hex']
assert fulfillment.validate() assert fulfillment.validate()
def test_serialize_deserialize_fulfillment(self): def test_serialize_deserialize_fulfillment(self, sk_ilp, vk_ilp):
sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(sk_ilp['b58'])
vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(vk_ilp['b58'])
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -164,32 +147,10 @@ class TestBigchainILPEd25519Sha256Fulfillment:
class TestBigchainILPThresholdSha256Fulfillment: class TestBigchainILPThresholdSha256Fulfillment:
PUBLIC_B58_ILP = 'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU'
PRIVATE_B58_ILP = '9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs'
CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' def create_fulfillment_ed25519sha256(self, sk_ilp, vk_ilp):
FULFILLMENT_ED25519_ILP = \ sk = Ed25519SigningKey(sk_ilp['b58'])
'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \ vk = Ed25519VerifyingKey(vk_ilp['b58'])
'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI'
CONDITION_ED25519_ILP_2 = 'cc:1:8:_WzTrHvFnv4I-H0cAKWZ6Q3g3Y0Du3aW01nIsaAsio8:116'
FULFILLMENT_ED25519_ILP_2 = \
'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_D0hlbGxvIHVuaXZlcnNlISAbIENvbmRpdGlvbnMgYXJlIGV2ZXJ5d2hlc' \
'mUhQNmD2Cvk7e3EFOo-arA2TKYTP-474Z4okhbYmKij6XxObIbRsDScjXILAJ6mV5hP7Xyqkg5fcSsZbfRYypzlsAM'
HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5'
CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1'
FULFILLMENT_SHA256_ILP = 'cf:1:1:AA'
CONDITION_THRESHOLD_ED25519_ILP_2 = 'cc:1:d:fDM51fekeLlbeF9yj9W1KT76jtqa7u0vMlJAbM4EyiE:230'
FULFILLMENT_THRESHOLD_ED25519_ILP_2 = \
'cf:1:4:AgIBAQABCCDsFyuTrV5WO_STLHDhJFA0w1Rn7y79TWTr-BloNGfivwxIZWxsbyB3b3JsZCEgFSBDb25kaXRpb25zIGFyZSBoZXJlI' \
'UBDW6ped9T2wiZUVLyoz-epNFyiTDqyBqNheurnrk7UZ2KyQdrdmbbXX1zOIMw__O3h9Z2U6buK05AMfNYUnacCAQEIIP1s06x7xZ7-CPh9H' \
'AClmekN4N2NA7t2ltNZyLGgLIqPdA'
def create_fulfillment_ed25519sha256(self):
sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -199,10 +160,14 @@ class TestBigchainILPThresholdSha256Fulfillment:
fulfillment.sign(sk) fulfillment.sign(sk)
return fulfillment return fulfillment
def test_serialize_condition_and_validate_fulfillment(self): def test_serialize_condition_and_validate_fulfillment(self,
ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) fulfillment_sha256,
ilp_fulfillment_2 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) fulfillment_ed25519,
ilp_fulfillment_3 = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) fulfillment_ed25519_2,
fulfillment_threshold):
ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri'])
ilp_fulfillment_2 = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri'])
ilp_fulfillment_3 = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri'])
assert ilp_fulfillment.validate() == True assert ilp_fulfillment.validate() == True
assert ilp_fulfillment_2.validate() == True assert ilp_fulfillment_2.validate() == True
@ -216,31 +181,35 @@ class TestBigchainILPThresholdSha256Fulfillment:
fulfillment.add_subfulfillment(ilp_fulfillment_3) fulfillment.add_subfulfillment(ilp_fulfillment_3)
fulfillment.threshold = threshold # defaults to subconditions.length fulfillment.threshold = threshold # defaults to subconditions.length
assert fulfillment.condition.serialize_uri() == self.CONDITION_THRESHOLD_ED25519_ILP_2 assert fulfillment.condition.serialize_uri() == fulfillment_threshold['condition_uri']
# Note: If there are more than enough fulfilled subconditions, shorter # Note: If there are more than enough fulfilled subconditions, shorter
# fulfillments will be chosen over longer ones. # fulfillments will be chosen over longer ones.
# thresholdFulfillmentUri.length === 65 # thresholdFulfillmentUri.length === 65
assert fulfillment.serialize_uri() == self.FULFILLMENT_THRESHOLD_ED25519_ILP_2 assert fulfillment.serialize_uri() == fulfillment_threshold['fulfillment_uri']
assert fulfillment.validate() assert fulfillment.validate()
def test_deserialize_fulfillment(self): def test_deserialize_fulfillment(self,
fulfillment_sha256,
fulfillment_ed25519,
fulfillment_threshold):
num_fulfillments = 3 num_fulfillments = 3
threshold = 2 threshold = 2
fulfillment = Fulfillment.from_uri(self.FULFILLMENT_THRESHOLD_ED25519_ILP_2) fulfillment = Fulfillment.from_uri(fulfillment_threshold['fulfillment_uri'])
assert isinstance(fulfillment, ThresholdSha256Fulfillment) assert isinstance(fulfillment, ThresholdSha256Fulfillment)
assert fulfillment.threshold == threshold assert fulfillment.threshold == threshold
assert len(fulfillment.subfulfillments) == threshold assert len(fulfillment.subfulfillments) == threshold
assert len(fulfillment.get_all_subconditions()) == num_fulfillments assert len(fulfillment.get_all_subconditions()) == num_fulfillments
assert fulfillment.serialize_uri() == self.FULFILLMENT_THRESHOLD_ED25519_ILP_2 assert fulfillment.serialize_uri() == fulfillment_threshold['fulfillment_uri']
assert fulfillment.validate() assert fulfillment.validate()
assert isinstance(fulfillment.subfulfillments[0], Sha256Fulfillment) assert isinstance(fulfillment.subfulfillments[0], Sha256Fulfillment)
assert isinstance(fulfillment.subfulfillments[1], Ed25519Sha256Fulfillment) assert isinstance(fulfillment.subfulfillments[1], Ed25519Sha256Fulfillment)
assert fulfillment.subfulfillments[0].condition.serialize_uri() == self.CONDITION_SHA256_ILP assert fulfillment.subfulfillments[0].condition.serialize_uri() == fulfillment_sha256['condition_uri']
assert fulfillment.subfulfillments[1].condition.serialize_uri() == self.CONDITION_ED25519_ILP assert fulfillment.subfulfillments[1].condition.serialize_uri() == fulfillment_ed25519['condition_uri']
def test_serialize_deserialize_fulfillment(self): def test_serialize_deserialize_fulfillment(self,
ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) fulfillment_ed25519):
ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri'])
num_fulfillments = 100 num_fulfillments = 100
threshold = ceil(num_fulfillments * 2 / 3) threshold = ceil(num_fulfillments * 2 / 3)
@ -262,8 +231,8 @@ class TestBigchainILPThresholdSha256Fulfillment:
assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.serialize_uri() == fulfillment_uri
assert deserialized_fulfillment.validate() assert deserialized_fulfillment.validate()
def test_fulfillment_didnt_reach_threshold(self): def test_fulfillment_didnt_reach_threshold(self, fulfillment_ed25519):
ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri'])
threshold = 10 threshold = 10
# Create a threshold condition # Create a threshold condition
@ -292,10 +261,13 @@ class TestBigchainILPThresholdSha256Fulfillment:
assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.serialize_uri() == fulfillment_uri
assert deserialized_fulfillment.validate() assert deserialized_fulfillment.validate()
def test_fulfillment_nested_and_or(self): def test_fulfillment_nested_and_or(self,
ilp_fulfillment_sha = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) fulfillment_sha256,
ilp_fulfillment_ed1 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) fulfillment_ed25519,
ilp_fulfillment_ed2 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) fulfillment_ed25519_2):
ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri'])
ilp_fulfillment_ed1 = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri'])
ilp_fulfillment_ed2 = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri'])
# 2-of-2 (AND with 2 inputs) # 2-of-2 (AND with 2 inputs)
fulfillment = ThresholdSha256Fulfillment() fulfillment = ThresholdSha256Fulfillment()
@ -318,6 +290,9 @@ class TestBigchainILPThresholdSha256Fulfillment:
fulfillment_uri = fulfillment.serialize_uri() fulfillment_uri = fulfillment.serialize_uri()
deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri)
condition_uri = fulfillment.condition.serialize_uri()
deserialized_condition = Condition.from_uri(condition_uri)
assert isinstance(deserialized_fulfillment, ThresholdSha256Fulfillment) assert isinstance(deserialized_fulfillment, ThresholdSha256Fulfillment)
assert deserialized_fulfillment.threshold == 2 assert deserialized_fulfillment.threshold == 2
assert len(deserialized_fulfillment.subfulfillments) == 2 assert len(deserialized_fulfillment.subfulfillments) == 2
@ -325,10 +300,13 @@ class TestBigchainILPThresholdSha256Fulfillment:
assert len(deserialized_fulfillment.get_all_subconditions()) == 2 assert len(deserialized_fulfillment.get_all_subconditions()) == 2
assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.serialize_uri() == fulfillment_uri
assert deserialized_fulfillment.validate() assert deserialized_fulfillment.validate()
assert deserialized_condition.serialize_uri() == condition_uri
def test_fulfillment_nested(self): def test_fulfillment_nested(self,
ilp_fulfillment_sha = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) fulfillment_sha256,
ilp_fulfillment_ed1 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) fulfillment_ed25519_2,):
ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri'])
ilp_fulfillment_ed1 = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri'])
# 2-of-2 (AND with 2 inputs) # 2-of-2 (AND with 2 inputs)
fulfillment = ThresholdSha256Fulfillment() fulfillment = ThresholdSha256Fulfillment()
@ -353,4 +331,14 @@ class TestBigchainILPThresholdSha256Fulfillment:
assert fulfillment.validate() is True assert fulfillment.validate() is True
assert len(fulfillment.subfulfillments) == 2 assert len(fulfillment.subfulfillments) == 2
assert isinstance(fulfillment.subfulfillments[1], ThresholdSha256Fulfillment) assert isinstance(fulfillment.subfulfillments[1], ThresholdSha256Fulfillment)
assert isinstance(fulfillment.subfulfillments[1].subfulfillments[0], ThresholdSha256Fulfillment) assert isinstance(fulfillment.subfulfillments[1].subfulfillments[0], ThresholdSha256Fulfillment)
fulfillment_uri = fulfillment.serialize_uri()
deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri)
condition_uri = fulfillment.condition.serialize_uri()
deserialized_condition = Condition.from_uri(condition_uri)
assert deserialized_fulfillment.serialize_uri() == fulfillment_uri
assert deserialized_fulfillment.validate() is True
assert deserialized_condition.serialize_uri() == condition_uri