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  }