github.com/MetalBlockchain/metalgo@v1.11.9/x/archivedb/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 archivedb
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/MetalBlockchain/metalgo/database"
    12  	"github.com/MetalBlockchain/metalgo/database/memdb"
    13  )
    14  
    15  func TestDBEntries(t *testing.T) {
    16  	require := require.New(t)
    17  
    18  	db := New(memdb.New())
    19  
    20  	batch := db.NewBatch(1)
    21  	require.NoError(batch.Write())
    22  
    23  	batch = db.NewBatch(2)
    24  	require.NoError(batch.Put([]byte("key1"), []byte("value1@10")))
    25  	require.NoError(batch.Put([]byte("key2"), []byte("value2@10")))
    26  	require.NoError(batch.Write())
    27  
    28  	batch = db.NewBatch(3)
    29  	require.NoError(batch.Write())
    30  
    31  	batch = db.NewBatch(4)
    32  	require.NoError(batch.Put([]byte("key1"), []byte("value1@100")))
    33  	require.NoError(batch.Write())
    34  
    35  	batch = db.NewBatch(5)
    36  	require.NoError(batch.Write())
    37  
    38  	batch = db.NewBatch(6)
    39  	require.NoError(batch.Put([]byte("key1"), []byte("value1@1000")))
    40  	require.NoError(batch.Put([]byte("key2"), []byte("value2@1000")))
    41  	require.NoError(batch.Write())
    42  
    43  	reader := db.Open(2)
    44  	value, err := reader.Get([]byte("key1"))
    45  	require.NoError(err)
    46  	require.Equal([]byte("value1@10"), value)
    47  
    48  	value, height, exists, err := reader.GetEntry([]byte("key1"))
    49  	require.NoError(err)
    50  	require.True(exists)
    51  	require.Equal([]byte("value1@10"), value)
    52  	require.Equal(uint64(2), height)
    53  
    54  	reader = db.Open(4)
    55  	value, err = reader.Get([]byte("key1"))
    56  	require.NoError(err)
    57  	require.Equal([]byte("value1@100"), value)
    58  
    59  	value, height, exists, err = reader.GetEntry([]byte("key1"))
    60  	require.NoError(err)
    61  	require.True(exists)
    62  	require.Equal([]byte("value1@100"), value)
    63  	require.Equal(uint64(4), height)
    64  
    65  	reader = db.Open(6)
    66  	value, err = reader.Get([]byte("key2"))
    67  	require.NoError(err)
    68  	require.Equal([]byte("value2@1000"), value)
    69  
    70  	value, height, exists, err = reader.GetEntry([]byte("key2"))
    71  	require.NoError(err)
    72  	require.True(exists)
    73  	require.Equal([]byte("value2@1000"), value)
    74  	require.Equal(uint64(6), height)
    75  
    76  	reader = db.Open(4)
    77  	value, err = reader.Get([]byte("key2"))
    78  	require.NoError(err)
    79  	require.Equal([]byte("value2@10"), value)
    80  
    81  	value, height, exists, err = reader.GetEntry([]byte("key2"))
    82  	require.NoError(err)
    83  	require.True(exists)
    84  	require.Equal([]byte("value2@10"), value)
    85  	require.Equal(uint64(2), height)
    86  
    87  	exists, err = reader.Has([]byte("key2"))
    88  	require.NoError(err)
    89  	require.True(exists)
    90  
    91  	reader = db.Open(1)
    92  	_, err = reader.Get([]byte("key1"))
    93  	require.ErrorIs(err, database.ErrNotFound)
    94  
    95  	exists, err = reader.Has([]byte("key1"))
    96  	require.NoError(err)
    97  	require.False(exists)
    98  
    99  	reader = db.Open(1)
   100  	_, err = reader.Get([]byte("key3"))
   101  	require.ErrorIs(err, database.ErrNotFound)
   102  }
   103  
   104  func TestDelete(t *testing.T) {
   105  	require := require.New(t)
   106  
   107  	db := New(memdb.New())
   108  
   109  	batch := db.NewBatch(1)
   110  	require.NoError(batch.Put([]byte("key1"), []byte("value1@10")))
   111  	require.NoError(batch.Put([]byte("key2"), []byte("value2@10")))
   112  	require.NoError(batch.Write())
   113  
   114  	batch = db.NewBatch(2)
   115  	require.NoError(batch.Put([]byte("key1"), []byte("value1@100")))
   116  	require.NoError(batch.Write())
   117  
   118  	batch = db.NewBatch(3)
   119  	require.NoError(batch.Delete([]byte("key1")))
   120  	require.NoError(batch.Delete([]byte("key2")))
   121  	require.NoError(batch.Write())
   122  
   123  	reader := db.Open(2)
   124  	value, err := reader.Get([]byte("key1"))
   125  	require.NoError(err)
   126  	require.Equal([]byte("value1@100"), value)
   127  
   128  	value, height, exists, err := reader.GetEntry([]byte("key1"))
   129  	require.NoError(err)
   130  	require.True(exists)
   131  	require.Equal(uint64(2), height)
   132  	require.Equal([]byte("value1@100"), value)
   133  
   134  	reader = db.Open(1)
   135  	value, err = reader.Get([]byte("key2"))
   136  	require.NoError(err)
   137  	require.Equal([]byte("value2@10"), value)
   138  
   139  	value, height, exists, err = reader.GetEntry([]byte("key2"))
   140  	require.NoError(err)
   141  	require.True(exists)
   142  	require.Equal(uint64(1), height)
   143  	require.Equal([]byte("value2@10"), value)
   144  
   145  	reader = db.Open(3)
   146  	_, err = reader.Get([]byte("key2"))
   147  	require.ErrorIs(err, database.ErrNotFound)
   148  
   149  	_, err = reader.Get([]byte("key1"))
   150  	require.ErrorIs(err, database.ErrNotFound)
   151  
   152  	_, height, exists, err = reader.GetEntry([]byte("key1"))
   153  	require.NoError(err)
   154  	require.False(exists)
   155  	require.Equal(uint64(3), height)
   156  
   157  	_, _, _, err = reader.GetEntry([]byte("key4"))
   158  	require.ErrorIs(err, database.ErrNotFound)
   159  }
   160  
   161  func TestDBKeySpace(t *testing.T) {
   162  	require := require.New(t)
   163  
   164  	var (
   165  		key1    = []byte("key1")
   166  		key2, _ = newDBKeyFromUser([]byte("key1"), 2)
   167  		key3    = []byte("key3")
   168  		value1  = []byte("value1@1")
   169  		value2  = []byte("value2@2")
   170  		value3  = []byte("value3@3")
   171  	)
   172  	require.NotEqual(key1, key2)
   173  	require.NotEqual(key1, key3)
   174  	require.NotEqual(key2, key3)
   175  
   176  	db := New(memdb.New())
   177  
   178  	batch := db.NewBatch(1)
   179  	require.NoError(batch.Put(key1, value1))
   180  	require.NoError(batch.Write())
   181  
   182  	batch = db.NewBatch(2)
   183  	require.NoError(batch.Put(key2, value2))
   184  	require.NoError(batch.Write())
   185  
   186  	batch = db.NewBatch(3)
   187  	require.NoError(batch.Put(key3, value3))
   188  	require.NoError(batch.Write())
   189  
   190  	storedHeight, err := db.Height()
   191  	require.NoError(err)
   192  	require.Equal(uint64(3), storedHeight)
   193  
   194  	reader := db.Open(3)
   195  	value, err := reader.Get(key1)
   196  	require.NoError(err)
   197  	require.Equal(value1, value)
   198  
   199  	value, height, exists, err := reader.GetEntry(key1)
   200  	require.NoError(err)
   201  	require.True(exists)
   202  	require.Equal(uint64(1), height)
   203  	require.Equal(value1, value)
   204  }
   205  
   206  func TestSkipHeight(t *testing.T) {
   207  	require := require.New(t)
   208  
   209  	db := New(memdb.New())
   210  
   211  	_, err := db.Height()
   212  	require.ErrorIs(err, database.ErrNotFound)
   213  
   214  	batch := db.NewBatch(0)
   215  	require.NoError(batch.Write())
   216  
   217  	height, err := db.Height()
   218  	require.NoError(err)
   219  	require.Zero(height)
   220  
   221  	batch = db.NewBatch(10)
   222  	require.NoError(batch.Write())
   223  
   224  	height, err = db.Height()
   225  	require.NoError(err)
   226  	require.Equal(uint64(10), height)
   227  }