Skip to content

Commit 19a438c

Browse files
committed
Adding more validation test cases
1 parent a4064d8 commit 19a438c

File tree

9 files changed

+395
-93
lines changed

9 files changed

+395
-93
lines changed

integration_tests/cli/model-validation-cases.sh

+24-8
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ test_divider
3232

3333
# Create a new model with minimum fields
3434
echo "Add Model with minimum required fields with VID: $vid_1 PID: $pid_1"
35-
result=$(echo "test1234" | dclcli tx model add-model --vid=$vid_1 --pid=$pid_1 --deviceTypeID=1 --productName=TestProduct --productLabel="Test Product" --partNumber=1 --commissioningCustomFlow=0 --from=$vendor_account_1 --yes)
35+
result=$(echo "test1234" | dclcli tx model add-model --vid=$vid_1 --pid=$pid_1 --deviceTypeID=1 --productName=TestProduct --productLabel="Test Product" --partNumber=1 --from=$vendor_account_1 --yes)
3636
check_response "$result" "\"success\": true"
3737

3838
test_divider
@@ -54,7 +54,7 @@ result=$(echo "test1234" | dclcli tx model add-model --vid=$vid_1 --pid=$pid_2 -
5454
--partNumber="23.456" --commissioningCustomFlow=1 --commissioningCustomFlowURL="https://customflow.url.info" \
5555
--commissioningModeInitialStepsHint=1 --commissioningModeInitialStepsInstruction="Initial Instructions" \
5656
--commissioningModeSecondaryStepsHint=2 --commissioningModeSecondaryStepsInstruction="Secondary Steps Instruction" \
57-
--userManualURL="https://usermanual.url" --supportURL="https://support.url.info" --from=$vendor_account_1 --yes)
57+
--userManualURL="https://usermanual.url" --productURL="https://product.url.info" --supportURL="https://support.url.info" --from=$vendor_account_1 --yes)
5858
check_response "$result" "\"success\": true"
5959

6060
test_divider
@@ -76,6 +76,8 @@ check_response_and_report "$result" "\"commissioningModeSecondaryStepsHint\": 2"
7676
check_response_and_report "$result" "\"commissioningModeSecondaryStepsInstruction\": \"Secondary Steps Instruction\""
7777
check_response_and_report "$result" "\"userManualURL\": \"https://usermanual.url\""
7878
check_response_and_report "$result" "\"supportURL\": \"https://support.url.info\""
79+
check_response_and_report "$result" "\"productURL\": \"https://product.url.info\""
80+
7981

8082
test_divider
8183

@@ -228,7 +230,7 @@ test_divider
228230
sv_1=$RANDOM
229231
# Create a new model version
230232
echo "Create a Device Model Version with minimum mandatory fields for VID: $vid_1 PID: $pid_1 SV: $sv_1"
231-
result=$(echo 'test1234' | dclcli tx model add-model-version --cdVersionNumber=1 --maxApplicableSoftwareVersion=10 --minApplicableSoftwareVersion=1 --vid=$vid_1 --pid=$pid_1 --softwareVersion=$sv_1 --softwareVersionString=1 --from=$vendor_account_1 --yes)
233+
result=$(echo 'test1234' | dclcli tx model add-model-version --cdVersionNumber=1 --maxApplicableSoftwareVersion=20 --minApplicableSoftwareVersion=10 --vid=$vid_1 --pid=$pid_1 --softwareVersion=$sv_1 --softwareVersionString=1 --from=$vendor_account_1 --yes)
232234
echo "$result"
233235
check_response_and_report "$result" "\"success\": true"
234236

@@ -244,8 +246,8 @@ check_response_and_report "$result" "\"softwareVersion\": $sv_1"
244246
check_response_and_report "$result" "\"softwareVersionString\": \"1\""
245247
check_response_and_report "$result" "\"CDVersionNumber\": 1"
246248
check_response_and_report "$result" "\"softwareVersionValid\": true"
247-
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 1"
248-
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 10"
249+
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 10"
250+
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 20"
249251

250252
test_divider
251253

