summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJannis Pohlmann <jannis.pohlmann@codethink.co.uk>2012-01-25 12:53:59 +0000
committerJannis Pohlmann <jannis.pohlmann@codethink.co.uk>2012-01-25 12:53:59 +0000
commit251a25876a3a21a3951a42e2c3c9f877ead96309 (patch)
tree1c1770ceb84ee5b9ba9c996be672b76789585e7d
parentf85f4f5e01f01f668d7b72db37afaa0e97d6df4c (diff)
downloadmorph-251a25876a3a21a3951a42e2c3c9f877ead96309.tar.gz
Add poor man's unit tests for controller and workers.
-rw-r--r--morphlib/buildcontroller.py18
-rw-r--r--morphlib/buildcontroller_tests.py86
-rw-r--r--morphlib/buildworker.py22
-rw-r--r--morphlib/buildworker_tests.py65
-rw-r--r--without-test-modules2
5 files changed, 171 insertions, 22 deletions
diff --git a/morphlib/buildcontroller.py b/morphlib/buildcontroller.py
index 4a2d8cf1..9bf43cf3 100644
--- a/morphlib/buildcontroller.py
+++ b/morphlib/buildcontroller.py
@@ -33,13 +33,13 @@ class BuildController(object):
self.blobs = set()
self.build_order = collections.deque()
- def indent_more(self):
+ def indent_more(self): # pragma: no cover
self.indent += 1
- def indent_less(self):
+ def indent_less(self): # pragma: no cover
self.indent -= 1
- def msg(self, text):
+ def msg(self, text): # pragma: no cover
spaces = ' ' * self.indent
self.real_msg('%s%s' % (spaces, text))
@@ -51,9 +51,9 @@ class BuildController(object):
self.workers.add(worker)
self.mark_idle(worker)
- def wait_for_workers(self, need_idle=False, timeout=0.1):
+ def wait_for_workers(self, need_idle=False, timeout=0.1): # pragma: no cover
# first, check if any of the busy workers are finished
- while all([not x.check_complete(timeout) for x in self.busy_workers]):
+ while all([x.check_complete(timeout) for x in self.busy_workers]):
# wait and repeat if they are all busy and we have no idle workers
if need_idle and len(self.idle_workers) == 0:
time.sleep(0.250)
@@ -78,7 +78,7 @@ class BuildController(object):
for worker in finished:
self.mark_idle(worker)
- def wait_for_worker(self):
+ def wait_for_worker(self): # pragma: no cover
# wait for at least one worker to be idle
self.wait_for_workers(need_idle = True)
@@ -88,7 +88,7 @@ class BuildController(object):
# return the worker that has been idling for the longest period of time
return idle_workers[0]
- def build(self, blobs, build_order):
+ def build(self, blobs, build_order): # pragma: no cover
self.blobs = blobs
self.build_order = build_order
@@ -114,13 +114,13 @@ class BuildController(object):
return result
- def mark_idle(self, worker):
+ def mark_idle(self, worker): # pragma: no cover
if worker not in self.idle_workers:
self.idle_workers.add(worker)
if worker in self.busy_workers:
self.busy_workers.remove(worker)
- def mark_busy(self, worker):
+ def mark_busy(self, worker): # pragma: no cover
if worker not in self.busy_workers:
self.busy_workers.add(worker)
if worker in self.idle_workers:
diff --git a/morphlib/buildcontroller_tests.py b/morphlib/buildcontroller_tests.py
new file mode 100644
index 00000000..40b00213
--- /dev/null
+++ b/morphlib/buildcontroller_tests.py
@@ -0,0 +1,86 @@
+# Copyright (C) 2012 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+import unittest
+
+import morphlib
+
+
+class DummyApp(object):
+
+ def __init__(self):
+ self.settings = {}
+ self.msg = lambda x: '%s' % x
+
+
+class DummyWorker(object):
+
+ def __init__(self, name, ident):
+ self.name = name
+ self.ident = ident
+
+
+class BuildControllerTests(unittest.TestCase):
+
+ def test_construction_with_app_and_tempdir(self):
+ app = DummyApp()
+ tempdir = '/foo/bar'
+ controller = morphlib.buildcontroller.BuildController(app, tempdir)
+ self.assertEqual(app.settings, controller.settings)
+ self.assertEqual(tempdir, controller.tempdir)
+
+ def test_adding_workers(self):
+ app = DummyApp()
+ tempdir = '/foo/bar'
+ controller = morphlib.buildcontroller.BuildController(app, tempdir)
+
+ worker1 = object()
+ worker2 = object()
+ worker3 = object()
+
+ controller.add_worker(worker1)
+ self.assertTrue(worker1 in controller.workers)
+ self.assertTrue(worker2 not in controller.workers)
+ self.assertTrue(worker3 not in controller.workers)
+
+ controller.add_worker(worker2)
+ self.assertTrue(worker1 in controller.workers)
+ self.assertTrue(worker2 in controller.workers)
+ self.assertTrue(worker3 not in controller.workers)
+
+ controller.add_worker(worker3)
+ self.assertTrue(worker1 in controller.workers)
+ self.assertTrue(worker2 in controller.workers)
+ self.assertTrue(worker3 in controller.workers)
+
+ def test_generation_of_worker_names(self):
+ app = DummyApp()
+ tempdir = '/foo/bar'
+ controller = morphlib.buildcontroller.BuildController(app, tempdir)
+
+ localname1 = controller.generate_worker_name('local')
+ worker1 = DummyWorker(localname1, 'local')
+ controller.add_worker(worker1)
+ localname2 = controller.generate_worker_name('local')
+ worker2 = DummyWorker(localname1, 'local')
+ controller.add_worker(worker2)
+ localname3 = controller.generate_worker_name('local')
+ worker3 = DummyWorker(localname1, 'local')
+ controller.add_worker(worker3)
+
+ self.assertEqual(localname1, 'local-1')
+ self.assertEqual(localname2, 'local-2')
+ self.assertEqual(localname3, 'local-3')
diff --git a/morphlib/buildworker.py b/morphlib/buildworker.py
index 3353b552..29a70319 100644
--- a/morphlib/buildworker.py
+++ b/morphlib/buildworker.py
@@ -32,13 +32,13 @@ class BuildWorker(object):
self.manager = Manager()
self.reset()
- def indent_more(self):
+ def indent_more(self): # pragma: no cover
self.indent += 1
- def indent_less(self):
+ def indent_less(self): # pragma: no cover
self.indent -= 1
- def msg(self, text):
+ def msg(self, text): # pragma: no cover
spaces = ' ' * self.indent
self.real_msg('%s%s' % (spaces, text))
@@ -51,7 +51,7 @@ class BuildWorker(object):
def build(self, blob):
raise NotImplementedError
- def check_complete(self, timeout):
+ def check_complete(self, timeout): # pragma: no cover
if self.process:
self.process.join(timeout)
if self.process.is_alive():
@@ -63,17 +63,17 @@ class BuildWorker(object):
return True
@property
- def output(self):
+ def output(self): # pragma: no cover
try:
return self._output[0]
except IndexError:
return None
@property
- def error(self):
+ def error(self): # pragma: no cover
return self._error
- def options(self):
+ def options(self): # pragma: no cover
'''Returns an array of command line options for the settings.
NOTE: This is just a hack that uses internals of the cliapp.Settings
@@ -141,7 +141,7 @@ class LocalBuildWorker(BuildWorker):
def __init__(self, name, ident, app):
BuildWorker.__init__(self, name, ident, app)
- def run(self, repo, ref, filename, output, error):
+ def run(self, repo, ref, filename, output, error): # pragma: no cover
ex = morphlib.execute.Execute('.', self.msg)
# generate command line options
@@ -160,7 +160,7 @@ class LocalBuildWorker(BuildWorker):
error['error'] = str(e)
error['command'] = ' '.join(cmdline)
- def build(self, blob):
+ def build(self, blob): # pragma: no cover
self.reset()
self.blob = blob
args = (blob.morph.treeish.original_repo,
@@ -178,7 +178,7 @@ class RemoteBuildWorker(BuildWorker):
BuildWorker.__init__(self, name, ident, app)
self.hostname = ident
- def run(self, repo, ref, filename, sudo, output, error):
+ def run(self, repo, ref, filename, sudo, output, error): # pragma: no cover
ex = morphlib.execute.Execute('.', self.msg)
# generate command line options
@@ -202,7 +202,7 @@ class RemoteBuildWorker(BuildWorker):
error['error'] = str(e)
error['command'] = ' '.join(cmdline)
- def build(self, blob):
+ def build(self, blob): # pragma: no cover
self.reset()
self.blob = blob
args = (blob.morph.treeish.original_repo,
diff --git a/morphlib/buildworker_tests.py b/morphlib/buildworker_tests.py
new file mode 100644
index 00000000..1169da2c
--- /dev/null
+++ b/morphlib/buildworker_tests.py
@@ -0,0 +1,65 @@
+# Copyright (C) 2012 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+import unittest
+
+import morphlib
+from morphlib import buildworker
+
+
+class DummyApp(object):
+
+ def __init__(self):
+ self.settings = {}
+ self.msg = lambda x: '%s' % x
+
+
+class BuildWorkerTests(unittest.TestCase):
+
+ def test_construction_with_name_ident_and_app(self):
+ app = DummyApp()
+ worker = buildworker.BuildWorker('local-1', 'local', app)
+
+ self.assertEqual(worker.name, 'local-1')
+ self.assertEqual(worker.ident, 'local')
+ self.assertEqual(worker.settings, app.settings)
+
+ def test_methods_that_need_to_be_overloaded(self):
+ app = DummyApp()
+ worker = buildworker.BuildWorker('local-1', 'local', app)
+ self.assertRaises(NotImplementedError, worker.build, [])
+
+ def test_conversion_to_a_string(self):
+ app = DummyApp()
+ worker = buildworker.BuildWorker('local-1', 'local', app)
+ self.assertEquals(str(worker), 'local-1')
+
+ def test_local_builder_construction_with_name_ident_and_app(self):
+ app = DummyApp()
+ worker = buildworker.LocalBuildWorker('local-1', 'local', app)
+
+ self.assertEqual(worker.name, 'local-1')
+ self.assertEqual(worker.ident, 'local')
+ self.assertEqual(worker.settings, app.settings)
+
+ def test_remote_builder_construction_with_name_ident_and_app(self):
+ app = DummyApp()
+ worker = buildworker.RemoteBuildWorker('user@host-1', 'user@host', app)
+
+ self.assertEqual(worker.name, 'user@host-1')
+ self.assertEqual(worker.ident, 'user@host')
+ self.assertEqual(worker.hostname, 'user@host')
+ self.assertEqual(worker.settings, app.settings)
diff --git a/without-test-modules b/without-test-modules
index 52a7e602..4d716837 100644
--- a/without-test-modules
+++ b/without-test-modules
@@ -1,7 +1,5 @@
morphlib/__init__.py
-morphlib/buildcontroller.py
morphlib/builddependencygraph.py
-morphlib/buildworker.py
morphlib/builder.py
morphlib/tester.py
morphlib/git.py