Focus on Iterator protocol - tests passing!
Too much naming copy/pasta will probably confuse Python programmers when we have generator/iterators and I suppose we have streams but that is just so generic that it won't help. So, better make it explicit that this is an iterator. It also seems to the fit the usage of the other implementors.
This commit is contained in:
@ -5,18 +5,18 @@ import pytest
|
||||
|
||||
@pytest.fixture
|
||||
def leaf():
|
||||
def _leaf(node):
|
||||
return hashlib.sha256(leaf.data).hexdigest()
|
||||
def _leaf(node, roots=None):
|
||||
return hashlib.sha256(node.data).hexdigest()
|
||||
|
||||
return _leaf
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def parent():
|
||||
def _parent(left, right):
|
||||
def _parent(first, second):
|
||||
sha256 = hashlib.sha256()
|
||||
sha256.update(left)
|
||||
sha256.update(right)
|
||||
sha256.update(first.data)
|
||||
sha256.update(second.data)
|
||||
return sha256.hexdigest()
|
||||
|
||||
return _parent
|
||||
|
64
test/test_generate.py
Normal file
64
test/test_generate.py
Normal file
@ -0,0 +1,64 @@
|
||||
"""Merkle tree generation test module."""
|
||||
|
||||
import hashlib
|
||||
|
||||
import pytest
|
||||
|
||||
from merkle_tree_stream import MerkleTreeIterator, MerkleTreeNode
|
||||
|
||||
|
||||
def test_hashes(leaf, parent):
|
||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
||||
|
||||
merkle_iter.write(b'a')
|
||||
merkle_iter.write(b'b')
|
||||
|
||||
expected_count = 2 + 1 # nodes plus parent
|
||||
assert len(merkle_iter) == expected_count
|
||||
|
||||
assert next(merkle_iter) == MerkleTreeNode(
|
||||
index=0,
|
||||
parent=1,
|
||||
hash=hashlib.sha256(b'a').hexdigest(),
|
||||
size=1,
|
||||
data=b'a',
|
||||
)
|
||||
|
||||
assert next(merkle_iter) == MerkleTreeNode(
|
||||
index=2,
|
||||
parent=1,
|
||||
hash=hashlib.sha256(b'b').hexdigest(),
|
||||
size=1,
|
||||
data=b'b',
|
||||
)
|
||||
|
||||
hashed = hashlib.sha256(b'a')
|
||||
hashed.update(b'b')
|
||||
|
||||
assert next(merkle_iter) == MerkleTreeNode(
|
||||
index=1, parent=3, hash=hashed.hexdigest(), size=2, data=b''
|
||||
)
|
||||
|
||||
with pytest.raises(StopIteration):
|
||||
next(merkle_iter)
|
||||
|
||||
|
||||
def test_single_root(leaf, parent):
|
||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
||||
|
||||
merkle_iter.write(b'a')
|
||||
merkle_iter.write(b'b')
|
||||
merkle_iter.write(b'c')
|
||||
merkle_iter.write(b'd')
|
||||
|
||||
assert len(merkle_iter.roots) == 1
|
||||
|
||||
|
||||
def multiple_roots(leaf, parent):
|
||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
||||
|
||||
merkle_iter.write(b'a')
|
||||
merkle_iter.write(b'b')
|
||||
merkle_iter.write(b'c')
|
||||
|
||||
assert len(merkle_iter.roots) > 1
|
@ -1,66 +0,0 @@
|
||||
"""Generator test module."""
|
||||
|
||||
import hashlib
|
||||
|
||||
from merkle_tree_stream import MerkleTreeGenerator, MerkleTreeNode
|
||||
|
||||
|
||||
def test_hashes(leaf, parent):
|
||||
stream = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||
|
||||
stream.next(b'a')
|
||||
|
||||
first_node = (
|
||||
MerkleTreeNode(
|
||||
index=0,
|
||||
parent=1,
|
||||
hash=hashlib.sha256(b'a').hexdigest(),
|
||||
size=1,
|
||||
data=b'a',
|
||||
),
|
||||
)
|
||||
|
||||
stream.next(b'b')
|
||||
|
||||
second_node = (
|
||||
MerkleTreeNode(
|
||||
index=2,
|
||||
parent=1,
|
||||
hash=hashlib.sha256(b'b').hexdigest(),
|
||||
size=1,
|
||||
data=b'a',
|
||||
),
|
||||
)
|
||||
|
||||
stream.next(b'c')
|
||||
|
||||
third = hashlib.sha256(b'a')
|
||||
third.update(b'b')
|
||||
third_hash = third.hexdigest()
|
||||
|
||||
third_node = (
|
||||
MerkleTreeNode(index=1, parent=3, hash=third_hash, size=2, data=b'a'),
|
||||
)
|
||||
|
||||
assert stream.nodes == [first_node, second_node, third_node]
|
||||
|
||||
|
||||
def test_single_root(leaf, parent):
|
||||
stream = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||
|
||||
stream.next('a')
|
||||
stream.next('b')
|
||||
stream.next('c')
|
||||
stream.next('d')
|
||||
|
||||
assert stream.roots.length == 1
|
||||
|
||||
|
||||
def multiple_roots(leaf, parent):
|
||||
stream = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||
|
||||
stream.next('a')
|
||||
stream.next('b')
|
||||
stream.next('c')
|
||||
|
||||
assert stream.roots.length > 1
|
Reference in New Issue
Block a user