arbo/helpers_test.go
helpers_test.goRaw
1package arbo
2
3import (
4 "bytes"
5 "io"
6 "io/ioutil"
7 "os"
8 "testing"
9 "time"
10
11 qt "github.com/frankban/quicktest"
12 "go.vocdoni.io/dvote/db/badgerdb"
13)
14
15func checkRoots(c *qt.C, tree1, tree2 *Tree) {
16 root1, err := tree1.Root()
17 c.Assert(err, qt.IsNil)
18 root2, err := tree2.Root()
19 c.Assert(err, qt.IsNil)
20 if !bytes.Equal(root2, root1) {
21 dir := "err-dump"
22 if _, err := os.Stat(dir); os.IsNotExist(err) {
23 err := os.Mkdir(dir, os.ModePerm)
24 c.Assert(err, qt.IsNil)
25 }
26 // store tree1
27 storeTree(c, tree1, dir+"/tree1")
28
29 // store tree2
30 storeTree(c, tree2, dir+"/tree2")
31
32 root1, err := tree1.Root()
33 c.Assert(err, qt.IsNil)
34 root2, err := tree2.Root()
35 c.Assert(err, qt.IsNil)
36 c.Check(root2, qt.DeepEquals, root1)
37 }
38}
39
40func storeTree(c *qt.C, tree *Tree, path string) {
41 dump, err := tree.Dump(nil)
42 c.Assert(err, qt.IsNil)
43 err = ioutil.WriteFile(path+"-"+time.Now().String()+".debug", dump, 0600)
44 c.Assert(err, qt.IsNil)
45}
46
47// nolint:unused
48func readTree(c *qt.C, tree *Tree, path string) {
49 b, err := ioutil.ReadFile(path) //nolint:gosec
50 c.Assert(err, qt.IsNil)
51 err = tree.ImportDump(b)
52 c.Assert(err, qt.IsNil)
53}
54
55// nolint:unused
56func importDumpLoopAdd(tree *Tree, b []byte) error {
57 r := bytes.NewReader(b)
58 var err error
59 for {
60 l := make([]byte, 2)
61 _, err = io.ReadFull(r, l)
62 if err == io.EOF {
63 break
64 } else if err != nil {
65 return err
66 }
67 k := make([]byte, l[0])
68 _, err = io.ReadFull(r, k)
69 if err != nil {
70 return err
71 }
72 v := make([]byte, l[1])
73 _, err = io.ReadFull(r, v)
74 if err != nil {
75 return err
76 }
77 err = tree.Add(k, v)
78 if err != nil {
79 return err
80 }
81 }
82 return nil
83}
84
85func TestReadTreeDBG(t *testing.T) {
86 t.Skip() // test just for debugging purposes, disabled by default
87
88 c := qt.New(t)
89
90 database1, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()})
91 c.Assert(err, qt.IsNil)
92 tree1, err := NewTree(database1, 100, HashFunctionBlake2b)
93 c.Assert(err, qt.IsNil)
94
95 database2, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()})
96 c.Assert(err, qt.IsNil)
97 tree2, err := NewTree(database2, 100, HashFunctionBlake2b)
98 c.Assert(err, qt.IsNil)
99
100 // tree1 is generated by a loop of .Add
101 path := "err-dump/tree1-2021-06-03 16:45:54.104449306 +0200 CEST m=+0.073874545.debug"
102 b, err := ioutil.ReadFile(path)
103 c.Assert(err, qt.IsNil)
104 err = importDumpLoopAdd(tree1, b)
105 c.Assert(err, qt.IsNil)
106
107 // tree2 is generated by .AddBatch
108 path = "err-dump/tree2-2021-06-03 16:45:54.104525519 +0200 CEST m=+0.073950756.debug"
109 readTree(c, tree2, path)
110
111 // tree1.PrintGraphvizFirstNLevels(nil, 6)
112 // tree2.PrintGraphvizFirstNLevels(nil, 6)
113
114 root1, err := tree1.Root()
115 c.Assert(err, qt.IsNil)
116 root2, err := tree2.Root()
117 c.Assert(err, qt.IsNil)
118 c.Check(root2, qt.DeepEquals, root1)
119}