| 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 |