diff options
| author | Ivan A. Melnikov <imelnikov@griddynamics.com> | 2013-09-12 11:49:45 +0400 |
|---|---|---|
| committer | Ivan A. Melnikov <imelnikov@griddynamics.com> | 2013-09-18 09:51:33 +0400 |
| commit | b07ee63f78e9c200c3a117f148b78599f8b71628 (patch) | |
| tree | 8e828f369ec469bc05613428e6db3849df05ae88 /taskflow/tests/unit/test_flow_dependencies.py | |
| parent | 645fc49c888a07e704d1c640e02583acc0abc8a3 (diff) | |
| download | taskflow-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.py | 42 |
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( |
