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