arnaucube
arnaucube/arboPublic Self-hosted repository
arbo/localdb_test.go
localdb_test.goRaw
 1package arbo
 2
 3import (
 4	"testing"
 5
 6	"github.com/arnaucube/arbo/db"
 7	"github.com/arnaucube/arbo/db/goleveldb"
 8	"github.com/arnaucube/arbo/db/pebbledb"
 9	qt "github.com/frankban/quicktest"
10)
11
12// TestLocalDBReaders checks pending and committed tree reads through the ported API.
13func TestLocalDBReaders(t *testing.T) {
14	backends := map[string]func(db.Options) (db.Database, error){
15		"pebble":  func(opts db.Options) (db.Database, error) { return pebbledb.New(opts) },
16		"leveldb": func(opts db.Options) (db.Database, error) { return goleveldb.New(opts) },
17	}
18	for name, open := range backends {
19		t.Run(name, func(t *testing.T) {
20			c := qt.New(t)
21			opts := db.Options{Path: t.TempDir()}
22			database, err := open(opts)
23			c.Assert(err, qt.IsNil)
24			t.Cleanup(func() { c.Check(database.Close(), qt.IsNil) })
25			cfg := Config{Database: database, MaxLevels: 32, HashFunction: HashFunctionBlake2b}
26			tree, err := NewTree(cfg)
27			c.Assert(err, qt.IsNil)
28
29			tx := database.WriteTx()
30			defer tx.Discard()
31			key, value := []byte{1}, []byte("value")
32			c.Assert(tree.AddWithTx(tx, key, value), qt.IsNil)
33			_, got, err := tree.GetWithTx(tx, key)
34			c.Assert(err, qt.IsNil)
35			c.Check(got, qt.DeepEquals, value)
36			_, _, err = tree.GetWithTx(database, key)
37			c.Check(err, qt.Equals, ErrKeyNotFound)
38			pendingRoot, err := tree.RootWithTx(tx)
39			c.Assert(err, qt.IsNil)
40			c.Assert(tx.Commit(), qt.IsNil)
41			tx.Discard()
42
43			root, err := tree.RootWithTx(database)
44			c.Assert(err, qt.IsNil)
45			c.Check(root, qt.DeepEquals, pendingRoot)
46			_, got, err = tree.Get(key)
47			c.Assert(err, qt.IsNil)
48			c.Check(got, qt.DeepEquals, value)
49		})
50	}
51}