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