summaryrefslogtreecommitdiff
path: root/taskflow/tests/unit/test_flow_dependencies.py
diff options
context:
space:
mode:
authorIvan A. Melnikov <imelnikov@griddynamics.com>2013-09-12 11:49:45 +0400
committerIvan A. Melnikov <imelnikov@griddynamics.com>2013-09-18 09:51:33 +0400
commitb07ee63f78e9c200c3a117f148b78599f8b71628 (patch)
tree8e828f369ec469bc05613428e6db3849df05ae88 /taskflow/tests/unit/test_flow_dependencies.py
parent645fc49c888a07e704d1c640e02583acc0abc8a3 (diff)
downloadtaskflow-b07ee63f78e9c200c3a117f148b78599f8b71628.tar.gz
Verify provides and requires
When flow is being constructed we ensure that it is actually valid by checking its invariants: - for linear flow, no item should depend on items that are executed after it; - for unordered flow, items should be independent. We also add check that all necessary provides were injected to storage before actually running flow. Implements: blueprint flow-verification Change-Id: I499898f543505b7dd6f82716ae8f4011cb08f601
Diffstat (limited to 'taskflow/tests/unit/test_flow_dependencies.py')
-rw-r--r--taskflow/tests/unit/test_flow_dependencies.py42
1 files changed, 35 insertions, 7 deletions
diff --git a/taskflow/tests/unit/test_flow_dependencies.py b/taskflow/tests/unit/test_flow_dependencies.py
index 68805f2..ffa14f6 100644
--- a/taskflow/tests/unit/test_flow_dependencies.py
+++ b/taskflow/tests/unit/test_flow_dependencies.py
@@ -19,6 +19,7 @@
from taskflow.patterns import linear_flow as lf
from taskflow.patterns import unordered_flow as uf
+from taskflow import exceptions
from taskflow import task
from taskflow import test
@@ -146,6 +147,12 @@ class FlowDependenciesTest(test.TestCase):
self.assertEquals(flow.requires, set())
self.assertEquals(flow.provides, set(['x', 'a', 'b', 'c']))
+ def test_linear_flow_provides_out_of_order(self):
+ with self.assertRaises(exceptions.InvariantViolationException):
+ lf.Flow('lf').add(
+ TaskOneArg('task2'),
+ TaskOneReturn('task1', provides='x'))
+
def test_linear_flow_provides_required_values(self):
flow = lf.Flow('lf').add(
TaskOneReturn('task1', provides='x'),
@@ -163,6 +170,11 @@ class FlowDependenciesTest(test.TestCase):
self.assertEquals(flow.requires, set(['a', 'b', 'c', 'z']))
self.assertEquals(flow.provides, set(['x', 'y', 'q', 'i', 'j', 'k']))
+ def test_linear_flow_self_requires(self):
+ flow = lf.Flow('uf')
+ with self.assertRaises(exceptions.InvariantViolationException):
+ flow.add(TaskNoRequiresNoReturns(rebind=['x'], provides='x'))
+
def test_unordered_flow_without_dependencies(self):
flow = uf.Flow('uf').add(
TaskNoRequiresNoReturns('task1'),
@@ -170,6 +182,11 @@ class FlowDependenciesTest(test.TestCase):
self.assertEquals(flow.requires, set())
self.assertEquals(flow.provides, set())
+ def test_unordered_flow_self_requires(self):
+ flow = uf.Flow('uf')
+ with self.assertRaises(exceptions.InvariantViolationException):
+ flow.add(TaskNoRequiresNoReturns(rebind=['x'], provides='x'))
+
def test_unordered_flow_reuires_values(self):
flow = uf.Flow('uf').add(
TaskOneArg('task1'),
@@ -192,21 +209,32 @@ class FlowDependenciesTest(test.TestCase):
self.assertEquals(flow.provides, set(['x', 'a', 'b', 'c']))
def test_unordered_flow_provides_required_values(self):
- flow = uf.Flow('uf').add(
- TaskOneReturn('task1', provides='x'),
- TaskOneArg('task2'))
- self.assertEquals(flow.requires, set(['x']))
- self.assertEquals(flow.provides, set(['x']))
+ with self.assertRaises(exceptions.InvariantViolationException):
+ uf.Flow('uf').add(
+ TaskOneReturn('task1', provides='x'),
+ TaskOneArg('task2'))
+
+ def test_unordered_flow_requires_provided_value_other_call(self):
+ flow = uf.Flow('uf')
+ flow.add(TaskOneReturn('task1', provides='x'))
+ with self.assertRaises(exceptions.InvariantViolationException):
+ flow.add(TaskOneArg('task2'))
+
+ def test_unordered_flow_provides_required_value_other_call(self):
+ flow = uf.Flow('uf')
+ flow.add(TaskOneArg('task2'))
+ with self.assertRaises(exceptions.InvariantViolationException):
+ flow.add(TaskOneReturn('task1', provides='x'))
def test_unordered_flow_multi_provides_and_requires_values(self):
flow = uf.Flow('uf').add(
TaskMultiArgMultiReturn('task1',
rebind=['a', 'b', 'c'],
- provides=['x', 'y', 'q']),
+ provides=['d', 'e', 'f']),
TaskMultiArgMultiReturn('task2',
provides=['i', 'j', 'k']))
self.assertEquals(flow.requires, set(['a', 'b', 'c', 'x', 'y', 'z']))
- self.assertEquals(flow.provides, set(['x', 'y', 'q', 'i', 'j', 'k']))
+ self.assertEquals(flow.provides, set(['d', 'e', 'f', 'i', 'j', 'k']))
def test_nested_flows_requirements(self):
flow = uf.Flow('uf').add(