From d62b49e35b75bc7afbba98c6725fc45644009e71 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 18 Nov 2017 21:02:44 +0100 Subject: Refactor: move WorkAPI tests to its own module --- ick2/workapi_tests.py | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 ick2/workapi_tests.py (limited to 'ick2/workapi_tests.py') diff --git a/ick2/workapi_tests.py b/ick2/workapi_tests.py new file mode 100644 index 0000000..03b25e7 --- /dev/null +++ b/ick2/workapi_tests.py @@ -0,0 +1,192 @@ +# Copyright (C) 2017 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 os +import shutil +import tempfile +import unittest + + +import ick2 + + +class WorkAPITests(unittest.TestCase): + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + self.statedir = os.path.join(self.tempdir, 'state/dir') + self.state = ick2.ControllerState() + self.state.set_state_directory(self.statedir) + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def create_project_api(self): + project = { + 'project': 'foo', + 'pipelines': [ + { + 'name': 'build', + 'actions': [ + { + 'shell': 'step-1', + }, + { + 'shell': 'step-2', + }, + ], + }, + ], + } + api = ick2.ProjectAPI(self.state) + api.create(project) + return api + + def create_worker_api(self): + worker = { + 'worker': 'asterix', + } + api = ick2.WorkerAPI(self.state) + api.create(worker) + return api + + def create_work_api(self): + return ick2.WorkAPI(self.state) + + def test_worker_gets_no_work_when_no_pipeline_is_triggered(self): + self.create_project_api() + self.create_worker_api() + work = self.create_work_api() + self.assertEqual(work.get_work('asterix'), {}) + + def test_worker_gets_work_when_a_pipeline_is_triggered(self): + projects = self.create_project_api() + projects.set_pipeline('triggered', 'foo', 'build') + self.create_worker_api() + work = self.create_work_api() + expected = { + 'build_id': 1, + 'worker': 'asterix', + 'project': 'foo', + 'pipeline': 'build', + 'step': { + 'shell': 'step-1', + }, + 'step_index': 0, + 'log': '/logs/1', + } + self.assertEqual(work.get_work('asterix'), expected) + + # Check we get the same thing twice. + self.assertEqual(work.get_work('asterix'), expected) + + def test_worker_manager_posts_work_updates(self): + projects = self.create_project_api() + projects.set_pipeline('triggered', 'foo', 'build') + self.create_worker_api() + work = self.create_work_api() + + # Ask for some work. + expected = { + 'build_id': 1, + 'worker': 'asterix', + 'project': 'foo', + 'pipeline': 'build', + 'step': { + 'shell': 'step-1', + }, + 'step_index': 0, + 'log': '/logs/1', + } + self.assertEqual(work.get_work('asterix'), expected) + + # Post a partial update. + done = { + 'build_id': 1, + 'worker': 'asterix', + 'project': 'foo', + 'pipeline': 'build', + 'exit_code': None, + 'stdout': 'out', + 'stderr': 'err', + 'timestamp': '2000-01-01T00:00:00', + } + work.update_work(done) + + # Ask for work again. We didn't finish the previous step, so + # should get same thing. + self.assertEqual(work.get_work('asterix'), expected) + + # Finish the step. + done['exit_code'] = 0 + work.update_work(done) + + # We should get the next step now. + expected['step'] = {'shell': 'step-2'} + expected['step_index'] = 1 + self.assertEqual(work.get_work('asterix'), expected) + + # Finish the step. + done['exit_code'] = 0 + work.update_work(done) + + # We now get nothing further to do. + self.assertEqual(work.get_work('asterix'), {}) + + # An pipeline status has changed. + self.assertEqual( + projects.get_pipeline('foo', 'build'), + {'status': 'idle'}) + + def test_worker_manager_posts_failure(self): + projects = self.create_project_api() + projects.set_pipeline('triggered', 'foo', 'build') + self.create_worker_api() + work = self.create_work_api() + + # Ask for some work. + expected = { + 'build_id': 1, + 'worker': 'asterix', + 'project': 'foo', + 'pipeline': 'build', + 'step': { + 'shell': 'step-1', + }, + 'step_index': 0, + 'log': '/logs/1', + } + self.assertEqual(work.get_work('asterix'), expected) + + # Post a partial update. + done = { + 'build_id': 1, + 'worker': 'asterix', + 'project': 'foo', + 'pipeline': 'build', + 'exit_code': 1, + 'stdout': 'out', + 'stderr': 'err', + 'timestamp': '2000-01-01T00:00:00', + } + work.update_work(done) + + # Ask for work again. + self.assertEqual(work.get_work('asterix'), {}) + + # An pipeline status has changed. + self.assertEqual( + projects.get_pipeline('foo', 'build'), + {'status': 'idle'}) -- cgit v1.2.1