Skip to content

Commit 6c14949

Browse files
authored
Fix delete model version (#599)
Fix deletion of model versions
1 parent b279db9 commit 6c14949

File tree

6 files changed

+215
-0
lines changed

6 files changed

+215
-0
lines changed

integration_tests/grpc_rest/model/grpc_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ func TestDeleteModelVersionGRPC(t *testing.T) {
6868
model.DeleteModelVersion(&suite)
6969
}
7070

71+
func TestDeleteModelVersionBeforeDeletingModelGRPC(t *testing.T) {
72+
suite := utils.SetupTest(t, testconstants.ChainID, false)
73+
model.DeleteModelVersionBeforeDeletingModel(&suite)
74+
}
75+
7176
func TestDeleteModelVersionDifferentVidGRPC(t *testing.T) {
7277
suite := utils.SetupTest(t, testconstants.ChainID, false)
7378
model.DeleteModelVersionDifferentVid(&suite)

integration_tests/grpc_rest/model/helpers.go

+72
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,78 @@ func DeleteModelVersion(suite *utils.TestSuite) {
678678
require.Nil(suite.T, model)
679679
}
680680

681+
func DeleteModelVersionBeforeDeletingModel(suite *utils.TestSuite) {
682+
// Alice and Bob are predefined Trustees
683+
aliceName := testconstants.AliceAccount
684+
aliceKeyInfo, err := suite.Kr.Key(aliceName)
685+
require.NoError(suite.T, err)
686+
address, err := aliceKeyInfo.GetAddress()
687+
require.NoError(suite.T, err)
688+
aliceAccount, err := testDclauth.GetAccount(suite, address)
689+
require.NoError(suite.T, err)
690+
691+
bobName := testconstants.BobAccount
692+
bobKeyInfo, err := suite.Kr.Key(bobName)
693+
require.NoError(suite.T, err)
694+
address, err = bobKeyInfo.GetAddress()
695+
require.NoError(suite.T, err)
696+
bobAccount, err := testDclauth.GetAccount(suite, address)
697+
require.NoError(suite.T, err)
698+
699+
// Register new Vendor account
700+
vid := int32(tmrand.Uint16())
701+
vendorName := utils.RandString()
702+
pid := int32(tmrand.Uint16())
703+
vendorAccount := testDclauth.CreateVendorAccount(
704+
suite,
705+
vendorName,
706+
dclauthtypes.AccountRoles{dclauthtypes.Vendor},
707+
vid,
708+
[]*commontypes.Uint16Range{{Min: pid, Max: pid}},
709+
aliceName,
710+
aliceAccount,
711+
bobName,
712+
bobAccount,
713+
testconstants.Info,
714+
)
715+
require.NotNil(suite.T, vendorAccount)
716+
717+
// New vendor adds a model
718+
createModelMsg := NewMsgCreateModel(vid, pid, vendorAccount.Address)
719+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelMsg}, vendorName, vendorAccount)
720+
require.NoError(suite.T, err)
721+
722+
createModelVersion1Msg := NewMsgCreateModelVersion(vid, pid, 1, "1", vendorAccount.Address)
723+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelVersion1Msg}, vendorName, vendorAccount)
724+
require.NoError(suite.T, err)
725+
726+
createModelVersion2Msg := NewMsgCreateModelVersion(vid, pid, 2, "2", vendorAccount.Address)
727+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelVersion2Msg}, vendorName, vendorAccount)
728+
require.NoError(suite.T, err)
729+
730+
deleteModelVersionMsg := NewMsgDeleteModelVersion(vid, pid, createModelVersion1Msg.SoftwareVersion, vendorAccount.Address)
731+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{deleteModelVersionMsg}, vendorName, vendorAccount)
732+
require.NoError(suite.T, err)
733+
734+
deleteModelMsg := NewMsgDeleteModel(vid, pid, vendorAccount.Address)
735+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{deleteModelMsg}, vendorName, vendorAccount)
736+
require.NoError(suite.T, err)
737+
738+
// check if modelVersions are deleted
739+
modelVersion, err := GetModelVersion(suite, deleteModelVersionMsg.Vid, deleteModelVersionMsg.Pid, createModelVersion1Msg.SoftwareVersion)
740+
require.Error(suite.T, err)
741+
require.Nil(suite.T, modelVersion)
742+
743+
modelVersion, err = GetModelVersion(suite, deleteModelVersionMsg.Vid, deleteModelVersionMsg.Pid, createModelVersion2Msg.SoftwareVersion)
744+
require.Error(suite.T, err)
745+
require.Nil(suite.T, modelVersion)
746+
747+
// check if model is deleted
748+
model, err := GetModel(suite, deleteModelVersionMsg.Vid, deleteModelVersionMsg.Pid)
749+
require.Error(suite.T, err)
750+
require.Nil(suite.T, model)
751+
}
752+
681753
func DeleteModelVersionDifferentVid(suite *utils.TestSuite) {
682754
// Alice and Bob are predefined Trustees
683755
aliceName := testconstants.AliceAccount

integration_tests/grpc_rest/model/rest_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ func TestDeleteModelVersionREST(t *testing.T) {
7878
model.DeleteModelVersion(&suite)
7979
}
8080

81+
func TestDeleteModelVersionBeforeDeletingModelRust(t *testing.T) {
82+
suite := utils.SetupTest(t, testconstants.ChainID, true)
83+
model.DeleteModelVersionBeforeDeletingModel(&suite)
84+
}
85+
8186
func TestDeleteModelVersionDifferentVidREST(t *testing.T) {
8287
suite := utils.SetupTest(t, testconstants.ChainID, true)
8388
model.DeleteModelVersionDifferentVid(&suite)

x/model/handler_test.go

+94
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,41 @@ func TestHandler_DeleteModel(t *testing.T) {
657657
require.Equal(t, codes.NotFound, status.Code(err))
658658
}
659659

660+
func TestHandler_DeleteModelAfterDeletingModelVersion(t *testing.T) {
661+
setup := Setup(t)
662+
663+
// add new model
664+
msgCreateModel := NewMsgCreateModel(setup.Vendor)
665+
_, err := setup.Handler(setup.Ctx, msgCreateModel)
666+
require.NoError(t, err)
667+
668+
// add two new model versions
669+
msgCreateModelVersion1 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion)
670+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion1)
671+
require.NoError(t, err)
672+
673+
msgCreateModelVersion2 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion+1)
674+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion2)
675+
require.NoError(t, err)
676+
677+
complianceKeeper := setup.ComplianceKeeper
678+
complianceKeeper.On("GetComplianceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false)
679+
680+
msgDeleteModelVersion1 := NewMsgDeleteModelVersion(setup.Vendor)
681+
_, err = setup.Handler(setup.Ctx, msgDeleteModelVersion1)
682+
require.NoError(t, err)
683+
684+
msgDeleteModel := NewMsgDeleteModel(setup.Vendor)
685+
// delete existing model
686+
_, err = setup.Handler(setup.Ctx, msgDeleteModel)
687+
require.NoError(t, err)
688+
689+
// query deleted model
690+
_, err = queryModel(setup, msgDeleteModel.Vid, msgDeleteModel.Pid)
691+
require.Error(t, err)
692+
require.Equal(t, codes.NotFound, status.Code(err))
693+
}
694+
660695
func TestHandler_DeleteModelWithAssociatedModelVersionsNotCertified(t *testing.T) {
661696
setup := Setup(t)
662697

@@ -1433,6 +1468,65 @@ func TestHandler_DeleteModelVersion(t *testing.T) {
14331468
)
14341469
require.Error(t, err)
14351470
require.Equal(t, codes.NotFound, status.Code(err))
1471+
1472+
// query model versions
1473+
_, err = queryAllModelVersions(
1474+
setup,
1475+
msgDeleteModelVersion.Vid,
1476+
msgDeleteModelVersion.Pid,
1477+
)
1478+
require.Error(t, err)
1479+
require.Equal(t, codes.NotFound, status.Code(err))
1480+
}
1481+
1482+
func TestHandler_DeleteOneOfTwoModelVersions(t *testing.T) {
1483+
setup := Setup(t)
1484+
1485+
// add new model
1486+
msgCreateModel := NewMsgCreateModel(setup.Vendor)
1487+
_, err := setup.Handler(setup.Ctx, msgCreateModel)
1488+
require.NoError(t, err)
1489+
1490+
// add two new model versions
1491+
msgCreateModelVersion1 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion)
1492+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion1)
1493+
require.NoError(t, err)
1494+
1495+
msgCreateModelVersion2 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion+1)
1496+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion2)
1497+
require.NoError(t, err)
1498+
1499+
// mock model versions not to be certified
1500+
complianceKeeper := setup.ComplianceKeeper
1501+
complianceKeeper.On("GetComplianceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false)
1502+
1503+
msgDeleteModelVersion := NewMsgDeleteModelVersion(setup.Vendor)
1504+
_, err = setup.Handler(setup.Ctx, msgDeleteModelVersion)
1505+
require.NoError(t, err)
1506+
1507+
// query deleted model version
1508+
_, err = queryModelVersion(
1509+
setup,
1510+
msgCreateModelVersion1.Vid,
1511+
msgCreateModelVersion1.Pid,
1512+
msgCreateModelVersion1.SoftwareVersion,
1513+
)
1514+
require.Error(t, err)
1515+
require.Equal(t, codes.NotFound, status.Code(err))
1516+
1517+
// query not deleted model version
1518+
modelVersion, err := queryModelVersion(
1519+
setup,
1520+
msgCreateModelVersion2.Vid,
1521+
msgCreateModelVersion2.Pid,
1522+
msgCreateModelVersion2.SoftwareVersion,
1523+
)
1524+
require.NoError(t, err)
1525+
require.NotNil(t, modelVersion)
1526+
1527+
modelVersions, err := queryAllModelVersions(setup, msgCreateModel.Vid, msgCreateModel.Pid)
1528+
require.NoError(t, err)
1529+
require.Equal(t, []uint32{msgCreateModelVersion2.SoftwareVersion}, modelVersions.SoftwareVersions)
14361530
}
14371531

