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 }