Skip to content

Commit e830b20

Browse files
committed
Merge branch 'delete-model-version-child-1' of https://github.com/zigbee-alliance/distributed-compliance-ledger into delete-model-version
2 parents 71c2b4b + c431b47 commit e830b20

File tree

6 files changed

+208
-18
lines changed

6 files changed

+208
-18
lines changed

integration_tests/cli/model-negative-cases.sh

+23
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ vendor_account=vendor_account_$vid
2727
echo "Create Vendor account - $vendor_account"
2828
create_new_vendor_account $vendor_account $vid
2929

30+
test_divider
31+
32+
echo "Create CertificationCenter account"
33+
create_new_account zb_account "CertificationCenter"
34+
3035
# Body
3136

3237
# Ledger side errors
@@ -54,6 +59,24 @@ echo "$result"
5459

5560
test_divider
5661

62+
sv=$RANDOM
63+
echo "Create a Device Model Version with VID: $vid PID: $pid SV: $sv"
64+
result=$(echo 'test1234' | dcld tx model add-model-version --cdVersionNumber=1 --maxApplicableSoftwareVersion=10 --minApplicableSoftwareVersion=1 --vid=$vid --pid=$pid --softwareVersion=$sv --softwareVersionString=1 --from=$vendor_account --yes)
65+
echo "$result"
66+
check_response "$result" "\"code\": 0"
67+
68+
certification_date="2020-01-01T00:00:01Z"
69+
zigbee_certification_type="zigbee"
70+
matter_certification_type="matter"
71+
cd_certificate_id="123"
72+
result=$(echo 'test1234' | dcld tx compliance certify-model --vid=$vid --pid=$pid --softwareVersion=$sv --certificationType="$zigbee_certification_type" --certificationDate="$certification_date" --cdCertificateId="$cd_certificate_id" --from $zb_account --yes)
73+
echo "$result"
74+
75+
echo "Delete Model with VID: ${vid} PID: ${pid}"
76+
result=$(dcld tx model delete-model --vid=$vid --pid=$pid --from=$vendor_account --yes)
77+
check_response "$result" "\"code\": 524" # code for model certified error
78+
79+
5780
# CLI side errors
5881

5982
echo "Add Model with VID: $vid PID: $pid: Unknown account"

integration_tests/grpc_rest/model/grpc_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,8 @@ func TestDeleteModelWithAssociatedModelVersionsGRPC(t *testing.T) {
6262
suite := utils.SetupTest(t, testconstants.ChainID, false)
6363
model.DeleteModelWithAssociatedModelVersions(&suite)
6464
}
65+
66+
func TestDeleteModelWithAssociatedModelVersionsCertifiedGRPC(t *testing.T) {
67+
suite := utils.SetupTest(t, testconstants.ChainID, false)
68+
model.DeleteModelWithAssociatedModelVersionsCertified(&suite)
69+
}

integration_tests/grpc_rest/model/helpers.go

+85
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
testconstants "github.com/zigbee-alliance/distributed-compliance-ledger/integration_tests/constants"
2626
test_dclauth "github.com/zigbee-alliance/distributed-compliance-ledger/integration_tests/grpc_rest/dclauth"
2727
"github.com/zigbee-alliance/distributed-compliance-ledger/integration_tests/utils"
28+
dclcompltypes "github.com/zigbee-alliance/distributed-compliance-ledger/types/compliance"
2829
dclauthtypes "github.com/zigbee-alliance/distributed-compliance-ledger/x/dclauth/types"
2930
modeltypes "github.com/zigbee-alliance/distributed-compliance-ledger/x/model/types"
3031
)
@@ -124,6 +125,21 @@ func NewMsgUpdateModelVersion(
124125
}
125126
}
126127

