arnaucube
arnaucube/asmtPublic Self-hosted repository
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}