audit-labs/evidence-seal
Tamper-evident seals and chain of custody for audit evidence.
clone: git clone https://gitbay.org/audit-labs/evidence-seal.git
v0.1.0: tests/test_hashing.py · raw
1"""Tests for file hashing and the Merkle root."""
2
3from evidence_seal.hashing import hash_bytes, hash_file, merkle_root
4
5
6def test_hash_file_matches_known_sha256(tmp_path):
7 f = tmp_path / "x.txt"
8 f.write_bytes(b"hello")
9 # Known SHA-256 of "hello".
10 assert hash_file(f) == "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
11 assert hash_bytes(b"hello") == hash_file(f)
12
13
14def test_merkle_root_is_order_independent():
15 a = {"a": "1", "b": "2", "c": "3"}
16 b = {"c": "3", "a": "1", "b": "2"}
17 assert merkle_root(a) == merkle_root(b)
18
19
20def test_merkle_root_changes_on_content():
21 base = {"a": "1", "b": "2"}
22 changed = {"a": "1", "b": "changed"}
23 assert merkle_root(base) != merkle_root(changed)
24
25
26def test_merkle_root_changes_on_rename():
27 # Same content hash, different path -> different root (path is bound in).
28 assert merkle_root({"a": "1"}) != merkle_root({"b": "1"})
29
30
31def test_empty_root_is_defined_and_distinct():
32 assert merkle_root({}) == hash_bytes(b"empty")
33 assert merkle_root({}) != merkle_root({"a": "1"})
34
35
36def test_odd_number_of_leaves():
37 # Three leaves exercises the duplicate-last branch; just needs to be stable.
38 entries = {"a": "1", "b": "2", "c": "3"}
39 assert merkle_root(entries) == merkle_root(dict(entries))