# 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 the cq_deps module."""

from recipe_engine.config import List
from recipe_engine.recipe_api import Property

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

PROPERTIES = {
    'revision': Property(kind=str, default=None),
    'statuses': Property(kind=List(str), default=('NEW',)),
}

PYTHON_VERSION_COMPATIBILITY = "PY3"


def RunSteps(api, revision, statuses):
    deps, errors = api.cq_deps.resolve(
        'pigweed', revision or 1, statuses=statuses,
    )

    with api.step.nest('final deps'):
        for dep in deps:
            with api.step.nest(dep.name) as pres:
                pres.step_summary_text = dep.remote
                _ = dep.gerrit_url  # For coverage.

    if errors:
        with api.step.nest('errors'):
            for error in errors:
                with api.step.nest(error.name):
                    pass


def GenTests(api):
    yield (
        api.status_check.test('hash')
        + api.properties(revision='b' * 40)
        + api.cq_deps.lookup_cl('b' * 40, 1)
        + api.cq_deps.details('pigweed:1', '')
    )

    yield (
        api.status_check.test('cl-not-found')
        + api.properties(revision='b' * 40)
        + api.cq_deps.lookup_cl('b' * 40, found=False)
    )

    yield (
        api.status_check.test('one')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.has_deps('pigweed:2')
        + api.cq_deps.lacks_deps('pigweed:1')
    )

    yield (
        api.status_check.test('disabled')
        + api.properties(**api.cq_deps.properties(disabled=True))
        + api.cq_deps.assert_disabled()
    )

    yield (
        api.status_check.test('ignore_errors')
        + api.properties(**api.cq_deps.properties(ignore_errors=True))
        + api.cq_deps.details('pigweed:1', 'Requires: invalid')
    )

    yield (
        api.status_check.test('two')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2, pigweed:3')
        + api.cq_deps.has_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('no_space')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2,pigweed:3')
        + api.cq_deps.has_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('no_gerrit_name')
        + api.cq_deps.details('pigweed:1', 'Requires: 2')
        + api.cq_deps.has_deps('pigweed:2')
    )

    yield (
        api.status_check.test('loop_two')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.details('pigweed:2', 'Requires: pigweed:1')
        + api.cq_deps.has_deps('pigweed:2')
    )

    yield (
        api.status_check.test('loop_three')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.details('pigweed:2', 'Requires: pigweed:3')
        + api.cq_deps.details('pigweed:3', 'Requires: pigweed:1')
        + api.cq_deps.has_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('abandoned')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.details(
            'pigweed:2', 'Requires: pigweed:3', status='ABANDONED'
        )
        + api.cq_deps.lacks_deps('pigweed:2')
    )

    yield (
        api.status_check.test('merged_skipped')
        + api.properties()
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.details(
            'pigweed:2', 'Requires: pigweed:3', status='MERGED'
        )
        + api.cq_deps.lacks_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('merged_ok')
        + api.properties(statuses=('NEW', 'MERGED'))
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.details(
            'pigweed:2', 'Requires: pigweed:3', status='MERGED'
        )
        + api.cq_deps.has_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('bad_field_name')
        + api.cq_deps.details('pigweed:1', 'Depends: pigweed:2')
        + api.cq_deps.lacks_deps('pigweed:2')
    )

    yield (
        api.status_check.test('commas')
        + api.cq_deps.details('pigweed:1', 'Requires: ,,pigweed:2,')
        + api.cq_deps.has_deps('pigweed:2')
    )

    yield (
        api.status_check.test('error')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.transient('pigweed:2')
        + api.cq_deps.transient('pigweed:2', n=2)
        + api.cq_deps.lacks_deps('forbidden:1')
    )

    yield (
        api.status_check.test('error_recovery')
        + api.cq_deps.details('pigweed:1', 'Requires: pigweed:2')
        + api.cq_deps.transient('pigweed:2')
        + api.cq_deps.details('pigweed:2', '', n=2)
        + api.cq_deps.has_deps('pigweed:2')
    )

    yield (
        api.status_check.test('forbidden')
        + api.cq_deps.details('pigweed:1', 'Requires: forbidden:1')
        + api.cq_deps.forbidden('forbidden:1')
        + api.cq_deps.lacks_deps('forbidden:1')
    )

    yield (
        api.status_check.test('multiline')
        + api.cq_deps.details(
            'pigweed:1', 'Requires: pigweed:2\nRequires: pigweed:3'
        )
        + api.cq_deps.has_deps('pigweed:2', 'pigweed:3')
    )

    yield (
        api.status_check.test('unsubmitted-parent-dependencies')
        + api.cq_deps.details('pigweed:1', '', parent='PIGWEED2')
        + api.cq_deps.lookup_cl('PIGWEED2', 2)
        + api.cq_deps.details(
            'pigweed:2', 'Requires: pigweed:3', commit_hash='PIGWEED2',
        )
        + api.cq_deps.has_deps('pigweed:3')
    )

    yield (
        api.status_check.test('dependency-requires-parent')
        + api.cq_deps.details(
            'pigweed:1', 'Requires: pigweed:3', parent='PIGWEED2',
        )
        + api.cq_deps.lookup_cl('PIGWEED2', 2)
        + api.cq_deps.details('pigweed:3', 'Requires: pigweed:2',)
        + api.cq_deps.lacks_deps('pigweed:2')
        + api.cq_deps.has_deps('pigweed:3')
    )

    yield (
        api.status_check.test('out-of-date-parent', status='failure')
        + api.cq_deps.details('pigweed:1', '', parent='OUTOFDATE')
        + api.cq_deps.lookup_cl('OUTOFDATE', 2)
        + api.cq_deps.details('pigweed:2', commit_hash='CURRENT')
    )

    yield (
        api.status_check.test('no-parent-cl')
        + api.cq_deps.details('pigweed:1', '', parent='NOCL')
        + api.cq_deps.lookup_cl('NOCL')
    )

    yield (
        api.status_check.test('gibberish-requirement', status='failure')
        + api.cq_deps.details('pigweed:1', 'Requires: GIBBERISH')
    )
