package arbo import ( "bytes" "io" "io/ioutil" "os" "testing" "time" qt "github.com/frankban/quicktest" "go.vocdoni.io/dvote/db" "go.vocdoni.io/dvote/db/badgerdb" ) func checkRoots(c *qt.C, tree1, tree2 *Tree) { root1, err := tree1.Root() c.Assert(err, qt.IsNil) root2, err := tree2.Root() c.Assert(err, qt.IsNil) if !bytes.Equal(root2, root1) { dir := "err-dump" if _, err := os.Stat(dir); os.IsNotExist(err) { err := os.Mkdir(dir, os.ModePerm) c.Assert(err, qt.IsNil) } // store tree1 storeTree(c, tree1, dir+"/tree1") // store tree2 storeTree(c, tree2, dir+"/tree2") root1, err := tree1.Root() c.Assert(err, qt.IsNil) root2, err := tree2.Root() c.Assert(err, qt.IsNil) c.Check(root2, qt.DeepEquals, root1) } } func storeTree(c *qt.C, tree *Tree, path string) { dump, err := tree.Dump(nil) c.Assert(err, qt.IsNil) err = ioutil.WriteFile(path+"-"+time.Now().String()+".debug", dump, 0600) c.Assert(err, qt.IsNil) } // nolint:unused func readTree(c *qt.C, tree *Tree, path string) { b, err := ioutil.ReadFile(path) //nolint:gosec c.Assert(err, qt.IsNil) err = tree.ImportDump(b) c.Assert(err, qt.IsNil) } // nolint:unused func importDumpLoopAdd(tree *Tree, b []byte) error { r := bytes.NewReader(b) var err error for { l := make([]byte, 2) _, err = io.ReadFull(r, l) if err == io.EOF { break } else if err != nil { return err } k := make([]byte, l[0]) _, err = io.ReadFull(r, k) if err != nil { return err } v := make([]byte, l[1]) _, err = io.ReadFull(r, v) if err != nil { return err } err = tree.Add(k, v) if err != nil { return err } } return nil } func TestReadTreeDBG(t *testing.T) { t.Skip() // test just for debugging purposes, disabled by default c := qt.New(t) database1, err := badgerdb.New(db.Options{Path: c.TempDir()}) c.Assert(err, qt.IsNil) tree1, err := NewTree(Config{Database: database1, MaxLevels: 100, HashFunction: HashFunctionBlake2b}) c.Assert(err, qt.IsNil) database2, err := badgerdb.New(db.Options{Path: c.TempDir()}) c.Assert(err, qt.IsNil) tree2, err := NewTree(Config{Database: database2, MaxLevels: 100, HashFunction: HashFunctionBlake2b}) c.Assert(err, qt.IsNil) // tree1 is generated by a loop of .Add path := "err-dump/tree1-2021-06-03 16:45:54.104449306 +0200 CEST m=+0.073874545.debug" b, err := ioutil.ReadFile(path) c.Assert(err, qt.IsNil) err = importDumpLoopAdd(tree1, b) c.Assert(err, qt.IsNil) // tree2 is generated by .AddBatch path = "err-dump/tree2-2021-06-03 16:45:54.104525519 +0200 CEST m=+0.073950756.debug" readTree(c, tree2, path) // tree1.PrintGraphvizFirstNLevels(nil, 6) // tree2.PrintGraphvizFirstNLevels(nil, 6) root1, err := tree1.Root() c.Assert(err, qt.IsNil) root2, err := tree2.Root() c.Assert(err, qt.IsNil) c.Check(root2, qt.DeepEquals, root1) }