asmt/censustree_test.go
censustree_test.goRaw
1package asmtree
2
3import (
4 "bytes"
5 "fmt"
6 "testing"
7)
8
9func TestTree(t *testing.T) {
10 censusSize := 1000
11 storage := t.TempDir()
12 tr1 := &Tree{}
13 err := tr1.Init("test1", storage)
14 if err != nil {
15 t.Fatal(err)
16 }
17 for i := 0; i < censusSize; i++ {
18 if err = tr1.Add([]byte(fmt.Sprintf("number %d", i)),
19 []byte(fmt.Sprintf("number %d value", i))); err != nil {
20 t.Fatal(err)
21 }
22 }
23
24 root1 := tr1.Root()
25 data, err := tr1.Dump(root1)
26 if err != nil {
27 t.Fatal(err)
28 }
29 t.Logf("dumped data size is: %d bytes", len(data))
30
31 tr2 := &Tree{}
32 err = tr2.Init("test2", storage)
33 if err != nil {
34 t.Fatal(err)
35 }
36 if err = tr2.ImportDump(data); err != nil {
37 t.Fatal(err)
38 }
39 root2 := tr2.Root()
40 if !bytes.Equal(root1, root2) {
41 t.Errorf("roots are different but they should be equal (%x != %x)", root1, root2)
42 }
43
44 // Try closing the storage and creating the tree again
45 tr2.Close()
46 err = tr2.Init("test2", storage)
47 if err != nil {
48 t.Fatal(err)
49 }
50
51 // Get the size
52 s, err := tr2.Size(nil)
53 if err != nil {
54 t.Errorf("cannot get te size of the tree after reopen: (%s)", err)
55 }
56 if s != int64(censusSize) {
57 t.Errorf("Size is wrong (have %d, expexted %d)", s, censusSize)
58 }
59
60 // Check Root is still the same
61 if !bytes.Equal(tr2.Root(), root2) {
62 t.Fatalf("after closing and opening the tree, the root is different")
63 }
64
65 // Generate a proof on tr1 and check validity on snapshot and tr2
66 proof1, err := tr1.GenProof([]byte("number 5"), []byte("number 5 value"))
67 if err != nil {
68 t.Error(err)
69 }
70 t.Logf("Proof Length: %d", len(proof1))
71 tr1s, err := tr1.Snapshot(root1)
72 if err != nil {
73 t.Fatal(err)
74 }
75 valid, err := tr1s.CheckProof([]byte("number 5"), []byte("number 5 value"), root1, proof1)
76 if err != nil {
77 t.Error(err)
78 }
79 if !valid {
80 t.Errorf("proof is invalid on snapshot")
81 }
82 valid, err = tr2.CheckProof([]byte("number 5"), []byte("number 5 value"), nil, proof1)
83 if err != nil {
84 t.Error(err)
85 }
86 if !valid {
87 t.Errorf("proof is invalid on tree2")
88 }
89
90}