arbo/helpers_test.go
helpers_test.goRaw
1package arbo
2
3import (
4 "bytes"
5 "io"
6 "os"
7 "testing"
8 "time"
9
10 "github.com/arnaucube/arbo/db"
11 "github.com/arnaucube/arbo/db/pebbledb"
12 qt "github.com/frankban/quicktest"
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 = os.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 := os.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 := pebbledb.New(db.Options{Path: c.TempDir()})
91 c.Assert(err, qt.IsNil)
92 tree1, err := NewTree(Config{Database: database1, MaxLevels: 100,
93 HashFunction: HashFunctionBlake2b})
94 c.Assert(err, qt.IsNil)
95
96 database2, err := pebbledb.New(db.Options{Path: c.TempDir()})
97 c.Assert(err, qt.IsNil)
98 tree2, err := NewTree(Config{Database: database2, MaxLevels: 100,
99 HashFunction: HashFunctionBlake2b})
100 c.Assert(err, qt.IsNil)
101
102 // tree1 is generated by a loop of .Add
103 path := "err-dump/tree1-2021-06-03 16:45:54.104449306 +0200 CEST m=+0.073874545.debug"
104 b, err := os.ReadFile(path)
105 c.Assert(err, qt.IsNil)
106 err = importDumpLoopAdd(tree1, b)
107 c.Assert(err, qt.IsNil)
108
109 // tree2 is generated by .AddBatch
110 path = "err-dump/tree2-2021-06-03 16:45:54.104525519 +0200 CEST m=+0.073950756.debug"
111 readTree(c, tree2, path)
112
113 // tree1.PrintGraphvizFirstNLevels(nil, 6)
114 // tree2.PrintGraphvizFirstNLevels(nil, 6)
115
116 root1, err := tree1.Root()
117 c.Assert(err, qt.IsNil)
118 root2, err := tree2.Root()
119 c.Assert(err, qt.IsNil)
120 c.Check(root2, qt.DeepEquals, root1)
121}