Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: add unit tests for the storage module #376

Merged
merged 9 commits into from
Jul 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions e2e/tests/virtualgroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@ func (s *VirtualGroupTestSuite) queryGlobalVirtualGroupByFamily(familyID uint32)
return resp.GlobalVirtualGroups
}

func (s *VirtualGroupTestSuite) queryAvailableGlobalVirtualGroupFamilies(familyIds []uint32) []uint32 {
resp, err := s.Client.AvailableGlobalVirtualGroupFamilies(
context.Background(),
&virtualgroupmoduletypes.AvailableGlobalVirtualGroupFamiliesRequest{
GlobalVirtualGroupFamilyIds: familyIds,
})
s.Require().NoError(err)
return resp.GlobalVirtualGroupFamilyIds
}

func (s *VirtualGroupTestSuite) TestBasic() {
primarySP := s.BaseSuite.PickStorageProvider()

Expand All @@ -82,6 +92,9 @@ func (s *VirtualGroupTestSuite) TestBasic() {
gvg = g
}

availableGvgFamilyIds := s.queryAvailableGlobalVirtualGroupFamilies([]uint32{gvg.FamilyId})
s.Require().Equal(availableGvgFamilyIds[0], gvg.FamilyId)

srcGVGs := s.queryGlobalVirtualGroupByFamily(gvg.FamilyId)

var secondarySPIDs []uint32
Expand Down
11 changes: 11 additions & 0 deletions testutil/sample/sample.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/cometbft/cometbft/crypto/tmhash"
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
"github.com/cosmos/cosmos-sdk/crypto/keys/eth/ethsecp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/prysmaticlabs/prysm/crypto/bls"
)
Expand All @@ -17,6 +18,16 @@ func AccAddress() string {
return sdk.AccAddress(addr).String()
}

func RandSignBytes() (addr sdk.AccAddress, signBytes []byte, sig []byte) {
signBytes = RandStr(256)
privKey, _ := ethsecp256k1.GenPrivKey()

sig, _ = privKey.Sign(sdk.Keccak256(signBytes))
pk := privKey.PubKey()
addr = sdk.AccAddress(pk.Address())
return addr, signBytes, sig
}

