| # 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. |
| """Constraint checks related to form factors.""" |
| |
| import pathlib |
| |
| from typing import Iterable |
| |
| from checker import constraint_suite |
| from checker import config_bundle_utils |
| |
| from chromiumos.config.payload import config_bundle_pb2 |
| from chromiumos.config.api import design_pb2 |
| from chromiumos.config.api import program_pb2 |
| from chromiumos.config.api import topology_pb2 |
| |
| |
| def get_form_factor_constraints( |
| program: program_pb2.Program |
| ) -> Iterable[design_pb2.Design.Config.Constraint]: |
| """Returns all Constraints on FormFactor.""" |
| return [ |
| c for c in program.design_config_constraints |
| if c.features.form_factor.form_factor |
| ] |
| |
| |
| class FormFactorConstraintSuite(constraint_suite.ConstraintSuite): |
| """Constraint checks related to form factors.""" |
| |
| def check_form_factor( |
| self, |
| program_config: config_bundle_pb2.ConfigBundle, |
| project_config: config_bundle_pb2.ConfigBundle, |
| factory_dir: pathlib.Path, |
| ): |
| """Checks a project uses a form factor allowed by a program.""" |
| del factory_dir |
| |
| program = config_bundle_utils.get_program(program_config) |
| allowed_form_factors = [] |
| # Alias the FormFactor.Name fn. to increase readability. This fn. is used to |
| # produce human-readable error messages. |
| form_factor_name = ( |
| topology_pb2.HardwareFeatures.FormFactor.FormFactorType.Name) |
| |
| for constraint in get_form_factor_constraints(program): |
| allowed_form_factors.append( |
| form_factor_name(constraint.features.form_factor.form_factor)) |
| |
| for design in project_config.design_list: |
| for config in design.configs: |
| self.assertIn( |
| form_factor_name(config.hardware_features.form_factor.form_factor), |
| allowed_form_factors) |
| |
| def check_form_factor_required( |
| self, |
| program_config: config_bundle_pb2.ConfigBundle, |
| project_config: config_bundle_pb2.ConfigBundle, |
| factory_dir: pathlib.Path, |
| ): |
| """Checks all form factor constraints are REQUIRED.""" |
| del project_config, factory_dir |
| program = config_bundle_utils.get_program(program_config) |
| |
| for constraint in program.design_config_constraints: |
| self.assertEqual(constraint.level, |
| design_pb2.Design.Config.Constraint.REQUIRED, |
| 'FormFactor constraints must be REQUIRED.') |