| # 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 TYPE_CHECKING |
| |
| from PB.recipe_modules.pigweed.checkout.tests.properties import InputProperties |
| |
| if TYPE_CHECKING: # pragma: no cover |
| from typing import Generator |
| 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', |
| properties(), |
| api.checkout.ci_test_data(git_repo='https://x.googlesource.com/b/c/d'), |
| submodule_data, |
| status='INFRA_FAILURE', |
| ) |
| |
| yield api.test( |
| 'submodule-try-not-found', |
| properties(), |
| api.checkout.try_test_data(git_repo='https://x.googlesource.com/xyz'), |
| submodule_data, |
| api.checkout.no_changes_applied(), |
| status='INFRA_FAILURE', |
| ) |
| |
| 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', |
| properties(included_submodules=['foo'], excluded_submodules=['bar']), |
| api.checkout.ci_test_data(), |
| status='INFRA_FAILURE', |
| ) |
| |
| 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', |
| properties(excluded_submodules=['missing']), |
| api.checkout.ci_test_data(), |
| status='INFRA_FAILURE', |
| ) |
| |
| yield api.test( |
| 'submodule-repeated-nomatch', |
| 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', |
| ), |
| ), |
| status='FAILURE', |
| ) |
| |
| 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', |
| 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', |
| ), |
| ), |
| status='FAILURE', |
| ) |
| |
| 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(), |
| ) |