func RandAccAddress() sdk.AccAddress {
pk := ed25519.GenPrivKey().PubKey()
addr := pk.Address()
Expand Down
11 changes: 7 additions & 4 deletions x/storage/keeper/cross_app_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import (
var _ sdk.CrossChainApplication = &BucketApp{}

type BucketApp struct {
storageKeeper Keeper
storageKeeper types.StorageKeeper
}

func NewBucketApp(keeper Keeper) *BucketApp {
func NewBucketApp(keeper types.StorageKeeper) *BucketApp {
return &BucketApp{
storageKeeper: keeper,
}
Expand Down Expand Up @@ -216,7 +216,7 @@ func (app *BucketApp) handleCreateBucketSynPackage(ctx sdk.Context, appCtx *sdk.
createBucketPackage.Creator,
createBucketPackage.BucketName,
createBucketPackage.PrimarySpAddress,
&CreateBucketOptions{
&types.CreateBucketOptions{
Visibility: types.VisibilityType(createBucketPackage.Visibility),
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
ChargedReadQuota: createBucketPackage.ChargedReadQuota,
Expand Down Expand Up @@ -267,6 +267,7 @@ func (app *BucketApp) handleDeleteBucketSynPackage(ctx sdk.Context, header *sdk.
return sdk.ExecuteResult{
Payload: types.DeleteBucketAckPackage{
Status: types.StatusFail,
Id: deleteBucketPackage.Id,
ExtraData: deleteBucketPackage.ExtraData,
}.MustSerialize(),
Err: err,
Expand All @@ -281,6 +282,7 @@ func (app *BucketApp) handleDeleteBucketSynPackage(ctx sdk.Context, header *sdk.
return sdk.ExecuteResult{
Payload: types.DeleteBucketAckPackage{
Status: types.StatusFail,
Id: deleteBucketPackage.Id,
ExtraData: deleteBucketPackage.ExtraData,
}.MustSerialize(),
Err: types.ErrNoSuchBucket,
Expand All @@ -290,14 +292,15 @@ func (app *BucketApp) handleDeleteBucketSynPackage(ctx sdk.Context, header *sdk.
err = app.storageKeeper.DeleteBucket(ctx,
deleteBucketPackage.Operator,
bucketInfo.BucketName,
DeleteBucketOptions{
types.DeleteBucketOptions{
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
},
)
if err != nil {
return sdk.ExecuteResult{
Payload: types.DeleteBucketAckPackage{
Status: types.StatusFail,
Id: deleteBucketPackage.Id,
ExtraData: deleteBucketPackage.ExtraData,
}.MustSerialize(),
Err: err,
Expand Down
57 changes: 57 additions & 0 deletions x/storage/keeper/cross_app_bucket_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package keeper_test

import (
"fmt"
"math/big"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/golang/mock/gomock"

"github.com/bnb-chain/greenfield/testutil/sample"
"github.com/bnb-chain/greenfield/x/storage/keeper"
"github.com/bnb-chain/greenfield/x/storage/types"
)

func (s *TestSuite) TestSynDeleteBucket() {
pack := types.DeleteBucketAckPackage{
Status: 1,
Id: big.NewInt(10),
ExtraData: []byte("x"),
}
pack.MustSerialize()
ctrl := gomock.NewController(s.T())
storageKeeper := types.NewMockStorageKeeper(ctrl)
storageKeeper.EXPECT().Logger(gomock.Any()).Return(s.ctx.Logger()).AnyTimes()

app := keeper.NewBucketApp(storageKeeper)
deleteSynPackage := types.DeleteBucketSynPackage{
Operator: sample.RandAccAddress(),
Id: big.NewInt(10),
ExtraData: []byte("extra data"),
}

serializedSynPackage := deleteSynPackage.MustSerialize()
serializedSynPackage = append([]byte{types.OperationDeleteBucket}, serializedSynPackage...)

// case 1: bucket not found
storageKeeper.EXPECT().GetBucketInfoById(gomock.Any(), gomock.Any()).Return(nil, false)
res := app.ExecuteSynPackage(s.ctx, nil, serializedSynPackage)
s.Require().ErrorIs(res.Err, types.ErrNoSuchBucket)

// case 2: delete bucket error
storageKeeper.EXPECT().GetBucketInfoById(gomock.Any(), gomock.Any()).Return(&types.BucketInfo{
BucketName: "bucket",
}, true)
storageKeeper.EXPECT().DeleteBucket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(fmt.Errorf("delete error"))
res = app.ExecuteSynPackage(s.ctx, nil, serializedSynPackage)
s.Require().ErrorContains(res.Err, "delete error")

// case 3: delete bucket success
storageKeeper.EXPECT().GetBucketInfoById(gomock.Any(), gomock.Any()).Return(&types.BucketInfo{
BucketName: "bucket",
Id: sdk.NewUint(10),
}, true)
storageKeeper.EXPECT().DeleteBucket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
res = app.ExecuteSynPackage(s.ctx, nil, serializedSynPackage)
s.Require().NoError(res.Err)
}
10 changes: 5 additions & 5 deletions x/storage/keeper/cross_app_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import (
var _ sdk.CrossChainApplication = &GroupApp{}

type GroupApp struct {
storageKeeper Keeper
storageKeeper types.StorageKeeper
}

func NewGroupApp(keeper Keeper) *GroupApp {
func NewGroupApp(keeper types.StorageKeeper) *GroupApp {
return &GroupApp{
storageKeeper: keeper,
}
Expand Down Expand Up @@ -174,7 +174,7 @@ func (app *GroupApp) handleDeleteGroupSynPackage(ctx sdk.Context, header *sdk.Cr
err = app.storageKeeper.DeleteGroup(ctx,
deleteGroupPackage.Operator,
groupInfo.GroupName,
DeleteGroupOptions{
types.DeleteGroupOptions{
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
},
)
Expand Down Expand Up @@ -226,7 +226,7 @@ func (app *GroupApp) handleCreateGroupSynPackage(ctx sdk.Context, header *sdk.Cr
groupId, err := app.storageKeeper.CreateGroup(ctx,
createGroupPackage.Creator,
createGroupPackage.GroupName,
CreateGroupOptions{
types.CreateGroupOptions{
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
},
)
Expand Down Expand Up @@ -336,7 +336,7 @@ func (app *GroupApp) handleUpdateGroupMemberSynPackage(ctx sdk.Context, header *
}
}

options := UpdateGroupMemberOptions{
options := types.UpdateGroupMemberOptions{
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
}
if updateGroupPackage.OperationType == types.OperationAddGroupMember {
Expand Down
6 changes: 3 additions & 3 deletions x/storage/keeper/cross_app_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import (
var _ sdk.CrossChainApplication = &ObjectApp{}

type ObjectApp struct {
storageKeeper Keeper
storageKeeper types.StorageKeeper
}

func NewObjectApp(keeper Keeper) *ObjectApp {
func NewObjectApp(keeper types.StorageKeeper) *ObjectApp {
return &ObjectApp{
storageKeeper: keeper,
}
Expand Down Expand Up @@ -211,7 +211,7 @@ func (app *ObjectApp) handleDeleteObjectSynPackage(ctx sdk.Context, header *sdk.
deleteObjectPackage.Operator,
objectInfo.BucketName,
objectInfo.ObjectName,
DeleteObjectOptions{
types.DeleteObjectOptions{
SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN,
},
)
Expand Down
59 changes: 44 additions & 15 deletions x/storage/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {

func (k Keeper) CreateBucket(
ctx sdk.Context, ownerAcc sdk.AccAddress, bucketName string,
primarySpAcc sdk.AccAddress, opts *CreateBucketOptions) (sdkmath.Uint, error) {
primarySpAcc sdk.AccAddress, opts *types.CreateBucketOptions) (sdkmath.Uint, error) {
store := ctx.KVStore(k.storeKey)

// check if the bucket exist
Expand Down Expand Up @@ -170,7 +170,17 @@ func (k Keeper) CreateBucket(
return bucketInfo.Id, nil
}

func (k Keeper) DeleteBucket(ctx sdk.Context, operator sdk.AccAddress, bucketName string, opts DeleteBucketOptions) error {
// StoreBucketInfo will store the bucket info
// It's designed to be used by the test cases to create a bucket.
func (k Keeper) StoreBucketInfo(ctx sdk.Context, bucketInfo *types.BucketInfo) {
store := ctx.KVStore(k.storeKey)
bucketKey := types.GetBucketKey(bucketInfo.BucketName)
bz := k.cdc.MustMarshal(bucketInfo)
store.Set(bucketKey, k.bucketSeq.EncodeSequence(bucketInfo.Id))
store.Set(types.GetBucketByIDKey(bucketInfo.Id), bz)
}

func (k Keeper) DeleteBucket(ctx sdk.Context, operator sdk.AccAddress, bucketName string, opts types.DeleteBucketOptions) error {
bucketInfo, found := k.GetBucketInfo(ctx, bucketName)
if !found {
return types.ErrNoSuchBucket
Expand Down Expand Up @@ -334,7 +344,7 @@ func (k Keeper) ForceDeleteBucket(ctx sdk.Context, bucketId sdkmath.Uint, cap ui
return bucketDeleted, deleted, nil
}

func (k Keeper) UpdateBucketInfo(ctx sdk.Context, operator sdk.AccAddress, bucketName string, opts UpdateBucketOptions) error {
func (k Keeper) UpdateBucketInfo(ctx sdk.Context, operator sdk.AccAddress, bucketName string, opts types.UpdateBucketOptions) error {
bucketInfo, found := k.GetBucketInfo(ctx, bucketName)
if !found {
return types.ErrNoSuchBucket
Expand Down Expand Up @@ -499,7 +509,7 @@ func (k Keeper) GetBucketInfoById(ctx sdk.Context, bucketId sdkmath.Uint) (*type

func (k Keeper) CreateObject(
ctx sdk.Context, operator sdk.AccAddress, bucketName, objectName string,
payloadSize uint64, opts CreateObjectOptions) (sdkmath.Uint, error) {
payloadSize uint64, opts types.CreateObjectOptions) (sdkmath.Uint, error) {
store := ctx.KVStore(k.storeKey)

// check payload size
Expand Down Expand Up @@ -619,6 +629,29 @@ func (k Keeper) CreateObject(
return objectInfo.Id, nil
}

// StoreObjectInfo stores object related keys to KVStore,
// it's designed to be used in tests
func (k Keeper) StoreObjectInfo(ctx sdk.Context, objectInfo *types.ObjectInfo) {
store := ctx.KVStore(k.storeKey)

objectKey := types.GetObjectKey(objectInfo.BucketName, objectInfo.ObjectName)

obz := k.cdc.MustMarshal(objectInfo)
store.Set(objectKey, k.objectSeq.EncodeSequence(objectInfo.Id))
store.Set(types.GetObjectByIDKey(objectInfo.Id), obz)
}

// DeleteObjectInfo deletes object related keys from KVStore,
// it's designed to be used in tests
func (k Keeper) DeleteObjectInfo(ctx sdk.Context, objectInfo *types.ObjectInfo) {
store := ctx.KVStore(k.storeKey)

objectKey := types.GetObjectKey(objectInfo.BucketName, objectInfo.ObjectName)

store.Delete(objectKey)
store.Delete(types.GetObjectByIDKey(objectInfo.Id))
}

func (k Keeper) SetObjectInfo(ctx sdk.Context, objectInfo *types.ObjectInfo) {
store := ctx.KVStore(k.storeKey)

Expand Down Expand Up @@ -742,7 +775,7 @@ func (k Keeper) SealObject(

func (k Keeper) CancelCreateObject(
ctx sdk.Context, operator sdk.AccAddress,
bucketName, objectName string, opts CancelCreateObjectOptions) error {
bucketName, objectName string, opts types.CancelCreateObjectOptions) error {
store := ctx.KVStore(k.storeKey)
bucketInfo, found := k.GetBucketInfo(ctx, bucketName)
if !found {
Expand Down Expand Up @@ -796,7 +829,7 @@ func (k Keeper) CancelCreateObject(
}

func (k Keeper) DeleteObject(
ctx sdk.Context, operator sdk.AccAddress, bucketName, objectName string, opts DeleteObjectOptions) error {
ctx sdk.Context, operator sdk.AccAddress, bucketName, objectName string, opts types.DeleteObjectOptions) error {

bucketInfo, found := k.GetBucketInfo(ctx, bucketName)
if !found {
Expand Down Expand Up @@ -917,7 +950,7 @@ func (k Keeper) ForceDeleteObject(ctx sdk.Context, objectId sdkmath.Uint) error

func (k Keeper) CopyObject(
ctx sdk.Context, operator sdk.AccAddress, srcBucketName, srcObjectName, dstBucketName, dstObjectName string,
opts CopyObjectOptions) (sdkmath.Uint, error) {
opts types.CopyObjectOptions) (sdkmath.Uint, error) {

store := ctx.KVStore(k.storeKey)

Expand Down Expand Up @@ -1178,7 +1211,7 @@ func (k Keeper) UpdateObjectInfo(ctx sdk.Context, operator sdk.AccAddress, bucke

func (k Keeper) CreateGroup(
ctx sdk.Context, owner sdk.AccAddress,
groupName string, opts CreateGroupOptions) (sdkmath.Uint, error) {
groupName string, opts types.CreateGroupOptions) (sdkmath.Uint, error) {
store := ctx.KVStore(k.storeKey)

groupInfo := types.GroupInfo{
Expand Down Expand Up @@ -1255,11 +1288,7 @@ func (k Keeper) GetGroupInfoById(ctx sdk.Context, groupId sdkmath.Uint) (*types.
return &groupInfo, true
}

type DeleteGroupOptions struct {
SourceType types.SourceType
}

func (k Keeper) DeleteGroup(ctx sdk.Context, operator sdk.AccAddress, groupName string, opts DeleteGroupOptions) error {
func (k Keeper) DeleteGroup(ctx sdk.Context, operator sdk.AccAddress, groupName string, opts types.DeleteGroupOptions) error {
store := ctx.KVStore(k.storeKey)

groupInfo, found := k.GetGroupInfo(ctx, operator, groupName)
Expand Down Expand Up @@ -1296,7 +1325,7 @@ func (k Keeper) DeleteGroup(ctx sdk.Context, operator sdk.AccAddress, groupName

func (k Keeper) LeaveGroup(
ctx sdk.Context, member sdk.AccAddress, owner sdk.AccAddress,
groupName string, opts LeaveGroupOptions) error {
groupName string, opts types.LeaveGroupOptions) error {

groupInfo, found := k.GetGroupInfo(ctx, owner, groupName)
if !found {
Expand All @@ -1322,7 +1351,7 @@ func (k Keeper) LeaveGroup(
return nil
}

func (k Keeper) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, groupInfo *types.GroupInfo, opts UpdateGroupMemberOptions) error {
func (k Keeper) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, groupInfo *types.GroupInfo, opts types.UpdateGroupMemberOptions) error {
if groupInfo.SourceType != opts.SourceType {
return types.ErrSourceTypeMismatch
}
Expand Down
Loading
Loading