# 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)