1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

selftest: Add base classes for Target/Environment and their management.

This commit is contained in:
Jelmer Vernooij 2012-03-04 02:18:27 +01:00
parent 164d3f6641
commit 5f74fa3511
3 changed files with 199 additions and 1 deletions

138
selftest/target/__init__.py Normal file
View File

@ -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

View 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))

View File

@ -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")))