# 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 __future__ import annotations

from collections.abc import Iterator

from recipe_engine import post_process, recipe_api, recipe_test_api

from PB.recipe_modules.pigweed.checkout.tests.repo import InputProperties

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

INLINE_PROPERTIES_PROTO = """
import "recipe_modules/pigweed/checkout/options.proto";

message InputProperties {
  // Checkout module options.
  recipe_modules.pigweed.checkout.Options checkout_options = 1;
}
"""

PROPERTIES = InputProperties

PIGWEED_REPO = 'https://pigweed.googlesource.com/pigweed_name'
DEFAULT_REPO = 'https://default.googlesource.com/default_name'


def RunSteps(api: recipe_api.RecipeScriptApi, props: InputProperties):
    checkout = api.checkout(props.checkout_options)
    _ = checkout.manifest_path  # For coverage.

    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 / 'snapshot')


def GenTests(api) -> Iterator[recipe_test_api.TestData]:
    """Create tests."""

    def properties(**kwargs):
        props = InputProperties(
            checkout_options=api.checkout.repo_options(**kwargs)
        )
        return api.properties(props)

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

    yield api.test(
        'ci',
        properties(),
        api.checkout.manifest_test_data(),
    )

    yield api.test(
        'try',
        properties(manifest_groups=['group1']),
        api.checkout.try_test_data(PIGWEED_REPO),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.post_check(
            post_process.MustRun,
            'checkout pigweed.no non-standard branch names',
        ),
    )

    yield api.test(
        'try-multiple',
        properties(repo_depth=20),
        api.checkout.try_test_data(
            gerrit_changes=[
                cl('pigweed_name', 1234),
                cl('default_name', 2345, name='default'),
            ]
        ),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.checkout.change_applied('pigweed:1234'),
        api.checkout.change_applied('default:2345'),
    )

    yield api.test(
        'try-multiple-cqdeps',
        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',
            patches_json=True,
            prefix='checkout pigweed.change data.process gerrit changes.',
        ),
        api.cq_deps.patches_json(
            'pigweed:1234',
            '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.all_changes_applied(),
        api.checkout.change_applied('pigweed:1234'),
        api.checkout.change_applied('default:2345'),
    )

    yield api.test(
        'try-multiple-onenotapplied',
        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.some_changes_applied(),
        api.checkout.change_not_applied('pigweed:3456'),
    )

    yield api.test(
        'try_repo_not_in_manifest',
        properties(),
        api.checkout.try_test_data('https://foo.googlesource.com/bar'),
        api.checkout.manifest_test_data(),
        api.checkout.no_changes_applied(),
        status='INFRA_FAILURE',
    )

    yield api.test(
        'try_manifest',
        properties(),
        api.checkout.try_test_data(api.checkout.manifest_repo),
        api.checkout.cl_branch_parents(
            'feature-not-in-manifest',
            remote=api.checkout.manifest_repo,
        ),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
    )

    yield api.test(
        'feature_branches_try',
        properties(),
        api.checkout.try_test_data(PIGWEED_REPO),
        api.checkout.cl_branch_parents(
            branch='feature1', remote=PIGWEED_REPO, name='pigweed'
        ),
        api.checkout.manifest_has_matching_branch('feature1'),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
    )

    yield api.test(
        'feature_branches_try_multiple_features',
        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,
            project='pigweed_name',
            name='pigweed',
        ),
        api.checkout.cl_branch_parents(
            'feature2',
            index=1,
            project='default_name',
            name='pigweed',
        ),
        api.checkout.manifest_has_matching_branch('feature1'),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.post_check(
            post_process.DoesNotRun,
            'checkout pigweed.no non-standard branch names',
        ),
        api.post_check(
            post_process.DoesNotRun,
            'checkout pigweed.not matching branch names',
        ),
    )

    yield api.test(
        'feature_branches_try_multiple_matches',
        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_check(
            post_process.DoesNotRun,
            'checkout pigweed.not matching branch names',
        ),
        status='FAILURE',
    )

    yield api.test(
        'feature_branches_try_no_matching',
        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, remote=PIGWEED_REPO, name='pigweed'
        ),
        api.checkout.cl_branch_parents(
            'feature2', index=1, remote=DEFAULT_REPO, name='pigweed'
        ),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.post_check(
            post_process.MustRun,
            'checkout pigweed.not matching branch names',
        ),
    )

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

    yield api.test(
        'no_trigger',
        properties(),
        api.checkout.manifest_test_data(),
    )

    yield api.test(
        'prefix',
        properties(),
        api.checkout.try_test_data(
            'https://foo.googlesource.com/prefix/suffix'
        ),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
    )

    yield api.test(
        'no_cache',
        properties(do_not_cache=True),
        api.checkout.ci_test_data(git_repo=PIGWEED_REPO),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.post_check(
            post_process.MustRun,
            'checkout pigweed.repo sync',
        ),
        api.post_check(
            post_process.DoesNotRunRE,
            '.*cache.*',
        ),
    )

    yield api.test(
        'disable_repo_cache_experiment',
        properties(),
        api.checkout.ci_test_data(
            git_repo=PIGWEED_REPO,
            experiments=['pigweed.disable_repo_cache'],
        ),
        api.checkout.manifest_test_data(),
        api.checkout.all_changes_applied(),
        api.post_check(
            post_process.MustRun,
            'checkout pigweed.repo sync',
        ),
        api.post_check(
            post_process.DoesNotRunRE,
            '.*cache.*',
        ),
    )
