diff options
author | Nathaniel Manista <nathaniel@google.com> | 2016-05-27 16:37:58 +0000 |
---|---|---|
committer | Nathaniel Manista <nathaniel@google.com> | 2016-05-27 21:10:39 +0000 |
commit | 6f61a13991e2747500285bd39e4eb69b68e623e3 (patch) | |
tree | 16590989c3743ddd42b1032d7baa61b01ae23f5e | |
parent | 704fb3f94f040ad59b6f39c27893d2ee2bd76d9e (diff) |
Add block_until_paused method to PauseFailControl
This method will be used in tests that want to ensure before
proceeding that the system under test has progressed to the control
point.
-rw-r--r-- | src/python/grpcio/tests/unit/framework/common/test_control.py | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/python/grpcio/tests/unit/framework/common/test_control.py b/src/python/grpcio/tests/unit/framework/common/test_control.py index ca5ba3a854..088e2f8b88 100644 --- a/src/python/grpcio/tests/unit/framework/common/test_control.py +++ b/src/python/grpcio/tests/unit/framework/common/test_control.py @@ -60,10 +60,16 @@ class Control(six.with_metaclass(abc.ABCMeta)): class PauseFailControl(Control): - """A Control that can be used to pause or fail code under control.""" + """A Control that can be used to pause or fail code under control. + + This object is only safe for use from two threads: one of the system under + test calling control and the other from the test system calling pause, + block_until_paused, and fail. + """ def __init__(self): self._condition = threading.Condition() + self._pause = False self._paused = False self._fail = False @@ -72,19 +78,31 @@ class PauseFailControl(Control): if self._fail: raise Defect() - while self._paused: + while self._pause: + self._paused = True + self._condition.notify_all() self._condition.wait() + self._paused = False @contextlib.contextmanager def pause(self): """Pauses code under control while controlling code is in context.""" with self._condition: - self._paused = True + self._pause = True yield with self._condition: - self._paused = False + self._pause = False self._condition.notify_all() + def block_until_paused(self): + """Blocks controlling code until code under control is paused. + + May only be called within the context of a pause call. + """ + with self._condition: + while not self._paused: + self._condition.wait() + @contextlib.contextmanager def fail(self): """Fails code under control while controlling code is in context.""" |