blob: 22e688daffd9f77113de72a511a36153b8d2a4bc [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from PB.recipe_modules.fuchsia.spec.examples.specs import ExampleSpec
from recipe_engine.config import Enum
from recipe_engine.recipe_api import Property
DEPS = [
'fuchsia/gitiles',
'fuchsia/spec',
'fuchsia/status_check',
'recipe_engine/buildbucket',
'recipe_engine/file',
'recipe_engine/path',
'recipe_engine/properties',
'recipe_engine/url',
'recipe_engine/raw_io',
]
PROPERTIES = {
'expected_revision':
Property(
kind=str,
help='the test revision that should be fetched',
default=None),
'expected_result':
Property(
kind=Enum('success', 'not_found', 'parse_error'),
help='the expected result of trying to fetch the spec',
default='success'),
}
TestProtoMessage = ExampleSpec(value='example_value')
def RunSteps(api, expected_revision, expected_result):
if expected_result == 'success':
expect_success(api, expected_revision)
elif expected_result == 'not_found':
expect_not_found_error(api)
elif expected_result == 'parse_error':
expect_parse_error(api)
else: # pragma: no cover
raise Exception('invalid expected result %s' % expected_result)
def expect_success(api, expected_revision=None):
message, revision = api.spec.get_spec_revision(
spec_remote='https://fuchsia.googlesource.com/fuchsia',
spec_dir='specs',
Type=ExampleSpec,
)
assert message == TestProtoMessage, message
expected_revision = expected_revision or 'deadbeef'
assert revision == expected_revision, 'actual rev:%s, expected:%s' % (
revision, expected_revision)
message2 = api.spec.load(
spec_remote='https://fuchsia.googlesource.com/fuchsia',
spec_dir='specs',
Type=ExampleSpec,
spec_revision=revision,
)
assert message2 == message
def expect_not_found_error(api):
_expect_exception(api, api.spec.NotFoundError)
def expect_parse_error(api):
_expect_exception(api, api.spec.ParseError)
def _expect_exception(api, exception_type):
try:
api.spec.load(
spec_remote='https://fuchsia.googlesource.com/fuchsia',
spec_dir='specs',
Type=ExampleSpec,
)
except exception_type:
pass
else: # pragma: no cover
assert False, 'loading spec should have raised %r' % exception_type
def GenTests(api):
def example_build():
return api.buildbucket.ci_build(
git_repo='https://fuchsia.googlesource.com/project',
revision='deadbeef1',
)
#yapf:disable
yield (
api.status_check.test('spec_file_not_found')
+ api.properties(expected_result='not_found')
+ example_build()
+ api.spec.spec_not_found()
)
yield (
api.status_check.test('fatal_error', status='infra_failure')
+ example_build()
+ api.step_data('build_init', retcode=1)
)
yield (
api.status_check.test('spec_file_is_empty')
+ api.properties(expected_result='parse_error')
+ example_build()
+ api.spec.spec_loaded_ok(ExampleSpec())
)
yield (
api.status_check.test('parse_error')
+ api.properties(expected_result='parse_error')
+ example_build()
+ api.spec.spec_parse_error()
)
yield (
api.status_check.test('spec_file_is_ok')
+ example_build()
+ api.spec.spec_loaded_ok(TestProtoMessage)
+ api.spec.spec_loaded_ok(TestProtoMessage, step_name='build_init (2)')
)
yield (
api.status_check.test('subbuild')
+ api.buildbucket.ci_build(
builder='foo-subbuild',
git_repo='https://fuchsia.googlesource.com/project',
revision='deadbeef1',
)
+ api.spec.spec_loaded_ok(TestProtoMessage)
+ api.spec.spec_loaded_ok(TestProtoMessage, step_name='build_init (2)')
)
# use gitiles_commit.id if project is same as spec_remote
yield (
api.status_check.test('spec_remote_change')
+ api.buildbucket.ci_build(
builder='foo-subbuild',
git_repo='https://fuchsia.googlesource.com/fuchsia',
revision='deadbeef2',
)
+ api.properties(expected_revision='deadbeef2')
+ api.spec.spec_loaded_ok(TestProtoMessage)
+ api.spec.spec_loaded_ok(TestProtoMessage, step_name='build_init (2)')
)
#yapf:enable