Malte Kraus 8 лет назад
Родитель
Сommit
5e67f8ce47
7 измененных файлов с 52 добавлено и 55 удалено
  1. 1 0
      .gitignore
  2. 0 0
      __init__.py
  3. 1 4
      doc/index.rst
  4. 2 0
      requirements.txt
  5. 33 29
      tests/test_proto.py
  6. 13 20
      tests/test_verifications.py
  7. 2 2
      tests/utils.py

+ 1 - 0
.gitignore

@@ -2,3 +2,4 @@ __pycache__
 .venv
 /doc/_autosummary/
 /doc/_build/
+.cache

+ 0 - 0
__init__.py


+ 1 - 4
doc/index.rst

@@ -39,10 +39,7 @@ Source Code Documentation
 
 Tests
 *****
-Run the tests like this:
-
-    >>> python3 -m tests.test_proto
-    >>> python3 -m tests.verifications
+To run the tests, just run the `pytest` command.
 
 
 Indices and tables

+ 2 - 0
requirements.txt

@@ -8,8 +8,10 @@ itsdangerous==0.24
 Jinja2==2.9.5
 MarkupSafe==0.23
 pudb==2017.1.1
+py==1.4.32
 pycrypto==2.6.1
 Pygments==2.2.0
+pytest==3.0.6
 pytz==2016.10
 requests==2.13.0
 six==1.10.0

+ 33 - 29
tests/test_proto.py

@@ -1,46 +1,50 @@
+from time import sleep
+
 from src.protocol import Protocol
 from src.mining import Miner
 from src.block import GENESIS_BLOCK
 from src.crypto import Signing
 from src.transaction import Transaction, TransactionInput, TransactionTarget
 
-from time import sleep
+def test_proto():
+    reward_key = Signing.generate_private_key()
 
-reward_key = Signing.generate_private_key()
+    proto1 = Protocol([], GENESIS_BLOCK, 1337)
+    proto2 = Protocol([("127.0.0.1", 1337)], GENESIS_BLOCK, 1338)
+    miner1 = Miner(proto1, reward_key)
+    miner2 = Miner(proto2, reward_key)
+    miner2.start_mining()
+    miner1.start_mining()
 
-proto1 = Protocol([], GENESIS_BLOCK, 1337)
-proto2 = Protocol([("127.0.0.1", 1337)], GENESIS_BLOCK, 1338)
-miner1 = Miner(proto1, reward_key)
-miner2 = Miner(proto2, reward_key)
-miner2.start_mining()
-miner1.start_mining()
 
 
+    sleep(5)
+    target_key = Signing.generate_private_key()
+    reward_trans = miner2.chainbuilder.primary_block_chain.blocks[20].transactions[0]
+    trans_in = TransactionInput(reward_trans.get_hash(), 0)
+    trans_targ = TransactionTarget(target_key, reward_trans.targets[0].amount)
 
-sleep(5)
-target_key = Signing.generate_private_key()
-reward_trans = miner2.chainbuilder.primary_block_chain.blocks[20].transactions[0]
-trans_in = TransactionInput(reward_trans.get_hash(), 0)
-trans_targ = TransactionTarget(target_key, reward_trans.targets[0].amount)
+    trans = Transaction([trans_in], [trans_targ])
+    trans.sign([reward_key])
+    assert trans.verify(miner1.chainbuilder.primary_block_chain, set()), "transaction should be valid"
 
-trans = Transaction([trans_in], [trans_targ])
-trans.sign([reward_key])
-assert trans.verify(miner1.chainbuilder.primary_block_chain, set()), "transaction should be valid"
+    proto2.received('transaction', trans.to_json_compatible(), None)
+    sleep(5)
 
-proto2.received('transaction', trans.to_json_compatible(), None)
-sleep(5)
-chain_len1 = len(miner1.chainbuilder.primary_block_chain.blocks)
-chain_len2 = len(miner2.chainbuilder.primary_block_chain.blocks)
-print("Length of chain of miner 1: {}".format(chain_len1))
-print("Length of chain of miner 2: {}".format(chain_len2))
+    chain_len1 = len(miner1.chainbuilder.primary_block_chain.blocks)
+    chain_len2 = len(miner2.chainbuilder.primary_block_chain.blocks)
+    print("Length of chain of miner 1: {}".format(chain_len1))
+    print("Length of chain of miner 2: {}".format(chain_len2))
+    miner1.stop_mining()
+    miner2.stop_mining()
 
