blob: 33b1adb9c57df1b6eba89dc68abd4fc55f69a630 [file] [log] [blame]
"""Functions related to test planning.
See proto definitions for descriptions of arguments.
"""
# Needed to load from @proto. Add @unused to silence lint.
load("//config/util/bindings/proto.star", "protos")
load(
"@proto//chromiumos/config/api/test/plan/v1/plan.proto",
plan_pb = "chromiumos.config.api.test.plan.v1",
)
def _get_exclusion_type(type):
"""Get the exclusion type enum.
Args:
type: the exclusion type string.
Returns:
Exclusion type enum
"""
if type == "PERMANENT":
return plan_pb.Exclusion.PERMANENT
if type == "TEMPORARY_NEW_TEST":
return plan_pb.Exclusion.TEMPORARY_NEW_TEST
if type == "TEMPORARY_PENDING_FIX":
return plan_pb.Exclusion.TEMPORARY_PENDING_FIX
return plan_pb.Exclusion.TYPE_UNSPECIFIED
def _get_exclusion_action(action):
"""Get the exclusion action enum.
Args:
action: the action type string.
Returns:
Exclusion action enum
"""
if action == "DO_NOT_SCHEDULE":
return plan_pb.Exclusion.DO_NOT_SCHEDULE
if action == "MARK_NON_CRITICAL":
return plan_pb.Exclusion.MARK_NON_CRITICAL
return plan_pb.Exclusion.ACTION_UNSPECIFIED
def _create_exclusion(
type = None,
action = None,
references = None):
"""Builds a test exclusion proto.
Args:
type: the exclusion type.
action: the exclusion action.
references: list of reference(s) associated.
Returns:
the Exclusion protobuf.
"""
return plan_pb.Exclusion(
type = _get_exclusion_type(type),
action = _get_exclusion_action(action),
references = references if references else None,
)
def _create_dut_criterion(attribute, values):
"""Builds a DutCriterion proto (see proto for args)
"""
return plan_pb.DutCriterion(
attribute = attribute,
values = values,
)
def _create_coverage_rule(name, dut_criteria, exclusion = None):
"""Builds a CoverageRule proto (see proto for args)
"""
return plan_pb.CoverageRule(
name = name,
dut_criteria = dut_criteria,
exclusion = exclusion,
)
def _append_unit(
units,
name,
suite_names = None,
coverage_rules = None,
exclusion = None):
"""Appends a test unit proto to existing units
Args:
units: the existing unit(s) to append to
name: name of the unit.
suite_names: list of test suite names to run.
coverage_rules: list of coverage rules that must be fulfilled.
exclusion: optional Exclusion for the entire unit.
Returns:
the Unit protobuf.
"""
units.append(_create_unit(name, suite_names, coverage_rules, exclusion))
def _create_unit(
name,
suite_names = None,
coverage_rules = None,
exclusion = None):
"""Builds a test unit proto.
Args:
name: name of the unit.
suite_names: list of test suite names to run.
coverage_rules: list of coverage rules that must be fulfilled.
exclusion: optional Exclusion for the entire unit.
Returns:
the Unit protobuf.
"""
suites = None
if suite_names:
suites = [plan_pb.Unit.Suite(name = name) for name in suite_names]
return plan_pb.Unit(
name = name,
suites = suites,
coverage_rules = coverage_rules,
exclusion = exclusion,
)
def _create_plan(name, units = None):
"""Builds a test plan proto.
Args:
name: name of the plan.
units: list of test units to include in the plan.
Returns:
the Plan protobuf.
"""
sorted_units = sorted(units, key = lambda u: u.name) if units else None
return plan_pb.Plan(name = name, units = sorted_units)
def _create_spec(plans):
"""Builds a test specification proto.
Args:
plans: list of test plans
Returns:
the Specification protobuf.
"""
return plan_pb.Specification(plans = plans if plans else None)
test_plan = struct(
create = _create_plan,
dut_criterion = struct(
create = _create_dut_criterion,
),
coverage_rule = struct(
create = _create_coverage_rule,
),
unit = struct(
append = _append_unit,
create = _create_unit,
),
spec = struct(
create = _create_spec,
),
)