Network update validation tests

This commit is contained in:
Matthew R Kasun
2021-05-03 07:13:12 -04:00
parent ce0cd9cd54
commit aa6112a38e
3 changed files with 153 additions and 22 deletions

View File

@@ -112,31 +112,30 @@ func getNetworks(w http.ResponseWriter, r *http.Request) {
}
}
func ValidateNetworkUpdate(network models.Network) error {
func ValidateNetworkUpdate(network models.NetworkUpdate) error {
v := validator.New()
_ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
return isvalid
})
_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
return isvalid
})
// _ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
// return isvalid
// })
//_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
// return isvalid
// })
_ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
return isvalid
})
// _ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
// return isvalid
// })
_ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
return true
})
// _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
// return true
// })
_ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
return true
})
// _ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
// return true
// })
err := v.Struct(network)
@@ -309,14 +308,13 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
return
}
var networkChange models.Network
var networkChange models.NetworkUpdate
haschange := false
hasrangeupdate := false
haslocalrangeupdate := false
_ = json.NewDecoder(r.Body).Decode(&networkChange)
if networkChange.AddressRange == "" {
networkChange.AddressRange = network.AddressRange
}

View File

@@ -237,6 +237,112 @@ func TestSecurityCheck(t *testing.T) {
})
}
func TestValidateNetworkUpdate(t *testing.T) {
//yes := true
//no := false
deleteNet()
//DeleteNetworks
cases := []NetworkValidationTestCase{
NetworkValidationTestCase{
testname: "InvalidAddress",
network: models.Network{
AddressRange: "10.0.0.256",
},
errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
},
NetworkValidationTestCase{
testname: "InvalidAddress6",
network: models.Network{
AddressRange6: "2607::ag",
},
errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
},
NetworkValidationTestCase{
testname: "BadDisplayName",
network: models.Network{
DisplayName: "skynet*",
},
errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
},
NetworkValidationTestCase{
testname: "DisplayNameTooLong",
network: models.Network{
DisplayName: "Thisisareallylongdisplaynamethatistoolong",
},
errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
},
NetworkValidationTestCase{
testname: "DisplayNameTooShort",
network: models.Network{
DisplayName: "1",
},
errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
},
NetworkValidationTestCase{
testname: "InvalidNetID",
network: models.Network{
NetID: "contains spaces",
},
errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
},
NetworkValidationTestCase{
testname: "NetIDTooLong",
network: models.Network{
NetID: "LongNetIDName",
},
errMessage: "Field validation for 'NetID' failed on the 'max' tag",
},
NetworkValidationTestCase{
testname: "ListenPortTooLow",
network: models.Network{
DefaultListenPort: 1023,
},
errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
},
NetworkValidationTestCase{
testname: "ListenPortTooHigh",
network: models.Network{
DefaultListenPort: 65536,
},
errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
},
NetworkValidationTestCase{
testname: "KeepAliveTooBig",
network: models.Network{
DefaultKeepalive: 1010,
},
errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
},
NetworkValidationTestCase{
testname: "InvalidLocalRange",
network: models.Network{
LocalRange: "192.168.0.1",
},
errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
},
NetworkValidationTestCase{
testname: "CheckInIntervalTooBig",
network: models.Network{
DefaultCheckInInterval: 100001,
},
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
},
NetworkValidationTestCase{
testname: "CheckInIntervalTooSmall",
network: models.Network{
DefaultCheckInInterval: 1,
},
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
},
}
for _, tc := range cases {
t.Run(tc.testname, func(t *testing.T) {
network := models.NetworkUpdate(tc.network)
err := ValidateNetworkUpdate(network)
assert.NotNil(t, err)
assert.Contains(t, err.Error(), tc.errMessage)
})
}
}
func TestValidateNetworkCreate(t *testing.T) {
yes := true

View File

@@ -35,6 +35,33 @@ type Network struct {
//can't have min=1 with omitempty
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
}
type NetworkUpdate struct {
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
AddressRange string `json:"addressrange" bson:"addressrange" validate:"omitempty,cidr"`
// bug in validator --- required_with does not work with bools issue#683
// AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"required_with=isdualstack true,cidrv6"`
AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"omitempty,cidr"`
//can't have min=1 with omitempty
DisplayName string `json:"displayname,omitempty" bson:"displayname,omitempty" validate:"omitempty,alphanum,min=2,max=20"`
NetID string `json:"netid" bson:"netid" validate:"alphanum,min=1,max=12"`
NodesLastModified int64 `json:"nodeslastmodified" bson:"nodeslastmodified"`
NetworkLastModified int64 `json:"networklastmodified" bson:"networklastmodified"`
DefaultInterface string `json:"defaultinterface" bson:"defaultinterface"`
DefaultListenPort int32 `json:"defaultlistenport,omitempty" bson:"defaultlistenport,omitempty" validate:"omitempty,min=1024,max=65535"`
DefaultPostUp string `json:"defaultpostup" bson:"defaultpostup"`
DefaultPostDown string `json:"defaultpostdown" bson:"defaultpostdown"`
KeyUpdateTimeStamp int64 `json:"keyupdatetimestamp" bson:"keyupdatetimestamp"`
DefaultKeepalive int32 `json:"defaultkeepalive" bson:"defaultkeepalive" validate:"omitempty,max=1000"`
DefaultSaveConfig *bool `json:"defaultsaveconfig" bson:"defaultsaveconfig"`
AccessKeys []AccessKey `json:"accesskeys" bson:"accesskeys"`
AllowManualSignUp *bool `json:"allowmanualsignup" bson:"allowmanualsignup"`
IsLocal *bool `json:"islocal" bson:"islocal"`
IsDualStack *bool `json:"isdualstack" bson:"isdualstack"`
LocalRange string `json:"localrange" bson:"localrange" validate:"omitempty,cidr"`
//can't have min=1 with omitempty
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
}
//TODO:
//Not sure if we need the below two functions. Got rid of one of the calls. May want to revisit