Commit 79074de8 authored by Kevin Di Lallo's avatar Kevin Di Lallo
Browse files

updated meep-model ut

parent 53b9de1b
Loading
Loading
Loading
Loading
+21 −9

File changed.

Preview size limit exceeded, changes collapsed.

+113 −7
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import (
	"errors"
	"fmt"
	"regexp"
	"strconv"
	"strings"

	dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model"
@@ -43,7 +44,7 @@ const (
	REGEX_VARIABLE_NAME      = `^(([_a-z0-9A-Z][_-a-z0-9.]*)?[_a-z0-9A-Z])+$`
	REGEX_MAC_ADDRESS        = `^(([_a-f0-9A-F][_-a-f0-9]*)?[_a-f0-9A-F])+$`
	REGEX_WIRELESS_TYPE_LIST = `^((,\s*)?(wifi|5g|4g|other))+$`
	REGEX_PATH               = `^[\^#%&$\*<>\?\{\|\} ]*$`
	REGEX_PATH               = `[\^#%&$\*<>\?\{\|\} ]+`
)

const (
@@ -84,7 +85,7 @@ var GPU_TYPE_ENUM = []string{"NVIDIA"}
var PROTOCOL_ENUM = []string{"UDP", "TCP"}

// Current validator version
var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 4}
var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 6}

// Versions requiring scenario update
var Version130 = semver.Version{Major: 1, Minor: 3, Patch: 0}
@@ -595,13 +596,23 @@ func validateProc(proc *dataModel.Process) (err error) {
		// TODO - Validate placement identifier

	} else if proc.UserChartLocation != "" {
		// USER-DEFINE CHART APP
		// USER-DEFINED CHART APP

		// User Chart Location

		err = validatePath(proc.UserChartLocation, true)
		if err != nil {
			return err
		}
		// User Chart Group

		err = validateChartGroup(proc.UserChartGroup)
		if err != nil {
			return err
		}
		// User Chart Alternate values
		err = validatePath(proc.UserChartAlternateValues, false)
		if err != nil {
			return err
		}

	} else {
		// INTERNAL APP
@@ -800,9 +811,19 @@ func validateMemoryConfig(cfg *dataModel.MemoryConfig) (err error) {

func validateExternalConfig(cfg *dataModel.ExternalConfig) (err error) {
	// Ingress Service Mapping

	for _, svc := range cfg.IngressServiceMap {
		err = validateIngressSvc(&svc)
		if err != nil {
			return err
		}
	}
	// EgressServiceMapping

	for _, svc := range cfg.EgressServiceMap {
		err = validateEgressSvc(&svc)
		if err != nil {
			return err
		}
	}
	return nil
}

@@ -846,6 +867,91 @@ func validateServiceConfig(cfg *dataModel.ServiceConfig) (err error) {
	return nil
}

func validateChartGroup(group string) (err error) {
	if group != "" {
		fields := strings.Split(group, ":")
		if len(fields) != 4 {
			return errors.New("Group format must be 'svc instance:svc group name:port:protocol'")
		}
		// Svc name
		err = validateFullName(fields[0])
		if err != nil {
			return err
		}
		// Svc group name
		err = validateName(fields[1])
		if err != nil {
			return err
		}
		// Port
		port, err := strconv.Atoi(fields[2])
		if err != nil {
			return err
		}
		err = validateInt32Range(int32(port), SERVICE_PORT_MIN, SERVICE_PORT_MAX)
		if err != nil {
			return err
		}
		// Protocol
		err = validateStringEnum(fields[3], PROTOCOL_ENUM)
		if err != nil {
			return err
		}
	}
	return nil
}

func validateIngressSvc(svc *dataModel.IngressService) (err error) {
	// External Port
	err = validateInt32Range(svc.ExternalPort, SERVICE_NODE_PORT_MIN, SERVICE_NODE_PORT_MAX)
	if err != nil {
		return err
	}
	// Svc name
	err = validateFullName(svc.Name)
	if err != nil {
		return err
	}
	// Port
	err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX)
	if err != nil {
		return err
	}
	// Protocol
	err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM)
	if err != nil {
		return err
	}
	return nil
}

func validateEgressSvc(svc *dataModel.EgressService) (err error) {
	// Svc name
	err = validateFullName(svc.Name)
	if err != nil {
		return err
	}
	// Group Svc name
	err = validateFullName(svc.MeSvcName)
	if err != nil {
		return err
	}
	// Port
	err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX)
	if err != nil {
		return err
	}
	// Protocol
	err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM)
	if err != nil {
		return err
	}

	// TODO -- Validate IP

	return nil
}