14381532
func TestHandler_DeleteModelVersionDifferentAccSameVid(t *testing.T) {

x/model/keeper/model_versions.go

+38
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,41 @@ func (k Keeper) AddModelVersion(ctx sdk.Context, vid int32, pid int32, softwareV
8686

8787
k.SetModelVersions(ctx, modelVersions)
8888
}
89+
90+
// RemoveSoftwareVersion deletes a softwareVersion from existing ModelVersions.
91+
func (k Keeper) RemoveSoftwareVersion(ctx sdk.Context, vid int32, pid int32, softwareVersion uint32) {
92+
modelVersions, found := k.GetModelVersions(ctx, vid, pid)
93+
94+
if !found {
95+
return
96+
}
97+
98+
// Find the index of the softwareVersion to delete
99+
index := -1
100+
for i, value := range modelVersions.SoftwareVersions {
101+
if value == softwareVersion {
102+
index = i
103+
104+
break
105+
}
106+
}
107+
108+
// If the softwareVersion is not found, no need to proceed
109+
if index == -1 {
110+
return
111+
}
112+
113+
modelVersions.SoftwareVersions = append(
114+
modelVersions.SoftwareVersions[:index],
115+
modelVersions.SoftwareVersions[index+1:]...,
116+
)
117+
118+
// Delete modelVersions if there are no softwareVersions left
119+
if len(modelVersions.SoftwareVersions) == 0 {
120+
k.RemoveModelVersions(ctx, vid, pid)
121+
122+
return
123+
}
124+
125+
k.SetModelVersions(ctx, modelVersions)
126+
}

x/model/keeper/msg_server_model_version.go

+1
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ func (k msgServer) DeleteModelVersion(goCtx context.Context, msg *types.MsgDelet
175175

176176
// store updated model version
177177
k.RemoveModelVersion(ctx, msg.Vid, msg.Pid, msg.SoftwareVersion)
178+
k.RemoveSoftwareVersion(ctx, msg.Vid, msg.Pid, msg.SoftwareVersion)
178179

179180
return &types.MsgDeleteModelVersionResponse{}, nil
180181
}

0 commit comments

Comments
 (0)