Exemplo n.º 1
0
 def test_transition_doesnt_exist(self):
     error = None
     sm = StateMachine("test_state_machine", ["exit", "__preempted__"])
     state1 = TestState("test1", ["s2"])
     sm.add_state(self.state1, {}, initial=True)
     try:
         sm._run()
     except TransitionError as e:
         error = e
         print(error)
     assert error is not None
Exemplo n.º 2
0
class TestLoopStateMachine(unittest.TestCase):
    def setUp(self):
        self.sm = StateMachine("test_state_machine", ["exit", "__preempted__"])
        self.state1 = TestStateLoop("test1", ["s2", "s3"])
        self.state2 = TestStateLoop("test2", ["s1", "s1"])
        self.state3 = TestStateLoop("test3", ["s1", "exit"])
        self.sm.add_state(self.state1, {"s2": "test2", "s3": "test3"}, initial=True)
        self.sm.add_state(self.state2, {"s1": "test1"})
        self.sm.add_state(self.state3, {"s1": "test1"})

    def test_basic(self):
        start_time = time.time()
        self.sm._run()
        execution_time = time.time() - start_time
        print("execution_time ", execution_time)
        print(self.state1, "\n")
        print(self.state2, "\n")
        print(self.state3, "\n")
Exemplo n.º 3
0
class TestMonitoredStateMachine(unittest.TestCase):
    def setUp(self):
        self.mock = Mock()

        self.iterations_num = 3
        self.sm = StateMachine("test_state_machine", ["exit"])
        self.state1 = TestMonitoredState(
            "test1", outcomes=["s2"], event_cb=self.mock, execute_iterations=self.iterations_num
        )
        self.state2 = TestMonitoredState(
            "test2", outcomes=["s3"], event_cb=self.mock, execute_iterations=self.iterations_num
        )
        self.state3 = TestMonitoredState(
            "test3", outcomes=["exit"], event_cb=self.mock, execute_iterations=self.iterations_num
        )
        self.sm.add_state(self.state1, {"s2": "test2"}, initial=True)
        self.sm.add_state(self.state2, {"s3": "test3"})
        self.sm.add_state(self.state3, {})
        self.mock.reset_mock()

    def test_basic(self):
        print("_____run______")
        self.sm._run()
        time.sleep(0.04)
        assert self.mock.call_count == (self.iterations_num + 2) * 3
        self.mock.assert_any_call("on_begin")
        self.mock.assert_any_call("on_execute")
        self.mock.assert_any_call("on_end")

    def test_pause(self):
        print("_____pause______")
        execution = Thread(target=self.sm._run)
        execution.start()
        time.sleep(0.02)
        PauseThread(self.sm, 0.03).start()
        execution.join()
        time.sleep(0.02)
        assert self.mock.call_count == (self.iterations_num + 2) * 3 + 2

        # check cb called with pause_in and pause_out once and only once
        self.mock.assert_any_call("on_pause_in")
        self.mock.assert_any_call("on_pause_out")
        self.mock.assert_any_call("on_begin")
        self.mock.assert_any_call("on_execute")
        self.mock.assert_any_call("on_end")

    def test_preempt(self):
        print("_____preempt______")
        execution = Thread(target=self.sm._run)
        execution.start()
        PreemptThread(self.sm).start()
        execution.join()
        time.sleep(0.04)
        self.mock.assert_any_call("on_begin")
        self.mock.assert_called_with("on_preempt")

    def test_abort(self):
        print("_____abort______")
        sm = StateMachine("test_state_machine", ["exit", "__preempted__"])
        state = AbortingState("test1", self.mock, ["exit"])
        sm.add_state(state, {}, initial=True)
        execution = Thread(target=sm._run)
        execution.start()
        execution.join()
        self.mock.assert_any_call("on_begin")
        self.mock.assert_any_call("on_execute")
        self.mock.assert_called_with("on_abort")
        assert self.mock.call_count == 3
