OLD | NEW |
(Empty) | |
| 1 # Copyright 2014-2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 """Provides simulator test coverage for individual recipes.""" |
| 6 |
| 7 import logging |
| 8 import re |
| 9 import os |
| 10 import sys |
| 11 |
| 12 from . import expect_tests |
| 13 |
| 14 # This variable must be set in the dynamic scope of the functions in this file. |
| 15 # We do this instead of passing because the threading system of expect tests |
| 16 # doesn't know how to serialize it. |
| 17 _UNIVERSE = None |
| 18 |
| 19 def RunRecipe(test_data): |
| 20 from .third_party import annotator |
| 21 from . import main |
| 22 from . import config_types |
| 23 |
| 24 stream = annotator.StructuredAnnotationStream(stream=open(os.devnull, 'w')) |
| 25 config_types.ResetTostringFns() |
| 26 result = main.run_steps( |
| 27 test_data.properties, stream, _UNIVERSE, test_data) |
| 28 |
| 29 return expect_tests.Result(list(result.steps_ran.values())) |
| 30 |
| 31 |
| 32 def test_gen_coverage(): |
| 33 return ( |
| 34 [os.path.join(x, '*') for x in _UNIVERSE.recipe_dirs] + |
| 35 [os.path.join(x, '*', 'example.py') for x in _UNIVERSE.module_dirs] + |
| 36 [os.path.join(x, '*', 'test_api.py') for x in _UNIVERSE.module_dirs] |
| 37 ) |
| 38 |
| 39 def cover_omit(): |
| 40 omit = [ ] |
| 41 for mod_dir_base in _UNIVERSE.module_dirs: |
| 42 if os.path.isdir(mod_dir_base): |
| 43 omit.append(os.path.join(mod_dir_base, '*', 'resources', '*')) |
| 44 return omit |
| 45 |
| 46 @expect_tests.covers(test_gen_coverage) |
| 47 def GenerateTests(): |
| 48 from . import loader |
| 49 |
| 50 cover_mods = [ ] |
| 51 for mod_dir_base in _UNIVERSE.module_dirs: |
| 52 if os.path.isdir(mod_dir_base): |
| 53 cover_mods.append(os.path.join(mod_dir_base, '*', '*.py')) |
| 54 |
| 55 for recipe_path, recipe_name in _UNIVERSE.loop_over_recipes(): |
| 56 recipe = _UNIVERSE.load_recipe(recipe_name) |
| 57 test_api = loader.create_test_api(recipe.LOADED_DEPS, _UNIVERSE) |
| 58 |
| 59 covers = cover_mods + [recipe_path] |
| 60 |
| 61 for test_data in recipe.GenTests(test_api): |
| 62 root, name = os.path.split(recipe_path) |
| 63 name = os.path.splitext(name)[0] |
| 64 expect_path = os.path.join(root, '%s.expected' % name) |
| 65 |
| 66 test_data.properties['recipe'] = recipe_name.replace('\\', '/') |
| 67 yield expect_tests.Test( |
| 68 '%s.%s' % (recipe_name, test_data.name), |
| 69 expect_tests.FuncCall(RunRecipe, test_data), |
| 70 expect_dir=expect_path, |
| 71 expect_base=test_data.name, |
| 72 covers=covers, |
| 73 break_funcs=(recipe.RunSteps,) |
| 74 ) |
| 75 |
| 76 |
| 77 def main(universe): |
| 78 """Runs simulation tests on a given repo of recipes. |
| 79 |
| 80 Args: |
| 81 universe: a RecipeUniverse to operate on. |
| 82 Returns: |
| 83 Doesn't -- exits with a status code |
| 84 """ |
| 85 |
| 86 # annotated_run has different behavior when these environment variables |
| 87 # are set, so unset to make simulation tests environment-invariant. |
| 88 for env_var in ['TESTING_MASTER_HOST', |
| 89 'TESTING_MASTER', |
| 90 'TESTING_SLAVENAME']: |
| 91 if env_var in os.environ: |
| 92 logging.warn("Ignoring %s environment variable." % env_var) |
| 93 os.environ.pop(env_var) |
| 94 |
| 95 global _UNIVERSE |
| 96 _UNIVERSE = universe |
| 97 expect_tests.main('recipe_simulation_test', GenerateTests, |
| 98 cover_omit=cover_omit()) |
OLD | NEW |