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