blob: 80dc3d977a192fe7b5950093edb67436d96e487f [file] [log] [blame]
# Copyright 2014 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 re
from recipe_engine.types import freeze
DEPS = [
'archive',
'chromium',
'chromium_checkout',
'depot_tools/bot_update',
'depot_tools/depot_tools',
'gn',
'recipe_engine/context',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/raw_io',
'recipe_engine/step',
]
BUILDERS = freeze({
'chromium.fuzz': {
'builders': {
'Libfuzzer Upload Chrome OS ASan': {
'archive_prefix': 'libfuzzer-chromeos',
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'chromeos',
'TARGET_BITS': 64,
},
'gclient_apply_config': ['chromeos'],
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'chromeos-asan',
},
'Libfuzzer Upload Linux32 ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
'Libfuzzer Upload Linux32 ASan Debug': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
'Libfuzzer Upload Linux32 V8-ARM ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
'archive_prefix': 'libfuzzer-v8-arm',
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan-arm-sim',
'v8_targets_only': True,
},
'Libfuzzer Upload Linux32 V8-ARM ASan Debug': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
'archive_prefix': 'libfuzzer-v8-arm',
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan-arm-sim',
'v8_targets_only': True,
},
'Libfuzzer Upload Linux ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
'Libfuzzer Upload Linux ASan Debug': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
'Libfuzzer Upload Linux V8-ARM64 ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'archive_prefix': 'libfuzzer-v8-arm64',
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan-arm64-sim',
'v8_targets_only': True,
},
'Libfuzzer Upload Linux V8-ARM64 ASan Debug': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'archive_prefix': 'libfuzzer-v8-arm64',
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan-arm64-sim',
'v8_targets_only': True,
},
'Libfuzzer Upload Linux MSan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': ['clobber', 'msan' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'msan',
},
'Libfuzzer Upload Linux UBSan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'ubsan',
},
'Libfuzzer Upload Mac ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'mac',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
'Libfuzzer Upload Windows ASan': {
'chromium_config': 'chromium_clang',
'chromium_apply_config': [ 'clobber' ],
'chromium_config_kwargs': {
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'win',
'TARGET_BITS': 64,
},
'upload_bucket': 'chromium-browser-libfuzzer',
'upload_directory': 'asan',
},
},
},
})
def RunSteps(api):
mastername = api.m.properties['mastername']
buildername, bot_config = api.chromium.configure_bot(BUILDERS, ['mb'])
checkout_results = api.chromium_checkout.ensure_checkout(bot_config)
api.chromium.ensure_goma()
api.chromium.runhooks()
api.chromium.mb_gen(mastername, buildername, use_goma=True)
with api.context(cwd=api.path['checkout'], env=api.chromium.get_env()):
all_fuzzers = api.gn.refs(
api.chromium.output_dir,
['//testing/libfuzzer:libfuzzer_main'],
output_type='executable',
output_format='output',
step_name='calculate all_fuzzers',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'target1\ntarget2\nv8_target3', stream='stdout'))
if bot_config.get('v8_targets_only', False):
# Some builders only need the V8 targets as the only difference is code
# generated by V8 simulators.
v8_fuzzers = api.gn.refs(
api.chromium.output_dir,
['//v8:fuzzer_support'],
output_type='executable',
output_format='output',
step_name='calculate v8_fuzzers',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'v8_target3', stream='stdout'))
all_fuzzers = all_fuzzers & v8_fuzzers
no_clusterfuzz = api.gn.refs(
api.chromium.output_dir,
['//testing/libfuzzer:no_clusterfuzz'],
output_type='executable',
output_format='output',
step_name='calculate no_clusterfuzz',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'target1', stream='stdout'))
targets = list(all_fuzzers - no_clusterfuzz)
api.step.active_result.presentation.logs['all_fuzzers'] = all_fuzzers
api.step.active_result.presentation.logs['no_clusterfuzz'] = no_clusterfuzz
api.step.active_result.presentation.logs['targets'] = targets
api.chromium.compile(targets=targets, use_goma_module=True)
# Make sure 32 bit archives are distinguished from 64 bit ones.
kwargs = {}
if api.chromium.c.TARGET_BITS == 32:
kwargs['use_legacy'] = False
kwargs['bitness'] = 32
api.archive.clusterfuzz_archive(
build_dir=api.chromium.output_dir,
update_properties=checkout_results.json.output['properties'],
gs_bucket=bot_config['upload_bucket'],
archive_prefix=bot_config.get('archive_prefix', 'libfuzzer'),
archive_subdir_suffix=bot_config['upload_directory'],
gs_acl='public-read',
**kwargs)
def GenTests(api):
for test in api.chromium.gen_tests_for_builders(BUILDERS):
yield test
yield (
api.test('kitchen_paths') +
api.platform.name('mac') +
api.properties.generic(
mastername='chromium.fuzz',
buildername='Libfuzzer Upload Mac ASan',
path_config='kitchen'))