Exemplo n.º 4
0
class TestBasicStateMachine(unittest.TestCase):
    def setUp(self):
        self.iterations_num = 3
        self.sm = StateMachine("test_state_machine", ["exit", "__preempted__"])
        self.state1 = TestState("test1", ["s2", "s3"], execute_iterations=self.iterations_num)
        self.state2 = TestState("test2", ["s3", "s1"], execute_iterations=self.iterations_num)
        self.state3 = TestState("test3", ["exit", "s1"], execute_iterations=self.iterations_num)
        self.sm.add_state(self.state1, {"s2": "test2", "s3": "test3"}, initial=True)
        self.sm.add_state(self.state2, {"s1": "test1", "s3": "test3"})
        self.sm.add_state(self.state3, {"s2": "test2", "s1": "test1"})

    def test_basic(self):
        start_time = time.time()
        self.sm._run()
        execution_time = time.time() - start_time
        print("execution_time ", execution_time)
        self.state1.mock.begin.assert_called()
        assert self.state1.mock.begin.call_count == 1
        self.state1.mock.execute.assert_called()
        assert self.state1.mock.execute.call_count == self.iterations_num
        self.state1.mock.end.assert_called()
        assert self.state1.mock.end.call_count == 1
        self.state2.mock.begin.assert_called()
        assert self.state2.mock.begin.call_count == 1
        self.state2.mock.execute.assert_called()
        assert self.state2.mock.execute.call_count == self.iterations_num
        self.state2.mock.end.assert_called()
        assert self.state2.mock.end.call_count == 1
        self.state3.mock.begin.assert_called()
        assert self.state3.mock.begin.call_count == 1
        self.state3.mock.execute.assert_called()
        assert self.state3.mock.execute.call_count == self.iterations_num
        self.state3.mock.end.assert_called()
        assert self.state3.mock.end.call_count == 1

    def test_pause(self):
        execution = Thread(target=self.sm._run)
        execution.start()
        time.sleep(0.02)
        PauseThread(self.sm, 0.03).start()
        execution.join()
        self.state1.mock.begin.assert_called()
        assert self.state1.mock.begin.call_count == 1
        self.state1.mock.pause_in.assert_called()
        assert self.state1.mock.pause_in.call_count == 1
        self.state1.mock.pause_out.assert_called()
        assert self.state1.mock.pause_out.call_count == 1
        self.state1.mock.execute.assert_called()
        assert self.state1.mock.execute.call_count == self.iterations_num
        self.state1.mock.end.assert_called()
        assert self.state1.mock.end.call_count == 1
        self.state2.mock.begin.assert_called()
        assert self.state2.mock.begin.call_count == 1
        self.state2.mock.execute.assert_called()
        assert self.state2.mock.execute.call_count == self.iterations_num
        self.state2.mock.end.assert_called()
        assert self.state2.mock.end.call_count == 1
        self.state3.mock.begin.assert_called()
        assert self.state3.mock.begin.call_count == 1
        self.state3.mock.execute.assert_called()
        assert self.state3.mock.execute.call_count == self.iterations_num
        self.state3.mock.end.assert_called()
        assert self.state3.mock.end.call_count == 1

    def test_pause_twice(self):
        execution = Thread(target=self.sm._run)
        execution.start()
        time.sleep(0.03)
        PauseThread(self.sm, 0.03).start()
        time.sleep(0.03)
        PauseThread(self.sm, 0.03).start()
        execution.join()
        self.state1.mock.begin.assert_called()
        assert self.state1.mock.begin.call_count == 1
        self.state1.mock.pause_in.assert_called()
        assert self.state1.mock.pause_in.call_count == 2
        self.state1.mock.pause_out.assert_called()
        assert self.state1.mock.pause_out.call_count == 2
        self.state1.mock.execute.assert_called()
        assert self.state1.mock.execute.call_count == self.iterations_num
        self.state1.mock.end.assert_called()
        assert self.state1.mock.end.call_count == 1
        self.state2.mock.begin.assert_called()
        assert self.state2.mock.begin.call_count == 1
        self.state2.mock.execute.assert_called()
        assert self.state2.mock.execute.call_count == self.iterations_num
        self.state2.mock.end.assert_called()
        assert self.state2.mock.end.call_count == 1
        self.state3.mock.begin.assert_called()
        assert self.state3.mock.begin.call_count == 1
        self.state3.mock.execute.assert_called()
        assert self.state3.mock.execute.call_count == self.iterations_num
        self.state3.mock.end.assert_called()
        assert self.state3.mock.end.call_count == 1

    def test_preempt(self):
        execution = Thread(target=self.sm._run, args=())
        execution.start()
        time.sleep(0.03)
        PreemptThread(self.sm).start()
        execution.join()
        self.state1.mock.begin.assert_called()
        assert self.state1.mock.begin.call_count == 1
        self.state1.mock.execute.assert_called()
        assert self.state1.mock.execute.call_count <= self.iterations_num
        self.state1.mock.end.assert_not_called()
        self.state2.mock.begin.assert_not_called()
        self.state2.mock.execute.assert_not_called()
        self.state2.mock.end.assert_not_called()
        self.state3.mock.begin.assert_not_called()
        self.state3.mock.execute.assert_not_called()
        self.state3.mock.end.assert_not_called()

    def test_restart_after_preempt(self):
        execution = Thread(target=self.sm._run, args=())
        execution.start()
        time.sleep(0.04)
        PreemptThread(self.sm).start()
        execution.join()
        time.sleep(0.01)
        execution2 = Thread(target=self.sm._run, args=())
        execution2.start()
        execution2.join()
        self.state1.mock.begin.assert_called()
        assert self.state1.mock.begin.call_count == 2
        self.state1.mock.execute.assert_called()
        assert self.state1.mock.execute.call_count >= self.iterations_num
        self.state1.mock.end.assert_called()
        assert self.state1.mock.end.call_count == 1
        self.state2.mock.begin.assert_called()
        assert self.state2.mock.begin.call_count == 1
        self.state2.mock.execute.assert_called()
        assert self.state2.mock.execute.call_count == self.iterations_num
        self.state2.mock.end.assert_called()
        assert self.state2.mock.end.call_count == 1
        self.state3.mock.begin.assert_called()
        assert self.state3.mock.begin.call_count == 1
        self.state3.mock.execute.assert_called()
        assert self.state3.mock.execute.call_count == self.iterations_num
        self.state3.mock.end.assert_called()
        assert self.state3.mock.end.call_count == 1

    def test_preempt_while_paused(self):
        print("test_preempt_while_paused")
        execution = Thread(target=self.sm._run)
        execution.start()
        time.sleep(0.02)
        PauseThread(self.sm, 0.03).start()
        PreemptThread(self.sm).start()
        time.sleep(0.03)
        Thread(target=self.sm._pause_out, args=()).start()
        execution.join()
        assert self.state1.mock.pause_in.call_count == 1
        self.state1.mock.end.assert_not_called()
        self.state2.mock.begin.assert_not_called()
        self.state2.mock.execute.assert_not_called()
        self.state2.mock.end.assert_not_called()
        self.state3.mock.begin.assert_not_called()
        self.state3.mock.execute.assert_not_called()
        self.state3.mock.end.assert_not_called()