blob: 79774e2daf1bebec87199eab85962ff0f1aeb324 [file] [log] [blame]
# Copyright 2016 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 json
from recipe_engine.config import Dict
from recipe_engine.config import Single
from recipe_engine.recipe_api import Property
DEPS = [
'adb',
'chromium',
'chromium_android',
'chromium_checkout',
'chromium_swarming',
'chromium_tests',
'depot_tools/bot_update',
'depot_tools/gclient',
'depot_tools/git',
'filter',
'findit',
'isolate',
'recipe_engine/buildbucket',
'recipe_engine/commit_position',
'recipe_engine/context',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/raw_io',
'recipe_engine/runtime',
'recipe_engine/step',
'test_results',
'test_utils',
]
PROPERTIES = {
'target_mastername': Property(
kind=str, help='The target master to match compile config to.'),
'target_testername': Property(
kind=str,
help='The target tester to match test config to. If the tests are run '
'on a builder, just treat the builder as a tester.'),
'test_revision': Property(
kind=str, help='The revision to test.'),
'tests': Property(
kind=Dict(value_type=list),
default={},
help='The failed tests, the test name should be full name, e.g.: {'
' "browser_tests": ['
' "suite.test1", "suite.test2"'
' ]'
'}'),
'test_repeat_count': Property(
kind=Single(int, required=False), default=100,
help='How many times to repeat the tests.'),
'skip_tests': Property(
kind=Single(bool, required=False), default=False,
help='If True, skip the execution of the tests.'),
}
def RunSteps(api, target_mastername, target_testername,
test_revision, tests, test_repeat_count, skip_tests):
assert tests, 'No failed tests were specified.'
target_buildername, checked_out_revision, cached_revision = (
api.findit.configure_and_sync(api, target_mastername, target_testername,
test_revision))
test_results = {}
report = {
'result': test_results,
'metadata': {},
'previously_cached_revision': cached_revision,
'previously_checked_out_revision': checked_out_revision
}
try:
test_results[test_revision], _ = (
api.findit.compile_and_test_at_revision(
api, target_mastername, target_buildername, target_testername,
test_revision, tests, False, test_repeat_count, skip_tests))
except api.step.InfraFailure:
test_results[test_revision] = api.findit.TestResult.INFRA_FAILED
report['metadata']['infra_failure'] = True
raise
finally:
report['last_checked_out_revision'] = api.properties.get('got_revision')
report['isolated_tests'] = api.isolate.isolated_tests
# Give the full report including test results and metadata.
api.python.succeeding_step(
'report', [json.dumps(report, indent=2)], as_log='report')
return report
def GenTests(api):
def props(
tests, platform_name, tester_name, use_analyze=False, revision=None,
skip_tests=False):
properties = {
'path_config': 'kitchen',
'mastername': 'tryserver.chromium.%s' % platform_name,
'buildername': '%s_chromium_variable' % platform_name,
'bot_id': 'build1-a1',
'buildnumber': 1,
'target_mastername': 'chromium.%s' % platform_name,
'target_testername': tester_name,
'test_revision': revision or 'r0',
'skip_tests': skip_tests,
}
if tests:
properties['tests'] = tests
return api.properties(**properties) + api.platform.name(
platform_name) + api.runtime(True, False)
yield (
api.test('flakiness_isolate_only') +
props({'browser_tests': ['Test.One']}, 'mac', 'Mac10.13 Tests',
skip_tests=True) +
api.chromium_tests.read_source_side_spec(
'chromium.mac', {
'Mac10.13 Tests': {
'gtest_tests': [
{
'test': 'browser_tests',
'swarming': {
'can_use_on_swarming_builders': True,
'shards': 10},
},
],
},
}, step_prefix='test r0.')
)
yield (
api.test('flakiness_swarming_tests') +
props({'browser_tests': ['Test.One']}, 'mac', 'Mac10.13 Tests') +
api.chromium_tests.read_source_side_spec(
'chromium.mac', {
'Mac10.13 Tests': {
'gtest_tests': [
{
'test': 'browser_tests',
'swarming': {
'can_use_on_swarming_builders': True,
'shards': 10},
},
],
},
}, step_prefix='test r0.') +
api.override_step_data(
'test r0.browser_tests (r0)',
api.chromium_swarming.canned_summary_output(
api.test_utils.simulated_gtest_output(
passed_test_names=['Test.One'])))
)
yield (
api.test('flakiness_non-swarming_tests') +
props({'gl_tests': ['Test.One']}, 'mac', 'Mac10.13 Tests') +
api.chromium_tests.read_source_side_spec(
'chromium.mac', {
'Mac10.13 Tests': {
'gtest_tests': [
{
'test': 'gl_tests',
'swarming': {'can_use_on_swarming_builders': False},
},
],
},
}, step_prefix='test r0.') +
api.override_step_data(
'test r0.gl_tests (r0)',
api.chromium_swarming.canned_summary_output(
api.test_utils.simulated_gtest_output(
passed_test_names=['Test.One'])))
)
yield (
api.test('record_infra_failure') +
props({'gl_tests': ['Test.One']}, 'mac', 'Mac10.13 Tests') +
api.chromium_tests.read_source_side_spec(
'chromium.mac', {
'Mac10.13 Tests': {
'gtest_tests': [
{
'test': 'gl_tests',
'swarming': {'can_use_on_swarming_builders': True},
},
],
},
}, step_prefix='test r0.') +
api.override_step_data(
'test r0.preprocess_for_goma.start_goma', retcode=1) +
api.step_data(
'test r0.preprocess_for_goma.goma_jsonstatus',
api.json.output(
data={
'notice': [
{
'infra_status': {
'ping_status_code': 408,
},
},
],
}))
)
yield (
api.test('flakiness_blink_web_tests') +
props({'blink_web_tests': ['fast/dummy/test.html']},
'mac', 'Mac10.13 Tests') +
api.chromium_tests.read_source_side_spec(
'chromium.mac', {
'Mac10.13 Tests': {
'isolated_scripts': [
{
'isolate_name': 'blink_web_tests',
'name': 'blink_web_tests',
'swarming': {
'can_use_on_swarming_builders': True,
'shards': 1,
},
},
],
},
}, step_prefix='test r0.') +
api.override_step_data(
'test r0.blink_web_tests (r0)',
api.chromium_swarming.canned_summary_output(
api.test_utils.simulated_isolated_script_output(
flaky_test_names=['fast/dummy/test.html'],
path_delimiter='/')))
)