@@ -266,8 +268,8 @@ check_response_and_report "$result" "\"softwareVersion\": $sv_1"
266268
check_response_and_report "$result" "\"softwareVersionString\": \"1\""
267269
check_response_and_report "$result" "\"CDVersionNumber\": 1"
268270
check_response_and_report "$result" "\"softwareVersionValid\": false"
269-
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 1"
270-
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 10"
271+
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 10"
272+
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 20"
271273

272274
test_divider
273275

@@ -290,7 +292,7 @@ check_response_and_report "$result" "\"softwareVersionString\": \"1\""
290292
check_response_and_report "$result" "\"CDVersionNumber\": 1"
291293
check_response_and_report "$result" "\"softwareVersionValid\": true"
292294
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 2"
293-
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 10"
295+
check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 20"
294296
check_response_and_report "$result" "\"releaseNotesURL\": \"https://release.url.info\""
295297

296298

@@ -445,4 +447,18 @@ check_response_and_report "$result" "\"maxApplicableSoftwareVersion\": 32"
445447
check_response_and_report "$result" "\"minApplicableSoftwareVersion\": 5"
446448
response_does_not_contain "$result" "\"releaseNotesURL\""
447449

450+
test_divider
451+
452+
# Update the model version with maxApplicableSoftwareVersion less then minApplicableSoftwareVersion
453+
echo "Update the model version with maxApplicableSoftwareVersion less then minApplicableSoftwareVersion and make sure we get error back VID: $vid_1 PID: $pid_1 SV: $sv_1"
454+
result=$(echo "test1234" | dclcli tx model update-model-version --vid=$vid_1 --pid=$pid_1 --softwareVersion=$sv_1 --maxApplicableSoftwareVersion=3 --from=$vendor_account_1 --yes)
455+
check_response_and_report "$result" "\"success\": false"
456+
457+
test_divider
458+
459+
# Update the model version with minApplicableSoftwareVersion greater then maxApplicableSoftwareVersion
460+
echo "Update the model version with minApplicableSoftwareVersion greater then maxApplicableSoftwareVersion and make sure we get error back VID: $vid_1 PID: $pid_1 SV: $sv_1"
461+
result=$(echo "test1234" | dclcli tx model update-model-version --vid=$vid_1 --pid=$pid_1 --softwareVersion=$sv_1 --minApplicableSoftwareVersion=33 --from=$vendor_account_1 --yes)
462+
check_response_and_report "$result" "\"success\": false"
463+
448464
test_divider

integration_tests/cli/modelinfo-negative-cases.sh

+6-6
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,22 @@ test_divider
8686

8787
echo "Add model with empty name"
8888
result=$(echo "test1234" | dclcli tx model add-model --vid=$vid --pid=$pid --deviceTypeID=1 --productName="" --productLabel=TestingProductLabel --partNumber=1 --commissioningCustomFlow=0 --from $vendor_account --yes 2>&1) || true
89-
check_response_and_report "$result" "Code: 6"
90-
check_response_and_report "$result" "Invalid ProductName"
89+
check_response_and_report "$result" "Code: 900"
90+
check_response_and_report "$result" "ProductName is a required field"
9191

9292
test_divider
9393

9494
echo "Add model with empty description"
9595
result=$(echo "test1234" | dclcli tx model add-model --vid=$vid --pid=$pid --deviceTypeID=1 --productName=TestProduct --productLabel="" --partNumber=1 --commissioningCustomFlow=0 --from $vendor_account --yes 2>&1) || true
96-
check_response_and_report "$result" "Code: 6"
97-
check_response_and_report "$result" "Invalid ProductLabel"
96+
check_response_and_report "$result" "Code: 900"
97+
check_response_and_report "$result" "ProductLabel is a required field"
9898

9999
test_divider
100100

101101
echo "Add model with empty partNumber"
102102
result=$(echo "test1234" | dclcli tx model add-model --vid=$vid --pid=$pid --deviceTypeID=1 --productName=TestProduct --productLabel="Test Label" --partNumber="" --commissioningCustomFlow=0 --from $vendor_account --yes 2>&1) || true
103-
check_response_and_report "$result" "Code: 6"
104-
check_response_and_report "$result" "Invalid PartNumber"
103+
check_response_and_report "$result" "Code: 900"
104+
check_response_and_report "$result" "PartNumber is a required field"
105105

106106
test_divider
107107

