blob: 1a8ee7a2370305df436b0c3c91345553b9ade3da [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.
DEPS = [
'depot_tools/bot_update',
'depot_tools/depot_tools',
'depot_tools/gclient',
'depot_tools/gsutil',
'depot_tools/osx_sdk',
'depot_tools/tryserver',
'goma',
'recipe_engine/buildbucket',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/step',
'recipe_engine/time',
]
from recipe_engine.recipe_api import Property
# DM_JSON is the file that gathers results for ingestion into Gold.
DM_JSON = 'dm.json'
# GS_BUCKET is the GS bucket to hold Gold Results.
GS_BUCKET = 'skia-pdfium-gm'
# Number of times the upload routine will retry to upload Gold results.
UPLOAD_ATTEMPTS = 5
PROPERTIES = {
'skia': Property(default=False, kind=bool),
'skia_paths': Property(default=False, kind=bool),
'xfa': Property(default=False, kind=bool),
'memory_tool': Property(default=None, kind=str),
'v8': Property(default=True, kind=bool),
'target_cpu': Property(default=None, kind=str),
'clang': Property(default=False, kind=bool),
'msvc': Property(default=False, kind=bool),
'rel': Property(default=False, kind=bool),
'jumbo': Property(default=False, kind=bool),
'skip_test': Property(default=False, kind=bool),
'target_os': Property(default=None, kind=str),
}
def _CheckoutSteps(api, target_os):
solution_path = api.path['cache'].join('builder')
api.file.ensure_directory('init cache if not exists', solution_path)
with api.context(cwd=solution_path):
# Checkout pdfium and its dependencies (specified in DEPS) using gclient.
api.gclient.set_config('pdfium')
if target_os:
api.gclient.c.target_os = {target_os}
api.gclient.c.got_revision_mapping['pdfium'] = 'got_revision'
update_step = api.bot_update.ensure_checkout()
api.gclient.runhooks()
return update_step.presentation.properties['got_revision']
def _OutPath(memory_tool, skia, skia_paths, xfa, v8, clang, msvc, rel, jumbo):
out_dir = 'release' if rel else 'debug'
if skia:
out_dir += "_skia"
if skia_paths:
out_dir += "_skiapaths"
if xfa:
out_dir += "_xfa"
if v8:
out_dir += "_v8"
if clang:
out_dir += "_clang"
elif msvc:
out_dir += "_msvc"
if jumbo:
out_dir += "_jumbo"
if memory_tool == 'asan':
out_dir += "_asan"
elif memory_tool == 'msan':
out_dir += "_msan"
elif memory_tool == 'ubsan':
out_dir += "_ubsan"
return out_dir
# _GNGenBuilds calls 'gn gen' and returns a dictionary of
# the used build configuration to be used by Gold.
def _GNGenBuilds(api, memory_tool, skia, skia_paths, xfa, v8, target_cpu, clang,
msvc, rel, jumbo, target_os, out_dir):
api.goma.ensure_goma()
gn_bool = {True: 'true', False: 'false'}
# Generate build files by GN.
checkout = api.path['checkout']
gn_cmd = api.depot_tools.gn_py_path
# Prepare the arguments to pass in.
args = [
'is_debug=%s' % gn_bool[not rel],
'is_component_build=false',
'pdf_enable_v8=%s' % gn_bool[v8],
'pdf_enable_xfa=%s' % gn_bool[xfa],
'pdf_use_skia=%s' % gn_bool[skia],
'pdf_use_skia_paths=%s' % gn_bool[skia_paths],
'pdf_is_standalone=true',
'use_goma=true',
'goma_dir="%s"' % api.goma.goma_dir,
]
if api.platform.is_win and not memory_tool:
args.append('symbol_level=1')
if api.platform.is_win:
assert not clang or not msvc
if clang:
args.append('is_clang=true')
elif msvc:
args.append('is_clang=false')
else:
# Default to Clang.
args.append('is_clang=true')
else:
# All other platforms already build with Clang, so no need to set it.
assert not clang
if skia or skia_paths:
# PDFium defaults to C++11 but newer Skia requires C++14.
args.append('use_cxx11=false')
if jumbo:
# Note: The jumbo_file_merge_limit value below comes from
# build/config/jumbo.gni. It is set here to make this jumbo/goma build act
# more like a jumbo without goma build. If the value changes in jumbo.gni,
# it needs to be updated here as well.
args.extend(['use_jumbo_build=true', 'jumbo_file_merge_limit=50'])
if memory_tool == 'asan':
args.append('is_asan=true')
if api.platform.is_win:
# ASAN requires Clang. Until Clang is default on Windows for certain,
# bots should set it explicitly.
assert clang
# No LSAN support.
else:
args.append('is_lsan=true')
elif memory_tool == 'msan':
assert not api.platform.is_win
args.extend(['is_msan=true', 'use_prebuilt_instrumented_libraries=true'])
elif memory_tool == 'ubsan':
assert not api.platform.is_win
args.append('is_ubsan_security=true')
if target_os:
args.append('target_os="%s"' % target_os)
if target_cpu == 'x86':
args.append('target_cpu="x86"')
with api.context(cwd=checkout):
api.python('gn gen', gn_cmd,
['--check',
'--root=' + str(checkout), 'gen', '//out/' + out_dir,
'--args=' + ' '.join(args)])
# convert the arguments to key values pairs for gold usage.
return gold_build_config(args)
def _BuildSteps(api, clang, out_dir):
debug_path = api.path['checkout'].join('out', out_dir)
ninja_cmd = [api.depot_tools.ninja_path, '-C', debug_path,
'-j', api.goma.recommended_goma_jobs, 'pdfium_all']
api.goma.build_with_goma(
name='compile with ninja',
ninja_command=ninja_cmd,
ninja_log_outdir=debug_path,
ninja_log_compiler='clang' if clang else 'unknown')
# _RunTests runs the tests and uploads the results to Gold.
def _RunTests(api, memory_tool, v8, out_dir, build_config, revision):
env = {}
COMMON_SANITIZER_OPTIONS = ['allocator_may_return_null=1']
COMMON_UNIX_SANITIZER_OPTIONS = [
'detect_leaks=1',
'symbolize=1',
# Note: deliberate lack of comma.
'external_symbolizer_path='
'third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer',
]
if memory_tool == 'asan':
options = []
options.extend(COMMON_SANITIZER_OPTIONS)
if not api.platform.is_win:
options.extend(COMMON_UNIX_SANITIZER_OPTIONS)
env.update({'ASAN_OPTIONS': ' '.join(options)})
elif memory_tool == 'msan':
assert not api.platform.is_win
options = []
options.extend(COMMON_SANITIZER_OPTIONS)
options.extend(COMMON_UNIX_SANITIZER_OPTIONS)
env.update({'MSAN_OPTIONS': ' '.join(options)})
elif memory_tool == 'ubsan':
assert not api.platform.is_win
options = []
options.extend(COMMON_SANITIZER_OPTIONS)
options.extend(COMMON_UNIX_SANITIZER_OPTIONS)
env.update({'UBSAN_OPTIONS': ' '.join(options)})
unittests_path = str(api.path['checkout'].join('out', out_dir,
'pdfium_unittests'))
if api.platform.is_win:
unittests_path += '.exe'
with api.context(cwd=api.path['checkout'], env=env):
api.step('unittests', [unittests_path])
embeddertests_path = str(api.path['checkout'].join('out', out_dir,
'pdfium_embeddertests'))
if api.platform.is_win:
embeddertests_path += '.exe'
with api.context(cwd=api.path['checkout'], env=env):
api.step('embeddertests', [embeddertests_path])
script_args = ['--build-dir', api.path.join('out', out_dir)]
# Add the arguments needed to upload the resulting images.
gold_output_dir = api.path['checkout'].join('out', out_dir, 'gold_output')
gold_props, gold_key = get_gold_params(api, build_config, revision)
script_args.extend([
'--gold_properties', gold_props,
'--gold_key', gold_key,
'--gold_output_dir', gold_output_dir,
])
# Cannot use the standard deferred result mechanism, since some of the
# operations related to uploading to Gold depend on non-deferred results.
test_exception = None
if v8:
javascript_path = str(api.path['checkout'].join('testing', 'tools',
'run_javascript_tests.py'))
with api.context(cwd=api.path['checkout'], env=env):
try:
api.python('javascript tests', javascript_path, script_args)
except api.step.StepFailure as e:
# Swallow the exception. The step will still show up as
# failed, but processing will continue.
test_exception = e
# Setup uploading results to Gold after the javascript tests, since they do
# not produce interesting result images
ignore_hashes_file = get_gold_ignore_hashes(api, out_dir)
if ignore_hashes_file:
script_args.extend(['--gold_ignore_hashes',
ignore_hashes_file]) # pragma: no cover
pixel_tests_path = str(api.path['checkout'].join('testing', 'tools',
'run_pixel_tests.py'))
with api.context(cwd=api.path['checkout'], env=env):
try:
api.python('pixel tests', pixel_tests_path, script_args)
except api.step.StepFailure as e:
# Swallow the exception. The step will still show up as
# failed, but processing will continue.
test_exception = e
# Upload immediately, since tests below will overwrite the output directory
upload_dm_results(api, gold_output_dir, revision, 'pixel')
corpus_tests_path = str(api.path['checkout'].join('testing', 'tools',
'run_corpus_tests.py'))
with api.context(cwd=api.path['checkout'], env=env):
try:
api.python('corpus tests', corpus_tests_path, script_args)
except api.step.StepFailure as e:
# Swallow the exception. The step will still show up as
# failed, but processing will continue.
test_exception = e
upload_dm_results(api, gold_output_dir, revision, 'corpus')
if test_exception:
raise test_exception # pylint: disable=E0702
def RunSteps(api, memory_tool, skia, skia_paths, xfa, v8, target_cpu, clang,
msvc, rel, jumbo, skip_test, target_os):
revision = _CheckoutSteps(api, target_os)
out_dir = _OutPath(memory_tool, skia, skia_paths, xfa, v8, clang, msvc, rel,
jumbo)
with api.osx_sdk('mac'):
build_config = _GNGenBuilds(api, memory_tool, skia, skia_paths, xfa, v8,
target_cpu, clang, msvc, rel, jumbo, target_os,
out_dir)
_BuildSteps(api, clang, out_dir)
if skip_test:
return
_RunTests(api, memory_tool, v8, out_dir, build_config, revision)
def get_gold_params(api, build_config, revision):
"""Get the parameters to be passed to the testing call to
generate the dm.json file expected by Gold and to upload
the generated images. Returns:
(properties_str, key_str)
These strings can be passed directly into run_corpus_tests.py.
"""
builder_name = api.m.buildbucket.builder_name.strip()
props = [
'gitHash', revision,
'master', api.m.properties['mastername'],
'builder', builder_name,
'build_number', str(api.m.buildbucket.build.number),
]
# Add the trybot information if this is a trybot run.
if api.m.tryserver.gerrit_change:
props.extend([
'issue', str(api.m.tryserver.gerrit_change.change),
'patchset', str(api.m.tryserver.gerrit_change.patchset),
'patch_storage', 'gerrit',
'buildbucket_build_id', str(api.buildbucket.build.id),
])
# Add the os from the builder name to the set of unique identifers.
keys = build_config.copy()
keys["os"] = builder_name.split("_")[0]
return " ".join(props), dict_to_str(keys)
def dict_to_str(props):
"""Returns the given dictionary as a string of space
separated key/value pairs sorted by keys.
"""
ret = []
for k in sorted(props.keys()):
ret += [k,props[k]]
return " ".join(ret)
def gold_build_config(args):
""" Extracts key value pairs from the arguments handed to 'gn gen'
and returns them as a dictionary. Since these are used as
parameters in Gold we strip common prefixes and disregard
some arguments. i.e. 'use_goma' since we don't care about how
a binary was built. Only arguments that follow the
'key=value' pattern are considered.
"""
black_list = ["use_goma", "goma_dir", "use_sysroot", "is_component_build"]
strip_prefixes = ["is_", "pdf_enable_", "pdf_use_", "pdf_"]
build_config = {}
for arg in args:
# Catch multiple k/v pairs separated by spaces.
parts = arg.split()
for p in parts:
kv = [x.strip() for x in p.split("=")]
if len(kv) == 2:
k,v = kv
if k not in black_list:
for prefix in strip_prefixes:
if k.startswith(prefix):
k = k[len(prefix):]
break
build_config[k] = v
return build_config
def get_gold_ignore_hashes(api, out_dir):
"""Downloads a list of MD5 hashes from Gold and
writes them to a file. That file is then used by the
test runner in the pdfium repository to ignore already
known hashes.
"""
host_hashes_file = api.path['checkout'].join('out',
out_dir,
'ignore_hashes.txt')
try:
with api.context(cwd=api.path['checkout']):
api.m.python.inline(
'get uninteresting hashes',
program="""
import contextlib
import math
import socket
import sys
import time
import urllib2
HASHES_URL = 'https://pdfium-gold.skia.org/_/hashes'
RETRIES = 5
TIMEOUT = 60
WAIT_BASE = 15
socket.setdefaulttimeout(TIMEOUT)
for retry in range(RETRIES):
try:
with contextlib.closing(
urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:
hashes = w.read()
with open(sys.argv[1], 'w') as f:
f.write(hashes)
break
except Exception as e:
print 'Failed to get uninteresting hashes from %s:' % HASHES_URL
print e
if retry == RETRIES:
raise
waittime = WAIT_BASE * math.pow(2, retry)
print 'Retry in %d seconds.' % waittime
time.sleep(waittime)
""",
args=[host_hashes_file],
infra_step=True)
except api.step.StepFailure:
# Swallow the exception. The step will still show up as
# failed, but processing will continue.
pass
if api.path.exists(host_hashes_file):
return host_hashes_file
return None
def upload_dm_results(api, results_dir, revision, test_type):
""" Uploads results of the tests to Gold.
This assumes that results_dir contains a JSON file
and a set of PNGs.
Adapted from:
https://skia.googlesource.com/skia/+/master/infra/bots/recipes/upload_dm_results.py
test_type is expected to be 'corpus', 'javascript', or 'pixel'
"""
builder_name = api.m.buildbucket.builder_name.strip()
# Upload the images.
files_to_upload = api.file.glob_paths(
'find images',
results_dir,
'*.png',
test_data=['someimage.png'])
if len(files_to_upload) > 0:
gs_cp(api, 'images', results_dir.join('*.png'), 'dm-images-v1',
multithreaded=True)
# Upload the JSON summary and verbose.log.
sec_str = str(int(api.time.time()))
now = api.time.utcnow()
summary_dest_path = '/'.join(
['dm-json-v1',
str(now.year).zfill(4),
str(now.month).zfill(2),
str(now.day).zfill(2),
str(now.hour).zfill(2),
revision,
builder_name,
sec_str,
test_type])
# Trybot results are further siloed by issue/patchset.
if api.m.tryserver.gerrit_change:
summary_dest_path = '/'.join((
'trybot', summary_dest_path,
str(api.m.tryserver.gerrit_change.change),
str(api.m.tryserver.gerrit_change.patchset)))
summary_dest_path = '/'.join([summary_dest_path, DM_JSON])
local_dmjson = results_dir.join(DM_JSON)
gs_cp(api, 'JSON', local_dmjson, summary_dest_path,
extra_args=['-z', 'json,log'])
def gs_cp(api, name, src, dst, multithreaded=False, extra_args=None):
"""
Copy the src to dst in Google storage.
"""
name = 'upload %s' % name
for i in xrange(UPLOAD_ATTEMPTS):
try:
args = extra_args if extra_args else []
full_dest = 'gs://%s/%s' % (GS_BUCKET, dst)
api.gsutil(['cp'] + args + [src, full_dest],
name=name, multithreaded=multithreaded)
break
except api.step.StepFailure: # pragma: no cover
if i == UPLOAD_ATTEMPTS - 1:
raise
def gen_ci_build(api, builder):
return api.buildbucket.ci_build(
project='pdfium',
builder=builder,
build_number=1234,
git_repo='https://pdfium.googlesource.com/pdfium',
)
def GenTests(api):
yield (
api.test('win') +
api.platform('win', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows')
)
yield (
api.test('linux') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux')
)
yield (
api.test('mac') +
api.platform('mac', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac')
)
yield (
api.test('win_no_v8') +
api.platform('win', 64) +
api.properties(v8=False,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_no_v8')
)
yield (
api.test('linux_no_v8') +
api.platform('linux', 64) +
api.properties(v8=False,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_no_v8')
)
yield (
api.test('mac_no_v8') +
api.platform('mac', 64) +
api.properties(v8=False,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_no_v8')
)
yield (
api.test('win_skia') +
api.platform('win', 64) +
api.properties(skia=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_skia')
)
yield (
api.test('win_skia_paths') +
api.platform('win', 64) +
api.properties(skia_paths=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_skia_paths')
)
yield (
api.test('win_xfa_32') +
api.platform('win', 64) +
api.properties(xfa=True,
target_cpu='x86',
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_32')
)
yield (
api.test('win_xfa') +
api.platform('win', 64) +
api.properties(xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa')
)
yield (
api.test('win_xfa_rel') +
api.platform('win', 64) +
api.properties(xfa=True,
rel=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_rel')
)
yield (
api.test('win_xfa_jumbo') +
api.platform('win', 64) +
api.properties(xfa=True,
jumbo=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_jumbo')
)
yield (
api.test('win_xfa_msvc_32') +
api.platform('win', 64) +
api.properties(xfa=True,
msvc=True,
target_cpu='x86',
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_msvc_32')
)
yield (
api.test('win_xfa_msvc') +
api.platform('win', 64) +
api.properties(xfa=True,
msvc=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_msvc')
)
yield (
api.test('linux_skia') +
api.platform('linux', 64) +
api.properties(skia=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_skia')
)
yield (
api.test('linux_skia_paths') +
api.platform('linux', 64) +
api.properties(skia_paths=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_skia_paths')
)
yield (
api.test('linux_xfa') +
api.platform('linux', 64) +
api.properties(xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa')
)
yield (
api.test('linux_xfa_rel') +
api.platform('linux', 64) +
api.properties(xfa=True,
rel=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa_rel')
)
yield (
api.test('linux_xfa_jumbo') +
api.platform('linux', 64) +
api.properties(xfa=True,
jumbo=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa_jumbo')
)
yield (
api.test('mac_skia') +
api.platform('mac', 64) +
api.properties(skia=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_skia')
)
yield (
api.test('mac_skia_paths') +
api.platform('mac', 64) +
api.properties(skia_paths=True,
xfa=True,
skip_test=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_skia_paths')
)
yield (
api.test('mac_xfa') +
api.platform('mac', 64) +
api.properties(xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_xfa')
)
yield (
api.test('mac_xfa_rel') +
api.platform('mac', 64) +
api.properties(xfa=True,
rel=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_xfa_rel')
)
yield (
api.test('mac_xfa_jumbo') +
api.platform('mac', 64) +
api.properties(xfa=True,
jumbo=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'mac_xfa_jumbo')
)
yield (
api.test('linux_asan_lsan') +
api.platform('linux', 64) +
api.properties(memory_tool='asan',
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_asan_lsan')
)
yield (
api.test('linux_msan') +
api.platform('linux', 64) +
api.properties(memory_tool='msan',
rel=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_msan')
)
yield (
api.test('linux_ubsan') +
api.platform('linux', 64) +
api.properties(memory_tool='ubsan',
rel=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_ubsan')
)
yield (
api.test('linux_xfa_asan_lsan') +
api.platform('linux', 64) +
api.properties(memory_tool='asan',
xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa_asan_lsan')
)
yield (
api.test('linux_xfa_msan') +
api.platform('linux', 64) +
api.properties(memory_tool='msan',
rel=True,
xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa_msan')
)
yield (
api.test('linux_xfa_ubsan') +
api.platform('linux', 64) +
api.properties(memory_tool='ubsan',
rel=True,
xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux_xfa_ubsan')
)
yield (
api.test('win_asan') +
api.platform('win', 64) +
api.properties(clang=True,
memory_tool='asan',
rel=True,
target_cpu='x86',
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_asan')
)
yield (
api.test('win_xfa_asan') +
api.platform('win', 64) +
api.properties(clang=True,
memory_tool='asan',
rel=True,
target_cpu='x86',
xfa=True,
mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'windows_xfa_asan')
)
yield (
api.test('try-linux-gerrit_xfa_asan_lsan') +
api.buildbucket.try_build(
project='pdfium',
builder='linux_xfa_asan_lsan',
build_number=1234) +
api.platform('linux', 64) +
api.properties(xfa=True,
memory_tool='asan',
mastername='tryserver.client.pdfium')
)
yield (
api.test('android') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave',
target_os='android',
skip_test=True) +
gen_ci_build(api, 'android')
)
yield (
api.test('success-download-hashes-file') +
api.platform('linux', 64) +
api.properties(v8=False,
mastername='client.pdfium',
bot_id='test_slave',
target_os='android') +
gen_ci_build(api, 'android') +
api.path.exists(
api.path['cache'].join(
'builder', 'pdfium', 'out', 'debug', 'ignore_hashes.txt')
)
)
yield (
api.test('fail-download-hashes-file') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave',
target_os='android') +
gen_ci_build(api, 'android') +
api.step_data('get uninteresting hashes', retcode=1)
)
yield (
api.test('fail-javascript-tests') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux') +
api.step_data('javascript tests', retcode=1)
)
yield (
api.test('fail-pixel-tests') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux') +
api.step_data('pixel tests', retcode=1)
)
yield (
api.test('fail-corpus-tests') +
api.platform('linux', 64) +
api.properties(mastername='client.pdfium',
bot_id='test_slave') +
gen_ci_build(api, 'linux') +
api.step_data('corpus tests', retcode=1)
)