github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/migration_archived_index_test.go (about) 1 package kv 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/prysmaticlabs/prysm/shared/bytesutil" 8 "github.com/prysmaticlabs/prysm/shared/testutil" 9 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 10 "go.etcd.io/bbolt" 11 ) 12 13 func Test_migrateArchivedIndex(t *testing.T) { 14 tests := []struct { 15 name string 16 setup func(t *testing.T, db *bbolt.DB) 17 eval func(t *testing.T, db *bbolt.DB) 18 }{ 19 { 20 name: "only runs once", 21 setup: func(t *testing.T, db *bbolt.DB) { 22 err := db.Update(func(tx *bbolt.Tx) error { 23 _, err := tx.CreateBucketIfNotExists(archivedRootBucket) 24 assert.NoError(t, err) 25 if err := tx.Bucket(archivedRootBucket).Put(bytesutil.Uint64ToBytesLittleEndian(2048), []byte("foo")); err != nil { 26 return err 27 } 28 return tx.Bucket(migrationsBucket).Put(migrationArchivedIndex0Key, migrationCompleted) 29 }) 30 assert.NoError(t, err) 31 }, 32 eval: func(t *testing.T, db *bbolt.DB) { 33 err := db.View(func(tx *bbolt.Tx) error { 34 v := tx.Bucket(archivedRootBucket).Get(bytesutil.Uint64ToBytesLittleEndian(2048)) 35 assert.DeepEqual(t, []byte("foo"), v, "Did not receive correct data for key 2048") 36 return nil 37 }) 38 assert.NoError(t, err) 39 }, 40 }, 41 { 42 name: "migrates and deletes entries", 43 setup: func(t *testing.T, db *bbolt.DB) { 44 err := db.Update(func(tx *bbolt.Tx) error { 45 _, err := tx.CreateBucketIfNotExists(archivedRootBucket) 46 assert.NoError(t, err) 47 _, err = tx.CreateBucketIfNotExists(slotsHasObjectBucket) 48 assert.NoError(t, err) 49 if err := tx.Bucket(archivedRootBucket).Put(bytesutil.Uint64ToBytesLittleEndian(2048), []byte("foo")); err != nil { 50 return err 51 } 52 sb := testutil.NewBeaconBlock() 53 sb.Block.Slot = 2048 54 b, err := encode(context.Background(), sb) 55 if err != nil { 56 return err 57 } 58 return tx.Bucket(blocksBucket).Put([]byte("foo"), b) 59 }) 60 assert.NoError(t, err) 61 }, 62 eval: func(t *testing.T, db *bbolt.DB) { 63 err := db.View(func(tx *bbolt.Tx) error { 64 k := uint64(2048) 65 v := tx.Bucket(stateSlotIndicesBucket).Get(bytesutil.Uint64ToBytesBigEndian(k)) 66 assert.DeepEqual(t, []byte("foo"), v, "Did not receive correct data for key %d", k) 67 return nil 68 }) 69 assert.NoError(t, err) 70 }, 71 }, 72 { 73 name: "deletes old buckets", 74 setup: func(t *testing.T, db *bbolt.DB) { 75 err := db.Update(func(tx *bbolt.Tx) error { 76 _, err := tx.CreateBucketIfNotExists(archivedRootBucket) 77 assert.NoError(t, err) 78 _, err = tx.CreateBucketIfNotExists(slotsHasObjectBucket) 79 assert.NoError(t, err) 80 return tx.Bucket(slotsHasObjectBucket).Put(savedStateSlotsKey, []byte("foo")) 81 }) 82 assert.NoError(t, err) 83 }, 84 eval: func(t *testing.T, db *bbolt.DB) { 85 err := db.View(func(tx *bbolt.Tx) error { 86 assert.Equal(t, (*bbolt.Bucket)(nil), tx.Bucket(slotsHasObjectBucket), "Expected %v to be deleted", savedStateSlotsKey) 87 assert.Equal(t, (*bbolt.Bucket)(nil), tx.Bucket(archivedRootBucket), "Expected %v to be deleted", savedStateSlotsKey) 88 return nil 89 }) 90 assert.NoError(t, err) 91 }, 92 }, 93 } 94 for _, tt := range tests { 95 t.Run(tt.name, func(t *testing.T) { 96 db := setupDB(t).db 97 tt.setup(t, db) 98 assert.NoError(t, db.Update(migrateArchivedIndex), "migrateArchivedIndex(tx) error") 99 tt.eval(t, db) 100 }) 101 } 102 }