github.com/ava-labs/avalanchego@v1.11.11/database/versiondb/db_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package versiondb 5 6 import ( 7 "fmt" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 12 "github.com/ava-labs/avalanchego/database" 13 "github.com/ava-labs/avalanchego/database/dbtest" 14 "github.com/ava-labs/avalanchego/database/memdb" 15 ) 16 17 func TestInterface(t *testing.T) { 18 for name, test := range dbtest.Tests { 19 t.Run(name, func(t *testing.T) { 20 baseDB := memdb.New() 21 test(t, New(baseDB)) 22 }) 23 } 24 } 25 26 func FuzzKeyValue(f *testing.F) { 27 dbtest.FuzzKeyValue(f, New(memdb.New())) 28 } 29 30 func FuzzNewIteratorWithPrefix(f *testing.F) { 31 dbtest.FuzzNewIteratorWithPrefix(f, New(memdb.New())) 32 } 33 34 func FuzzNewIteratorWithStartAndPrefix(f *testing.F) { 35 dbtest.FuzzNewIteratorWithStartAndPrefix(f, New(memdb.New())) 36 } 37 38 func TestIterate(t *testing.T) { 39 require := require.New(t) 40 41 baseDB := memdb.New() 42 db := New(baseDB) 43 44 key1 := []byte("hello1") 45 value1 := []byte("world1") 46 47 key2 := []byte("z") 48 value2 := []byte("world2") 49 50 require.NoError(db.Put(key1, value1)) 51 require.NoError(db.Commit()) 52 53 iterator := db.NewIterator() 54 require.NotNil(iterator) 55 defer iterator.Release() 56 57 require.True(iterator.Next()) 58 require.Equal(key1, iterator.Key()) 59 require.Equal(value1, iterator.Value()) 60 61 require.False(iterator.Next()) 62 require.Nil(iterator.Key()) 63 require.Nil(iterator.Value()) 64 65 require.NoError(iterator.Error()) 66 67 require.NoError(db.Put(key2, value2)) 68 69 iterator = db.NewIterator() 70 require.NotNil(iterator) 71 defer iterator.Release() 72 73 require.True(iterator.Next()) 74 require.Equal(key1, iterator.Key()) 75 require.Equal(value1, iterator.Value()) 76 77 require.True(iterator.Next()) 78 require.Equal(key2, iterator.Key()) 79 require.Equal(value2, iterator.Value()) 80 81 require.False(iterator.Next()) 82 require.Nil(iterator.Key()) 83 require.Nil(iterator.Value()) 84 85 require.NoError(iterator.Error()) 86 require.NoError(db.Delete(key1)) 87 88 iterator = db.NewIterator() 89 require.NotNil(iterator) 90 defer iterator.Release() 91 92 require.True(iterator.Next()) 93 require.Equal(key2, iterator.Key()) 94 require.Equal(value2, iterator.Value()) 95 96 require.False(iterator.Next()) 97 require.Nil(iterator.Key()) 98 require.Nil(iterator.Value()) 99 100 require.NoError(iterator.Error()) 101 102 require.NoError(db.Commit()) 103 require.NoError(db.Put(key2, value1)) 104 105 iterator = db.NewIterator() 106 require.NotNil(iterator) 107 defer iterator.Release() 108 109 require.True(iterator.Next()) 110 require.Equal(key2, iterator.Key()) 111 require.Equal(value1, iterator.Value()) 112 113 require.False(iterator.Next()) 114 require.Nil(iterator.Key()) 115 require.Nil(iterator.Value()) 116 117 require.NoError(iterator.Error()) 118 119 require.NoError(db.Commit()) 120 require.NoError(db.Put(key1, value2)) 121 122 iterator = db.NewIterator() 123 require.NotNil(iterator) 124 defer iterator.Release() 125 126 require.True(iterator.Next()) 127 require.Equal(key1, iterator.Key()) 128 require.Equal(value2, iterator.Value()) 129 130 require.True(iterator.Next()) 131 require.Equal(key2, iterator.Key()) 132 require.Equal(value1, iterator.Value()) 133 134 require.False(iterator.Next()) 135 require.Nil(iterator.Key()) 136 require.Nil(iterator.Value()) 137 138 require.NoError(iterator.Error()) 139 } 140 141 func TestCommit(t *testing.T) { 142 require := require.New(t) 143 144 baseDB := memdb.New() 145 db := New(baseDB) 146 147 require.NoError(db.Commit()) 148 149 key1 := []byte("hello1") 150 value1 := []byte("world1") 151 152 require.NoError(db.Put(key1, value1)) 153 154 require.NoError(db.Commit()) 155 156 value, err := db.Get(key1) 157 require.NoError(err) 158 require.Equal(value1, value) 159 value, err = baseDB.Get(key1) 160 require.NoError(err) 161 require.Equal(value1, value) 162 } 163 164 func TestCommitClosed(t *testing.T) { 165 require := require.New(t) 166 167 baseDB := memdb.New() 168 db := New(baseDB) 169 170 key1 := []byte("hello1") 171 value1 := []byte("world1") 172 173 require.NoError(db.Put(key1, value1)) 174 require.NoError(db.Close()) 175 require.Equal(database.ErrClosed, db.Commit()) 176 } 177 178 func TestCommitClosedWrite(t *testing.T) { 179 require := require.New(t) 180 181 baseDB := memdb.New() 182 db := New(baseDB) 183 184 key1 := []byte("hello1") 185 value1 := []byte("world1") 186 187 baseDB.Close() 188 189 require.NoError(db.Put(key1, value1)) 190 require.Equal(database.ErrClosed, db.Commit()) 191 } 192 193 func TestCommitClosedDelete(t *testing.T) { 194 require := require.New(t) 195 196 baseDB := memdb.New() 197 db := New(baseDB) 198 199 key1 := []byte("hello1") 200 201 baseDB.Close() 202 203 require.NoError(db.Delete(key1)) 204 require.Equal(database.ErrClosed, db.Commit()) 205 } 206 207 func TestAbort(t *testing.T) { 208 require := require.New(t) 209 210 baseDB := memdb.New() 211 db := New(baseDB) 212 213 key1 := []byte("hello1") 214 value1 := []byte("world1") 215 216 require.NoError(db.Put(key1, value1)) 217 218 value, err := db.Get(key1) 219 require.NoError(err) 220 require.Equal(value1, value) 221 has, err := baseDB.Has(key1) 222 require.NoError(err) 223 require.False(has) 224 225 db.Abort() 226 227 has, err = db.Has(key1) 228 require.NoError(err) 229 require.False(has) 230 has, err = baseDB.Has(key1) 231 require.NoError(err) 232 require.False(has) 233 } 234 235 func TestCommitBatch(t *testing.T) { 236 require := require.New(t) 237 238 baseDB := memdb.New() 239 db := New(baseDB) 240 241 key1 := []byte("hello1") 242 value1 := []byte("world1") 243 244 require.NoError(db.Put(key1, value1)) 245 has, err := baseDB.Has(key1) 246 require.NoError(err) 247 require.False(has) 248 249 batch, err := db.CommitBatch() 250 require.NoError(err) 251 db.Abort() 252 253 has, err = db.Has(key1) 254 require.NoError(err) 255 require.False(has) 256 require.NoError(batch.Write()) 257 258 value, err := db.Get(key1) 259 require.NoError(err) 260 require.Equal(value1, value) 261 value, err = baseDB.Get(key1) 262 require.NoError(err) 263 require.Equal(value1, value) 264 } 265 266 func TestSetDatabase(t *testing.T) { 267 require := require.New(t) 268 269 baseDB := memdb.New() 270 newDB := memdb.New() 271 db := New(baseDB) 272 273 key1 := []byte("hello1") 274 value1 := []byte("world1") 275 276 require.NoError(db.SetDatabase(newDB)) 277 278 require.Equal(newDB, db.GetDatabase()) 279 280 require.NoError(db.Put(key1, value1)) 281 require.NoError(db.Commit()) 282 283 has, err := baseDB.Has(key1) 284 require.NoError(err) 285 require.False(has) 286 287 has, err = newDB.Has(key1) 288 require.NoError(err) 289 require.True(has) 290 } 291 292 func TestSetDatabaseClosed(t *testing.T) { 293 require := require.New(t) 294 295 baseDB := memdb.New() 296 db := New(baseDB) 297 298 require.NoError(db.Close()) 299 require.Equal(database.ErrClosed, db.SetDatabase(memdb.New())) 300 require.Nil(db.GetDatabase()) 301 } 302 303 func BenchmarkInterface(b *testing.B) { 304 for _, size := range dbtest.BenchmarkSizes { 305 keys, values := dbtest.SetupBenchmark(b, size[0], size[1], size[2]) 306 for name, bench := range dbtest.Benchmarks { 307 b.Run(fmt.Sprintf("versiondb_%d_pairs_%d_keys_%d_values_%s", size[0], size[1], size[2], name), func(b *testing.B) { 308 baseDB := memdb.New() 309 db := New(baseDB) 310 bench(b, db, keys, values) 311 _ = db.Close() 312 }) 313 } 314 } 315 }