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