tMerge pull request #1423 from romanz/tests - electrum - Electrum Bitcoin wallet | |
git clone https://git.parazyd.org/electrum | |
Log | |
Files | |
Refs | |
Submodules | |
--- | |
commit bbe5cbecfddd6f8ddb6a645d0642be46e9292add | |
parent 023cd9eeb0fc3dc01a0ffdc48612f57ccb7990bc | |
Author: ThomasV <[email protected]> | |
Date: Tue, 25 Aug 2015 16:34:30 +0200 | |
Merge pull request #1423 from romanz/tests | |
Add more unit tests for lib.transaction | |
Diffstat: | |
M lib/tests/test_transaction.py | 92 +++++++++++++++++++++++++++++… | |
1 file changed, 92 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/lib/tests/test_transaction.py b/lib/tests/test_transaction.py | |
t@@ -7,6 +7,47 @@ unsigned_blob = '01000000012a5c9a94fcde98f5581cd00162c60a1393… | |
signed_blob = '01000000012a5c9a94fcde98f5581cd00162c60a13936ceb75389ea65bf3863… | |
+class TestBCDataStream(unittest.TestCase): | |
+ | |
+ def test_compact_size(self): | |
+ s = transaction.BCDataStream() | |
+ values = [0, 1, 252, 253, 2**16-1, 2**16, 2**32-1, 2**32, 2**64-1] | |
+ for v in values: | |
+ s.write_compact_size(v) | |
+ | |
+ with self.assertRaises(transaction.SerializationError): | |
+ s.write_compact_size(-1) | |
+ | |
+ self.assertEquals(s.input.encode('hex'), | |
+ '0001fcfdfd00fdfffffe00000100feffffffffff00000000010… | |
+ for v in values: | |
+ self.assertEquals(s.read_compact_size(), v) | |
+ | |
+ with self.assertRaises(IndexError): | |
+ s.read_compact_size() | |
+ | |
+ def test_string(self): | |
+ s = transaction.BCDataStream() | |
+ with self.assertRaises(transaction.SerializationError): | |
+ s.read_string() | |
+ | |
+ msgs = ['Hello', ' ', 'World', '', '!'] | |
+ for msg in msgs: | |
+ s.write_string(msg) | |
+ for msg in msgs: | |
+ self.assertEquals(s.read_string(), msg) | |
+ | |
+ with self.assertRaises(transaction.SerializationError): | |
+ s.read_string() | |
+ | |
+ def test_bytes(self): | |
+ s = transaction.BCDataStream() | |
+ s.write('foobar') | |
+ self.assertEquals(s.read_bytes(3), 'foo') | |
+ self.assertEquals(s.read_bytes(2), 'ba') | |
+ self.assertEquals(s.read_bytes(4), 'r') | |
+ self.assertEquals(s.read_bytes(1), '') | |
+ | |
class TestTransaction(unittest.TestCase): | |
def test_tx_unsigned(self): | |
t@@ -112,3 +153,54 @@ class TestTransaction(unittest.TestCase): | |
tx.sign(keypairs={x_pubkey: privkey}) | |
self.assertEquals(tx.serialize(), signed_blob) | |
+ | |
+ def test_sweep(self): | |
+ privkeys = ['5HuH1SHoSVrgtPEwew9JzVAHGoKyp47x564mBCTgVmUT2Me1Q18'] | |
+ unspent = [ | |
+ { | |
+ "height": 371447, | |
+ "tx_hash": "8e4d173db094786cc128b0c12eebc2200c0d8bfc3ad04ba39f… | |
+ "tx_pos": 0, | |
+ "value": 599995800 | |
+ } | |
+ ] | |
+ to_address = '1JtBahwvii2pRkBmb4QMfcJQux1rk3Jkbq' | |
+ network = NetworkMock(unspent) | |
+ tx = transaction.Transaction.sweep(privkeys, network, to_address, fee=… | |
+ result = transaction.deserialize(tx.serialize()) | |
+ expected = { | |
+ 'inputs': [{ | |
+ 'address': '1t28kmZypcPQrunmJk212dcPGPxbBtB6Y', | |
+ 'is_coinbase': False, | |
+ 'num_sig': 1, | |
+ 'prevout_hash': '8e4d173db094786cc128b0c12eebc2200c0d8bfc3ad04… | |
+ 'prevout_n': 0, | |
+ 'pubkeys': ['047b9f9014f8d0d6f24dcaf5681b6ab185bd821e0fcce29d8… | |
+ 'scriptSig': '48304502203f1ff200490d18bcb802c7cf7ba4264727b089… | |
+ 'sequence': 4294967295, | |
+ 'signatures': ['304502203f1ff200490d18bcb802c7cf7ba4264727b089… | |
+ 'x_pubkeys': ['047b9f9014f8d0d6f24dcaf5681b6ab185bd821e0fcce29… | |
+ 'lockTime': 0, | |
+ 'outputs': [{'address': '1JtBahwvii2pRkBmb4QMfcJQux1rk3Jkbq', | |
+ 'prevout_n': 0, | |
+ 'scriptPubKey': '76a914c4282f6060b811ee695ebb2068b8788213451d6… | |
+ 'type': 'address', | |
+ 'value': 599990800}], | |
+ 'version': 1} | |
+ self.assertEquals(result, expected) | |
+ | |
+ network = NetworkMock([]) | |
+ tx = transaction.Transaction.sweep(privkeys, network, to_address, fee=… | |
+ self.assertEquals(tx, None) | |
+ | |
+ privkeys = [] | |
+ tx = transaction.Transaction.sweep(privkeys, network, to_address, fee=… | |
+ self.assertEquals(tx, None) | |
+ | |
+class NetworkMock(object): | |
+ | |
+ def __init__(self, unspent): | |
+ self.unspent = unspent | |
+ | |
+ def synchronous_get(self, arg): | |
+ return [self.unspent] |