summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--selftest/target/__init__.py138
-rw-r--r--selftest/tests/__init__.py2
-rw-r--r--selftest/tests/test_target.py60
3 files changed, 199 insertions, 1 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
diff --git a/selftest/tests/__init__.py b/selftest/tests/__init__.py
index 1e6b192d26..6eb4bb9bc6 100644
--- a/selftest/tests/__init__.py
+++ b/selftest/tests/__init__.py
@@ -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
index 0000000000..9b3d37b270
--- /dev/null
+++ b/selftest/tests/test_target.py
@@ -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")))