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