From 9759c2b51a1250aa345c21b7cc6b793f4965ac2d Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 28 May 2018 19:51:58 +0300 Subject: Add: BuildStateMachine class --- ick2/buildsm_tests.py | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 ick2/buildsm_tests.py (limited to 'ick2/buildsm_tests.py') diff --git a/ick2/buildsm_tests.py b/ick2/buildsm_tests.py new file mode 100644 index 0000000..9d56989 --- /dev/null +++ b/ick2/buildsm_tests.py @@ -0,0 +1,144 @@ +# Copyright (C) 2018 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +import unittest + + +import ick2 + + +class BuildStateMachineTests(unittest.TestCase): + + def setUp(self): + self.resource = None + + def create_state_machine(self): + build_dict = { + 'build_id': 'foo/1', + 'status': 'triggered', + 'graph': { + '1': { + 'action': {'action': 'step1'}, + 'status': ick2.ACTION_READY, + 'depends': [], + }, + '2': { + 'action': {'action': 'step2'}, + 'status': ick2.ACTION_BLOCKED, + 'depends': ['1'], + }, + }, + } + self.resource = ick2.resource_from_dict(build_dict) + build = ick2.Build(self.resource) + return ick2.BuildStateMachine(build) + + def test_is_triggered_initially(self): + sm = self.create_state_machine() + self.assertEqual(sm.get_state(), ick2.BUILD_TRIGGERED) + + def test_successful_build(self): + sm = self.create_state_machine() + self.assertEqual(sm.get_state(), ick2.BUILD_TRIGGERED) + + resp = sm.handle_event(ick2.BuildStartsEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.NeedWorkEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, ('1', {'action': 'step1'})) + + resp = sm.handle_event(ick2.PartialActionOutputEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.ActionFinishedEvent('1')) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.NeedWorkEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, ('2', {'action': 'step2'})) + + resp = sm.handle_event(ick2.ActionFinishedEvent('2')) + self.assertEqual(sm.get_state(), ick2.BUILD_NOTIFYING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.NeedWorkEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_NOTIFYING) + self.assertEqual(resp, ('3', {'action': 'notify'})) + + resp = sm.handle_event(ick2.ActionFinishedEvent('3')) + self.assertEqual(sm.get_state(), ick2.BUILD_DONE) + self.assertEqual(resp, None) + self.assertEqual(self.resource['status'], ick2.BUILD_DONE) + self.assertEqual(self.resource['exit_code'], 0) + + def test_failed_build(self): + sm = self.create_state_machine() + self.assertEqual(sm.get_state(), ick2.BUILD_TRIGGERED) + + resp = sm.handle_event(ick2.BuildStartsEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_BUILDING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.ActionFailedEvent('1', 42)) + self.assertEqual(sm.get_state(), ick2.BUILD_NOTIFYING) + self.assertEqual(resp, None) + + resp = sm.handle_event(ick2.NeedWorkEvent()) + self.assertEqual(sm.get_state(), ick2.BUILD_NOTIFYING) + self.assertEqual(resp, ('3', {'action': 'notify'})) + + resp = sm.handle_event(ick2.ActionFinishedEvent('3')) + self.assertEqual(sm.get_state(), ick2.BUILD_FAILED) + self.assertEqual(resp, None) + self.assertEqual(self.resource['status'], ick2.BUILD_FAILED) + self.assertEqual(self.resource['exit_code'], 42) + + +class CreateBuildEventTests(unittest.TestCase): + + def test_creates_build_starts(self): + e = ick2.create_build_event(ick2.BuildStartsEvent) + self.assertTrue(isinstance(e, ick2.BuildStartsEvent)) + + def test_creates_need_work(self): + e = ick2.create_build_event(ick2.NeedWorkEvent) + self.assertTrue(isinstance(e, ick2.NeedWorkEvent)) + + def test_creates_partial_action_output(self): + work_update = {} + e = ick2.create_build_event(work_update) + self.assertTrue(isinstance(e, ick2.PartialActionOutputEvent)) + + def test_creates_action_finished(self): + work_update = { + 'action_id': '123', + 'exit_code': 0, + } + e = ick2.create_build_event(work_update) + self.assertTrue(isinstance(e, ick2.ActionFinishedEvent)) + self.assertEqual(e.action_id, '123') + + def test_creates_action_failed(self): + work_update = { + 'exit_code': 42, + } + e = ick2.create_build_event(work_update) + self.assertTrue(isinstance(e, ick2.ActionFailedEvent)) + self.assertEqual(e.exit_code, 42) -- cgit v1.2.1