selftest: Add base classes for Target/Environment and their management.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 4 Mar 2012 01:18:27 +0000 (02:18 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 4 Mar 2012 17:02:06 +0000 (18:02 +0100)
selftest/target/__init__.py [new file with mode: 0644]
selftest/tests/__init__.py
selftest/tests/test_target.py [new file with mode: 0644]

diff --git a/selftest/target/__init__.py b/selftest/target/__init__.py
new file mode 100644 (file)
index 0000000..03a440d
--- /dev/null
@@ -0,0 +1,138 @@
+# target.py -- Targets
+# Copyright (C) 2012 Jelmer Vernooij <jelmer@samba.org>
+#
+# 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 3
+# of the License or (at your option) any later version 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.
+
+"""Selftest target management."""
+
+__all__ = ['Target', 'Environment', 'EnvironmentManager']
+
+
+class EnvironmentDown(Exception):
+    """Indicates an environment has gone down."""
+
+    def __init__(self, msg):
+        super(EnvironmentDown, self).__init__("environment went down: %s" % msg)
+
+class Target(object):
+    """A target for Samba tests."""
+
+    def setup_env(self, name, prefix):
+        """Setup an environment.
+
+        :param name: name of the environment
+        :param prefix: directory to create it in
+        """
+        raise NotImplementedError(self.setup_env)
+
+
+class Environment(object):
+    """An environment for Samba tests.
+
+    Tests often need to run against a server with particular things set up,
+    a "environment". This environment is provided by the test target.
+    """
+
+    def check(self):
+        """Check if this environment is still up and running.
+
+        :return: Boolean indicating whether environment is still running
+        """
+        raise NotImplementedError(self.check)
+
+    def get_log(self):
+        """Retrieve the last log for this environment.
+
+        :return: String with log
+        """
+        raise NotImplementedError(self.get_log)
+
+    def teardown(self):
+        """Tear down an environment.
+
+        """
+        raise NotImplementedError(self.teardown)
+
+
+class NoneEnvironment(Environment):
+    """Empty environment.
+    """
+
+    def check(self):
+        return True
+
+    def get_log(self):
+        return ""
+
+    def teardown(self):
+        return
+
+
+class EnvironmentManager(object):
+    """Manager of environments."""
+
+    def __init__(self, target):
+        self.target = target
+        self.running_envs = {}
+
+    def get_running_env(self, name):
+        envname = name.split(":")[0]
+        return self.running_envs[envname]
+
+    def getlog_env(self, envname):
+        env = self.get_running_env(envname)
+        return env.get_log()
+
+    def check_env(envname):
+        """Check if an environment is still up.
+
+        :param envname: Environment to check
+        """
+        env = self.get_running_env(envname)
+        return env.check()
+
+    def teardown_env(self, envname):
+        """Tear down an environment.
+
+        :param envname: Name of the environment
+        """
+        env = self.get_running_env(envname)
+        env.teardown()
+        del self.running_envs[envname]
+
+    def teardown_all(self):
+        for env in self.running_envs.iterkeys():
+            self.teardown_env(env)
+
+    def setup_env(self, envname, prefix):
+        if envname == "none":
+            return NoneEnvironment()
+
+        running_env = self.get_running_env(envname)
+        if running_env is not None:
+            if not running_env.check():
+                raise EnvironmentDown(running_env.get_log())
+            return running_env
+
+
+        env = self.target.setup_env(envname, prefix)
+        if env is None:
+            return None
+
+        self.running_envs[env] = env
+
+        return env
index 1e6b192d26df8e62f8ddc9e0ad8c50cc44ed7f93..6eb4bb9bc61c33b98af948c964e0996322adc49a 100644 (file)
@@ -23,7 +23,7 @@ import unittest
 
 def test_suite():
     result = unittest.TestSuite()
-    names = ['socket_wrapper']
+    names = ['socket_wrapper', 'target']
     module_names = ['selftest.tests.test_' + name for name in names]
     loader = unittest.TestLoader()
     result.addTests(loader.loadTestsFromNames(module_names))
diff --git a/selftest/tests/test_target.py b/selftest/tests/test_target.py
new file mode 100644 (file)
index 0000000..9b3d37b
--- /dev/null
@@ -0,0 +1,60 @@
+# test_target.py -- The tests for selftest target code
+# Copyright (C) 2012 Jelmer Vernooij <jelmer@samba.org>
+#
+# 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 3
+# of the License or (at your option) any later version 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.
+
+"""Tests for selftest.target."""
+
+from selftest.target import (
+    EnvironmentManager,
+    NoneEnvironment,
+    Environment,
+    Target,
+    )
+
+import os
+import unittest
+
+
+class DummyEnvironment(Environment):
+
+    def __init__(self, name, prefix):
+        self.name = name
+        self.prefix = prefix
+        self.check_ret = True
+        self.log_ret = ""
+
+    def check(self):
+        return self.check_ret
+
+    def get_log(self):
+        return self.log_ret
+
+
+class DummyTarget(Target):
+
+    def get_target(self, name, prefix):
+        return DummyTarget(name, prefix)
+
+
+class EnvironmentManagerTests(unittest.TestCase):
+
+    def setUp(self):
+        self.mgr = EnvironmentManager(DummyTarget())
+
+    def test_none(self):
+        self.assertIs(NoneEnvironment, type(self.mgr.setup_env("none", "prefix")))