# Copyright 2021 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 Pigweed with multiple swarming tasks."""

from PB.recipes.pigweed.build import InputProperties

DEPS = [
    'fuchsia/status_check',
    'pigweed/build',
    'pigweed/checkout',
    'pigweed/environment',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = InputProperties


def RunSteps(api, props):
    checkout = api.checkout(props.checkout_options)
    env = api.environment.init(checkout.root, props.environment_options)

    with env():
        api.build(checkout.root, props.build_options)
        if props.skip_archive:
            return
        digest = api.build.archive_to_cas()

    with api.step.nest('result') as pres:
        pres.properties['digest'] = digest


def GenTests(api):
    yield (
        api.status_check.test('basic')
        + api.checkout.ci_test_data()
        + api.properties(build_options=api.build.options(gn_args=['gnarg']))
        + api.properties(**api.checkout.git_properties())
    )

    yield (
        api.status_check.test('skip_archive')
        + api.checkout.ci_test_data()
        + api.properties(
            build_options=api.build.options(gn_args=['gnarg']),
            skip_archive=True,
        )
        + api.properties(**api.checkout.git_properties())
    )