-assert max(chain_len1, chain_len2) * 90 // 100 < min(chain_len1, chain_len2), "chain lengths are VERY different"
+    assert max(chain_len1, chain_len2) * 90 // 100 < min(chain_len1, chain_len2), "chain lengths are VERY different"
 
-chain1 = miner1.chainbuilder.primary_block_chain
-hashes1 = [b.hash for b in chain1.blocks[:chain_len1 * 90 // 100]]
-hashes2 = [b.hash for b in miner2.chainbuilder.primary_block_chain.blocks[:chain_len1 * 90 // 100]]
-assert hashes1 == hashes2, "first 90% of chains should be identical"
+    chain1 = miner1.chainbuilder.primary_block_chain
+    hashes1 = [b.hash for b in chain1.blocks[:chain_len1 * 90 // 100]]
+    hashes2 = [b.hash for b in miner2.chainbuilder.primary_block_chain.blocks[:chain_len1 * 90 // 100]]
+    assert hashes1 == hashes2, "first 90% of chains should be identical"
 
-assert not trans.verify(miner1.chainbuilder.primary_block_chain, set()), "inserted transaction should be spent and therefore invalid"
+    assert not trans.verify(miner1.chainbuilder.primary_block_chain, set()), "inserted transaction should be spent and therefore invalid"
 
-assert chain1.is_coin_still_valid(TransactionInput(trans.get_hash(), 0)), "someone spent our coins?"
+    assert chain1.is_coin_still_valid(TransactionInput(trans.get_hash(), 0)), "someone spent our coins?"

+ 13 - 20
tests/verifications.py → tests/test_verifications.py

@@ -6,17 +6,19 @@ errors = 0
 def trans_test(fn):
     """ Immediately runs a test that requires a blockchain, and a transaction with private key in that blockchain. """
 
-    gen_chain = Blockchain([GENESIS_BLOCK])
-    assert gen_chain.verify_all()
-    key = Signing.generate_private_key()
-    reward_trans = Transaction([], [TransactionTarget(key, gen_chain.compute_blockreward(gen_chain.head))])
-    chain = extend_blockchain(gen_chain, [reward_trans])
-    try:
-        fn(chain, reward_trans)
-    except:
-        global errors
-        errors += 1
-        traceback.print_exc()
+    def wrapper():
+        gen_chain = Blockchain([GENESIS_BLOCK])
+        assert gen_chain.verify_all()
+        key = Signing.generate_private_key()
+        reward_trans = Transaction([], [TransactionTarget(key, gen_chain.compute_blockreward(gen_chain.head))])
+        chain = extend_blockchain(gen_chain, [reward_trans])
+        try:
+            fn(chain, reward_trans)
+        except:
+            global errors
+            errors += 1
+            traceback.print_exc()
+    return wrapper
 
 @trans_test
 def test_double_spend1(chain, reward_trans):
@@ -41,12 +43,3 @@ def test_double_spend3(chain, reward_trans):
     key = reward_trans.targets[0].recipient_pk
     trans1.sign([key, key])
     extend_blockchain(chain, [trans1], verify_res=False)
-
-
-OKGREEN = '\033[92m'
-FAIL = '\033[91m'
-ENDC = '\033[0m'
-if errors == 0:
-    print(OKGREEN + "All tests passed." + ENDC)
-else:
-    print(FAIL + str(errors) + " tests failed." + ENDC)

+ 2 - 2
tests/utils.py

@@ -1,3 +1,5 @@
+from datetime import datetime
+
 import src.proof_of_work
 import src.block
 src.proof_of_work.verify_proof_of_work = lambda b: True
@@ -8,8 +10,6 @@ from src.blockchain import *
 from src.crypto import *
 from src.transaction import *
 
-from datetime import datetime
-
 
 def extend_blockchain(chain, trans:list=None, verify_res=True):
     ts = datetime.utcfromtimestamp(len(chain.blocks))