| # 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. |
| |
| |
| # TODO(borenet): This module was copied from build.git and heavily modified to |
| # remove dependencies on other modules in build.git. It belongs in a different |
| # repo. Remove this once it has been moved. |
| |
| |
| from recipe_engine.recipe_api import Property |
| |
| DEPS = [ |
| 'isolate', |
| 'recipe_engine/json', |
| 'recipe_engine/path', |
| 'recipe_engine/properties', |
| 'recipe_engine/step', |
| 'swarming_client', |
| ] |
| |
| PROPERTIES = { |
| 'always_use_exparchive': Property( |
| kind=bool, help="Force usage of exparchive.", default=False), |
| } |
| |
| |
| def RunSteps(api, always_use_exparchive): |
| # 'isolate_tests' step needs swarming checkout. |
| api.swarming_client.checkout('master') |
| |
| # Code coverage for isolate_server property. |
| api.isolate.isolate_server = 'https://isolateserver-dev.appspot.com' |
| assert api.isolate.isolate_server == 'https://isolateserver-dev.appspot.com' |
| |
| # That would read a list of files to search for, generated in GenTests. |
| step_result = api.step('read test spec', ['cat'], stdout=api.json.output()) |
| expected_targets = step_result.stdout |
| |
| build_path = api.isolate.package_repo_resource() |
| # Generates code coverage for find_isolated_tests corner cases. |
| # TODO(vadimsh): This step doesn't actually make any sense when the recipe |
| # is running for real via run_recipe.py. |
| api.isolate.find_isolated_tests(build_path, expected_targets) |
| |
| # Code coverage for 'isolate_tests'. 'isolated_test' doesn't support discovery |
| # of isolated targets in build directory, so skip if 'expected_targets' is |
| # None. |
| if expected_targets is not None: |
| api.isolate.isolate_tests( |
| build_path, expected_targets, |
| always_use_exparchive=always_use_exparchive) |
| |
| |
| def GenTests(api): |
| def make_test( |
| name, |
| expected_batcharchive_targets, |
| expected_exparchive_targets, |
| discovered_targets): |
| |
| if expected_batcharchive_targets or expected_exparchive_targets: |
| all_expected_targets = ( |
| (expected_batcharchive_targets or []) + |
| (expected_exparchive_targets or [])) |
| else: |
| all_expected_targets = None |
| |
| missing = set(all_expected_targets or []) - set(discovered_targets or []) |
| output = ( |
| api.test(name) + |
| api.step_data( |
| 'read test spec', |
| stdout=api.json.output(all_expected_targets)) + |
| api.override_step_data( |
| 'find isolated tests', |
| api.isolate.output_json(discovered_targets)) |
| ) |
| |
| # See comment around 'if expected_targets is not None' above. |
| if all_expected_targets: |
| for target in sorted(expected_exparchive_targets): |
| output += api.override_step_data( |
| 'isolate %s' % target, |
| api.isolate.output_json([target], missing)) |
| |
| if expected_batcharchive_targets: |
| output += api.override_step_data( |
| 'isolate tests', |
| api.isolate.output_json(expected_batcharchive_targets, missing)) |
| |
| return output |
| |
| # Expected targets == found targets. |
| yield make_test( |
| 'basic', ['test1', 'test2'], [], ['test1', 'test2']) |
| # No expectations, just discovering what's there returned by default mock. |
| yield make_test( |
| 'discover', None, None, None) |
| # Found more than expected. |
| yield make_test( |
| 'extra', ['test1', 'test2'], [], ['test1', 'test2', 'extra_test']) |
| # Didn't find something. |
| yield ( |
| make_test('missing', ['test1', 'test2'], [], ['test1']) + |
| api.properties.generic(buildername='Windows Swarm Test')) |
| # No expectations, and nothing has been found, produces warning. |
| yield make_test('none', None, None, []) |
| # Test the `exparchive` cases |
| # Only exparchive |
| yield make_test( |
| 'exparchive', [], ['test_exparchive'], ['test_exparchive']) |
| yield make_test( |
| 'exparchive-miss', [], ['test_exparchive'], []) |
| yield make_test( |
| 'exparchive-multi', |
| [], |
| ['test1_exparchive', 'test2_exparchive'], |
| ['test1_exparchive', 'test2_exparchive']) |
| yield make_test( |
| 'exparchive-multi-miss', |
| [], |
| ['test1_exparchive', 'test2_exparchive'], |
| ['test1_exparchive']) |
| # Mixed |
| yield make_test( |
| 'exparchive-batch', |
| ['test1', 'test2'], |
| ['test_exparchive'], |
| ['test1', 'test2', 'test_exparchive']) |
| yield make_test( |
| 'exparchive-batch-bmiss', |
| ['test1', 'test2'], |
| ['test_exparchive'], |
| ['test1', 'test_exparchive']) |
| yield make_test( |
| 'exparchive-batch-emiss', |
| ['test1', 'test2'], |
| ['test_exparchive'], |
| ['test1', 'test2']) |
| # Use force-exparchive |
| yield make_test( |
| 'always-use-exparchive', |
| [], |
| ['test_exparchive', 'test1', 'test2'], |
| ['test_exparchive', 'test1', 'test2']) + api.properties( |
| always_use_exparchive=True) |