github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/backend_test.go (about) 1 package db 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common" 14 ) 15 16 func cleanupDBDir(dir, name string) { 17 err := os.RemoveAll(filepath.Join(dir, name) + ".db") 18 if err != nil { 19 panic(err) 20 } 21 } 22 23 func testBackendGetSetDelete(t *testing.T, backend DBBackendType) { 24 // Default 25 dirname, err := ioutil.TempDir("", fmt.Sprintf("test_backend_%s_", backend)) 26 require.Nil(t, err) 27 db := NewDB("testdb", backend, dirname) 28 defer cleanupDBDir(dirname, "testdb") 29 30 // A nonexistent key should return nil, even if the key is empty 31 require.Nil(t, db.Get([]byte(""))) 32 33 // A nonexistent key should return nil, even if the key is nil 34 require.Nil(t, db.Get(nil)) 35 36 // A nonexistent key should return nil. 37 key := []byte("abc") 38 require.Nil(t, db.Get(key)) 39 40 // Set empty value. 41 db.Set(key, []byte("")) 42 require.NotNil(t, db.Get(key)) 43 require.Empty(t, db.Get(key)) 44 45 // Set nil value. 46 db.Set(key, nil) 47 require.NotNil(t, db.Get(key)) 48 require.Empty(t, db.Get(key)) 49 50 // Delete. 51 db.Delete(key) 52 require.Nil(t, db.Get(key)) 53 } 54 55 func TestBackendsGetSetDelete(t *testing.T) { 56 for dbType := range backends { 57 testBackendGetSetDelete(t, dbType) 58 } 59 } 60 61 func withDB(t *testing.T, creator dbCreator, fn func(DB)) { 62 name := fmt.Sprintf("test_%x", cmn.RandStr(12)) 63 dir := os.TempDir() 64 db, err := creator(name, dir) 65 require.Nil(t, err) 66 defer cleanupDBDir(dir, name) 67 fn(db) 68 db.Close() 69 } 70 71 func TestBackendsNilKeys(t *testing.T) { 72 73 // Test all backends. 74 for dbType, creator := range backends { 75 withDB(t, creator, func(db DB) { 76 t.Run(fmt.Sprintf("Testing %s", dbType), func(t *testing.T) { 77 78 // Nil keys are treated as the empty key for most operations. 79 expect := func(key, value []byte) { 80 if len(key) == 0 { // nil or empty 81 assert.Equal(t, db.Get(nil), db.Get([]byte(""))) 82 assert.Equal(t, db.Has(nil), db.Has([]byte(""))) 83 } 84 assert.Equal(t, db.Get(key), value) 85 assert.Equal(t, db.Has(key), value != nil) 86 } 87 88 // Not set 89 expect(nil, nil) 90 91 // Set nil value 92 db.Set(nil, nil) 93 expect(nil, []byte("")) 94 95 // Set empty value 96 db.Set(nil, []byte("")) 97 expect(nil, []byte("")) 98 99 // Set nil, Delete nil 100 db.Set(nil, []byte("abc")) 101 expect(nil, []byte("abc")) 102 db.Delete(nil) 103 expect(nil, nil) 104 105 // Set nil, Delete empty 106 db.Set(nil, []byte("abc")) 107 expect(nil, []byte("abc")) 108 db.Delete([]byte("")) 109 expect(nil, nil) 110 111 // Set empty, Delete nil 112 db.Set([]byte(""), []byte("abc")) 113 expect(nil, []byte("abc")) 114 db.Delete(nil) 115 expect(nil, nil) 116 117 // Set empty, Delete empty 118 db.Set([]byte(""), []byte("abc")) 119 expect(nil, []byte("abc")) 120 db.Delete([]byte("")) 121 expect(nil, nil) 122 123 // SetSync nil, DeleteSync nil 124 db.SetSync(nil, []byte("abc")) 125 expect(nil, []byte("abc")) 126 db.DeleteSync(nil) 127 expect(nil, nil) 128 129 // SetSync nil, DeleteSync empty 130 db.SetSync(nil, []byte("abc")) 131 expect(nil, []byte("abc")) 132 db.DeleteSync([]byte("")) 133 expect(nil, nil) 134 135 // SetSync empty, DeleteSync nil 136 db.SetSync([]byte(""), []byte("abc")) 137 expect(nil, []byte("abc")) 138 db.DeleteSync(nil) 139 expect(nil, nil) 140 141 // SetSync empty, DeleteSync empty 142 db.SetSync([]byte(""), []byte("abc")) 143 expect(nil, []byte("abc")) 144 db.DeleteSync([]byte("")) 145 expect(nil, nil) 146 }) 147 }) 148 } 149 } 150 151 func TestGoLevelDBBackend(t *testing.T) { 152 name := fmt.Sprintf("test_%x", cmn.RandStr(12)) 153 db := NewDB(name, GoLevelDBBackend, "") 154 defer cleanupDBDir("", name) 155 156 _, ok := db.(*GoLevelDB) 157 assert.True(t, ok) 158 } 159 160 func TestDBIterator(t *testing.T) { 161 for dbType := range backends { 162 t.Run(fmt.Sprintf("%v", dbType), func(t *testing.T) { 163 testDBIterator(t, dbType) 164 }) 165 } 166 } 167 168 func testDBIterator(t *testing.T, backend DBBackendType) { 169 name := fmt.Sprintf("test_%x", cmn.RandStr(12)) 170 dir := os.TempDir() 171 db := NewDB(name, backend, dir) 172 defer cleanupDBDir(dir, name) 173 174 for i := 0; i < 10; i++ { 175 if i != 6 { // but skip 6. 176 db.Set(int642Bytes(int64(i)), nil) 177 } 178 } 179 180 verifyIterator(t, db.Iterator(nil, nil), []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator") 181 verifyIterator(t, db.ReverseIterator(nil, nil), []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator") 182 183 verifyIterator(t, db.Iterator(nil, int642Bytes(0)), []int64(nil), "forward iterator to 0") 184 verifyIterator(t, db.ReverseIterator(int642Bytes(10), nil), []int64(nil), "reverse iterator from 10 (ex)") 185 186 verifyIterator(t, db.Iterator(int642Bytes(0), nil), []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 0") 187 verifyIterator(t, db.Iterator(int642Bytes(1), nil), []int64{1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 1") 188 verifyIterator(t, db.ReverseIterator(nil, int642Bytes(10)), []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 10 (ex)") 189 verifyIterator(t, db.ReverseIterator(nil, int642Bytes(9)), []int64{8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 9 (ex)") 190 verifyIterator(t, db.ReverseIterator(nil, int642Bytes(8)), []int64{7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 8 (ex)") 191 192 verifyIterator(t, db.Iterator(int642Bytes(5), int642Bytes(6)), []int64{5}, "forward iterator from 5 to 6") 193 verifyIterator(t, db.Iterator(int642Bytes(5), int642Bytes(7)), []int64{5}, "forward iterator from 5 to 7") 194 verifyIterator(t, db.Iterator(int642Bytes(5), int642Bytes(8)), []int64{5, 7}, "forward iterator from 5 to 8") 195 verifyIterator(t, db.Iterator(int642Bytes(6), int642Bytes(7)), []int64(nil), "forward iterator from 6 to 7") 196 verifyIterator(t, db.Iterator(int642Bytes(6), int642Bytes(8)), []int64{7}, "forward iterator from 6 to 8") 197 verifyIterator(t, db.Iterator(int642Bytes(7), int642Bytes(8)), []int64{7}, "forward iterator from 7 to 8") 198 199 verifyIterator(t, db.ReverseIterator(int642Bytes(4), int642Bytes(5)), []int64{4}, "reverse iterator from 5 (ex) to 4") 200 verifyIterator(t, db.ReverseIterator(int642Bytes(4), int642Bytes(6)), []int64{5, 4}, "reverse iterator from 6 (ex) to 4") 201 verifyIterator(t, db.ReverseIterator(int642Bytes(4), int642Bytes(7)), []int64{5, 4}, "reverse iterator from 7 (ex) to 4") 202 verifyIterator(t, db.ReverseIterator(int642Bytes(5), int642Bytes(6)), []int64{5}, "reverse iterator from 6 (ex) to 5") 203 verifyIterator(t, db.ReverseIterator(int642Bytes(5), int642Bytes(7)), []int64{5}, "reverse iterator from 7 (ex) to 5") 204 verifyIterator(t, db.ReverseIterator(int642Bytes(6), int642Bytes(7)), []int64(nil), "reverse iterator from 7 (ex) to 6") 205 206 verifyIterator(t, db.Iterator(int642Bytes(0), int642Bytes(1)), []int64{0}, "forward iterator from 0 to 1") 207 verifyIterator(t, db.ReverseIterator(int642Bytes(8), int642Bytes(9)), []int64{8}, "reverse iterator from 9 (ex) to 8") 208 209 verifyIterator(t, db.Iterator(int642Bytes(2), int642Bytes(4)), []int64{2, 3}, "forward iterator from 2 to 4") 210 verifyIterator(t, db.Iterator(int642Bytes(4), int642Bytes(2)), []int64(nil), "forward iterator from 4 to 2") 211 verifyIterator(t, db.ReverseIterator(int642Bytes(2), int642Bytes(4)), []int64{3, 2}, "reverse iterator from 4 (ex) to 2") 212 verifyIterator(t, db.ReverseIterator(int642Bytes(4), int642Bytes(2)), []int64(nil), "reverse iterator from 2 (ex) to 4") 213 214 } 215 216 func verifyIterator(t *testing.T, itr Iterator, expected []int64, msg string) { 217 var list []int64 218 for itr.Valid() { 219 list = append(list, bytes2Int64(itr.Key())) 220 itr.Next() 221 } 222 assert.Equal(t, expected, list, msg) 223 }