tendermint/merkle/simple_tree_test.go

75 lines
1.8 KiB
Go

package merkle
import (
. "github.com/tendermint/tendermint/common"
"bytes"
"testing"
)
type testItem []byte
func (tI testItem) Hash() []byte {
return []byte(tI)
}
func TestMerkleTrails(t *testing.T) {
numItems := uint(100)
items := make([]Hashable, numItems)
for i := uint(0); i < numItems; i++ {
items[i] = testItem(RandBytes(32))
}
root := HashFromHashables(items)
trails, rootTrail := HashTrailsFromHashables(items)
// Assert that HashFromHashables and HashTrailsFromHashables are compatible.
if !bytes.Equal(root, rootTrail.Hash) {
t.Errorf("Root mismatch:\n%X vs\n%X", root, rootTrail.Hash)
}
// For each item, check the trail.
for i, item := range items {
itemHash := item.Hash()
flatTrail := trails[i].Flatten()
// Verify success
ok := VerifyHashTrail(uint(i), numItems, itemHash, flatTrail, root)
if !ok {
t.Errorf("Verification failed for index %v.", i)
}
// Wrong item index should make it fail
ok = VerifyHashTrail(uint(i)+1, numItems, itemHash, flatTrail, root)
if ok {
t.Errorf("Expected verification to fail for wrong index %v.", i)
}
// Trail too long should make it fail
trail2 := append(flatTrail, RandBytes(32))
ok = VerifyHashTrail(uint(i), numItems, itemHash, trail2, root)
if ok {
t.Errorf("Expected verification to fail for wrong trail length.")
}
// Trail too short should make it fail
trail2 = flatTrail[:len(flatTrail)-1]
ok = VerifyHashTrail(uint(i), numItems, itemHash, trail2, root)
if ok {
t.Errorf("Expected verification to fail for wrong trail length.")
}
// Mutating the itemHash should make it fail.
itemHash2 := make([]byte, len(itemHash))
copy(itemHash2, itemHash)
itemHash2[0] += byte(0x01)
ok = VerifyHashTrail(uint(i), numItems, itemHash2, flatTrail, root)
if ok {
t.Errorf("Expected verification to fail for mutated leaf hash")
}
}
}