github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/util_test.go (about) 1 package db 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 ) 8 9 // Empty iterator for empty db. 10 func TestPrefixIteratorNoMatchNil(t *testing.T) { 11 for backend := range backends { 12 t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { 13 db, dir := newTempDB(t, backend) 14 defer os.RemoveAll(dir) 15 itr := IteratePrefix(db, []byte("2")) 16 17 checkInvalid(t, itr) 18 }) 19 } 20 } 21 22 // Empty iterator for db populated after iterator created. 23 func TestPrefixIteratorNoMatch1(t *testing.T) { 24 for backend := range backends { 25 if backend == BoltDBBackend { 26 t.Log("bolt does not support concurrent writes while iterating") 27 continue 28 } 29 30 t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { 31 db, dir := newTempDB(t, backend) 32 defer os.RemoveAll(dir) 33 itr := IteratePrefix(db, []byte("2")) 34 db.SetSync(bz("1"), bz("value_1")) 35 36 checkInvalid(t, itr) 37 }) 38 } 39 } 40 41 // Empty iterator for prefix starting after db entry. 42 func TestPrefixIteratorNoMatch2(t *testing.T) { 43 for backend := range backends { 44 t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { 45 db, dir := newTempDB(t, backend) 46 defer os.RemoveAll(dir) 47 db.SetSync(bz("3"), bz("value_3")) 48 itr := IteratePrefix(db, []byte("4")) 49 50 checkInvalid(t, itr) 51 }) 52 } 53 } 54 55 // Iterator with single val for db with single val, starting from that val. 56 func TestPrefixIteratorMatch1(t *testing.T) { 57 for backend := range backends { 58 t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { 59 db, dir := newTempDB(t, backend) 60 defer os.RemoveAll(dir) 61 db.SetSync(bz("2"), bz("value_2")) 62 itr := IteratePrefix(db, bz("2")) 63 64 checkValid(t, itr, true) 65 checkItem(t, itr, bz("2"), bz("value_2")) 66 checkNext(t, itr, false) 67 68 // Once invalid... 69 checkInvalid(t, itr) 70 }) 71 } 72 } 73 74 // Iterator with prefix iterates over everything with same prefix. 75 func TestPrefixIteratorMatches1N(t *testing.T) { 76 for backend := range backends { 77 t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { 78 db, dir := newTempDB(t, backend) 79 defer os.RemoveAll(dir) 80 81 // prefixed 82 db.SetSync(bz("a/1"), bz("value_1")) 83 db.SetSync(bz("a/3"), bz("value_3")) 84 85 // not 86 db.SetSync(bz("b/3"), bz("value_3")) 87 db.SetSync(bz("a-3"), bz("value_3")) 88 db.SetSync(bz("a.3"), bz("value_3")) 89 db.SetSync(bz("abcdefg"), bz("value_3")) 90 itr := IteratePrefix(db, bz("a/")) 91 92 checkValid(t, itr, true) 93 checkItem(t, itr, bz("a/1"), bz("value_1")) 94 checkNext(t, itr, true) 95 checkItem(t, itr, bz("a/3"), bz("value_3")) 96 97 // Bad! 98 checkNext(t, itr, false) 99 100 //Once invalid... 101 checkInvalid(t, itr) 102 }) 103 } 104 }