def testArgDefn(): name = 'SEQ_ENABLE_DISABLE' defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.bytes == [0, 1] assert arg.desc == None assert arg.enum == None assert arg.fixed == False assert arg.name == 'sequence_id' assert arg.nbytes == 2 assert arg.range == None assert arg.slice() == slice(0, 2) assert arg.type == dtype.get('MSB_U16') assert arg.units == None assert arg.value == None assert type(repr(arg)) is str arg = defn.argdefns[1] assert arg.bytes == 2 assert arg.desc == None assert arg.enum == {'DISABLED': 0, 'ENABLED': 1} assert arg.fixed == False assert arg.name == 'enable' assert arg.nbytes == 1 assert arg.range == None assert arg.slice() == slice(2, 3) assert arg.type == dtype.get('U8') assert arg.units == None assert arg.value == None assert type(repr(arg)) is str
def testCmdDefn(): name = 'SEQ_ENABLE_DISABLE' defn = cmd.CmdDict(CMDDICT_TEST)[name] assert defn.name == name assert defn.opcode == 0x0042 assert defn.nargs == 2
def testArgDefn(): name = "SEQ_ENABLE_DISABLE" defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.bytes == [0, 1] assert arg.desc == None assert arg.enum == None assert arg.fixed == False assert arg.name == "sequence_id" assert arg.nbytes == 2 assert arg.range == None assert arg.slice() == slice(0, 2) assert arg.type == dtype.get("MSB_U16") assert arg.units == None assert arg.value == None assert type(repr(arg)) is str arg = defn.argdefns[1] assert arg.bytes == 2 assert arg.desc == None assert arg.enum == {"DISABLED": 0, "ENABLED": 1} assert arg.fixed == False assert arg.name == "enable" assert arg.nbytes == 1 assert arg.range == None assert arg.slice() == slice(2, 3) assert arg.type == dtype.get("U8") assert arg.units == None assert arg.value == None assert type(repr(arg)) is str
def testArgDefnEncode(): name = 'SEQ_ENABLE_DISABLE' defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.encode(1234) == struct.pack('>H', 1234) arg = defn.argdefns[1] assert arg.encode('DISABLED') == struct.pack('>B', 0) assert arg.encode('ENABLED') == struct.pack('>B', 1) assert arg.encode(2) == struct.pack('>B', 2)
def testArgDefnDecode(): name = 'SEQ_ENABLE_DISABLE' defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.decode(struct.pack('>H', 1234)) == 1234 arg = defn.argdefns[1] assert arg.decode(struct.pack('>B', 0)) == 'DISABLED' assert arg.decode(struct.pack('>B', 1)) == 'ENABLED' assert arg.decode(struct.pack('>B', 2)) == 2
def testArgDefnEncode(): name = "SEQ_ENABLE_DISABLE" defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.encode(1234) == struct.pack(">H", 1234) arg = defn.argdefns[1] assert arg.encode("DISABLED") == struct.pack(">B", 0) assert arg.encode("ENABLED") == struct.pack(">B", 1) assert arg.encode(2) == struct.pack(">B", 2)
def testArgDefnDecode(): name = "SEQ_ENABLE_DISABLE" defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.decode(struct.pack(">H", 1234)) == 1234 arg = defn.argdefns[1] assert arg.decode(struct.pack(">B", 0)) == "DISABLED" assert arg.decode(struct.pack(">B", 1)) == "ENABLED" assert arg.decode(struct.pack(">B", 2)) == 2
def testArgDefnValidate(): name = 'SEQ_ENABLE_DISABLE' defn = cmd.CmdDict(CMDDICT_TEST)[name] arg = defn.argdefns[0] assert arg.validate(1) == True assert arg.validate(1.2) == False arg.range = [0, 2] assert arg.validate(0) == True assert arg.validate(1) == True assert arg.validate(2) == True assert arg.validate(3) == False arg = defn.argdefns[1] assert arg.validate('ENABLED') == True assert arg.validate('DISABLED') == True assert arg.validate('FOOBAR') == False msgs = [] assert arg.validate('FOOBAR', msgs) == False assert len(msgs) > 0
def content_val(self, ymldata=None, messages=None): """Validates the Command Dictionary to ensure the contents for each of the fields meets specific criteria regarding the expected types, byte ranges, etc.""" self._ymlproc = YAMLProcessor(self._ymlfile, False) # Turn off the YAML Processor log.debug("BEGIN: Content-based validation of Command dictionary") if ymldata is not None: cmddict = ymldata else: cmddict = cmd.CmdDict(self._ymlfile) try: # instantiate the document number. this will increment in order to # track the line numbers and section where validation fails docnum = 0 # boolean to hold argument validity argsvalid = True # list of rules to validate against rules = [] # set the command rules # # set uniqueness rule for command names rules.append( UniquenessRule("name", "Duplicate command name: %s", messages)) # set uniqueness rule for opcodes rules.append( UniquenessRule("opcode", "Duplicate opcode: %s", messages)) for key in cmddict.keys(): cmddefn = cmddict[key] for rule in rules: rule.check(cmddefn) # list of argument rules to validate against argrules = [] # set rules for command arguments # # set uniqueness rule for opcodes argrules.append( UniquenessRule( "name", "Duplicate argument name: " + cmddefn.name + ".%s", messages, )) # set type rule for arg.type argrules.append( TypeRule( "type", "Invalid argument type for argument: " + cmddefn.name + ".%s", messages, )) # set argument size rule for arg.type.nbytes argrules.append( TypeSizeRule( "nbytes", "Invalid argument size for argument: " + cmddefn.name + ".%s", messages, )) # set argument enumerations rule to check no enumerations contain un-quoted YAML special variables argrules.append( EnumRule( "enum", "Invalid enum value for argument: " + cmddefn.name + ".%s", messages, )) # set byte order rule to ensure proper ordering of aruguments argrules.append( ByteOrderRule( "bytes", "Invalid byte order for argument: " + cmddefn.name + ".%s", messages, )) # ### argdefns = cmddefn.argdefns for arg in argdefns: # check argument rules for rule in argrules: rule.check(arg) # check if argument rule failed, if so set the validity to False if not all(r.valid is True for r in argrules): argsvalid = False log.debug("END: Content-based validation complete for '%s'", self._ymlfile) # check validity of all command rules and argument validity return all(rule.valid is True for rule in rules) and argsvalid except util.YAMLValidationError as e: # Display the error message if messages is not None: if len(e.message) < 128: msg = ("Validation Failed for YAML file '" + self._ymlfile + "': '" + str(e.message) + "'") else: msg = "Validation Failed for YAML file '" + self._ymlfile + "'" log.error(msg) self.ehandler.process(docnum, self.ehandler.doclines, e, messages) return False