Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Unified Diff: recipe_engine/recipe_test_api.py

Issue 1785543004: Split Placeholder into InputPlaceholder and OutputPlaceholder. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/recipes-py@master
Patch Set: Fix nits. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | recipe_engine/step_runner.py » ('j') | recipe_engine/step_runner.py » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: recipe_engine/recipe_test_api.py
diff --git a/recipe_engine/recipe_test_api.py b/recipe_engine/recipe_test_api.py
index 9015267afb6ebfe730a8bb84ead952205403c470..117bfe33ae8d39eb769454d3f5a0bf14309fbdce 100644
--- a/recipe_engine/recipe_test_api.py
+++ b/recipe_engine/recipe_test_api.py
@@ -5,7 +5,7 @@
import collections
import contextlib
-from .util import ModuleInjectionSite, static_call, static_wraps
+from . import util
from .types import freeze
def combineify(name, dest, a, b):
@@ -56,7 +56,8 @@ class StepTestData(BaseTestData):
def __init__(self):
super(StepTestData, self).__init__()
# { (module, placeholder) -> [data] }
- self.placeholder_data = collections.defaultdict(list)
+ self.input_placeholder_data = collections.defaultdict(list)
iannucci 2016/03/12 03:36:12 I don't think there needs to be input_placeholder_
stgao 2016/03/22 05:56:43 Done. Also update other docstrings and error messa
+ self.output_placeholder_data = collections.defaultdict(list)
self.override = False
self._stdout = None
self._stderr = None
@@ -70,7 +71,8 @@ class StepTestData(BaseTestData):
ret = StepTestData()
- combineify('placeholder_data', ret, self, other)
+ combineify('input_placeholder_data', ret, self, other)
+ combineify('output_placeholder_data', ret, self, other)
# pylint: disable=W0212
ret._stdout = other._stdout or self._stdout
@@ -82,20 +84,26 @@ class StepTestData(BaseTestData):
return ret
- def unwrap_placeholder(self):
+ def unwrap_output_placeholder(self):
# {(module, placeholder): [data]} => data.
- assert len(self.placeholder_data) == 1
- data_list = self.placeholder_data.items()[0][1]
+ assert len(self.output_placeholder_data) == 1
+ data_list = self.output_placeholder_data.items()[0][1]
assert len(data_list) == 1
return data_list[0]
- def pop_placeholder(self, name_pieces):
- l = self.placeholder_data[name_pieces]
+ def _pop_placeholder(self, name_pieces, placeholder_data):
+ l = placeholder_data[name_pieces]
if l:
return l.pop(0)
else:
return PlaceholderTestData()
+ def pop_input_placeholder(self, name_pieces):
+ return self._pop_placeholder(name_pieces, self.input_placeholder_data)
+
+ def pop_output_placeholder(self, name_pieces):
+ return self._pop_placeholder(name_pieces, self.output_placeholder_data)
+
@property
def retcode(self): # pylint: disable=E0202
return self._retcode or 0
@@ -257,7 +265,10 @@ class DisabledTestData(BaseTestData):
def __getattr__(self, name):
return self
- def pop_placeholder(self, _name_pieces):
+ def pop_input_placeholder(self, _name_pieces):
+ return self
+
+ def pop_output_placeholder(self, _name_pieces):
return self
def pop_step_test_data(self, _step_name, _step_test_data_fn):
@@ -271,12 +282,12 @@ class DisabledTestData(BaseTestData):
yield True
def mod_test_data(func):
- @static_wraps(func)
+ @util.static_wraps(func)
def inner(self, *args, **kwargs):
assert isinstance(self, RecipeTestApi)
mod_name = self._module.NAME # pylint: disable=W0212
ret = TestData(None)
- data = static_call(self, func, *args, **kwargs)
+ data = util.static_call(self, func, *args, **kwargs)
ret.mod_data[mod_name][inner.__name__] = data
return ret
return inner
@@ -284,7 +295,7 @@ def mod_test_data(func):
def placeholder_step_data(func):
"""Decorates RecipeTestApi member functions to allow those functions to
- return just the placeholder data, instead of the normally required
+ return just the output placeholder data, instead of the normally required
StepTestData() object.
The wrapped function may return either:
@@ -310,7 +321,7 @@ def placeholder_step_data(func):
Code calling cool_method('hello') would get a StepTestData:
StepTestData(
- placeholder_data = {
+ output_placeholder_data = {
('foo_module', 'cool_method'): [
PlaceholderTestData('Test data (hello)')
]
@@ -320,7 +331,7 @@ def placeholder_step_data(func):
Code calling other_method(50) would get a StepTestData:
StepTestData(
- placeholder_data = {
+ output_placeholder_data = {
('foo_module', 'other_method'): [
PlaceholderTestData('Test data (hammer time)')
]
@@ -328,18 +339,16 @@ def placeholder_step_data(func):
retcode = 50
)
"""
- @static_wraps(func)
+ @util.static_wraps(func)
def inner(self, *args, **kwargs):
assert isinstance(self, RecipeTestApi)
mod_name = self._module.NAME # pylint: disable=W0212
- data = static_call(self, func, *args, **kwargs)
+ data = util.static_call(self, func, *args, **kwargs)
if isinstance(data, StepTestData):
- all_data = [i
- for l in data.placeholder_data.values()
- for i in l]
+ all_data = data.output_placeholder_data.values()
assert len(all_data) == 1, (
- 'placeholder_step_data is only expecting a single placeholder datum. '
- 'Got: %r' % data
+ 'placeholder_step_data is only expecting a single output placeholder '
+ 'datum. Got: %r' % data
)
placeholder_data, retcode = all_data[0], data.retcode
else:
@@ -347,7 +356,8 @@ def placeholder_step_data(func):
placeholder_data = PlaceholderTestData(placeholder_data)
ret = StepTestData()
- ret.placeholder_data[(mod_name, inner.__name__)].append(placeholder_data)
+ ret.output_placeholder_data[(mod_name, inner.__name__)].append(
+ placeholder_data)
ret.retcode = retcode
return ret
return inner
@@ -410,7 +420,7 @@ class RecipeTestApi(object):
"""Note: Injected dependencies are NOT available in __init__()."""
# If we're the 'root' api, inject directly into 'self'.
# Otherwise inject into 'self.m'
- self.m = self if module is None else ModuleInjectionSite()
+ self.m = self if module is None else util.ModuleInjectionSite()
self._module = module
@staticmethod
@@ -444,8 +454,10 @@ class RecipeTestApi(object):
retcode for this step.
retcode=(int or None) - Override the retcode for this step, even if it
was set by |data|. This must be set as a keyword arg.
- stdout - StepTestData object with placeholder data for a step's stdout.
- stderr - StepTestData object with placeholder data for a step's stderr.
+ stdout - StepTestData object with a single output placeholder datum for a
+ step's stdout.
+ stderr - StepTestData object with a single output placeholder datum for a
+ step's stderr.
override=(bool) - This step data completely replaces any previously
generated step data, instead of adding on to it.
@@ -487,7 +499,8 @@ class RecipeTestApi(object):
if key in kwargs:
stdio_test_data = kwargs[key]
assert isinstance(stdio_test_data, StepTestData)
- setattr(ret.step_data[name], key, stdio_test_data.unwrap_placeholder())
+ setattr(ret.step_data[name], key,
+ stdio_test_data.unwrap_output_placeholder())
return ret
def step_data(self, name, *data, **kwargs):
« no previous file with comments | « no previous file | recipe_engine/step_runner.py » ('j') | recipe_engine/step_runner.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698