diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2012-03-04 02:18:27 +0100 |
---|---|---|
committer | Jelmer Vernooij <jelmer@samba.org> | 2012-03-04 18:02:06 +0100 |
commit | 5f74fa3511f0a545b63db142741320fc38126646 (patch) | |
tree | a71ae25466ac74ba76dafd71fd7cfa213ec63084 /selftest/target | |
parent | 164d3f66416932cbf70eba34559b6a854a213ff1 (diff) | |
download | samba-5f74fa3511f0a545b63db142741320fc38126646.tar.gz |
selftest: Add base classes for Target/Environment and their management.
Diffstat (limited to 'selftest/target')
-rw-r--r-- | selftest/target/__init__.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/selftest/target/__init__.py b/selftest/target/__init__.py new file mode 100644 index 00000000000..03a440dd279 --- /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 |