func validateName(name string) (err error) {
	if name == "" {
		return errors.New("Name not provided")
+206 −11
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import (
	"fmt"
	"testing"

	dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model"
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
)

@@ -106,18 +105,214 @@ func TestValidateComponents(t *testing.T) {
		t.Fatalf(err.Error())
	}

	// Int32 Range
	err = validateInt32Range(0, 1, 10)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateInt32Range(100, 1, 10)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateInt32Range(1, 1, 10)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateInt32Range(10, 1, 10)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateInt32Range(5, 1, 10)
	if err != nil {
		t.Fatalf(err.Error())
	}

func TestValidatePhyLoc(t *testing.T) {
	fmt.Println("--- ", t.Name())
	log.MeepTextLogInit(t.Name())
	// Float32 Range
	err = validateFloat32Range(0.1, 1.0, 10.0)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateFloat32Range(100.0, 1.0, 10.0)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateFloat32Range(1.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateFloat32Range(10.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateFloat32Range(5.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}

	// Float64 Range
	err = validateFloat64Range(0.1, 1.0, 10.0)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateFloat64Range(100.0, 1.0, 10.0)
	if err == nil {
		t.Fatalf("Int32 should be out of range")
	}
	err = validateFloat64Range(1.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateFloat64Range(10.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateFloat64Range(5.0, 1.0, 10.0)
	if err != nil {
		t.Fatalf(err.Error())
	}

	// Enum
	enumVals := []string{"val1", "val2", "val3"}
	err = validateStringEnum("", enumVals)
	if err == nil {
		t.Fatalf("String should not be in enum")
	}
	err = validateStringEnum("dummy", enumVals)
	if err == nil {
		t.Fatalf("String should not be in enum")
	}
	err = validateStringEnum("val1", enumVals)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateStringEnum("val2", enumVals)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateStringEnum("val3", enumVals)
	if err != nil {
		t.Fatalf(err.Error())
	}

	// MAC Address
	err = validateMacAddress("badmac")
	if err == nil {
		t.Fatalf("MAC Address should be invalid")
	}
	err = validateMacAddress("11:22:33")
	if err == nil {
		t.Fatalf("MAC Address should be invalid")
	}
	err = validateMacAddress("11:22:33:44:55:66")
	if err == nil {
		t.Fatalf("MAC Address should be invalid")
	}
	err = validateMacAddress("")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateMacAddress("0123456789ab")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateMacAddress("CDEF01234567")
	if err != nil {
		t.Fatalf(err.Error())
	}

	pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"}
	err := validatePhyLoc(&pl)
	// Wireless Type List
	err = validateWirelessTypeList("badtype")
	if err == nil {
		t.Fatalf("Wireless Type should be invalid")
	}
	err = validateWirelessTypeList("3g")
	if err == nil {
		t.Fatalf("Wireless Type should be invalid")
	}
	err = validateWirelessTypeList("4g,none")
	if err == nil {
		t.Fatalf("Wireless Type should be invalid")
	}
	err = validateWirelessTypeList("wifi")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateWirelessTypeList("5g")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateWirelessTypeList("4g")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateWirelessTypeList("other")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateWirelessTypeList("wifi,5g,4g,other")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateWirelessTypeList("wifi, 4g,   5g")
	if err != nil {
		t.Fatalf(err.Error())
	}

	// Path
	err = validatePath("", true)
	if err == nil {
		t.Fatalf("Path should be present")
	}
	err = validatePath("invalid path", true)
	if err == nil {
		t.Fatalf("Path should be invalid")
	}
	err = validatePath("", false)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validatePath("/valid/path", true)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validatePath("another/valid/path", true)
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validatePath("registry:repo/name", true)
	if err != nil {
		t.Fatalf(err.Error())
	}

	// Environment Variables
	err = validateEnvVar("INVALID VAR=value")
	if err == nil {
		t.Fatalf("Env var format should be invalid")
	}
	err = validateEnvVar("VAR=value,INVALID_VAR")
	if err == nil {
		t.Fatalf("Env var format should be invalid")
	}
	err = validateEnvVar("")
	if err != nil {
		t.Fatalf(err.Error())
	}
	err = validateEnvVar("VAR=!@#$%^&*(),VAR2='val with spaces,VAR_NO_VAL=")
	if err != nil {
		t.Fatalf(err.Error())
	}
}

func TestValidatePhyLoc(t *testing.T) {
	fmt.Println("--- ", t.Name())
	log.MeepTextLogInit(t.Name())

	// pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"}
	// err := validatePhyLoc(&pl)
	// if err != nil {
	// 	t.Fatalf(err.Error())
	// }

	// Type_ string `json:"type,omitempty"`
	// // true: Physical location is external to MEEP false: Physical location is internal to MEEP
	// IsExternal              bool     `json:"isExternal,omitempty"`
@@ -152,11 +347,11 @@ func TestValidateProc(t *testing.T) {
	fmt.Println("--- ", t.Name())
	log.MeepTextLogInit(t.Name())

	pl := dataModel.Process{Id: "", Name: "my-proc"}
	err := validateProc(&pl)
	if err != nil {
		t.Fatalf(err.Error())
	}
	// pl := dataModel.Process{Id: "", Name: "my-proc"}
	// err := validateProc(&pl)
	// if err != nil {
	// 	t.Fatalf(err.Error())
	// }

	// // true: process is external to MEEP false: process is internal to MEEP
	// IsExternal bool `json:"isExternal,omitempty"`