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}