package asmtree
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
func TestTree(t *testing.T) {
|
|
censusSize := 1000
|
|
storage := t.TempDir()
|
|
tr1 := &Tree{}
|
|
err := tr1.Init("test1", storage)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for i := 0; i < censusSize; i++ {
|
|
if err = tr1.Add([]byte(fmt.Sprintf("number %d", i)),
|
|
[]byte(fmt.Sprintf("number %d value", i))); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
root1 := tr1.Root()
|
|
data, err := tr1.Dump(root1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Logf("dumped data size is: %d bytes", len(data))
|
|
|
|
tr2 := &Tree{}
|
|
err = tr2.Init("test2", storage)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = tr2.ImportDump(data); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
root2 := tr2.Root()
|
|
if !bytes.Equal(root1, root2) {
|
|
t.Errorf("roots are different but they should be equal (%x != %x)", root1, root2)
|
|
}
|
|
|
|
// Try closing the storage and creating the tree again
|
|
tr2.Close()
|
|
err = tr2.Init("test2", storage)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Get the size
|
|
s, err := tr2.Size(nil)
|
|
if err != nil {
|
|
t.Errorf("cannot get te size of the tree after reopen: (%s)", err)
|
|
}
|
|
if s != int64(censusSize) {
|
|
t.Errorf("Size is wrong (have %d, expexted %d)", s, censusSize)
|
|
}
|
|
|
|
// Check Root is still the same
|
|
if !bytes.Equal(tr2.Root(), root2) {
|
|
t.Fatalf("after closing and opening the tree, the root is different")
|
|
}
|
|
|
|
// Generate a proof on tr1 and check validity on snapshot and tr2
|
|
proof1, err := tr1.GenProof([]byte("number 5"), []byte("number 5 value"))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
t.Logf("Proof Length: %d", len(proof1))
|
|
tr1s, err := tr1.Snapshot(root1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
valid, err := tr1s.CheckProof([]byte("number 5"), []byte("number 5 value"), root1, proof1)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !valid {
|
|
t.Errorf("proof is invalid on snapshot")
|
|
}
|
|
valid, err = tr2.CheckProof([]byte("number 5"), []byte("number 5 value"), nil, proof1)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !valid {
|
|
t.Errorf("proof is invalid on tree2")
|
|
}
|
|
|
|
}
|