From 5f74fa3511f0a545b63db142741320fc38126646 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 4 Mar 2012 02:18:27 +0100 Subject: selftest: Add base classes for Target/Environment and their management. --- selftest/target/__init__.py | 138 ++++++++++++++++++++++++++++++++++++++++++ selftest/tests/__init__.py | 2 +- selftest/tests/test_target.py | 60 ++++++++++++++++++ 3 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 selftest/target/__init__.py create mode 100644 selftest/tests/test_target.py (limited to 'selftest') 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 +# +# 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 +# +# 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"))) -- cgit