summaryrefslogtreecommitdiff
path: root/taskflow/tests/unit/action_engine
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2015-07-16 17:10:09 -0700
committerJoshua Harlow <harlowja@gmail.com>2015-07-28 22:07:08 -0700
commit054ca2a6e2b4d7fdbff48116a651e5c4310f978b (patch)
treedd8806474a25d0d7177c1c4a4951182a9d84d1fd /taskflow/tests/unit/action_engine
parent69c3b04e37f952a17fe29fae43397ff0f6e666d0 (diff)
downloadtaskflow-054ca2a6e2b4d7fdbff48116a651e5c4310f978b.tar.gz
Remove extra runner layer and just use use machine in engine
Just directly use the built machine in the action engine and avoid having another layer of abstraction that does not provide that much value. This makes the code cleaner, and more easy to understand (and so-on). Change-Id: Iae1279098112254338258c1941c15889f1ad1a79
Diffstat (limited to 'taskflow/tests/unit/action_engine')
-rw-r--r--taskflow/tests/unit/action_engine/test_builder.py (renamed from taskflow/tests/unit/action_engine/test_runner.py)197
1 files changed, 98 insertions, 99 deletions
diff --git a/taskflow/tests/unit/action_engine/test_runner.py b/taskflow/tests/unit/action_engine/test_builder.py
index bff74cb..b406744 100644
--- a/taskflow/tests/unit/action_engine/test_runner.py
+++ b/taskflow/tests/unit/action_engine/test_builder.py
@@ -15,11 +15,12 @@
# under the License.
from automaton import exceptions as excp
+from automaton import runners
import six
+from taskflow.engines.action_engine import builder
from taskflow.engines.action_engine import compiler
from taskflow.engines.action_engine import executor
-from taskflow.engines.action_engine import runner
from taskflow.engines.action_engine import runtime
from taskflow.patterns import linear_flow as lf
from taskflow import states as st
@@ -30,7 +31,8 @@ from taskflow.types import notifier
from taskflow.utils import persistence_utils as pu
-class _RunnerTestMixin(object):
+class BuildersTest(test.TestCase):
+
def _make_runtime(self, flow, initial_state=None):
compilation = compiler.PatternCompiler(flow).compile()
flow_detail = pu.create_flow_detail(flow)
@@ -51,17 +53,11 @@ class _RunnerTestMixin(object):
r.compile()
return r
-
-class RunnerTest(test.TestCase, _RunnerTestMixin):
- def test_running(self):
- flow = lf.Flow("root")
- flow.add(*test_utils.make_many(1))
-
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
-
- rt = self._make_runtime(flow, initial_state=st.SUSPENDED)
- self.assertFalse(rt.runner.runnable())
+ def _make_machine(self, flow, initial_state=None):
+ runtime = self._make_runtime(flow, initial_state=initial_state)
+ machine, memory = runtime.builder.build()
+ machine_runner = runners.FiniteRunner(machine)
+ return (runtime, machine, memory, machine_runner)
def test_run_iterations(self):
flow = lf.Flow("root")
@@ -69,29 +65,32 @@ class RunnerTest(test.TestCase, _RunnerTestMixin):
1, task_cls=test_utils.TaskNoRequiresNoReturns)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- it = rt.runner.run_iter()
- state, failures = six.next(it)
- self.assertEqual(st.RESUMING, state)
- self.assertEqual(0, len(failures))
+ it = machine_runner.run_iter(builder.START)
+ prior_state, new_state = six.next(it)
+ self.assertEqual(st.RESUMING, new_state)
+ self.assertEqual(0, len(memory.failures))
- state, failures = six.next(it)
- self.assertEqual(st.SCHEDULING, state)
- self.assertEqual(0, len(failures))
+ prior_state, new_state = six.next(it)
+ self.assertEqual(st.SCHEDULING, new_state)
+ self.assertEqual(0, len(memory.failures))
- state, failures = six.next(it)
- self.assertEqual(st.WAITING, state)
- self.assertEqual(0, len(failures))
+ prior_state, new_state = six.next(it)
+ self.assertEqual(st.WAITING, new_state)
+ self.assertEqual(0, len(memory.failures))
- state, failures = six.next(it)
- self.assertEqual(st.ANALYZING, state)
- self.assertEqual(0, len(failures))
+ prior_state, new_state = six.next(it)
+ self.assertEqual(st.ANALYZING, new_state)
+ self.assertEqual(0, len(memory.failures))
- state, failures = six.next(it)
- self.assertEqual(st.SUCCESS, state)
- self.assertEqual(0, len(failures))
+ prior_state, new_state = six.next(it)
+ self.assertEqual(builder.GAME_OVER, new_state)
+ self.assertEqual(0, len(memory.failures))
+ prior_state, new_state = six.next(it)
+ self.assertEqual(st.SUCCESS, new_state)
+ self.assertEqual(0, len(memory.failures))
self.assertRaises(StopIteration, six.next, it)
@@ -101,15 +100,15 @@ class RunnerTest(test.TestCase, _RunnerTestMixin):
1, task_cls=test_utils.TaskWithFailure)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- transitions = list(rt.runner.run_iter())
- state, failures = transitions[-1]
- self.assertEqual(st.REVERTED, state)
- self.assertEqual([], failures)
-
- self.assertEqual(st.REVERTED, rt.storage.get_atom_state(tasks[0].name))
+ transitions = list(machine_runner.run_iter(builder.START))
+ prior_state, new_state = transitions[-1]
+ self.assertEqual(st.REVERTED, new_state)
+ self.assertEqual([], memory.failures)
+ self.assertEqual(st.REVERTED,
+ runtime.storage.get_atom_state(tasks[0].name))
def test_run_iterations_failure(self):
flow = lf.Flow("root")
@@ -117,18 +116,17 @@ class RunnerTest(test.TestCase, _RunnerTestMixin):
1, task_cls=test_utils.NastyFailingTask)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- transitions = list(rt.runner.run_iter())
- state, failures = transitions[-1]
- self.assertEqual(st.FAILURE, state)
- self.assertEqual(1, len(failures))
- failure = failures[0]
+ transitions = list(machine_runner.run_iter(builder.START))
+ prior_state, new_state = transitions[-1]
+ self.assertEqual(st.FAILURE, new_state)
+ self.assertEqual(1, len(memory.failures))
+ failure = memory.failures[0]
self.assertTrue(failure.check(RuntimeError))
-
self.assertEqual(st.REVERT_FAILURE,
- rt.storage.get_atom_state(tasks[0].name))
+ runtime.storage.get_atom_state(tasks[0].name))
def test_run_iterations_suspended(self):
flow = lf.Flow("root")
@@ -136,20 +134,22 @@ class RunnerTest(test.TestCase, _RunnerTestMixin):
2, task_cls=test_utils.TaskNoRequiresNoReturns)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
transitions = []
- for state, failures in rt.runner.run_iter():
- transitions.append((state, failures))
- if state == st.ANALYZING:
- rt.storage.set_flow_state(st.SUSPENDED)
+ for prior_state, new_state in machine_runner.run_iter(builder.START):
+ transitions.append((new_state, memory.failures))
+ if new_state == st.ANALYZING:
+ runtime.storage.set_flow_state(st.SUSPENDED)
state, failures = transitions[-1]
self.assertEqual(st.SUSPENDED, state)
self.assertEqual([], failures)
- self.assertEqual(st.SUCCESS, rt.storage.get_atom_state(tasks[0].name))
- self.assertEqual(st.PENDING, rt.storage.get_atom_state(tasks[1].name))
+ self.assertEqual(st.SUCCESS,
+ runtime.storage.get_atom_state(tasks[0].name))
+ self.assertEqual(st.PENDING,
+ runtime.storage.get_atom_state(tasks[1].name))
def test_run_iterations_suspended_failure(self):
flow = lf.Flow("root")
@@ -160,46 +160,44 @@ class RunnerTest(test.TestCase, _RunnerTestMixin):
1, task_cls=test_utils.TaskNoRequiresNoReturns, offset=1)
flow.add(*happy_tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
transitions = []
- for state, failures in rt.runner.run_iter():
- transitions.append((state, failures))
- if state == st.ANALYZING:
- rt.storage.set_flow_state(st.SUSPENDED)
+ for prior_state, new_state in machine_runner.run_iter(builder.START):
+ transitions.append((new_state, memory.failures))
+ if new_state == st.ANALYZING:
+ runtime.storage.set_flow_state(st.SUSPENDED)
state, failures = transitions[-1]
self.assertEqual(st.SUSPENDED, state)
self.assertEqual([], failures)
self.assertEqual(st.PENDING,
- rt.storage.get_atom_state(happy_tasks[0].name))
+ runtime.storage.get_atom_state(happy_tasks[0].name))
self.assertEqual(st.FAILURE,
- rt.storage.get_atom_state(sad_tasks[0].name))
+ runtime.storage.get_atom_state(sad_tasks[0].name))
-
-class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
def test_builder_manual_process(self):
flow = lf.Flow("root")
tasks = test_utils.make_many(
1, task_cls=test_utils.TaskNoRequiresNoReturns)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- machine, machine_runner, memory = rt.runner.build()
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
self.assertRaises(excp.NotInitialized, machine.process_event, 'poke')
# Should now be pending...
- self.assertEqual(st.PENDING, rt.storage.get_atom_state(tasks[0].name))
+ self.assertEqual(st.PENDING,
+ runtime.storage.get_atom_state(tasks[0].name))
machine.initialize()
- self.assertEqual(runner._UNDEFINED, machine.current_state)
+ self.assertEqual(builder.UNDEFINED, machine.current_state)
self.assertFalse(machine.terminated)
self.assertRaises(excp.NotFound, machine.process_event, 'poke')
last_state = machine.current_state
- reaction, terminal = machine.process_event('start')
+ reaction, terminal = machine.process_event(builder.START)
self.assertFalse(terminal)
self.assertIsNotNone(reaction)
self.assertEqual(st.RESUMING, machine.current_state)
@@ -208,7 +206,7 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
last_state = machine.current_state
cb, args, kwargs = reaction
next_event = cb(last_state, machine.current_state,
- 'start', *args, **kwargs)
+ builder.START, *args, **kwargs)
reaction, terminal = machine.process_event(next_event)
self.assertFalse(terminal)
self.assertIsNotNone(reaction)
@@ -225,7 +223,8 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
self.assertRaises(excp.NotFound, machine.process_event, 'poke')
# Should now be running...
- self.assertEqual(st.RUNNING, rt.storage.get_atom_state(tasks[0].name))
+ self.assertEqual(st.RUNNING,
+ runtime.storage.get_atom_state(tasks[0].name))
last_state = machine.current_state
cb, args, kwargs = reaction
@@ -243,10 +242,11 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
next_event, *args, **kwargs)
reaction, terminal = machine.process_event(next_event)
self.assertFalse(terminal)
- self.assertEqual(runner._GAME_OVER, machine.current_state)
+ self.assertEqual(builder.GAME_OVER, machine.current_state)
# Should now be done...
- self.assertEqual(st.SUCCESS, rt.storage.get_atom_state(tasks[0].name))
+ self.assertEqual(st.SUCCESS,
+ runtime.storage.get_atom_state(tasks[0].name))
def test_builder_automatic_process(self):
flow = lf.Flow("root")
@@ -254,26 +254,25 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
1, task_cls=test_utils.TaskNoRequiresNoReturns)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- machine, machine_runner, memory = rt.runner.build()
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- transitions = list(machine_runner.run_iter('start'))
- self.assertEqual((runner._UNDEFINED, st.RESUMING), transitions[0])
- self.assertEqual((runner._GAME_OVER, st.SUCCESS), transitions[-1])
- self.assertEqual(st.SUCCESS, rt.storage.get_atom_state(tasks[0].name))
+ transitions = list(machine_runner.run_iter(builder.START))
+ self.assertEqual((builder.UNDEFINED, st.RESUMING), transitions[0])
+ self.assertEqual((builder.GAME_OVER, st.SUCCESS), transitions[-1])
+ self.assertEqual(st.SUCCESS,
+ runtime.storage.get_atom_state(tasks[0].name))
def test_builder_automatic_process_failure(self):
flow = lf.Flow("root")
tasks = test_utils.make_many(1, task_cls=test_utils.NastyFailingTask)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- machine, machine_runner, memory = rt.runner.build()
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- transitions = list(machine_runner.run_iter('start'))
- self.assertEqual((runner._GAME_OVER, st.FAILURE), transitions[-1])
+ transitions = list(machine_runner.run_iter(builder.START))
+ self.assertEqual((builder.GAME_OVER, st.FAILURE), transitions[-1])
self.assertEqual(1, len(memory.failures))
def test_builder_automatic_process_reverted(self):
@@ -281,13 +280,13 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
tasks = test_utils.make_many(1, task_cls=test_utils.TaskWithFailure)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- machine, machine_runner, memory = rt.runner.build()
- self.assertTrue(rt.runner.runnable())
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
- transitions = list(machine_runner.run_iter('start'))
- self.assertEqual((runner._GAME_OVER, st.REVERTED), transitions[-1])
- self.assertEqual(st.REVERTED, rt.storage.get_atom_state(tasks[0].name))
+ transitions = list(machine_runner.run_iter(builder.START))
+ self.assertEqual((builder.GAME_OVER, st.REVERTED), transitions[-1])
+ self.assertEqual(st.REVERTED,
+ runtime.storage.get_atom_state(tasks[0].name))
def test_builder_expected_transition_occurrences(self):
flow = lf.Flow("root")
@@ -295,16 +294,16 @@ class RunnerBuildTest(test.TestCase, _RunnerTestMixin):
10, task_cls=test_utils.TaskNoRequiresNoReturns)
flow.add(*tasks)
- rt = self._make_runtime(flow, initial_state=st.RUNNING)
- machine, machine_runner, memory = rt.runner.build()
- transitions = list(machine_runner.run_iter('start'))
+ runtime, machine, memory, machine_runner = self._make_machine(
+ flow, initial_state=st.RUNNING)
+ transitions = list(machine_runner.run_iter(builder.START))
occurrences = dict((t, transitions.count(t)) for t in transitions)
self.assertEqual(10, occurrences.get((st.SCHEDULING, st.WAITING)))
self.assertEqual(10, occurrences.get((st.WAITING, st.ANALYZING)))
self.assertEqual(9, occurrences.get((st.ANALYZING, st.SCHEDULING)))
- self.assertEqual(1, occurrences.get((runner._GAME_OVER, st.SUCCESS)))
- self.assertEqual(1, occurrences.get((runner._UNDEFINED, st.RESUMING)))
+ self.assertEqual(1, occurrences.get((builder.GAME_OVER, st.SUCCESS)))
+ self.assertEqual(1, occurrences.get((builder.UNDEFINED, st.RESUMING)))
self.assertEqual(0, len(memory.next_nodes))
self.assertEqual(0, len(memory.not_done))