# 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.
"""Full test of repo functionality in checkout module."""

from PB.recipe_modules.pigweed.checkout.tests.properties import InputProperties
from recipe_engine import post_process

DEPS = [
    'fuchsia/status_check',
    'pigweed/checkout',
    'pigweed/cq_deps',
    'recipe_engine/path',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = InputProperties

PYTHON_VERSION_COMPATIBILITY = "PY3"

REPO = 'https://pigweed.googlesource.com/pigweed_name'


def RunSteps(api, props):  # pylint: disable=invalid-name
    checkout = api.checkout(props.checkout_options)

    with api.step.nest('changes'):
        for i, change in enumerate(checkout.changes):
            with api.step.nest(str(i)) as pres:
                pres.step_summary_text = repr(change)
    with api.step.nest('snapshot_to_dir'):
        checkout.snapshot_to_dir(api.path['start_dir'].join('snapshot'))


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

    def cl(project, change, patchset=1, name='pigweed'):
        return api.checkout.cl(
            host='{}-review.googlesource.com'.format(name),
            project=project,
            change=change,
            patchset=patchset,
        )

    yield (
        api.status_check.test('ci')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.manifest_test_data()
        + api.checkout.root_files('foo', 'bar', '.repo')
    )

    yield (
        api.status_check.test('try')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(REPO)
        + api.checkout.manifest_test_data()
        + api.checkout.root_files('foo', '.repo')
        + api.checkout.all_changes_applied()
        + api.post_process(
            post_process.MustRun,
            'checkout pigweed.no non-standard branch names',
        )
    )

    yield (
        api.status_check.test('try-multiple')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
            ]
        )
        + api.checkout.manifest_test_data()
        + api.checkout.root_files('foo', '.repo')
        + api.checkout.all_changes_applied()
        + api.checkout.change_applied('pigweed:1234')
        + api.checkout.change_applied('default:2345')
    )

    yield (
        api.status_check.test('try-multiple-cqdeps')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            git_repo='https://pigweed.googlesource.com/pigweed_name',
            change_number=1234,
            patch_set=1,
        )
        + api.cq_deps.details(
            'pigweed:1234',
            message='Requires: default:2345',
            prefix='checkout pigweed.change data.process gerrit changes.',
        )
        + api.cq_deps.details(
            'default:2345',
            project='default_name',
            prefix='checkout pigweed.change data.process gerrit changes.',
        )
        + api.checkout.manifest_test_data()
        + api.checkout.root_files('foo', '.repo')
        + api.checkout.all_changes_applied()
        + api.checkout.change_applied('pigweed:1234')
        + api.checkout.change_applied('default:2345')
    )

    yield (
        api.status_check.test('try-multiple-onenotapplied')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
                cl('project-that-is-not-in-the-manifest', 3456),
            ]
        )
        + api.checkout.manifest_test_data(name='pigweed')
        + api.checkout.root_files('foo', '.repo')
        + api.checkout.some_changes_applied()
        + api.checkout.change_not_applied('pigweed:3456')
    )

    yield (
        api.status_check.test(
            'try_repo_not_in_manifest', status='infra_failure'
        )
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data('https://foo.googlesource.com/bar')
        + api.checkout.manifest_test_data()
        + api.checkout.no_changes_applied()
    )

    yield (
        api.status_check.test('try_manifest')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(api.checkout.manifest_repo)
        + api.checkout.cl_branch_parents('feature-not-in-manifest')
        + api.checkout.manifest_test_data()
        + api.checkout.root_files('foo')
        + api.checkout.all_changes_applied()
    )

    yield (
        api.status_check.test('feature_branches_try')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(REPO)
        + api.checkout.cl_branch_parents('feature1')
        + api.checkout.manifest_has_matching_branch('feature1')
        + api.checkout.manifest_test_data()
        + api.checkout.all_changes_applied()
    )

    yield (
        api.status_check.test('feature_branches_try_multiple_features')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
            ]
        )
        + api.checkout.cl_branch_parents('feature1', index=0)
        + api.checkout.cl_branch_parents('feature2', index=1)
        + api.checkout.manifest_has_matching_branch('feature1')
        + api.checkout.manifest_test_data()
        + api.checkout.all_changes_applied()
        + api.post_process(
            post_process.DoesNotRun,
            'checkout pigweed.no non-standard branch names',
        )
        + api.post_process(
            post_process.DoesNotRun,
            'checkout pigweed.not matching branch names',
        )
    )

    yield (
        api.status_check.test(
            'feature_branches_try_multiple_matches', status='failure'
        )
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
            ]
        )
        + api.checkout.cl_branch_parents('feature1', index=0)
        + api.checkout.cl_branch_parents('feature2', index=1)
        + api.checkout.manifest_has_matching_branch('feature1')
        + api.checkout.manifest_has_matching_branch('feature2')
        + api.checkout.all_changes_applied()
        + api.post_process(
            post_process.DoesNotRun,
            'checkout pigweed.not matching branch names',
        )
    )

    yield (
        api.status_check.test('feature_branches_try_no_matching')
        + api.properties(**api.checkout.repo_properties(match_branch=False))
        + api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
            ]
        )
        + api.checkout.cl_branch_parents('feature1', index=0)
        + api.checkout.cl_branch_parents('feature2', index=1)
        + api.checkout.manifest_test_data()
        + api.checkout.all_changes_applied()
        + api.post_process(
            post_process.MustRun, 'checkout pigweed.not matching branch names',
        )
    )

    yield (
        api.status_check.test('feature_branches_ci')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.ci_test_data(
            'https://pigweed.googlesource.com/pinned', branch='feature1'
        )
        + api.checkout.manifest_has_matching_branch('feature1')
        + api.checkout.manifest_test_data()
    )

    yield (
        api.status_check.test('no_trigger')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.manifest_test_data()
    )

    yield (
        api.status_check.test('prefix')
        + api.properties(**api.checkout.repo_properties())
        + api.checkout.try_test_data(
            "https://foo.googlesource.com/prefix/suffix"
        )
        + api.checkout.manifest_test_data()
        + api.checkout.all_changes_applied()
    )
