blob: c6073cdec97d7fa7de059981f65de8dad4cdf923 [file] [log] [blame]
# Copyright 2014 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
from google.protobuf import struct_pb2, json_format
from recipe_engine import post_process
from PB.recipe_modules.recipe_engine.properties.examples.full import InputProps
from PB.recipe_modules.recipe_engine.properties.examples.full import EnvProps
DEPS = [
'json',
'properties',
'step',
]
PROPERTIES = InputProps
ENV_PROPERTIES = EnvProps
def RunSteps(api, props, env_props):
api.step('echo props', ['echo'] + [repr(props)])
api.step('echo env_props', ['echo'] + [repr(env_props)])
properties = api.properties.thaw()
prop_tups = sorted(properties.items())
api.step('echo all', ['echo'] + [
'(%r, %r)' % (k, v) for k, v in prop_tups])
# It should behave like a real dictionary.
assert len(properties) == len(api.properties)
for k in sorted(api.properties):
api.step('echo %s' % k, ['echo', repr(api.properties[k])])
def GenTests(api):
yield (
api.test('basic')
+ api.properties(
InputProps(
test_prop=InputProps.SubMessage(key='value'),
list=['some', 'strings'],
# unfortunately, constructing arbitrary Struct fields inline is
# awkward. Doable... but awkward.
dict=json_format.ParseDict({
'cool': 'dictionary',
'float_val': 12345678.6789,
'secretly_int_val': 123456789.0,
}, struct_pb2.Struct()),
param_name_test='thing',
),
**{
'arbitrary_property': True,
'$fake_repo/fake_module': InputProps(
test_prop=InputProps.SubMessage(key='value'),
),
}
)
+ api.properties.environ(
EnvProps(FROM_ENV='mocked_env')
)
)
yield (
api.test('manual_props')
+ api.properties.environ(FROM_ENV='mocked_env')
)
yield (
api.test('odd_name')
+ api.properties(**{'foo.bar-bam': 'blarp'})
)
yield (
api.test('prop_wrong_type')
+ api.properties(test_prop=True) # wrong type
+ api.expect_exception('ParseError')
+ api.post_process(post_process.StatusException)
+ api.post_process(
post_process.SummaryMarkdownRE,
'Failed to parse test_prop field'
)
+ api.post_process(post_process.DropExpectation)
)
# Deprecated: buildbot "defaults"
# Some default buildbot configurations.
yield api.test('buildbot_generic') + api.properties.generic()
yield (api.test('buildbot_scheduled') +
api.properties.scheduled())
yield (api.test('buildbot_git_scheduled') +
api.properties.git_scheduled())
yield (api.test('buildbot_tryserver') +
api.properties.tryserver())
yield (api.test('buildbot_tryserver_gerrit') +
api.properties.tryserver(gerrit_project='infra/infra'))
yield (api.test('buildbot_tryserver_gerrit_override_gerrit') +
api.properties.tryserver(
gerrit_project='infra/internal',
gerrit_url='https://chrome-internal-review.googlesource.com'))
yield (api.test('buildbot_tryserver_gerrit_override_git') +
api.properties.tryserver(
gerrit_project='infra/hidden',
git_url='https://chrome-internal.googlesource.com/infra/hidden'))
yield (api.test('buildbot_tryserver_gerrit_override_both') +
api.properties.tryserver(
gerrit_project='custom',
gerrit_url='https://gerrit.my.host',
git_url='https://git.my.host/custom',
patch_issue=989898,
patch_set=3))
# testing test_api
try:
not_a_message = True
api.properties(not_a_message)
assert False, ( # pragma: no cover
'api.properties should only accept proto Messages'
)
except ValueError:
pass
try:
not_a_message = True
api.properties.environ(not_a_message)
assert False, ( # pragma: no cover
'api.properties.environ should only accept proto Messages as args'
)
except ValueError:
pass
try:
not_an_env_value = ['bad', 'stuff']
api.properties.environ(ENV_INT=not_an_env_value)
assert False, ( # pragma: no cover
'api.properties.environ should only accept simple values'
)
except ValueError:
pass