blob: 9e375f477c510b3fee072fa42547faa733a3d3b5 [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.
"""Test of rolls of one repository."""
from __future__ import annotations
from typing import TYPE_CHECKING
from PB.recipes.pigweed.submodule_roller import InputProperties
from PB.recipe_modules.fuchsia.auto_roller.options import Options
from recipe_engine import config, recipe_api
if TYPE_CHECKING: # pragma: no cover
from typing import Generator
from recipe_engine import recipe_test_api
DEPS = [
'pigweed/roll_util',
'recipe_engine/path',
'recipe_engine/properties',
'recipe_engine/step',
]
PROPERTIES = {
'project_name': recipe_api.Property(kind=str),
'original_commits': recipe_api.Property(kind=config.List),
'old_revision': recipe_api.Property(kind=str),
'new_revision': recipe_api.Property(kind=str),
}
def RunSteps( # pylint: disable=invalid-name
api, project_name, old_revision, new_revision
):
proj_dir = api.path.start_dir / 'project'
direction = api.roll_util.get_roll_direction(
api.path.start_dir / 'checkout', old_revision, new_revision
)
if api.roll_util.can_roll(direction):
roll = api.roll_util.create_roll(
project_name=project_name,
old_revision=old_revision,
new_revision=new_revision,
proj_dir=proj_dir,
direction=direction,
)
def steplog(name, value):
with api.step.nest(name) as pres:
pres.step_summary_text = repr(value)
steplog('remote', roll.remote)
steplog('gerrit_name', roll.gerrit_name)
with api.step.nest('emails') as pres:
pres.logs['authors'] = sorted(
x.email for x in api.roll_util.authors(roll)
)
pres.logs['reviewers'] = sorted(
x.email for x in api.roll_util.reviewers(roll)
)
message = api.roll_util.message(roll)
with api.step.nest('message') as pres:
pres.logs['message'] = message
else:
api.roll_util.skip_roll_step('remote', old_revision, new_revision)
host = 'pigweed-review.googlesource.com'
api.roll_util.can_cc_on_roll('email@example.com', host)
api.roll_util.can_cc_on_roll('nobody@google.com', host)
Account = api.roll_util.Account
user = Account('user', 'user@example.com')
assert (
api.roll_util.fake_author(user).email
== 'user@pigweed.infra.roller.example.com'
)
with api.step.nest('CCing'):
api.roll_util.include_cc(user, ('example.com',), host)
with api.step.nest('not CCing, domain excluded'):
api.roll_util.include_cc(user, ('google.com',), host)
with api.step.nest('not CCing, robot account'):
api.roll_util.include_cc(
Account('robot', 'robot@gserviceaccount.com'),
(),
host,
)
with api.step.nest('not CCing, no account in Gerrit'):
api.roll_util.include_cc(
Account('nobody', 'nobody@google.com'),
(),
host,
)
auto_roller_options = Options(upstream_ref="upstream_ref")
auto_roller_options.push_options.append("push_option_1")
override_auto_roller_options = Options()
override_auto_roller_options.push_options.append("push_option_2")
complete_auto_roller_options = api.roll_util.merge_auto_roller_overrides(
auto_roller_options, override_auto_roller_options
)
# check that upstream_ref is not overwritten and push_options is merged
assert complete_auto_roller_options.upstream_ref == "upstream_ref"
assert complete_auto_roller_options.push_options == [
"push_option_1",
"push_option_2",
]
def GenTests(api) -> Generator[recipe_test_api.TestData, None, None]:
yield api.test(
'singlecommit_singleline',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='1' * 40
),
api.roll_util.properties(
commit_divider='--divider--',
footer='Cq-Include-Trybots: foo',
),
api.roll_util.commit_data(
'proj',
api.roll_util.commit('1' * 40, 'foo\n\nbar\n\nChange-Id: I11111'),
),
api.roll_util.forward_roll(),
api.roll_util.not_cancelled(),
)
yield api.test(
'singlecommit_multiline',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='1' * 40
),
api.roll_util.properties(commit_divider='--divider--'),
api.roll_util.commit_data(
'proj',
api.roll_util.commit(
'1' * 40,
'foo ' * 20
+ '\n\nbar\n\nBug: 123\nCC: foo\nFoo-Auto-Submit: true\n',
),
),
api.roll_util.forward_roll(),
api.roll_util.not_cancelled(),
)
yield api.test(
'multicommit',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='4' * 40
),
api.roll_util.commit_data(
'proj',
api.roll_util.commit('4' * 40, 'xyz\n\nxyz'),
api.roll_util.commit('3' * 40, 'baz\n\nbaz'),
api.roll_util.commit(
'2' * 40, ''.join(x * 10 for x in '0123456789')
),
api.roll_util.commit('1' * 40, 'foo\n\nfoo'),
),
api.roll_util.forward_roll(),
api.roll_util.not_cancelled(),
)
yield api.test(
'manymanycommit',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='4' * 40
),
api.roll_util.commit_data(
'proj',
*[
api.roll_util.commit(f'{i:040}', f'Commit {i}')
for i in range(0, 600)
],
),
api.roll_util.forward_roll(),
api.roll_util.not_cancelled(),
)
yield api.test(
'frombranch',
api.properties(
project_name='proj', old_revision='main', new_revision='5' * 40
),
api.roll_util.commit_data(
'proj',
api.roll_util.commit('5' * 40, 'five'),
api.roll_util.commit('4' * 40, 'four'),
api.roll_util.commit('3' * 40, 'three'),
api.roll_util.commit('2' * 40, 'two'),
api.roll_util.commit('1' * 40, 'one'),
),
api.roll_util.forward_roll(),
api.roll_util.not_cancelled(),
)
yield api.test(
'backwards',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='1' * 40
),
api.roll_util.backward_roll(),
api.roll_util.cancelled(),
)
yield api.test(
'up_to_date',
api.properties(
project_name='proj', old_revision='1' * 40, new_revision='1' * 40
),
api.roll_util.cancelled(),
)
yield api.test(
'up_to_date_testonly',
api.properties(
project_name='proj', old_revision='1' * 40, new_revision='2' * 40
),
api.roll_util.noop_roll(),
api.roll_util.cancelled(),
)
yield api.test(
'rebase',
api.properties(
project_name='proj', old_revision='0' * 40, new_revision='5' * 40
),
api.roll_util.commit_data(
'proj',
api.roll_util.commit('5' * 40, 'five'),
api.roll_util.commit('4' * 40, 'four'),
api.roll_util.commit('3' * 40, 'three'),
api.roll_util.commit('2' * 40, 'two'),
api.roll_util.commit('1' * 40, 'one'),
),
api.roll_util.rebased_roll(),
api.roll_util.not_cancelled(),
)