blob: 16ab5982b996e643ee50d3424f93998ad5526c50 [file] [log] [blame]
# 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 submodule functionality of checkout module."""
from __future__ import annotations
from typing import Generator
from PB.recipe_modules.pigweed.checkout.tests.properties import InputProperties
from recipe_engine import recipe_test_api
DEPS = [
'pigweed/checkout',
'pigweed/cq_deps',
'recipe_engine/path',
'recipe_engine/properties',
'recipe_engine/step',
]
PROPERTIES = InputProperties
def RunSteps(api, props): # pylint: disable=invalid-name
checkout = api.checkout(props.checkout_options)
with api.step.nest('snapshot_to_dir'):
checkout.snapshot_to_dir(api.path.start_dir / 'snapshot')
def GenTests(api) -> Generator[recipe_test_api.TestData, None, None]:
def properties(**kwargs):
kwargs.setdefault('initialize_submodules', False)
kwargs.setdefault('remote', api.checkout.pigweed_repo_dot_git)
kwargs.setdefault('branch', None)
props = InputProperties(
checkout_options=api.checkout.git_options(**kwargs)
)
return api.properties(props)
submodule_data = api.checkout.submodules(
api.checkout.submodule('foo', 'https://x.googlesource.com/foo', '-'),
api.checkout.submodule('bar', 'https://x.googlesource.com/bar', '+'),
api.checkout.submodule('baz', 'https://x.googlesource.com/baz.git'),
# Using 'b/c/d' instead of 'a/b/c' because an 'a/' prefix is treated
# specially by Gerrit and the buildbucket module.
api.checkout.submodule(
'b/c/d', 'https://x.googlesource.com/b/c/d', ' '
),
)
yield (
api.test('submodule-try')
+ properties()
+ api.checkout.try_test_data(git_repo='https://x.googlesource.com/baz')
+ submodule_data
+ api.checkout.all_changes_applied()
)
yield (
api.test('submodule-ci')
+ properties()
+ api.checkout.ci_test_data(git_repo='https://x.googlesource.com/baz')
+ submodule_data
)
yield (
api.test('submodule-not-initialized', status='INFRA_FAILURE')
+ properties()
+ api.checkout.ci_test_data(git_repo='https://x.googlesource.com/b/c/d')
+ submodule_data
)
yield (
api.test('submodule-try-not-found', status='INFRA_FAILURE')
+ properties()
+ api.checkout.try_test_data(git_repo='https://x.googlesource.com/xyz')
+ submodule_data
+ api.checkout.no_changes_applied()
)
yield (
api.test('submodule-try-equivalent')
+ properties(
equivalent_remotes=(
(
'https://z.googlesource.com/foo',
'https://x.googlesource.com/foo',
),
),
)
+ api.checkout.try_test_data(git_repo='https://z.googlesource.com/foo')
+ submodule_data
+ api.checkout.all_changes_applied()
)
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('submodule-try-multiple')
+ properties()
+ api.checkout.try_test_data(
gerrit_changes=[
cl('foo', 1234, name='x'),
cl('bar', 2345, name='x'),
cl('pigweed/pigweed', 3456),
]
)
+ submodule_data
+ api.checkout.all_changes_applied()
+ api.checkout.change_applied('x:1234')
+ api.checkout.change_applied('x:2345')
+ api.checkout.change_applied('pigweed:3456')
)
yield (
api.test('submodule-try-multiple-one-missing')
+ properties()
+ api.checkout.try_test_data(
gerrit_changes=[
cl('foo', 1234, name='x'),
cl('not-a-submodule', 2345, name='x'),
cl('pigweed/pigweed', 3456),
]
)
+ submodule_data
+ api.checkout.some_changes_applied()
+ api.checkout.change_applied('x:1234')
+ api.checkout.change_not_applied('x:2345')
+ api.checkout.change_applied('pigweed:3456')
)
# These tests are nominally identical to 'submodule-try-multiple' and
# 'submodule-try-multiple-one-missing' above but use the cq_deps module.
# After the 'process gerrit changes' step all changes are minor (e.g.
# '2345' instead of '2345L').
yield (
api.test('submodule-try-multiple-cqdeps')
+ properties()
+ api.checkout.try_test_data(
git_repo='https://x.googlesource.com/foo',
change_number=1234,
patch_set=1,
)
+ api.cq_deps.details(
'x:1234',
patches_json=True,
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.patches_json(
'x:1234',
'x:2345',
'pigweed:3456',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.details(
'x:2345',
project='bar',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.details(
'pigweed:3456',
project='pigweed/pigweed',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ submodule_data
+ api.checkout.all_changes_applied()
+ api.checkout.change_applied('x:1234')
+ api.checkout.change_applied('x:2345')
+ api.checkout.change_applied('pigweed:3456')
)
yield (
api.test('submodule-try-multiple-one-missing-one-forbidden-cqdeps')
+ properties()
+ api.checkout.try_test_data(
git_repo='https://x.googlesource.com/foo',
change_number=1234,
patch_set=1,
)
+ api.cq_deps.details(
'x:1234',
patches_json=True,
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.patches_json(
'x:1234',
'x:2345',
'pigweed:3456',
'forbidden:9999',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.details(
'x:2345',
project='not-a-submodule',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.details(
'pigweed:3456',
project='pigweed/pigweed',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ api.cq_deps.forbidden(
'forbidden:9999',
prefix='checkout pigweed.change data.process gerrit changes.',
)
+ submodule_data
+ api.checkout.some_changes_applied()
+ api.checkout.change_applied('x:1234')
+ api.checkout.change_not_applied('x:2345')
+ api.checkout.change_not_applied('forbidden:9999')
+ api.checkout.change_applied('pigweed:3456')
)
yield (
api.test('submodule-try-included-excluded', status='INFRA_FAILURE')
+ properties(included_submodules=['foo'], excluded_submodules=['bar'])
+ api.checkout.ci_test_data()
)
yield (
api.test('submodule-try-included')
+ properties(included_submodules=['nanopb'])
+ api.checkout.ci_test_data()
+ api.checkout.included_submodule('nanopb')
)
yield (
api.test('submodule-try-excluded')
+ properties(excluded_submodules=['nanopb'])
+ api.checkout.ci_test_data()
+ api.checkout.excluded_submodule('nanopb')
)
yield (
api.test('submodule-try-excluded-missing', status='INFRA_FAILURE')
+ properties(excluded_submodules=['missing'])
+ api.checkout.ci_test_data()
)
yield (
api.test('submodule-repeated-nomatch', status='FAILURE')
+ properties()
+ api.checkout.try_test_data('https://x.googlesource.com/foo')
+ api.checkout.submodules(
api.checkout.submodule(
'foo1',
'https://x.googlesource.com/foo',
branch='release',
),
api.checkout.submodule(
'foo2',
'https://x.googlesource.com/foo',
branch='dev',
),
)
)
yield (
api.test('submodule-repeated-match')
+ properties()
+ api.checkout.try_test_data('https://x.googlesource.com/foo')
+ api.checkout.submodules(
api.checkout.submodule(
'foo1',
'https://x.googlesource.com/foo',
branch='main',
),
api.checkout.submodule(
'foo2',
'https://x.googlesource.com/foo',
branch='dev',
),
)
)
yield (
api.test('submodule-repeated-twomatch', status='FAILURE')
+ properties()
+ api.checkout.try_test_data('https://x.googlesource.com/foo')
+ api.checkout.submodules(
api.checkout.submodule(
'foo1',
'https://x.googlesource.com/foo',
branch='main',
),
api.checkout.submodule(
'foo2',
'https://x.googlesource.com/foo',
branch='main',
),
)
)
yield (
api.test('insteadof')
+ properties(
rewrites=[('https://github.com/foo', 'https://github.mirror/foo')],
)
+ api.checkout.try_test_data()
+ api.checkout.submodules(
api.checkout.submodule('foobar', 'https://github.com/foo/bar', ' '),
)
+ api.checkout.all_changes_applied()
)