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"
 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}