Skip to content

Commit 6c6fb19

Browse files
authored
Merge pull request #514 from zigbee-alliance/unit-tests-refactoring
Compliance module unit tests refactoring
2 parents bf1de62 + ff1525c commit 6c6fb19

9 files changed

+1112
-1734
lines changed

integration_tests/constants/constants.go

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ var (
116116
ProgramType = "Some Program Type"
117117
ProgramTypeVersion = "Some Program Type Version"
118118
Transport = "Some Transport"
119+
SoftwareVersionCertificationStatus = uint32(3)
119120
ParentChild1 = "parent"
120121
ParentChild2 = "child"
121122
CertificationIDOfSoftwareComponent = "some certification ID of software component"

integration_tests/upgrade/add-new-node-after-upgrade.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ mainnet_stable_version="0.12.1"
88
latest_release_binary_version="1.2.2"
99

1010
node_name="new-observer"
11-
node_p2p_port=26670
12-
node_client_port=26671
11+
node_p2p_port=26570
12+
node_client_port=26571
1313
chain_id="dclchain"
1414
ip="192.167.10.28"
1515
docker_network="distributed-compliance-ledger_localnet"
+272
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,272 @@
1+
package compliance
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
"time"
7+
8+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
9+
"github.com/stretchr/testify/require"
10+
testconstants "github.com/zigbee-alliance/distributed-compliance-ledger/integration_tests/constants"
11+
dclcompltypes "github.com/zigbee-alliance/distributed-compliance-ledger/types/compliance"
12+
"github.com/zigbee-alliance/distributed-compliance-ledger/x/compliance/types"
13+
dclauthtypes "github.com/zigbee-alliance/distributed-compliance-ledger/x/dclauth/types"
14+
modeltypes "github.com/zigbee-alliance/distributed-compliance-ledger/x/model/types"
15+
)
16+
17+
func setupCertifyModel(t *testing.T) (*TestSetup, int32, int32, uint32, string, string) {
18+
t.Helper()
19+
setup := setup(t)
20+
21+
vid, pid, softwareVersion, softwareVersionString := setup.addModelVersion(
22+
testconstants.Vid, testconstants.Pid, testconstants.SoftwareVersion, testconstants.SoftwareVersionString)
23+
certificationType := dclcompltypes.ZigbeeCertificationType
24+
25+
return setup, vid, pid, softwareVersion, softwareVersionString, certificationType
26+
}
27+
28+
func (setup *TestSetup) checkModelCertified(t *testing.T, certifyModelMsg *types.MsgCertifyModel) {
29+
t.Helper()
30+
31+
vid := certifyModelMsg.Vid
32+
pid := certifyModelMsg.Pid
33+
softwareVersion := certifyModelMsg.SoftwareVersion
34+
certificationType := certifyModelMsg.CertificationType
35+
36+
certifiedModel, _ := queryCertifiedModel(setup, vid, pid, softwareVersion, certificationType)
37+
require.True(t, certifiedModel.Value)
38+
39+
revokedModel, _ := queryRevokedModel(setup, vid, pid, softwareVersion, certificationType)
40+
require.False(t, revokedModel.Value)
41+
42+
provisionalModel, _ := queryProvisionalModel(setup, vid, pid, softwareVersion, certificationType)
43+
require.False(t, provisionalModel.Value)
44+
}
45+
46+
func (setup *TestSetup) checkCertifiedModelMatchesMsg(t *testing.T, certifyModelMsg *types.MsgCertifyModel) *dclcompltypes.ComplianceInfo {
47+
t.Helper()
48+
49+
vid := certifyModelMsg.Vid
50+
pid := certifyModelMsg.Pid
51+
softwareVersion := certifyModelMsg.SoftwareVersion
52+
certificationType := certifyModelMsg.CertificationType
53+
54+
receivedComplianceInfo, _ := queryComplianceInfo(setup, vid, pid, softwareVersion, certificationType)
55+
checkCertifiedModelInfo(t, certifyModelMsg, receivedComplianceInfo)
56+
57+
return receivedComplianceInfo
58+
}
59+
60+
func (setup *TestSetup) checkDeviceSoftwareComplianceMatchesComplianceInfo(t *testing.T, complianceInfo *dclcompltypes.ComplianceInfo) {
61+
receivedDeviceSoftwareCompliance, _ := queryDeviceSoftwareCompliance(setup, complianceInfo.CDCertificateId)
62+
require.Equal(t, receivedDeviceSoftwareCompliance.CDCertificateId, complianceInfo.CDCertificateId)
63+
checkDeviceSoftwareCompliance(t, receivedDeviceSoftwareCompliance.ComplianceInfo[0], complianceInfo)
64+
}
65+
66+
func TestHandler_CertifyModel_Zigbee(t *testing.T) {
67+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
68+
69+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
70+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
71+
require.NoError(t, certifyModelErr)
72+
73+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
74+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
75+
setup.checkModelCertified(t, certifyModelMsg)
76+
}
77+
78+
func TestHandler_CertifyModel_Zigbee_WithAllOptionalFlags(t *testing.T) {
79+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
80+
81+
certifyModelMsg := newMsgCertifyModelWithAllOptionalFlags(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
82+
_, err := setup.Handler(setup.Ctx, certifyModelMsg)
83+
require.NoError(t, err)
84+
85+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
86+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
87+
setup.checkModelCertified(t, certifyModelMsg)
88+
}
89+
90+
func TestHandler_CertifyModel_Matter(t *testing.T) {
91+
setup, vid, pid, softwareVersion, softwareVersionString, _ := setupCertifyModel(t)
92+
certificationType := dclcompltypes.MatterCertificationType
93+
94+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
95+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
96+
require.NoError(t, certifyModelErr)
97+
98+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
99+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
100+
setup.checkModelCertified(t, certifyModelMsg)
101+
}
102+
103+
func TestHandler_CertifyModel_Matter_WithAllOptionalFlags(t *testing.T) {
104+
setup, vid, pid, softwareVersion, softwareVersionString, _ := setupCertifyModel(t)
105+
certificationType := dclcompltypes.MatterCertificationType
106+
107+
certifyModelMsg := newMsgCertifyModelWithAllOptionalFlags(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
108+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
109+
require.NoError(t, certifyModelErr)
110+
111+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
112+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
113+
setup.checkModelCertified(t, certifyModelMsg)
114+
}
115+
116+
func TestHandler_CertifyProvisionedModel(t *testing.T) {
117+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
118+
119+
provisionModelMsg, provisionModelErr := setup.provisionModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
120+
require.NoError(t, provisionModelErr)
121+
122+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
123+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
124+
require.NoError(t, certifyModelErr)
125+
126+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
127+
setup.checkModelCertified(t, certifyModelMsg)
128+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
129+
require.Equal(t, 1, len(complianceInfo.History))
130+
require.Equal(t, dclcompltypes.CodeProvisional, complianceInfo.History[0].SoftwareVersionCertificationStatus)
131+
require.Equal(t, provisionModelMsg.ProvisionalDate, complianceInfo.History[0].Date)
132+
}
133+
134+
func TestHandler_CertifyProvisionedModelWithAllOptionalFlags(t *testing.T) {
135+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
136+
137+
provisionModelMsg, provisionModelErr := setup.provisionModelWithAllOptionalFlags(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
138+
require.NoError(t, provisionModelErr)
139+
140+
certifyModelMsg := newMsgCertifyModelWithAllOptionalFlags(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
141+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
142+
require.NoError(t, certifyModelErr)
143+
144+
complianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
145+
setup.checkModelCertified(t, certifyModelMsg)
146+
setup.checkDeviceSoftwareComplianceMatchesComplianceInfo(t, complianceInfo)
147+
require.Equal(t, 1, len(complianceInfo.History))
148+
require.Equal(t, dclcompltypes.CodeProvisional, complianceInfo.History[0].SoftwareVersionCertificationStatus)
149+
require.Equal(t, provisionModelMsg.ProvisionalDate, complianceInfo.History[0].Date)
150+
}
151+
152+
func TestHandler_CertifyModelByDifferentRoles(t *testing.T) {
153+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
154+
accountRoles := []dclauthtypes.AccountRole{
155+
dclauthtypes.Vendor,
156+
dclauthtypes.Trustee,
157+
dclauthtypes.NodeAdmin,
158+
}
159+
160+
for _, role := range accountRoles {
161+
accAddress := generateAccAddress()
162+
setup.addAccount(accAddress, []dclauthtypes.AccountRole{role})
163+
164+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, accAddress)
165+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
166+
require.ErrorIs(t, certifyModelErr, sdkerrors.ErrUnauthorized)
167+
}
168+
}
169+
170+
func TestHandler_CertifyModelForUnknownModel(t *testing.T) {
171+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
172+
nonExistentPid := pid + 1
173+
174+
setup.setNoModelVersionForKey(vid, nonExistentPid, softwareVersion)
175+
176+
certifyModelMsg := newMsgCertifyModel(vid, nonExistentPid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
177+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
178+
require.ErrorIs(t, certifyModelErr, modeltypes.ErrModelVersionDoesNotExist)
179+
}
180+
181+
func TestHandler_CertifyModelWithWrongSoftwareVersionString(t *testing.T) {
182+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
183+
nonExistentSoftwareVersionStr := softwareVersionString + "modified"
184+
185+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, nonExistentSoftwareVersionStr, certificationType, setup.CertificationCenter)
186+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
187+
require.ErrorIs(t, certifyModelErr, types.ErrModelVersionStringDoesNotMatch)
188+
}
189+
190+
func TestHandler_CertifyModelTwice(t *testing.T) {
191+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
192+
193+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
194+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
195+
require.NoError(t, certifyModelErr)
196+
197+
_ = newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
198+
_, certifyModelErr = setup.Handler(setup.Ctx, certifyModelMsg)
199+
require.ErrorIs(t, certifyModelErr, types.ErrAlreadyCertified)
200+
}
201+
202+
func TestHandler_CertifyModelTwiceByDifferentAccounts(t *testing.T) {
203+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
204+
accAddress := generateAccAddress()
205+
setup.addAccount(accAddress, []dclauthtypes.AccountRole{dclauthtypes.CertificationCenter})
206+
207+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
208+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
209+
require.NoError(t, certifyModelErr)
210+
211+
_ = newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, accAddress)
212+
_, certifyModelErr = setup.Handler(setup.Ctx, certifyModelMsg)
213+
require.ErrorIs(t, certifyModelErr, types.ErrAlreadyCertified)
214+
}
215+
216+
func TestHandler_CertifyDifferentModels(t *testing.T) {
217+
setup := setup(t)
218+
modelVersionsQuantity := 5
219+
220+
for i := 1; i < modelVersionsQuantity; i++ {
221+
vid, pid, softwareVersion, softwareVersionString := setup.addModelVersion(int32(i), int32(i), uint32(i), fmt.Sprint(i))
222+
223+
for _, certificationType := range setup.CertificationTypes {
224+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
225+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
226+
require.NoError(t, certifyModelErr)
227+
setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
228+
setup.checkModelCertified(t, certifyModelMsg)
229+
}
230+
}
231+
}
232+
233+
func TestHandler_CertifyProvisionedModelForCertificationDateBeforeProvisionalDate(t *testing.T) {
234+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
235+
236+
certificationTime := time.Now().UTC()
237+
certificationDate := certificationTime.Format(time.RFC3339)
238+
provisionalDate := certificationTime.AddDate(0, 0, 1).Format(time.RFC3339)
239+
240+
provisionModelErr := setup.provisionModelByDate(vid, pid, softwareVersion, softwareVersionString, certificationType, provisionalDate, setup.CertificationCenter)
241+
require.NoError(t, provisionModelErr)
242+
243+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
244+
certifyModelMsg.CertificationDate = certificationDate
245+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
246+
require.ErrorIs(t, certifyModelErr, types.ErrInconsistentDates)
247+
}
248+
249+
func TestHandler_CertifyRevokedModel(t *testing.T) {
250+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupCertifyModel(t)
251+
certificationTime := time.Now().UTC()
252+
certificationDate := certificationTime.Format(time.RFC3339)
253+
254+
revokeModelMsg, revokeModelErr := setup.revokeModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
255+
require.NoError(t, revokeModelErr)
256+
257+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
258+
certifyModelMsg.CertificationDate = certificationDate
259+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
260+
require.NoError(t, certifyModelErr)
261+
262+
receivedComplianceInfo := setup.checkCertifiedModelMatchesMsg(t, certifyModelMsg)
263+
require.Equal(t, 1, len(receivedComplianceInfo.History))
264+
require.Equal(t, dclcompltypes.CodeRevoked, receivedComplianceInfo.History[0].SoftwareVersionCertificationStatus)
265+
require.Equal(t, revokeModelMsg.RevocationDate, receivedComplianceInfo.History[0].Date)
266+
267+
receivedDeviceSoftwareCompliance, _ := queryDeviceSoftwareCompliance(setup, testconstants.CDCertificateID)
268+
require.Equal(t, receivedDeviceSoftwareCompliance.CDCertificateId, testconstants.CDCertificateID)
269+
checkDeviceSoftwareCompliance(t, receivedDeviceSoftwareCompliance.ComplianceInfo[0], receivedComplianceInfo)
270+
271+
setup.checkModelCertified(t, certifyModelMsg)
272+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package compliance
2+
3+
import (
4+
"testing"
5+
6+
sdk "github.com/cosmos/cosmos-sdk/types"
7+
"github.com/stretchr/testify/require"
8+
testconstants "github.com/zigbee-alliance/distributed-compliance-ledger/integration_tests/constants"
9+
dclcompltypes "github.com/zigbee-alliance/distributed-compliance-ledger/types/compliance"
10+
"github.com/zigbee-alliance/distributed-compliance-ledger/x/compliance/types"
11+
)
12+
13+
func setupDeleteComplianceInfo(t *testing.T) (*TestSetup, int32, int32, uint32, string, string) {
14+
setup := setup(t)
15+
16+
vid, pid, softwareVersion, softwareVersionString := setup.addModelVersion(
17+
testconstants.Vid, testconstants.Pid, testconstants.SoftwareVersion, testconstants.SoftwareVersionString)
18+
certificationType := dclcompltypes.ZigbeeCertificationType
19+
20+
return setup, vid, pid, softwareVersion, softwareVersionString, certificationType
21+
}
22+
23+
func (setup *TestSetup) deleteComplianceInfo(vid int32, pid int32, softwareVersion uint32, certificationType string, signer sdk.AccAddress) (*types.MsgDeleteComplianceInfo, error) {
24+
deleteComplInfoMsg := newMsgDeleteComplianceInfo(
25+
vid, pid, softwareVersion, certificationType, signer)
26+
_, err := setup.Handler(setup.Ctx, deleteComplInfoMsg)
27+
28+
return deleteComplInfoMsg, err
29+
}
30+
31+
func (setup *TestSetup) checkComplianceInfoDeleted(t *testing.T, deleteComplInfoMsg *types.MsgDeleteComplianceInfo) {
32+
vid := deleteComplInfoMsg.Vid
33+
pid := deleteComplInfoMsg.Pid
34+
softwareVersion := deleteComplInfoMsg.SoftwareVersion
35+
certificationType := deleteComplInfoMsg.CertificationType
36+
37+
_, err := queryProvisionalModel(setup, vid, pid, softwareVersion, certificationType)
38+
assertNotFound(t, err)
39+
40+
_, err = queryCertifiedModel(setup, vid, pid, softwareVersion, certificationType)
41+
assertNotFound(t, err)
42+
43+
_, err = queryRevokedModel(setup, vid, pid, softwareVersion, certificationType)
44+
assertNotFound(t, err)
45+
}
46+
47+
func TestHandler_DeleteComplianceInfoForRevokedModel(t *testing.T) {
48+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupDeleteComplianceInfo(t)
49+
50+
_, revokeModelErr := setup.revokeModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
51+
require.NoError(t, revokeModelErr)
52+
53+
deleteComplInfoMsg, deleteComplInfoError := setup.deleteComplianceInfo(vid, pid, softwareVersion, certificationType, setup.CertificationCenter)
54+
require.NoError(t, deleteComplInfoError)
55+
56+
setup.checkComplianceInfoDeleted(t, deleteComplInfoMsg)
57+
}
58+
59+
func TestHandler_DeleteComplianceInfoForCertifiedModel(t *testing.T) {
60+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupDeleteComplianceInfo(t)
61+
62+
certifyModelMsg := newMsgCertifyModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
63+
_, certifyModelErr := setup.Handler(setup.Ctx, certifyModelMsg)
64+
require.NoError(t, certifyModelErr)
65+
66+
deleteComplInfoMsg, deleteComplInfoError := setup.deleteComplianceInfo(vid, pid, softwareVersion, certificationType, setup.CertificationCenter)
67+
require.NoError(t, deleteComplInfoError)
68+
69+
setup.checkComplianceInfoDeleted(t, deleteComplInfoMsg)
70+
}
71+
72+
func TestHandler_DeleteComplianceInfoForProvisionalModel(t *testing.T) {
73+
setup, vid, pid, softwareVersion, softwareVersionString, certificationType := setupDeleteComplianceInfo(t)
74+
75+
_, provisionModelErr := setup.provisionModel(vid, pid, softwareVersion, softwareVersionString, certificationType, setup.CertificationCenter)
76+
require.NoError(t, provisionModelErr)
77+
78+
deleteComplInfoMsg, deleteComplInfoError := setup.deleteComplianceInfo(vid, pid, softwareVersion, certificationType, setup.CertificationCenter)
79+
require.NoError(t, deleteComplInfoError)
80+
81+
setup.checkComplianceInfoDeleted(t, deleteComplInfoMsg)
82+
}
83+
84+
func TestHandler_DeleteComplianceInfoDoesNotExist(t *testing.T) {
85+
setup, vid, pid, softwareVersion, _, certificationType := setupDeleteComplianceInfo(t)
86+
87+
_, deleteComplInfoError := setup.deleteComplianceInfo(vid, pid, softwareVersion, certificationType, setup.CertificationCenter)
88+
require.ErrorIs(t, deleteComplInfoError, types.ErrComplianceInfoDoesNotExist)
89+
}

0 commit comments

Comments
 (0)