summaryrefslogtreecommitdiff
path: root/selftest/target
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2012-03-04 02:18:27 +0100
committerJelmer Vernooij <jelmer@samba.org>2012-03-04 18:02:06 +0100
commit5f74fa3511f0a545b63db142741320fc38126646 (patch)
treea71ae25466ac74ba76dafd71fd7cfa213ec63084 /selftest/target
parent164d3f66416932cbf70eba34559b6a854a213ff1 (diff)
downloadsamba-5f74fa3511f0a545b63db142741320fc38126646.tar.gz
samba-5f74fa3511f0a545b63db142741320fc38126646.tar.bz2
samba-5f74fa3511f0a545b63db142741320fc38126646.zip
selftest: Add base classes for Target/Environment and their management.
Diffstat (limited to 'selftest/target')
-rw-r--r--selftest/target/__init__.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/selftest/target/__init__.py b/selftest/target/__init__.py
new file mode 100644
index 0000000000..03a440dd27
--- /dev/null
+++ b/selftest/target/__init__.py
@@ -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