diff --git a/tests/test/__init__.py b/pybtc/test/__init__.py similarity index 100% rename from tests/test/__init__.py rename to pybtc/test/__init__.py diff --git a/tests/test/address_class.py b/pybtc/test/address_class.py similarity index 100% rename from tests/test/address_class.py rename to pybtc/test/address_class.py diff --git a/tests/test/address_functions.py b/pybtc/test/address_functions.py similarity index 100% rename from tests/test/address_functions.py rename to pybtc/test/address_functions.py diff --git a/tests/test/block.py b/pybtc/test/block.py similarity index 100% rename from tests/test/block.py rename to pybtc/test/block.py diff --git a/tests/test/create_transaction.py b/pybtc/test/create_transaction.py similarity index 100% rename from tests/test/create_transaction.py rename to pybtc/test/create_transaction.py diff --git a/tests/test/ecdsa.py b/pybtc/test/ecdsa.py similarity index 100% rename from tests/test/ecdsa.py rename to pybtc/test/ecdsa.py diff --git a/tests/test/hash_functions.py b/pybtc/test/hash_functions.py similarity index 100% rename from tests/test/hash_functions.py rename to pybtc/test/hash_functions.py diff --git a/tests/test/integer.py b/pybtc/test/integer.py similarity index 100% rename from tests/test/integer.py rename to pybtc/test/integer.py diff --git a/tests/test/mnemonic.py b/pybtc/test/mnemonic.py similarity index 100% rename from tests/test/mnemonic.py rename to pybtc/test/mnemonic.py diff --git a/tests/test/raw_block.txt b/pybtc/test/raw_block.txt similarity index 100% rename from tests/test/raw_block.txt rename to pybtc/test/raw_block.txt diff --git a/tests/test/script_deserialize.py b/pybtc/test/script_deserialize.py similarity index 100% rename from tests/test/script_deserialize.py rename to pybtc/test/script_deserialize.py diff --git a/tests/test/sighash.py b/pybtc/test/sighash.py similarity index 100% rename from tests/test/sighash.py rename to pybtc/test/sighash.py diff --git a/tests/test/transaction_constructor.py b/pybtc/test/transaction_constructor.py similarity index 100% rename from tests/test/transaction_constructor.py rename to pybtc/test/transaction_constructor.py diff --git a/tests/test/transaction_deserialize.py b/pybtc/test/transaction_deserialize.py similarity index 99% rename from tests/test/transaction_deserialize.py rename to pybtc/test/transaction_deserialize.py index b21fa46..dc38887 100644 --- a/tests/test/transaction_deserialize.py +++ b/pybtc/test/transaction_deserialize.py @@ -24,7 +24,7 @@ class TransactionDeserializeTests(unittest.TestCase): print("\nTesting Transaction class deserialization:\n") def test_serialaize_and_perfomance(self): - f = open('./test/raw_block.txt') + f = open(ROOT_DIR + '/test/raw_block.txt') fc = f.readline() qt = time.time() bt = decode_block_tx(fc[:-1]) diff --git a/setup.py b/setup.py index f33609d..ebccd31 100644 --- a/setup.py +++ b/setup.py @@ -16,6 +16,7 @@ setup(name='pybtc', install_requires=[ 'secp256k1'], include_package_data=True, package_data={ - 'pybtc': ['bip39_word_list/*.txt'], + 'pybtc': ['bip39_word_list/*.txt', 'test/*.txt'], }, + test_suite='tests', zip_safe=False) diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..969082e --- /dev/null +++ b/tests.py @@ -0,0 +1,9 @@ +import unittest + +import pybtc.test + +testLoad = unittest.TestLoader() +suites = testLoad.loadTestsFromModule(pybtc.test) + +runner = unittest.TextTestRunner(verbosity=1) +runner.run(suites) diff --git a/tests/bip0032_fixtures.py b/tests/bip0032_fixtures.py deleted file mode 100644 index eefd011..0000000 --- a/tests/bip0032_fixtures.py +++ /dev/null @@ -1,73 +0,0 @@ -import pytest - - -@pytest.fixture -def fail_key1(): - return b'\x00\x00\x00\x00' - - -@pytest.fixture -def fail_key2(): - return b'\x97\x8bq\xc6\xd8\xfew\xe5\xfa\xad\xdc\xc6\xc5\x91\xbd\xfb' - - -@pytest.fixture -def good_key(): - return b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c' - -@pytest.fixture -def master_key_hdwallet_mnet(): - return dict(version=b'\x04\x88\xad\xe4', - key=b"Y\x9e'\xe00or'\xacD\x9c(l\x99\x0fxB\x03\xbd/]|+\xfd\xe89K!\x93\x0bN\x9b", - depth=0, - child=0, - finger_print=b'\x00\x00\x00\x00', - chain_code=b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c', - is_private=True) - - -@pytest.fixture -def public_key_hdwallet_mnet(): - return dict(version=b'\x04\x88\xB2\x1E', - key=b"\x03F\xcd\x96\xd7-\xc4Q\xee\xfc\xadc\n\xe4\xd2Xe\x02\x99(\x0f\xf5\x1c'\x16\xab\xd0\x05_\xb4:8\xfa", - depth=0, - child=0, - finger_print=b'\x00\x00\x00\x00', - chain_code=b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c', - is_private=False) - -@pytest.fixture -def master_key_hdwallet_tnet(): - return dict(version=b'\x04\x35\x83\x94', - key=b"Y\x9e'\xe00or'\xacD\x9c(l\x99\x0fxB\x03\xbd/]|+\xfd\xe89K!\x93\x0bN\x9b", - depth=0, - child=0, - finger_print=b'\x00\x00\x00\x00', - chain_code=b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c', - is_private=True) - - -@pytest.fixture -def public_key_hdwallet_tnet(): - return dict(version=b'\x04\x35\x87\xCF', - key=b"\x03F\xcd\x96\xd7-\xc4Q\xee\xfc\xadc\n\xe4\xd2Xe\x02\x99(\x0f\xf5\x1c'\x16\xab\xd0\x05_\xb4:8\xfa", - depth=0, - child=0, - finger_print=b'\x00\x00\x00\x00', - chain_code=b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c', - is_private=False) - -@pytest.fixture -def privkey_hdwallet_base58(): - return 'xprv9s21ZrQH143K2irFFw4cdtV8EicuR6Y5P2WqMpbLWhnZUADeKUi52Jh8Pzt8K9RqHanNsrVXf6VhNXQv2ypWxsTSWB8UsqjxkGPxHcjyXNC' - - -@pytest.fixture -def pubkey_hdwallet_base58(): - return 'xpub661MyMwAqRbcFCviMxbd12RrnkTPpZFvkFSSACzx53KYLxYns22Ka71cFHiMLQz3NaPYeN7EcdDUwH5QTWeS56jc2DzAzuKU2cfwp5cvyoR' - - -@pytest.fixture -def bad_key_hdwallet_base58(): - return 'xpeb661MyMwAq1ecFCviMxbd12RrnkTPpZFvkFSSACzx53KYLxYns22Ka71cFHiMLQz3NaPYeN7EcdDUwH5QTWeS56jc2DzAzuKU2cfwp5cvyoR' - diff --git a/tests/bip0039_fixtures.py b/tests/bip0039_fixtures.py deleted file mode 100644 index d9440b5..0000000 --- a/tests/bip0039_fixtures.py +++ /dev/null @@ -1,74 +0,0 @@ -import pytest -import random - - -#@pytest.fixture -#def gen_entropy(bit_size): - #rnd = random.systemRandom(123456) - #return rnd.randint(0, 255) - -@pytest.fixture -def mnemonic_128(): - return ['nurse', 'fortune', 'immune', 'rapid', 'trash', - 'very', 'turkey', 'romance', 'short', 'clutch', 'hunt', 'wait'] - -@pytest.fixture -def mnemonic_160(): - return ['mail', 'paddle', 'wine', 'fox', 'various', 'absent', - 'manage', 'divert', 'awful', 'push', 'mystery', - 'mule', 'arrest', 'lawsuit', 'orient'] - -@pytest.fixture -def mnemonic_192(): - return ['craft', 'first', 'champion', 'border', 'rely', - 'dance', 'tag', 'voyage', 'category', 'orbit', - 'hungry', 'caught', 'occur', 'wonder', 'history', - 'jacket', 'first', 'plunge'] - -@pytest.fixture -def mnemonic_224(): - return ['liberty', 'family', 'lobster', 'omit', 'glide', - 'vague', 'market', 'cancel', 'exotic', 'jazz', - 'sausage', 'elite', 'tuition', 'grief', 'typical', - 'hobby', 'local', 'impact', 'leopard', 'basic', 'obscure'] - -@pytest.fixture -def mnemonic_256(): - return ['neck', 'adjust', 'town', 'ticket', 'sunset', 'pulse', - 'space', 'dolphin', 'farm', 'absent', 'cat', 'adult', - 'erupt', 'student', 'globe', 'tooth', 'tackle', 'group', - 'sponsor', 'dice', 'add', 'maid', 'illegal', 'major'] - -@pytest.fixture -def entropy_128(): - return b'\x97\x8bq\xc6\xd8\xfew\xe5\xfa\xad\xdc\xc6\xc5\x91\xbd\xfb' - -@pytest.fixture -def entropy_160(): - return b'\x863\xdb\xee./\x18\x01a\xb9\xfe\x10\xb5\xd6I\xc8\xa0\xc6\xfcg' - -@pytest.fixture -def entropy_192(): - return b'2\n\xec\x98\x0c\xebVn\xb7O\xb0$3}\xbd\x129\x8d\xfa\x1b\x0b\xb8Wt' - -@pytest.fixture -def entropy_224(): - return b'\x80\xeaR\x0c\xcd61\xe1b\t\tP\x0e\xee\xfe\xa4\x0e\xa2\xcd:\xfbb\x83N:\x01\t\x89' - -@pytest.fixture -def entropy_256(): - return b'\x93\xa0s\x99p\xdd\x99[4\x12\x06S \x14\x8f\x01\xe4\xcf\xae\xd8\xd7&\xdd\x0c\xdfI\x9e\xb03\x0c\x1cD' - - -@pytest.yield_fixture -def wordlist(): - f = None - def select_wordlist(filename): - nonlocal f - assert f is None - f = open(filename) - return f - yield select_wordlist - if f is not None: - f.close() - diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index d9c3db4..0000000 --- a/tests/conftest.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -import pytest - - -pytest_plugins = ['bip0032_fixtures', 'bip0039_fixtures'] - diff --git a/tests/test.py b/tests/test.py deleted file mode 100644 index 7a7e9c2..0000000 --- a/tests/test.py +++ /dev/null @@ -1,9 +0,0 @@ -import unittest - -import test - -testLoad = unittest.TestLoader() -suites = testLoad.loadTestsFromModule(test) - -runner = unittest.TextTestRunner(verbosity=3) -runner.run(suites) diff --git a/tests/test_bip0032.py b/tests/test_bip0032.py deleted file mode 100644 index 8905723..0000000 --- a/tests/test_bip0032.py +++ /dev/null @@ -1,187 +0,0 @@ -import os -import sys -import random -import hashlib -import hmac - -from binascii import hexlify, unhexlify - - -parentPath = os.path.abspath("..") -if parentPath not in sys.path: - sys.path.insert(0, parentPath) - -from pybtc.wallet import * -from pybtc.tools import encode_base58, decode_base58 - - - -def test_create_master_key_hdwallet(mnemonic_256): - passphrase = ' '.join(mnemonic_256) - seed = mnemonic_to_seed(passphrase, 'P@ssw0rd') - assert seed is not None - assert len(seed) == 64 - master_key = create_xmaster_key(seed) - assert master_key is not None - assert isinstance(master_key, dict) - assert master_key.get('version') is not None - assert master_key.get('key') is not None - assert master_key.get('depth') is not None - assert master_key.get('child') is not None - assert master_key.get('finger_print') is not None - assert master_key.get('chain_code') is not None - assert master_key.get('is_private') is not None - assert master_key['is_private'] - - -def test_create_public_key_hdwallet(master_key_hdwallet_mnet): - public_key = create_xpublic_key(master_key_hdwallet_mnet) - assert public_key is not None - assert len(public_key['key']) == 33 - - -def test_validate_private_key(fail_key1, fail_key2, good_key): - assert not is_xprivate_key_valid(fail_key1) - assert not is_xprivate_key_valid(fail_key2) - assert is_xprivate_key_valid(good_key) - - -def test_create_expanded_key(master_key_hdwallet_mnet, public_key_hdwallet_mnet): - result = create_expanded_key(b'asdasdasd', 0) - assert result is None - result = create_expanded_key(master_key_hdwallet_mnet, 0x80000000) - assert result is None - result = create_expanded_key(master_key_hdwallet_mnet, 0) - assert result is not None - assert len(result) == 64 - result = create_expanded_key(public_key_hdwallet_mnet, 0) - assert result is not None - assert len(result) == 64 - - -def test_create_expanded_hard_key(master_key_hdwallet_mnet, public_key_hdwallet_mnet): - result = create_expanded_hard_key(master_key_hdwallet_mnet, 0) - assert result is None - result = create_expanded_hard_key(master_key_hdwallet_mnet, 0x80000000) - assert result is not None - assert len(result) == 64 - - -def test_create_child_privkey(master_key_hdwallet_mnet, public_key_hdwallet_mnet): - result = create_child_privkey(public_key_hdwallet_mnet, 0) - assert result is None - result = create_child_privkey(master_key_hdwallet_mnet, 0) - assert result is not None - assert isinstance(result, dict) - assert result.get('is_private') - - -def test_create_child_pubkey(master_key_hdwallet_mnet, public_key_hdwallet_mnet): - result = create_child_pubkey(master_key_hdwallet_mnet, 0) - assert result is None - result = create_child_pubkey(public_key_hdwallet_mnet, 0) - assert result is not None - assert isinstance(result, dict) - assert not result.get('is_private') - - -def test_serialize_key_hdwallet(master_key_hdwallet_mnet, public_key_hdwallet_tnet): - serialize_mkey = serialize_xkey(master_key_hdwallet_mnet) - assert serialize_mkey is not None - assert isinstance(serialize_mkey, bytes) - assert len(serialize_mkey[:-4]) == 78 - ser_encode = encode_base58(serialize_mkey) - assert ser_encode[:4] in ['xprv', 'tprv'] - - serialize_pkey = serialize_xkey(public_key_hdwallet_tnet) - assert serialize_pkey is not None - assert isinstance(serialize_pkey, bytes) - assert len(serialize_pkey[:-4]) == 78 - ser_encode = encode_base58(serialize_pkey) - assert ser_encode[:4] in ['xpub', 'tpub'] - - -def test_deserialize_key(privkey_hdwallet_base58, pubkey_hdwallet_base58, bad_key_hdwallet_base58): - #десериализация приватного ключа - privkey = deserialize_xkey(privkey_hdwallet_base58) - assert privkey is not None - assert isinstance(privkey, dict) - assert privkey['is_private'] - #десериализация публичного ключа - pubkey = deserialize_xkey(pubkey_hdwallet_base58) - assert pubkey is not None - assert isinstance(pubkey, dict) - assert not pubkey['is_private'] - #десериализация некорретного ключа - pubkey = deserialize_xkey(bad_key_hdwallet_base58) - assert pubkey is None - - -def test_derive_xkey(mnemonic_256): - passphrase = ' '.join(mnemonic_256) - seed = mnemonic_to_seed(passphrase, 'P@ssw0rd') - params = [0x8000002C, 0x80000001, 0x80000000, 0, 0] - result = derive_xkey(seed, *params, bip44=True, testnet=True, wif=True) - assert result is not None - assert isinstance(result, str) - assert result[:4] in 'tprv' - - -def test_xprivate_to_xpublic_key(privkey_hdwallet_base58): - xpubkey = xprivate_to_xpublic_key(privkey_hdwallet_base58) - assert xpubkey is not None - assert isinstance(xpubkey, str) - assert len(xpubkey) == 111 - assert xpubkey[:4] in ['xpub', 'tpub'] - xpubkey = xprivate_to_xpublic_key(privkey_hdwallet_base58, False) - assert xpubkey is not None - assert isinstance(xpubkey, bytes) - - -def test_xkey_to_private_key(privkey_hdwallet_base58): - privkey = xkey_to_private_key(privkey_hdwallet_base58, True, False) - assert privkey is not None - assert isinstance(privkey, str) - privkey = xkey_to_private_key(privkey_hdwallet_base58, False, True) - assert privkey is not None - assert isinstance(privkey, str) - privkey = xkey_to_private_key(privkey_hdwallet_base58, False, False) - assert privkey is not None - assert isinstance(privkey, bytes) - - -def test_xkey_to_public_key(privkey_hdwallet_base58, pubkey_hdwallet_base58): - # from xpubkey to pubkey - pubkey = xkey_to_public_key(pubkey_hdwallet_base58, True) - assert pubkey is not None - assert isinstance(pubkey, str) - pubkey = xkey_to_public_key(pubkey_hdwallet_base58, False) - assert pubkey is not None - assert isinstance(pubkey, bytes) - # from xprivkey to pubkey - pubkey = xkey_to_public_key(privkey_hdwallet_base58, True) - assert pubkey is not None - assert isinstance(pubkey, str) - pubkey = xkey_to_public_key(privkey_hdwallet_base58, False) - assert pubkey is not None - assert isinstance(pubkey, bytes) - - -def test_validate_path_level(): - params = [0x8000002C, 0x80000001, 0x80000000, 0, 0] - testnet = True - assert is_validate_path_level(params, testnet) - testnet = False - assert not is_validate_path_level(params, testnet) - params = [0, 0x80000001, 0x80000000, 0, 0] - testnet = True - assert not is_validate_path_level(params, testnet) - params = [0x8000002C, 0x80000001, 0, 0, 0] - testnet = True - assert not is_validate_path_level(params, testnet) - params = [0x8000002C, 0x80000001, 0, 0] - testnet = True - assert not is_validate_path_level(params, testnet) - params = [] - assert is_validate_path_level(params, testnet) - diff --git a/tests/test_bip0039.py b/tests/test_bip0039.py deleted file mode 100644 index 7853dac..0000000 --- a/tests/test_bip0039.py +++ /dev/null @@ -1,119 +0,0 @@ -import os -import random -import hashlib -import hmac -from binascii import hexlify, unhexlify -from pybtc.wallet import * - - - -def test_recovery_from_passphrase_12(entropy_128, mnemonic_128): - passphrase = ' '.join(mnemonic_128) - entropy = mnemonic_to_entropy(passphrase, 'english') - assert entropy == entropy_128 - - -def test_recovery_from_passphrase_15(entropy_160, mnemonic_160): - passphrase = ' '.join(mnemonic_160) - entropy = mnemonic_to_entropy(passphrase, 'english') - assert entropy == entropy_160 - - -def test_recovery_from_passphrase_18(entropy_192, mnemonic_192): - passphrase = ' '.join(mnemonic_192) - entropy = mnemonic_to_entropy(passphrase, 'english') - assert entropy == entropy_192 - - -def test_recovery_from_passphrase_21(entropy_224, mnemonic_224): - passphrase = ' '.join(mnemonic_224) - entropy = mnemonic_to_entropy(passphrase, 'english') - assert entropy == entropy_224 - - -def test_recovery_from_passphrase_24(entropy_256, mnemonic_256): - passphrase = ' '.join(mnemonic_256) - entropy = mnemonic_to_entropy(passphrase, 'english') - assert entropy == entropy_256 - - -def test_create_mnemonic(entropy_128, entropy_160, entropy_192, entropy_224, entropy_256): - mnemonic = create_mnemonic(entropy_128, 'english') - assert len(mnemonic) == 12 - - mnemonic = create_mnemonic(entropy_160, 'english') - assert len(mnemonic) == 15 - - mnemonic = create_mnemonic(entropy_192, 'english') - assert len(mnemonic) == 18 - - mnemonic = create_mnemonic(entropy_224, 'english') - assert len(mnemonic) == 21 - - mnemonic = create_mnemonic(entropy_256, 'english') - assert len(mnemonic) == 24 - - -def test_create_wordlist(): - wordlist_en = create_wordlist('english') - wordlist_fr = create_wordlist('french') - wordlist_it = create_wordlist('italian') - wordlist_sp = create_wordlist('spanish') - assert 'abandon' in wordlist_en - assert 'abaisser' in wordlist_fr - assert 'abaco' in wordlist_it - assert 'ábaco' in wordlist_sp - - -def test_create_seed(mnemonic_256): - passphrase = ' '.join(mnemonic_256) - seed = mnemonic_to_seed(passphrase, 'P@ssw0rd') - assert seed is not None - assert len(seed) == 64 - - -def test_create_passphrase(): - passphrase = create_passphrase(128, 'english') - assert len(passphrase.split()) == 12 - - passphrase = create_passphrase(160, 'english') - assert len(passphrase.split()) == 15 - - passphrase = create_passphrase(192, 'english') - assert len(passphrase.split()) == 18 - - passphrase = create_passphrase(224, 'english') - assert len(passphrase.split()) == 21 - - passphrase = create_passphrase(256, 'english') - assert len(passphrase.split()) == 24 - - -def test_add_checksum_ent(entropy_128, entropy_160, entropy_192, entropy_224, entropy_256): - ent_add_chksum = add_checksum_ent(entropy_128) - ent_hash = hashlib.sha256(entropy_128).hexdigest() - fb = unhexlify(ent_hash)[0] - assert (fb >> 4) & ent_add_chksum - - ent_add_chksum = add_checksum_ent(entropy_160) - ent_hash = hashlib.sha256(entropy_160).hexdigest() - fb = unhexlify(ent_hash)[0] - assert (fb >> 3) & ent_add_chksum - - ent_add_chksum = add_checksum_ent(entropy_192) - ent_hash = hashlib.sha256(entropy_192).hexdigest() - fb = unhexlify(ent_hash)[0] - assert (fb >> 2) & ent_add_chksum - - ent_add_chksum = add_checksum_ent(entropy_224) - ent_hash = hashlib.sha256(entropy_224).hexdigest() - fb = unhexlify(ent_hash)[0] - assert (fb >> 1) & ent_add_chksum - - ent_add_chksum = add_checksum_ent(entropy_256) - ent_hash = hashlib.sha256(entropy_256).hexdigest() - fb = unhexlify(ent_hash)[0] - assert fb & ent_add_chksum - - -