Ejemplo n.º 1
0
    def testParseFieldFoldersFromGoodFilesWithSubfieldUniverse(self):
        subfield_folders = parse.ParseSubfieldFoldersFromFiles(
            [self.global_subfields_file, self.local_subfields_file])
        subfield_universe = subfield_lib.SubfieldUniverse(subfield_folders)

        field_folders = parse.ParseFieldFoldersFromFiles(
            [self.global_fields_file, self.local_fields_file],
            subfield_universe=subfield_universe)
        # Should have two namespace objects
        self.assertLen(field_folders, 2)
        for folder in field_folders:
            self.assertEmpty(folder.GetFindings())
            if folder.parent_namespace is None:
                # check global namespace
                # Should have 4 fields in global namespace
                global_fields = folder.local_namespace.fields
                self.assertLen(global_fields, 4)
                self.assertIn(frozenset({'fan', 'run', 'status'}),
                              global_fields)
                self.assertIn(frozenset({'dryer', 'run', 'status'}),
                              global_fields)
                self.assertIn(frozenset({'command', 'fan', 'run'}),
                              global_fields)
                self.assertIn(frozenset({'current', 'sensor'}), global_fields)
            else:
                # check local namespace
                self.assertIn(
                    frozenset({'air', 'sensor', 'temperature', 'zone'}),
                    folder.local_namespace.fields)
Ejemplo n.º 2
0
 def testParseFieldFoldersFromBadFileDuplicateKeys(self):
     bad_fields = base_lib.PathParts(
         root=self.base_dir,
         relative_path='BAD/fields/duplicate_literal_fields.yaml')
     field_folders = parse.ParseFieldFoldersFromFiles([bad_fields])
     # Error is added to the folder it is found in, even if fields may uplevel
     local_folder = field_folders[1]
     self.assertTrue(
         local_folder.HasFindingTypes([findings_lib.DuplicateKeyError]))
Ejemplo n.º 3
0
def BuildUniverse(config):
    """Verifies that the ontology config is consistent and valid.

  Args:
    config: a Config namedtuple containing lists of localpaths to config files.

  Returns:
     A ConfigUniverse that is fully populated with all content specified in the
     config.
  """
    # Parse state files
    state_universe = None
    if config.states:
        state_folders = parse.ParseStateFoldersFromFiles(config.states)
        state_universe = state_lib.StateUniverse(state_folders)

    connections_universe = None
    if config.connections:
        connection_folders = parse.ParseConnectionFoldersFromFiles(
            config.connections)
        connections_universe = connection_lib.ConnectionUniverse(
            connection_folders)

    # Parse subfield files
    subfields_universe = None
    if config.subfields:
        subfield_folders = parse.ParseSubfieldFoldersFromFiles(
            config.subfields)
        subfields_universe = subfield_lib.SubfieldUniverse(subfield_folders)

    # Parse unit files
    unit_universe = None
    if config.units:
        unit_folders = parse.ParseUnitFoldersFromFiles(config.units,
                                                       subfields_universe)
        unit_universe = unit_lib.UnitUniverse(unit_folders)
        if subfields_universe:
            subfields_universe.ValidateUnits(unit_universe)

    # Parse fields files
    fields_universe = None
    if config.fields:
        field_folders = parse.ParseFieldFoldersFromFiles(
            config.fields, subfields_universe, state_universe)
        fields_universe = field_lib.FieldUniverse(field_folders)

    # Parse typedef files
    type_folders = parse.ParseTypeFoldersFromFiles(config.type_defs,
                                                   fields_universe)
    types_universe = entity_type_lib.EntityTypeUniverse(type_folders)

    # return findings_list, result_namespaces
    return ConfigUniverse(types_universe, fields_universe, subfields_universe,
                          state_universe, connections_universe, unit_universe)
Ejemplo n.º 4
0
 def testParseFieldFoldersFromBadFile(self):
     bad_fields = base_lib.PathParts(
         root=self.base_dir,
         relative_path='BAD/fields/bad_local_fields.yaml')
     field_folders = parse.ParseFieldFoldersFromFiles([bad_fields])
     # should have 2 folders. (global folder is created automatically)
     self.assertLen(field_folders, 2)
     # Field in bad_local will be upleveled to global ns
     global_folder = field_folders[0]
     self.assertTrue(
         global_folder.local_namespace.HasFindingTypes(
             [findings_lib.DuplicateFieldDefinitionError]))
Ejemplo n.º 5
0
    def testParseFieldFoldersFromBadFileWithStateUniverse(self):
        state_folders = parse.ParseStateFoldersFromFiles(
            [self.global_states_file, self.local_states_file])
        state_universe = state_lib.StateUniverse(state_folders)

        bad_fields = base_lib.PathParts(
            root=self.base_dir,
            relative_path='BAD/fields/bad_state_fields.yaml')
        field_folders = parse.ParseFieldFoldersFromFiles(
            [bad_fields], state_universe=state_universe)
        local_folder = field_folders[1]
        self.assertTrue(
            local_folder.HasFindingTypes(
                [findings_lib.InvalidStateFormatError]))
        self.assertTrue(
            local_folder.HasFindingTypes([findings_lib.DuplicateStateError]))
        self.assertTrue(
            local_folder.HasFindingTypes([findings_lib.MissingStateError]))
Ejemplo n.º 6
0
    def testParseFieldFoldersFromGoodFilesWithStateUniverse(self):
        state_folders = parse.ParseStateFoldersFromFiles(
            [self.global_states_file, self.local_states_file])
        state_universe = state_lib.StateUniverse(state_folders)

        field_folders = parse.ParseFieldFoldersFromFiles(
            [self.state_fields_file], state_universe=state_universe)
        self.assertLen(field_folders, 2)
        for folder in field_folders:
            self.assertEmpty(folder.GetFindings())
            if folder.parent_namespace is not None:
                # field_two uses local states and isn't up-leveled
                self.assertSameElements([frozenset({'field', 'two'})],
                                        folder.local_namespace.fields)
            else:
                self.assertSameElements([
                    frozenset({'field', 'one'}),
                    frozenset({'field', 'three'})
                ], folder.local_namespace.fields)
Ejemplo n.º 7
0
 def testParseFieldFoldersFromGoodFilesNoSubfieldUniverse(self):
     field_folders = parse.ParseFieldFoldersFromFiles(
         [self.global_fields_file, self.local_fields_file])
     # Should have two namespace objects
     self.assertLen(field_folders, 2)
     for folder in field_folders:
         self.assertFalse(folder.GetFindings())
         if folder.parent_namespace is None:
             # check global namespace
             # All the fields should be global. The field in local_fields_file is
             # upleveled
             # Should have 5 fields in global namespace
             global_fields = folder.local_namespace.fields
             self.assertLen(global_fields, 5)
             self.assertIn(frozenset({'fan', 'run', 'status'}),
                           global_fields)
             self.assertIn(frozenset({'dryer', 'run', 'status'}),
                           global_fields)
             self.assertIn(frozenset({'command', 'fan', 'run'}),
                           global_fields)
             self.assertIn(
                 frozenset({'air', 'sensor', 'temperature', 'zone'}),
                 global_fields)
             self.assertIn(frozenset({'current', 'sensor'}), global_fields)