# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

load('@stdlib//internal/graph.star', 'graph')
load(
    "@proto//external/crostesting/source_tree_test_config.proto",
    source_tree_test_config_pb="crostesting")

source_tree_kind = 'source_tree'
# Set up the root node in the graph.
root_key = graph.key(source_tree_kind, '...')

def set_up_graph():
  """Call this once to set up the Starlark graph root node."""
  graph.add_node(root_key)

def source_tree_test_config(
    source_trees,
    disable_hw_tests=False,
    disable_image_tests=False,
    disable_vm_tests=False):
  """Create SourceTreeTestRestriction and bind it in the Starlark graph.

  Args:
    source_trees: list(string) of source tree paths
    disable_hw_tests: boolean, whether to disable hardware tests
    disable_image_tests: boolean, whether to disable image tests
    disable_vm_tests: boolean, whether to disable virtual machine tests
  """
  for source_tree_name in source_trees:
    source_tree_test_restriction = (
        source_tree_test_config_pb.SourceTreeTestRestriction(
            source_tree = source_tree_test_config_pb.SourceTree(
                path=source_tree_name)))

    test_restriction = source_tree_test_config_pb.TestRestriction(
        disable_hw_tests=disable_hw_tests,
        disable_image_tests=disable_image_tests,
        disable_vm_tests=disable_vm_tests)
    source_tree_test_restriction.test_restriction = test_restriction

    graph.add_node(
        graph.key(source_tree_kind, source_tree_name),
        props={'source_tree_test_restriction': source_tree_test_restriction})
    graph.add_edge(root_key, graph.key(source_tree_kind, source_tree_name))


def gen(ctx):
  """Called by lucicfg to run Starlark and generate the output config."""
  # Collect the restrictions and sort them on source tree path.
  source_tree_test_restrictions = (
      [n.props.source_tree_test_restriction
       for n in graph.children(root_key, source_tree_kind)])
  sorted(source_tree_test_restrictions, key=lambda s: s.source_tree.path)
  repo_test_config = source_tree_test_config_pb.SourceTreeTestCfg(
      source_tree_test_restriction=source_tree_test_restrictions
  )
  ctx.config_set['source_tree_test_config.cfg'] = (
      proto.to_jsonpb(repo_test_config))

lucicfg.generator(impl = gen)
