arbo/db/prefixeddb/prefixeddb_test.go
db/prefixeddb/prefixeddb_test.goRaw
1package prefixeddb
2
3import (
4 "testing"
5
6 "github.com/arnaucube/arbo/db/metadb"
7 qt "github.com/frankban/quicktest"
8)
9
10func TestPrefixed(t *testing.T) {
11 database := metadb.NewTest(t)
12
13 prefix1 := []byte("one")
14 prefix2 := []byte("two")
15
16 db1 := NewPrefixedDatabase(database, prefix1)
17 db2 := NewPrefixedDatabase(database, prefix2)
18
19 keys1, values1 := [][]byte{[]byte("a"), []byte("b")}, [][]byte{[]byte("1"), []byte("2")}
20 keys2, values2 := [][]byte{[]byte("c"), []byte("d")}, [][]byte{[]byte("3"), []byte("4")}
21
22 // Insert at prefix "one" with WriteTx from PrefixedDatabase
23 wTx1 := db1.WriteTx()
24 qt.Assert(t, wTx1.Set(keys1[0], values1[0]), qt.IsNil)
25 qt.Assert(t, wTx1.Set(keys1[1], values1[1]), qt.IsNil)
26 qt.Assert(t, wTx1.Commit(), qt.IsNil)
27
28 // Insert at prefix "two" with PrefixedWriteTx from Database.WriteTx()
29 wTx2 := NewPrefixedWriteTx(database.WriteTx(), prefix2)
30 qt.Assert(t, wTx2.Set(keys2[0], values2[0]), qt.IsNil)
31 qt.Assert(t, wTx2.Set(keys2[1], values2[1]), qt.IsNil)
32 qt.Assert(t, wTx2.Commit(), qt.IsNil)
33
34 // Check key-values in PrefixedDatabase "one"
35 i := 0
36 err := db1.Iterate(nil, func(key, value []byte) bool {
37 qt.Assert(t, key, qt.DeepEquals, keys1[i])
38 qt.Assert(t, value, qt.DeepEquals, values1[i])
39 i++
40 return true
41 })
42 qt.Assert(t, err, qt.IsNil)
43
44 // Check key-values in PrefixedDatabase "two"
45 v0, err := db2.Get(keys2[0])
46 qt.Assert(t, err, qt.IsNil)
47 qt.Assert(t, v0, qt.DeepEquals, values2[0])
48 v1, err := db2.Get(keys2[1])
49 qt.Assert(t, err, qt.IsNil)
50 qt.Assert(t, v1, qt.DeepEquals, values2[1])
51
52 // Check all key-values with prefixes in parent Database
53 prefixes := [][]byte{prefix1, prefix1, prefix2, prefix2}
54 keys := append(keys1, keys2...)
55 values := append(values1, values2...)
56 i = 0
57 err = database.Iterate(nil, func(key, value []byte) bool {
58 qt.Assert(t, key, qt.DeepEquals, append(prefixes[i], keys[i]...))
59 qt.Assert(t, value, qt.DeepEquals, values[i])
60 i++
61 return true
62 })
63 qt.Assert(t, err, qt.IsNil)
64}