def testConfigUniverseGetUnitsForMeasurementMultipleNoUnits(self): doc = { 'powerfactor': [{ 'no_units': 'STANDARD' }, 'another_one'], 'voltageratio': [{ 'no_units': 'STANDARD' }], } folder = unit_lib.UnitFolder('units/anyfolder') folder.AddFromConfig([doc], 'units/anyfolder/units.yaml') unit_universe = unit_lib.UnitUniverse([folder]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=None, field_universe=None, entity_type_universe=None, state_universe=None, connection_universe=None, unit_universe=unit_universe) units1 = config_universe.GetUnitsForMeasurement('powerfactor_sensor') units2 = config_universe.GetUnitsForMeasurement('voltageratio_sensor') self.assertSameElements(['no_units', 'another_one'], units1) self.assertSameElements(['no_units'], units2)
def testConfigUniverseGetStatesByField(self): meow_states = ['HUNGRY', 'SNUGGLY'] meow_cat = field_lib.Field('meow_cat') meow_cat.states = meow_states claw_states = ['HISSY', 'BITEY'] claws_cat = field_lib.Field('claws_cat') claws_cat.states = claw_states global_folder = field_lib.FieldFolder('fields/anyfolder') folder = field_lib.FieldFolder('localnamespace/fields/anyfolder', global_folder.local_namespace) folder.local_namespace.PutIfAbsent(meow_cat) global_folder.local_namespace.PutIfAbsent(claws_cat) field_universe = field_lib.FieldUniverse([folder, global_folder]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=None, field_universe=field_universe, entity_type_universe=None, state_universe=None, connection_universe=None, unit_universe=None) self.assertSameElements(claw_states, config_universe.GetStatesByField('/claws_cat')) self.assertSameElements( meow_states, config_universe.GetStatesByField('localnamespace/meow_cat'))
def testConfigUniverseGetUnitsForMeasurement(self): folder = unit_lib.UnitFolder('units/anyfolder') namespace = folder.local_namespace namespace.InsertUnit( unit_lib.Unit('degrees_celsius', 'temperature', False)) namespace.InsertUnit(unit_lib.Unit('kelvin', 'temperature', True)) unit_universe = unit_lib.UnitUniverse([folder]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=None, field_universe=None, entity_type_universe=None, state_universe=None, connection_universe=None, unit_universe=unit_universe) units = config_universe.GetUnitsForMeasurement( 'zone_temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement( '/zone_temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('/temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('pressure_sensor') self.assertIsNone(units) units = config_universe.GetUnitsForMeasurement( 'discharge_fan_lost_power_alarm') self.assertIsNone(units)
def testConfigUniverseGetEntityType(self): context = findings_lib.FileContext('') type_universe = entity_type_lib.EntityTypeUniverse([]) type_universe.AddFinding( findings_lib.IllegalCharacterError('stuff', context)) field_universe = field_lib.FieldUniverse([]) field_universe.AddFinding( findings_lib.InconsistentFileLocationError('', context)) subfield_universe = subfield_lib.SubfieldUniverse([]) subfield_universe.AddFinding( findings_lib.CapitalizationError('Hi', context)) state_universe = state_lib.StateUniverse([]) connection_universe = connection_lib.ConnectionUniverse([]) unit_universe = unit_lib.UnitUniverse([]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=subfield_universe, field_universe=field_universe, entity_type_universe=type_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) entity_type = config_universe.GetEntityType('NONEXISTENT', 'NONEXISTENT') self.assertIsNone(entity_type)
def testConfigUniverse(self): context = findings_lib.FileContext('') type_universe = entity_type_lib.EntityTypeUniverse([]) type_universe.AddFinding( findings_lib.IllegalCharacterError('stuff', context)) field_universe = field_lib.FieldUniverse([]) field_universe.AddFinding( findings_lib.InconsistentFileLocationError('', context)) subfield_universe = subfield_lib.SubfieldUniverse([]) subfield_universe.AddFinding( findings_lib.CapitalizationError('Hi', context)) state_universe = state_lib.StateUniverse([]) connection_universe = connection_lib.ConnectionUniverse([]) connection_universe.AddFinding( findings_lib.InvalidConnectionNamespaceError('notglobal', context)) unit_universe = unit_lib.UnitUniverse([]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=subfield_universe, field_universe=field_universe, entity_type_universe=type_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) findings = config_universe.GetFindings() self.assertLen(findings, 4) self.assertTrue( config_universe.HasFindingTypes([ findings_lib.InconsistentFileLocationError, findings_lib.IllegalCharacterError, findings_lib.CapitalizationError, findings_lib.InvalidConnectionNamespaceError ])) self.assertFalse(config_universe.IsValid())
def testInstanceLinkSourceFieldValidation(self, mock_fn): field_u = field_lib.FieldUniverse([]) config_u = presubmit_validate_types_lib.ConfigUniverse( None, field_u, None, None, None, None) mock_fn.side_effect = lambda f, ns: f == 'run_status' validator = entity_instance.InstanceValidator(config_u, _UPDATE_CFG) src_ok = entity_instance.EntityInstance( _UPDATE, 'AHU-1', links=[link.Link('CTRL-1', {'run_status': 'run_status'})], etag='123') bad_src_field = entity_instance.EntityInstance( _UPDATE, 'AHU-1', links=[link.Link('CTRL-1', {'nonexistent_status': 'run_status'})], etag='123') self.assertFalse(validator.Validate(bad_src_field)) self.assertTrue(validator.Validate(src_ok))
def create_simplified_universe( ) -> presubmit_validate_types_lib.ConfigUniverse: """Creates a simplified test universe with minimal configuration for testing. Returns: config_universe a partially defined ConfigUniverse """ # constant universes state_universe = states.STATE_UNIVERSE connection_universe = connections.CONNECTION_UNIVERSE subfield_universe = subfields.SUBFIELD_UNIVERSE # update unit folder with subfield_universe unit_folder = unit_lib.UnitFolder(folderpath='units') unit_folder.local_namespace.subfields = subfield_universe.GetSubfieldsMap( unit_folder.local_namespace.namespace) unit_folder.AddFromConfig(config_filename='units/units.yaml', documents=[units.UNIT_DOCUMENT]) unit_universe = unit_lib.UnitUniverse(folders=[unit_folder]) # subfield universe has to validate unit universe subfield_universe.ValidateUnits(unit_universe) # field universe depends on subfield and state universes field_folder = field_lib.FieldFolder(folderpath='fields') field_folder.local_namespace.subfields = subfield_universe.GetSubfieldsMap( field_folder.local_namespace.namespace) field_folder.local_namespace.states = state_universe.GetStatesMap( field_folder.local_namespace.namespace) field_folder.AddFromConfig(config_filename='fields/telemetry_fields.yaml', documents=[fields.TELEMETRY_FIELDS_DOCUMENT]) field_folder.AddFromConfig(config_filename='fields/metadata_fields.yaml', documents=[fields.METADATA_FIELDS_DOCUMENT]) field_universe = field_lib.FieldUniverse(folders=[field_folder]) # entity type universe depends on field universe global_type_folder = entity_type_lib.EntityTypeFolder( folderpath='entity_types', field_universe=field_universe) facilities_type_folder = entity_type_lib.EntityTypeFolder( folderpath='FACILITIES/entity_types', field_universe=field_universe) hvac_type_folder = entity_type_lib.EntityTypeFolder( folderpath='HVAC/entity_types', field_universe=field_universe) global_type_folder.AddFromConfig( config_filename='entity_types/global.yaml', documents=[types.GLOBAL_TYPES_DOCUMENT]) facilities_type_folder.AddFromConfig( config_filename='FACILITIES/entity_types/Facilities.yaml', documents=[types.FACILITIES_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/ANALYSIS.yaml', documents=[types.HVAC_ANALYSIS_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/ABSTRACT.yaml', documents=[types.HVAC_ABSTRACT_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/CHWS.yaml', documents=[types.HVAC_CHWS_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/GENERALTYPES.yaml', documents=[types.HVAC_GENERAL_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/SDC.yaml', documents=[types.HVAC_SDC_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/DMP.yaml', documents=[types.HVAC_DMP_TYPES_DOCUMENT]) entity_type_universe = entity_type_lib.EntityTypeUniverse( entity_type_folders=[ global_type_folder, facilities_type_folder, hvac_type_folder ]) config_universe = presubmit_validate_types_lib.ConfigUniverse( entity_type_universe=entity_type_universe, field_universe=field_universe, subfield_universe=subfield_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) # call this to expand inherited fields namespace_validator.NamespaceValidator( config_universe.GetEntityTypeNamespaces()) return config_universe