| # Copyright 2020 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Tests for check_topology.""" |
| |
| import unittest |
| |
| from checker.common_checks.check_topology import TopologyConstraintSuite |
| |
| from chromiumos.config.payload.config_bundle_pb2 import ConfigBundle |
| from chromiumos.config.api.component_pb2 import Component |
| from chromiumos.config.api.design_pb2 import Design |
| from chromiumos.config.api.hardware_topology_pb2 import HardwareTopology |
| from chromiumos.config.api.topology_pb2 import (HardwareFeatures, Topology) |
| |
| |
| class CheckIdsTest(unittest.TestCase): |
| """Tests for check_topology.""" |
| |
| def setUp(self): |
| """Creates objects to be shared between tests.""" |
| self.screen_1_topology = Topology( |
| id="part1", |
| type=Topology.SCREEN, |
| description={'EN': 'The first type of screen.'}, |
| hardware_feature=HardwareFeatures( |
| screen=HardwareFeatures.Screen( |
| panel_properties=Component.DisplayPanel.Properties( |
| diagonal_milliinch=10)))) |
| |
| self.screen_2_topology = Topology( |
| id="part2", |
| type=Topology.SCREEN, |
| description={'EN': 'The second type of screen.'}, |
| hardware_feature=HardwareFeatures( |
| screen=HardwareFeatures.Screen( |
| panel_properties=Component.DisplayPanel.Properties( |
| diagonal_milliinch=20)))) |
| |
| self.keyboard_1_topology = Topology( |
| id="part1", |
| type=Topology.KEYBOARD, |
| description={'EN': 'The first type of keyboard.'}, |
| hardware_feature=HardwareFeatures( |
| keyboard=HardwareFeatures.Keyboard( |
| backlight=HardwareFeatures.PRESENT)), |
| ) |
| |
| def test_check_topologies_consistent(self): |
| """Tests no assertions thrown when topologies are consistent.""" |
| # Screen topologies differ in id and type between configs. The same keyboard |
| # topology is used by both configs (the entire message, including id and |
| # type match). |
| # |
| # Note that screen_1_topology and keyboard_1_topology share the same id |
| # ("part1"), but are a different type, so do not violate the constraint. |
| project_config = ConfigBundle(design_list=[ |
| Design(configs=[ |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=self.screen_1_topology, |
| keyboard=self.keyboard_1_topology)), |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=self.screen_2_topology, |
| keyboard=self.keyboard_1_topology)) |
| ]) |
| ]) |
| |
| TopologyConstraintSuite().run_checks( |
| program_config=None, |
| project_config=project_config, |
| factory_dir=None, |
| ) |
| |
| def test_check_topologies_consistent_violated(self): |
| """Tests assertion thrown when topologies are inconsistent.""" |
| # Create a copy of the first screen topology, but change the milliinch |
| # value. Now, a given id and type maps to two different messages. |
| invalid_screen_topology = Topology() |
| invalid_screen_topology.CopyFrom(self.screen_1_topology) |
| invalid_screen = invalid_screen_topology.hardware_feature.screen |
| invalid_screen.panel_properties.diagonal_milliinch = 20 |
| |
| project_config = ConfigBundle(design_list=[ |
| Design(configs=[ |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=self.screen_1_topology, |
| keyboard=self.keyboard_1_topology)), |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=invalid_screen_topology, |
| keyboard=self.keyboard_1_topology)) |
| ]) |
| ]) |
| |
| with self.assertRaisesRegex( |
| AssertionError, |
| r'Two different messages found for id and type \(part1, SCREEN\)*'): |
| TopologyConstraintSuite().run_checks( |
| program_config=None, |
| project_config=project_config, |
| factory_dir=None, |
| ) |
| |
| def test_check_topologies_consistent_violated_across_designs(self): |
| """Tests assertion thrown when topologies are inconsistent across designs. |
| """ |
| # Create a copy of the first screen topology, but change the milliinch |
| # value. Now, a given id and type maps to two different messages. |
| invalid_screen_topology = Topology() |
| invalid_screen_topology.CopyFrom(self.screen_1_topology) |
| invalid_screen = invalid_screen_topology.hardware_feature.screen |
| invalid_screen.panel_properties.diagonal_milliinch = 20 |
| |
| project_config = ConfigBundle(design_list=[ |
| Design(configs=[ |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=self.screen_1_topology, |
| keyboard=self.keyboard_1_topology)), |
| ]), |
| Design(configs=[ |
| Design.Config( |
| hardware_topology=HardwareTopology( |
| screen=invalid_screen_topology, |
| keyboard=self.keyboard_1_topology)) |
| ]) |
| ]) |
| |
| with self.assertRaisesRegex( |
| AssertionError, |
| r'Two different messages found for id and type \(part1, SCREEN\)*'): |
| TopologyConstraintSuite().run_checks( |
| program_config=None, |
| project_config=project_config, |
| factory_dir=None, |
| ) |