blob: ad84bbc97cdb142216063a42ef024d3d054396f7 [file] [log] [blame]
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import itertools
import json
from recipe_engine import post_process
DEPS = [
'chromium_swarming',
'chromium_tests',
'recipe_engine/json',
'recipe_engine/properties',
'recipe_engine/raw_io',
'recipe_engine/runtime',
]
CUSTOM_BUILDERS = {
'chromium.example': {
'settings': {
'build_gs_bucket': 'chromium-example-archive',
},
'builders': {
'Isolated Transfer Builder': {
'bot_type': 'builder',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Isolated Transfer Tester': {
'bot_type': 'tester',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'parent_buildername': 'Isolated Transfer Builder',
'testing': {
'platform': 'linux',
},
},
'Isolated Transfer: mixed builder, isolated tester (builder)': {
'bot_type': 'builder',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Isolated Transfer: mixed builder, isolated tester (tester)': {
'bot_type': 'tester',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'parent_buildername':
'Isolated Transfer: mixed builder, isolated tester (builder)',
'testing': {
'platform': 'linux',
},
},
'Isolated Transfer: mixed BT, isolated tester (BT)': {
'android_config': 'main_builder_mb',
'bot_type': 'builder_tester',
'chromium_config': 'android',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
'TARGET_PLATFORM': 'android',
},
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Isolated Transfer: mixed BT, isolated tester (tester)': {
'android_config': 'main_builder_mb',
'bot_type': 'tester',
'chromium_config': 'android',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
'TARGET_PLATFORM': 'android',
},
'gclient_config': 'chromium',
'parent_buildername':
'Isolated Transfer: mixed BT, isolated tester (BT)',
'testing': {
'platform': 'linux',
},
},
'Packaged Transfer Builder': {
'bot_type': 'builder',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Packaged Transfer Enabled Builder': {
'bot_type': 'builder',
'enable_package_transfer': True,
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Packaged Transfer Tester': {
'bot_type': 'tester',
'chromium_apply_config': ['mb'],
'chromium_config': 'chromium',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 64,
},
'gclient_config': 'chromium',
'parent_buildername': 'Packaged Transfer Builder',
'testing': {
'platform': 'linux',
},
},
'Multiple Triggers: Builder': {
'android_config': 'main_builder',
'bot_type': 'builder',
'chromium_apply_config': ['mb'],
'chromium_config': 'android',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 32,
'TARGET_PLATFORM': 'android',
},
'gclient_apply_config': ['android'],
'gclient_config': 'chromium',
'testing': {
'platform': 'linux',
},
},
'Multiple Triggers: Mixed': {
'android_config': 'main_builder',
'bot_type': 'tester',
'chromium_apply_config': ['mb'],
'chromium_config': 'android',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 32,
'TARGET_PLATFORM': 'android',
},
'gclient_apply_config': ['android'],
'gclient_config': 'chromium',
'parent_buildername': 'Multiple Triggers: Builder',
'testing': {
'platform': 'linux',
},
},
'Multiple Triggers: Isolated': {
'android_config': 'main_builder',
'bot_type': 'tester',
'chromium_apply_config': ['mb'],
'chromium_config': 'android',
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_BITS': 32,
'TARGET_PLATFORM': 'android',
},
'gclient_apply_config': ['android'],
'gclient_config': 'chromium',
'parent_buildername': 'Multiple Triggers: Builder',
'testing': {
'platform': 'linux',
},
},
},
},
}
def RunSteps(api):
builders = None
if api.properties.get('custom_builders'):
builders = CUSTOM_BUILDERS
api.chromium_tests.main_waterfall_steps(builders=builders)
def GenTests(api):
yield (
api.test('builder') +
api.chromium_tests.platform([{
'mastername': 'chromium.linux',
'buildername': 'Linux Builder'}]) +
api.properties.generic(
mastername='chromium.linux',
buildername='Linux Builder') +
api.runtime(is_luci=True, is_experimental=False) +
api.override_step_data('trigger', stdout=api.raw_io.output_text("""
{
"builds":[{
"status": "SCHEDULED",
"created_ts": "1459200369835900",
"bucket": "user.username",
"result_details_json": "null",
"status_changed_ts": "1459200369835930",
"created_by": "user:username@example.com",
"updated_ts": "1459200369835940",
"utcnow_ts": "1459200369962370",
"parameters_json": "{\\"This_has_been\\": \\"removed\\"}",
"id": "9016911228971028736"
}],
"kind": "buildbucket#resourcesItem",
"etag": "\\"8uCIh8TRuYs4vPN3iWmly9SJMqw\\""
}
"""))
)
yield (
api.test('builder_on_buildbot') +
api.chromium_tests.platform([{
'mastername': 'chromium.linux',
'buildername': 'Linux Builder'}]) +
api.properties.generic(
mastername='chromium.linux',
buildername='Linux Builder')
)
yield (
api.test('tester') +
api.chromium_tests.platform([{
'mastername': 'chromium.linux',
'buildername': 'Linux Tests'}]) +
api.properties.generic(
mastername='chromium.linux',
buildername='Linux Tests',
parent_buildername='Linux Builder') +
api.chromium_tests.read_source_side_spec(
'chromium.linux',{
'Linux Tests': {
'gtest_tests': ['base_unittests'],
},
}
)
)
def TriggersBuilderWithProperties(check, step_odict, builder='',
properties=None):
trigger_step = step_odict['trigger']
check(
'TriggersBuilderWithProperties only supports LUCI builds.',
not trigger_step.trigger_specs)
check(
'"trigger" step did not run expected command.',
'scheduler.Scheduler.EmitTriggers' in trigger_step.cmd and
trigger_step.stdin)
trigger_json = json.loads(trigger_step.stdin)
for batch in trigger_json.get('batches', []):
if any(builder == j.get('job') for j in batch.get('jobs', [])):
actual_properties = (
batch.get('trigger', {}).get('buildbucket', {}).get(
'properties', {}))
check(all(p in actual_properties for p in properties))
break
else: # pragma: no cover
check('"%s" not triggered' % builder, False)
yield (
api.test('isolate_transfer_builder') +
api.properties(
bot_id='isolated_transfer_builder_id',
buildername='Isolated Transfer Builder',
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.runtime(is_luci=True, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Isolated Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.DoesNotRun, 'package build') +
api.post_process(
TriggersBuilderWithProperties,
builder='Isolated Transfer Tester',
properties=['swarm_hashes']) +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('isolate_transfer_tester') +
api.properties(
bot_id='isolated_transfer_tester_id',
buildername='Isolated Transfer Tester',
buildnumber=123,
custom_builders=True,
mastername='chromium.example',
parent_buildername='Isolated Transfer Builder',
swarm_hashes={
'base_unittests': 'ffffffffffffffffffffffffffffffffffffffff',
}) +
api.runtime(is_luci=True, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Isolated Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.override_step_data(
'find isolated tests',
api.json.output({})
) +
api.post_process(post_process.DoesNotRun, 'extract build') +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('isolated_transfer__mixed_builder_isolated_tester') +
api.properties(
bot_id='isolated_transfer_builder_id',
buildername=(
'Isolated Transfer: mixed builder, isolated tester (builder)'),
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.runtime(is_luci=True, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Isolated Transfer: mixed builder, isolated tester (builder)': {
'scripts': [
{
'name': 'check_network_annotations',
'script': 'check_network_annotations.py',
},
],
},
'Isolated Transfer: mixed builder, isolated tester (tester)': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.DoesNotRun, 'package build') +
api.post_process(
TriggersBuilderWithProperties,
builder='Isolated Transfer: mixed builder, isolated tester (tester)',
properties=['swarm_hashes']) +
api.post_process(post_process.DropExpectation)
)
def TriggersBuilderWithoutProperties(check, step_odict, builder='',
properties=None):
trigger_specs = step_odict['trigger'].trigger_specs
for t in trigger_specs:
if t['builder_name'] == builder:
check(all(p not in t['properties'] for p in properties))
return step_odict
else: # pragma: no cover
check('"%s" not triggered' % builder, False)
yield (
api.test('isolate_transfer_builder_buildbot') +
api.properties(
bot_id='isolated_transfer_builder_id',
buildername='Isolated Transfer Builder',
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.runtime(is_luci=False, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Isolated Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.MustRun, 'package build') +
api.post_process(
TriggersBuilderWithoutProperties,
builder='Isolated Transfer Tester',
properties=['swarm_hashes']) +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('isolate_transfer_tester_buildbot') +
api.properties(
bot_id='isolated_transfer_tester_id',
buildername='Isolated Transfer Tester',
buildnumber=123,
custom_builders=True,
mastername='chromium.example',
parent_buildername='Isolated Transfer Builder',
swarm_hashes={
'base_unittests': 'ffffffffffffffffffffffffffffffffffffffff',
}) +
api.runtime(is_luci=False, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Isolated Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.override_step_data(
'find isolated tests',
api.json.output({})
) +
api.post_process(post_process.MustRun, 'extract build') +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('isolated_transfer__mixed_bt_isolated_tester') +
api.properties(
bot_id='isolated_transfer_builder_tester_id',
buildername=(
'Isolated Transfer: mixed BT, isolated tester (BT)'),
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.runtime(is_luci=True, is_experimental=False) +
api.override_step_data(
'read test spec (chromium.example.json)',
api.json.output({
'Isolated Transfer: mixed BT, isolated tester (BT)': {
'junit_tests': [
{
'test': 'base_junit_tests',
},
],
},
'Isolated Transfer: mixed BT, isolated tester (tester)': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
})
) +
api.post_process(post_process.DoesNotRun, 'package build') +
api.post_process(
TriggersBuilderWithProperties,
builder='Isolated Transfer: mixed BT, isolated tester (tester)',
properties=['swarm_hashes']) +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('package_transfer_builder') +
api.properties(
bot_id='packaged_transfer_builder_id',
buildername='Packaged Transfer Builder',
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Packaged Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': False,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.MustRun, 'package build') +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('package_transfer_enabled_builder') +
api.properties(
bot_id='packaged_transfer_builder_id',
buildername='Packaged Transfer Enabled Builder',
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Packaged Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': False,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.MustRun, 'package build') +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('package_transfer_tester') +
api.properties(
bot_id='packaged_transfer_tester_id',
buildername='Packaged Transfer Tester',
buildnumber=123,
custom_builders=True,
mastername='chromium.example',
parent_buildername='Packaged Transfer Builder',
swarm_hashes={
'base_unittests': 'ffffffffffffffffffffffffffffffffffffffff',
}) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Packaged Transfer Tester': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': False,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.MustRun, 'extract build') +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('multiple_triggers') +
api.properties(
bot_id='multiple_triggers_builder_id',
buildername='Multiple Triggers: Builder',
buildnumber=123,
custom_builders=True,
mastername='chromium.example') +
api.runtime(is_luci=True, is_experimental=False) +
api.chromium_tests.read_source_side_spec(
'chromium.example', {
'Multiple Triggers: Mixed': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
'junit_tests': [
{
'test': 'base_junit_tests',
},
],
},
'Multiple Triggers: Isolated': {
'gtest_tests': [
{
'args': ['--sample-argument'],
'swarming': {
'can_use_on_swarming_builders': True,
},
'test': 'base_unittests',
},
],
},
}
) +
api.post_process(post_process.MustRun, 'package build') +
api.post_process(
TriggersBuilderWithProperties,
builder='Multiple Triggers: Mixed',
properties=['swarm_hashes']) +
api.post_process(post_process.DropExpectation)
)