integration_tests/constants/constants.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ var (
5353
FirmwareDigests = "Firmware Digest String"
5454
Revoked = false
5555
SoftwareVersionValid = true
56-
OtaURL = "http://ota.firmware.com"
56+
OtaURL = "https://ota.firmware.com"
5757
OtaFileSize uint64 = 12345678
5858
OtaChecksum = "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" //nolint:lll
5959
OtaChecksumType uint16 = 1
@@ -103,6 +103,9 @@ var (
103103
ValidatorPubKey2 = "cosmosvalconspub1zcjduepqdtar5ynhrhc78mymwg5sqksdnfafqyqu6sar3gg745u6dsw32krscaqv8u"
104104
ValidatorAddress1 = sdk.ConsAddress(sdk.MustGetConsPubKeyBech32(ValidatorPubKey1).Address())
105105
ValidatorAddress2 = sdk.ConsAddress(sdk.MustGetConsPubKeyBech32(ValidatorPubKey2).Address())
106+
ValidHTTPSURL = "https://valid.url.com"
107+
ValidHTTPURL = "http://valid.url.com"
108+
NotAValidURL = "not a valid url"
106109
)
107110

108111
/*

utils/validator/validator.go

+51-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package validator
1616

1717
import (
1818
"fmt"
19+
"reflect"
1920

2021
sdk "github.com/cosmos/cosmos-sdk/types"
2122
"github.com/go-playground/locales/en"
@@ -38,7 +39,10 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
3839

3940
vl = validator.New()
4041

41-
_ = vl.RegisterValidation("requiredForAdd", onlyRequiredForAdd)
42+
_ = vl.RegisterValidation("address", validateAddress)
43+
_ = en_translations.RegisterDefaultTranslations(vl, trans)
44+
45+
_ = vl.RegisterValidation("requiredForAdd", validateRequiredForAdd)
4246
_ = en_translations.RegisterDefaultTranslations(vl, trans)
4347

4448
_ = vl.RegisterTranslation("required", trans, func(ut ut.Translator) error {
@@ -49,6 +53,21 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
4953
return t
5054
})
5155

56+
_ = vl.RegisterTranslation("required_with", trans, func(ut ut.Translator) error {
57+
return ut.Add("required_with", "{0} is a required field", true) // see universal-translator for details
58+
}, func(ut ut.Translator, fe validator.FieldError) string {
59+
t, _ := ut.T("required_with", fe.Field())
60+
61+
return t
62+
})
63+
_ = vl.RegisterTranslation("address", trans, func(ut ut.Translator) error {
64+
return ut.Add("address", "Field {0} : {1} is not a valid address", true)
65+
}, func(ut ut.Translator, fe validator.FieldError) string {
66+
t, _ := ut.T("address", fe.Field(), fmt.Sprintf("%v", fe.Value()))
67+
68+
return t
69+
})
70+
5271
_ = vl.RegisterTranslation("requiredForAdd", trans, func(ut ut.Translator) error {
5372
return ut.Add("requiredForAdd", "{0} is a required field", true)
5473
}, func(ut ut.Translator, fe validator.FieldError) string {
@@ -73,20 +92,31 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
7392
return t
7493
})
7594

95+
vl.RegisterTranslation("startsnotwith", trans, func(ut ut.Translator) error {
96+
return ut.Add("startsnotwith", "Field {0} : {1} is not a valid url", true)
97+
}, func(ut ut.Translator, fe validator.FieldError) string {
98+
t, _ := ut.T("startsnotwith", fe.Field(), fmt.Sprintf("%v", fe.Value()))
99+
return t
100+
})
101+
76102
errs := vl.Struct(s)
77103

78104
if errs != nil {
79105
for _, e := range errs.(validator.ValidationErrors) {
80106
if e.Tag() == "max" {
81107
return sdk.NewError(Codespace, CodeFieldMaxLengthExceeded, e.Translate(trans))
82108
}
83-
if e.Tag() == "required" {
109+
110+
// currently required_with is only applicable for Additions
111+
// (Create custom validator if need for both update and add)
112+
if (e.Tag() == "requiredForAdd" || e.Tag() == "required_with") && performAddValidation {
84113
return sdk.NewError(Codespace, CodeRequiredFieldMissing, e.Translate(trans))
85114
}
86-
if e.Tag() == "requiredForAdd" && performAddValidation {
115+
116+
if e.Tag() == "required" {
87117
return sdk.NewError(Codespace, CodeRequiredFieldMissing, e.Translate(trans))
88118
}
89-
if e.Tag() == "url" {
119+
if e.Tag() == "url" || e.Tag() == "startsnotwith" || e.Tag() == "address" {
90120
return sdk.NewError(Codespace, CodeFieldNotValid, e.Translate(trans))
91121
}
92122

@@ -104,8 +134,23 @@ func ValidateAdd(s interface{}) sdk.Error {
104134
return validate(s, true)
105135
}
106136

107-
func onlyRequiredForAdd(fl validator.FieldLevel) bool {
108-
if fl.Field().String() == "" {
137+
func validateRequiredForAdd(fl validator.FieldLevel) bool {
138+
field := fl.Field()
139+
//nolint:exhaustive
140+
switch field.Kind() {
141+
case reflect.String:
142+
return field.Len() > 0
143+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
144+
return field.Int() != 0
145+
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
146+
return field.Uint() != 0
147+
default:
148+
return field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface()
149+
}
150+
}
151+
152+
func validateAddress(fl validator.FieldLevel) bool {
153+
if sdk.VerifyAddressFormat(fl.Field().Bytes()) != nil {
109154
return false
110155
} else {
111156
return true

x/model/handler.go

+11
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,12 @@ func handleMsgAddModelVersion(ctx sdk.Context, keeper keeper.Keeper, authKeeper
196196
return types.ErrModelVersionAlreadyExists(msg.VID, msg.PID, msg.SoftwareVersion).Result()
197197
}
198198

199+
// check if maxApllicableSoftwareVersion is less then minApplicableSoftwareVersion
200+
if msg.MaxApplicableSoftwareVersion < msg.MinApplicableSoftwareVersion {
201+
return types.ErrMaxSVLessThanMinSV(msg.MinApplicableSoftwareVersion,
202+
msg.MaxApplicableSoftwareVersion).Result()
203+
}
204+
199205
modelVersion := types.ModelVersion{
200206
VID: msg.VID,
201207
PID: msg.PID,
@@ -266,6 +272,11 @@ func handleMsgUpdateModelVersion(ctx sdk.Context, keeper keeper.Keeper, authKeep
266272
modelVersion.ReleaseNotesURL = msg.ReleaseNotesURL
267273
}
268274

275+
if modelVersion.MaxApplicableSoftwareVersion < modelVersion.MinApplicableSoftwareVersion {
276+
return types.ErrMaxSVLessThanMinSV(modelVersion.MinApplicableSoftwareVersion,
277+
modelVersion.MaxApplicableSoftwareVersion).Result()
278+
}
279+
269280
// store updated model
270281
keeper.SetModelVersion(ctx, modelVersion)
271282

x/model/internal/types/errors.go

+8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const (
3838
CodeNoModelVersionExist sdk.CodeType = 518
3939
CodeModelVersionAlreadyExists sdk.CodeType = 519
4040
CodeOtaURLCannotBeSet sdk.CodeType = 520
41+
CodeMaxSVLessThanMinSV sdk.CodeType = 521
4142
)
4243

4344
func ErrModelAlreadyExists(vid interface{}, pid interface{}) sdk.Error {
@@ -108,3 +109,10 @@ func ErrOtaURLCannotBeSet(vid interface{}, pid interface{}, softwareVersion inte
108109
fmt.Sprintf("OTA URL cannot be set for model version associated with vid=%v, pid=%v "+
109110
"and softwareVersion=%v because OTA was not set for this model info initially", vid, pid, softwareVersion))
110111
}
112+
113+
func ErrMaxSVLessThanMinSV(minApplicableSoftwareVersion interface{},
114+
maxApplicableSoftwareVersion interface{}) sdk.Error {
115+
return sdk.NewError(Codespace, CodeMaxSVLessThanMinSV,
116+
fmt.Sprintf("MaxApplicableSoftwareVersion %v is less than MinApplicableSoftwareVersion %v",
117+
maxApplicableSoftwareVersion, minApplicableSoftwareVersion))
118+
}

0 commit comments

Comments
 (0)