blob: 829f7a431a8ea72d08936ad498b8b4ba1857535b [file] [log] [blame]
# Copyright 2018 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.
from recipe_engine import post_process
from recipe_engine.types import freeze
from RECIPE_MODULES.build import chromium
DEPS = [
'chromium',
'chromium_checkout',
'depot_tools/tryserver',
'filter',
'gn',
'recipe_engine/context',
'recipe_engine/json',
'recipe_engine/raw_io',
]
BUILDERS = freeze({
'tryserver.chromium.linux': {
'builders': {
'linux-libfuzzer-asan-rel':
chromium.BuilderSpec.create(
chromium_config='chromium',
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
),
},
},
'tryserver.chromium.win': {
'builders': {
'win-libfuzzer-asan-rel':
chromium.BuilderSpec.create(
chromium_config='chromium_clang',
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'win',
'TARGET_BITS': 64,
},
),
},
},
})
INCLUDED_FUZZ_TARGETS = ['//testing/libfuzzer:libfuzzer_main']
EXCLUDED_FUZZ_TARGETS = ['//testing/libfuzzer:no_clusterfuzz']
def RunSteps(api):
assert api.tryserver.is_tryserver
with api.chromium.chromium_layout():
builder_id, bot_config = api.chromium.configure_bot(BUILDERS, ['mb'])
api.chromium_checkout.ensure_checkout(bot_config)
checkout_dir = api.chromium_checkout.get_checkout_dir(bot_config).join(
'src')
with api.context(cwd=checkout_dir):
outdir = api.chromium.output_dir
api.chromium.runhooks()
api.chromium.ensure_goma()
api.chromium.mb_gen(builder_id, use_goma=True)
# Calculate the GN labels of all fuzz targets.
all_fuzz_labels = api.gn.refs(
outdir, INCLUDED_FUZZ_TARGETS, output_type='executable',
step_name='calculate all_fuzzers', output_format='label')
excluded_fuzz_labels = api.gn.refs(
outdir, EXCLUDED_FUZZ_TARGETS, output_type='executable',
step_name='calculate no_fuzzers', output_format='label')
fuzz_labels = list(all_fuzz_labels - excluded_fuzz_labels)
# Filter out all targets that the patch doesn't affect.
affected_files = api.chromium_checkout.get_files_affected_by_patch()
test_targets, compile_targets = api.filter.analyze(
affected_files, None, fuzz_labels, 'trybot_analyze_config.json')
affected_fuzz_labels = test_targets + compile_targets
if not affected_fuzz_labels:
return
# Run MB one more time since filter calls above wipes out the specified
# goma dir.
api.chromium.mb_gen(
builder_id, use_goma=True, gn_args_location=api.gn.LOGS)
# Convert the GN labels to ninja targets and pass them into compile.
affected_fuzz_targets = list(api.gn.ls(
outdir, affected_fuzz_labels, output_format='output'))
return api.chromium.compile(
targets=affected_fuzz_targets, use_goma_module=True)
def GenTests(api):
yield api.test(
'basic_linux_tryjob',
api.chromium.try_build(
mastername='tryserver.chromium.linux',
builder='linux-libfuzzer-asan-rel'),
api.step_data(
'calculate all_fuzzers',
stdout=api.raw_io.output_text(
'//foo/bar:target1\n//foo/bar:target2\n//foo/bar:target3')),
api.step_data(
'calculate no_fuzzers',
stdout=api.raw_io.output_text('//foo/bar:target1')),
)
yield api.test(
'basic_linux_tryjob_with_compile',
api.chromium.try_build(
mastername='tryserver.chromium.linux',
builder='linux-libfuzzer-asan-rel'),
api.step_data(
'calculate all_fuzzers',
stdout=api.raw_io.output_text('\n'.join(
['//foo/bar:target1', '//foo/bar:target2',
'//foo/bar:target3']))),
api.step_data(
'calculate no_fuzzers',
stdout=api.raw_io.output_text('//foo/bar:target1')),
api.override_step_data(
'analyze',
api.json.output({
'status': 'Found dependency',
'compile_targets': ['//foo/bar:target2'],
'test_targets': []
})),
api.step_data(
'list gn targets', stdout=api.raw_io.output_text('target2')),
)
yield api.test(
'compile_failure',
api.chromium.try_build(
mastername='tryserver.chromium.linux',
builder='linux-libfuzzer-asan-rel'),
api.step_data(
'calculate all_fuzzers',
stdout=api.raw_io.output_text('\n'.join(
['//foo/bar:target1', '//foo/bar:target2',
'//foo/bar:target3']))),
api.step_data(
'calculate no_fuzzers',
stdout=api.raw_io.output_text('//foo/bar:target1')),
api.override_step_data(
'analyze',
api.json.output({
'status': 'Found dependency',
'compile_targets': ['//foo/bar:target2'],
'test_targets': []
})),
api.step_data('compile', retcode=1),
api.post_process(post_process.StatusFailure),
api.post_process(post_process.DropExpectation),
)