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  }