# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Recipe for testing recipes."""

from PB.recipes.pigweed.recipes import InputProperties

DEPS = [
    'fuchsia/commit_queue',
    'fuchsia/recipe_testing',
    'fuchsia/status_check',
    'pigweed/checkout',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = InputProperties

PYTHON_VERSION_COMPATIBILITY = "PY3"

# If this build is being triggered from a change to this recipe, we need
# to explicitly pass a CL. The most recent passing run of
# pigweed.try/recipes could have any number of different subbuilds kicked
# off. In that case alter the recipes build to run on a specific CL that
# modifies the xrefs recipe alone, because that recipe is used by
# relatively few CQ builders.
SELFTEST_CL = (
    'https://pigweed-review.googlesource.com/c/infra/recipes/+/21160/2'
)

COMMIT_QUEUE_CFG = """
    submit_options: <
      max_burst: 4
      burst_delay: <
        seconds: 480
      >
    >

    config_groups: <
      gerrit: <
        url: "https://pigweed-review.googlesource.com"
        projects: <
          name: "project"
          ref_regexp: "refs/heads/.+"
        >
      >

      verifiers: <
        gerrit_cq_ability: <
          committer_list: "project-pigweed-committers"
          dry_run_access_list: "project-pigweed-tryjob-access"
        >
        tryjob: <
          builders: <
            name: "pigweed/try/pigweed-baz"
            location_regexp: ".*"
            location_regexp_exclude: ".+/[+]/.*\\.md"
          >
        >
      >
    >

    config_groups: <
      gerrit: <
        url: "https://pigweed-review.googlesource.com"
        projects: <
          name: "pigweed/pigweed"
          ref_regexp: "refs/heads/.+"
        >
      >
      verifiers: <
        gerrit_cq_ability: <
          committer_list: "project-pigweed-committers"
          dry_run_access_list: "project-pigweed-tryjob-access"
        >

        tryjob: <
          builders: <
            name: "pigweed/try/pigweed-bar"
            location_regexp: ".*"
            location_regexp_exclude: ".+/[+]/.*\\.md"
            location_regexp_exclude: ".+/[+].*/docs/.+"
          >
          builders: <
            name: "pigweed/try/pigweed-foo"
            location_regexp: ".*"
            location_regexp_exclude: ".+/[+]/.*\\.md"
            location_regexp_exclude: ".+/[+].*/docs/.+"
          >
        >
      >
    >
"""


def RunSteps(api, props):
    api.checkout()

    api.recipe_testing.projects = ('pigweed',)

    with api.step.defer_results():
        api.recipe_testing.run_lint(
            api.checkout.root,
            allowlist='xml|ConfigParser|StringIO|six.moves.urllib',
        )
        api.recipe_testing.run_unit_tests(api.checkout.root)

    if not props.unittest_only:
        api.recipe_testing.run_tests(
            api.checkout.root,
            SELFTEST_CL,
            include_public=props.include_public,
            include_private=props.include_private,
        )


def GenTests(api):  # pylint: disable=invalid-name
    """Create tests."""

    def properties(**kwargs):
        new_kwargs = api.checkout.git_properties()
        new_kwargs.update(kwargs)
        return api.properties(**new_kwargs)

    yield (
        api.status_check.test('cq_try')
        + properties(
            unittest_only=False, include_public=True, include_private=False
        )
        + api.checkout.try_test_data()
        + api.commit_queue.test_data('pigweed', COMMIT_QUEUE_CFG)
        + api.recipe_testing.affected_recipes_data(['none'])
        + api.recipe_testing.build_data(
            'pigweed/try/pigweed-foo', 'pigweed', skip=True, project='pigweed'
        )
        + api.recipe_testing.build_data(
            'pigweed/try/pigweed-bar', 'pigweed', skip=True, project='pigweed'
        )
        + api.recipe_testing.build_data(
            'pigweed/try/pigweed-baz', 'project', skip=True, project='pigweed'
        )
    )