128+
func NewMsgCertifyModelVersion(
129+
signer string,
130+
vid int32,
131+
pid int32,
132+
) *dclcompltypes.MsgCertifyModel {
133+
return &dclcompltypes.MsgCertifyModel{
134+
Signer: signer,
135+
Vid: vid,
136+
Pid: pid,
137+
CertificationDate: testconstants.CertificationDate,
138+
CDCertificateId: testconstants.CDCertificateID,
139+
CertificationType: testconstants.CertificationType,
140+
}
141+
}
142+
127143
func AddModel(
128144
suite *utils.TestSuite,
129145
msg *modeltypes.MsgCreateModel,
@@ -395,6 +411,75 @@ func DeleteModelWithAssociatedModelVersions(suite *utils.TestSuite) {
395411
require.Nil(suite.T, modelVersion2)
396412
}
397413

414+
func DeleteModelWithAssociatedModelVersionsCertified(suite *utils.TestSuite) {
415+
// Alice and Bob are predefined Trustees
416+
aliceName := testconstants.AliceAccount
417+
aliceKeyInfo, err := suite.Kr.Key(aliceName)
418+
require.NoError(suite.T, err)
419+
aliceAccount, err := test_dclauth.GetAccount(suite, aliceKeyInfo.GetAddress())
420+
require.NoError(suite.T, err)
421+
422+
bobName := testconstants.BobAccount
423+
bobKeyInfo, err := suite.Kr.Key(bobName)
424+
require.NoError(suite.T, err)
425+
bobAccount, err := test_dclauth.GetAccount(suite, bobKeyInfo.GetAddress())
426+
require.NoError(suite.T, err)
427+
428+
// Register new Vendor account
429+
vid := int32(tmrand.Uint16())
430+
vendorName := utils.RandString()
431+
vendorAccount := test_dclauth.CreateVendorAccount(
432+
suite,
433+
vendorName,
434+
dclauthtypes.AccountRoles{dclauthtypes.Vendor},
435+
vid,
436+
aliceName,
437+
aliceAccount,
438+
bobName,
439+
bobAccount,
440+
testconstants.Info,
441+
)
442+
require.NotNil(suite.T, vendorAccount)
443+
444+
// New vendor adds a model
445+
pid := int32(tmrand.Uint16())
446+
createModelMsg := NewMsgCreateModel(vid, pid, vendorAccount.Address)
447+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelMsg}, vendorName, vendorAccount)
448+
require.NoError(suite.T, err)
449+
450+
createModelVersionMsg1 := NewMsgCreateModelVersion(vid, pid, 1, "1", vendorName)
451+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelVersionMsg1}, vendorName, vendorAccount)
452+
require.NoError(suite.T, err)
453+
454+
createModelVersionMsg2 := NewMsgCreateModelVersion(vid, pid, 2, "2", vendorName)
455+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{createModelVersionMsg2}, vendorName, vendorAccount)
456+
require.NoError(suite.T, err)
457+
458+
// certify model version
459+
certifyModelVersionMsg := NewMsgCertifyModelVersion(aliceName, vid, pid)
460+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{certifyModelVersionMsg}, aliceName, aliceAccount)
461+
require.NoError(suite.T, err)
462+
463+
deleteModelMsg := NewMsgDeleteModel(vid, pid, vendorName)
464+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{deleteModelMsg}, vendorName, vendorAccount)
465+
require.Error(suite.T, err)
466+
467+
// check if model is not deleted
468+
model, err := GetModel(suite, deleteModelMsg.Vid, deleteModelMsg.Pid)
469+
require.NoError(suite.T, err)
470+
require.NotNil(suite.T, model)
471+
472+
// check if model version 1 is deleted
473+
modelVersion1, err := GetModelVersion(suite, createModelVersionMsg1.Vid, createModelVersionMsg1.Pid, createModelVersionMsg1.SoftwareVersion)
474+
require.NoError(suite.T, err)
475+
require.NotNil(suite.T, modelVersion1)
476+
477+
// check if model version 2 is deleted
478+
modelVersion2, err := GetModelVersion(suite, createModelVersionMsg2.Vid, createModelVersionMsg2.Pid, createModelVersionMsg2.SoftwareVersion)
479+
require.NoError(suite.T, err)
480+
require.NotNil(suite.T, modelVersion2)
481+
}
482+
398483
func Demo(suite *utils.TestSuite) {
399484
// Alice and Bob are predefined Trustees
400485
aliceName := testconstants.AliceAccount

integration_tests/grpc_rest/model/rest_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,8 @@ func TestDeleteModelWithAssociatedModelVersionsREST(t *testing.T) {
6767
suite := utils.SetupTest(t, testconstants.ChainID, true)
6868
model.DeleteModelWithAssociatedModelVersions(&suite)
6969
}
70+
71+
func TestDeleteModelWithAssociatedModelVersionsCertifiedREST(t *testing.T) {
72+
suite := utils.SetupTest(t, testconstants.ChainID, true)
73+
model.DeleteModelWithAssociatedModelVersionsCertified(&suite)
74+
}

x/model/handler_test.go

+56-1
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ func TestHandler_DeleteModel(t *testing.T) {
427427
require.Equal(t, codes.NotFound, status.Code(err))
428428
}
429429

430-
func TestHandler_DeleteModelWithAssociatedModelVersions(t *testing.T) {
430+
func TestHandler_DeleteModelWithAssociatedModelVersionsNotCertified(t *testing.T) {
431431
setup := Setup(t)
432432

433433
// add new model
@@ -444,6 +444,7 @@ func TestHandler_DeleteModelWithAssociatedModelVersions(t *testing.T) {
444444
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion2)
445445
require.NoError(t, err)
446446

447+
// mock model versions not to be certified
447448
complianceKeeper := setup.ComplianceKeeper
448449
complianceKeeper.On("GetComplianceInfo", mock.Anything, msgCreateModelVersion1.Vid, msgCreateModelVersion1.Pid, msgCreateModelVersion1.SoftwareVersion, mock.Anything).Return(false)
449450
complianceKeeper.On("GetComplianceInfo", mock.Anything, msgCreateModelVersion2.Vid, msgCreateModelVersion2.Pid, msgCreateModelVersion2.SoftwareVersion, mock.Anything).Return(false)
@@ -472,6 +473,60 @@ func TestHandler_DeleteModelWithAssociatedModelVersions(t *testing.T) {
472473
)
473474
require.Error(t, err)
474475
require.Equal(t, codes.NotFound, status.Code(err))
476+
477+
// query deleted model
478+
_, err = queryModel(setup, msgDeleteModel.Vid, msgDeleteModel.Pid)
479+
require.Error(t, err)
480+
require.Equal(t, codes.NotFound, status.Code(err))
481+
}
482+
483+
func TestHandler_DeleteModelWithAssociatedModelVersionsCertified(t *testing.T) {
484+
setup := Setup(t)
485+
486+
// add new model
487+
msgCreateModel := NewMsgCreateModel(setup.Vendor)
488+
_, err := setup.Handler(setup.Ctx, msgCreateModel)
489+
require.NoError(t, err)
490+
491+
// add two new model versions
492+
msgCreateModelVersion1 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion)
493+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion1)
494+
require.NoError(t, err)
495+
496+
msgCreateModelVersion2 := NewMsgCreateModelVersion(setup.Vendor, testconstants.SoftwareVersion+1)
497+
_, err = setup.Handler(setup.Ctx, msgCreateModelVersion2)
498+
require.NoError(t, err)
499+
500+
// mock one model version to be certified
501+
complianceKeeper := setup.ComplianceKeeper
502+
complianceKeeper.On("GetComplianceInfo", mock.Anything, msgCreateModelVersion1.Vid, msgCreateModelVersion1.Pid, msgCreateModelVersion1.SoftwareVersion, mock.Anything).Return(false)
503+
complianceKeeper.On("GetComplianceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(true)
504+
505+
msgDeleteModel := NewMsgDeleteModel(setup.Vendor)
506+
_, err = setup.Handler(setup.Ctx, msgDeleteModel)
507+
require.Error(t, err)
508+
509+
// query first deleted model version - should not be deleted
510+
_, err = queryModelVersion(
511+
setup,
512+
msgCreateModelVersion1.Vid,
513+
msgCreateModelVersion1.Pid,
514+
msgCreateModelVersion1.SoftwareVersion,
515+
)
516+
require.NoError(t, err)
517+
518+
// query second deleted model version - should not be deleted
519+
_, err = queryModelVersion(
520+
setup,
521+
msgCreateModelVersion2.Vid,
522+
msgCreateModelVersion2.Pid,
523+
msgCreateModelVersion2.SoftwareVersion,
524+
)
525+
require.NoError(t, err)
526+
527+
// query deleted model - should not be deleted
528+
_, err = queryModel(setup, msgDeleteModel.Vid, msgDeleteModel.Pid)
529+
require.NoError(t, err)
475530
}
476531

477532
func TestHandler_OnlyOwnerAndVendorWithSameVidCanDeleteModel(t *testing.T) {

x/model/keeper/msg_server_model.go

+34-17
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ func (k msgServer) DeleteModel(goCtx context.Context, msg *types.MsgDeleteModel)
172172
if err != nil {
173173
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid Address: (%s)", err)
174174
}
175-
175+
176176
if err := checkModelRights(ctx, k.Keeper, signerAddr, msg.Vid, "MsgDeleteModel"); err != nil {
177177
return nil, err
178178
}
@@ -188,6 +188,14 @@ func (k msgServer) DeleteModel(goCtx context.Context, msg *types.MsgDeleteModel)
188188
return nil, types.NewErrModelDoesNotExist(msg.Vid, msg.Pid)
189189
}
190190

191+
modelVersions, found := k.GetModelVersions(ctx, msg.Vid, msg.Pid)
192+
193+
if found {
194+
if err = removeAssociatedModelVersions(k, goCtx, modelVersions, *msg); err != nil {
195+
return nil, err
196+
}
197+
}
198+
191199
// remove model from store
192200
k.RemoveModel(
193201
ctx,
@@ -198,24 +206,33 @@ func (k msgServer) DeleteModel(goCtx context.Context, msg *types.MsgDeleteModel)
198206
// remove product from VendorProducts
199207
k.RemoveVendorProduct(ctx, msg.Vid, msg.Pid)
200208

201-
modelVersions, found := k.GetModelVersions(ctx, msg.Vid, msg.Pid)
209+
return &types.MsgDeleteModelResponse{}, nil
210+
}
202211

203-
if found {
204-
// remove modelVersion for each softwareVersion
205-
for _, softwareVersion := range modelVersions.SoftwareVersions {
206-
msgDeleteModelVersion := types.NewMsgDeleteModelVersion(
207-
msg.Creator,
208-
msg.Vid,
209-
msg.Pid,
210-
softwareVersion,
211-
)
212-
213-
k.DeleteModelVersion(goCtx, msgDeleteModelVersion)
212+
func removeAssociatedModelVersions(k msgServer, goCtx context.Context, modelVersions types.ModelVersions, msg types.MsgDeleteModel) error {
213+
ctx := sdk.UnwrapSDKContext(goCtx)
214+
215+
// check if no model version has certification record
216+
for _, softwareVersion := range modelVersions.SoftwareVersions {
217+
if k.IsModelCertified(ctx, msg.Vid, msg.Pid, softwareVersion) {
218+
return types.NewErrModelVersionCertified(msg.Vid, msg.Pid, softwareVersion)
214219
}
215-
216-
// remove modelVersions record
217-
k.RemoveModelVersions(ctx, msg.Vid, msg.Pid)
218220
}
219221

220-
return &types.MsgDeleteModelResponse{}, nil
222+
// remove modelVersion for each softwareVersion
223+
for _, softwareVersion := range modelVersions.SoftwareVersions {
224+
msgDeleteModelVersion := types.NewMsgDeleteModelVersion(
225+
msg.Creator,
226+
msg.Vid,
227+
msg.Pid,
228+
softwareVersion,
229+
)
230+
231+
k.DeleteModelVersion(goCtx, msgDeleteModelVersion)
232+
}
233+
234+
// remove modelVersions record
235+
k.RemoveModelVersions(ctx, msg.Vid, msg.Pid)
236+
237+
return nil
221238
}

0 commit comments

Comments
 (0)