good start on TestSwiftInitClass

This commit is contained in:
Clay Gerrard 2010-12-29 00:01:30 -06:00
parent 668666c18b
commit ef487c65ef
2 changed files with 225 additions and 24 deletions

@ -144,8 +144,6 @@ class SwiftInit():
"""
def __init__(self, servers):
self.servers = []
server_names = set()
for server in servers:
if server == 'all':
@ -157,8 +155,9 @@ class SwiftInit():
else:
server_names.add(server)
self.servers = set()
for name in server_names:
self.servers.append(SwiftServer(name))
self.servers.add(SwiftServer(name))
def watch_server_pids(self, server_pids, interval=0, **kwargs):
"""Monitor a collection of server pids yeilding back those pids that
@ -331,20 +330,17 @@ class SwiftInit():
raise UnknownCommand(cmd)
return f
def list_commands(self):
@classmethod
def list_commands(cls):
"""Get all publicly accessible commands
:returns: a list of strings, the method names who are decorated
as commands
"""
cmds = sorted([x.replace('_', '-') for x in dir(self) if \
hasattr(getattr(self, x), 'publicly_accessible')])
try:
helps = [self.get_command(x).__doc__.strip() for x in cmds]
except AttributeError:
raise AttributeError(
'command %s has no __doc__, please add one' % x)
return zip(cmds, helps)
get_method = lambda cmd: getattr(cls, cmd)
return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip())
for x in dir(cls) if
getattr(get_method(x), 'publicly_accessible', False)])
def run_command(self, cmd, **kwargs):
"""Find the named command and run it
@ -365,7 +361,7 @@ class SwiftServer():
def __init__(self, server):
if '-' not in server:
server = '%s-server' % server
self.server = server
self.server = server.lower()
self.type = '-'.join(server.split('-')[:-1])
self.cmd = 'swift-%s' % server
self.procs = []
@ -373,6 +369,18 @@ class SwiftServer():
def __str__(self):
return self.server
def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, repr(str(self)))
def __hash__(self):
return hash(str(self))
def __eq__(self, other):
try:
return self.server == other.server
except AttributeError:
return False
def get_pid_file_name(self, ini_file):
"""Translate ini_file to a corresponding pid_file
@ -645,7 +653,7 @@ class SwiftServer():
USAGE = """%prog <server> [<server ...] <command>
Commands:
""" + '\n'.join(["%16s: %s" % x for x in SwiftInit([]).list_commands()])
""" + '\n'.join(["%16s: %s" % x for x in SwiftInit.list_commands()])
def main():
@ -676,13 +684,13 @@ def main():
if len(servers) == 1:
# this is just a stupid swap for me cause I always try to "start main"
commands, docs = zip(*SwiftInit([]).list_commands())
commands, docs = zip(*SwiftInit.list_commands())
if servers[0] in commands:
command, servers = servers[0], [command]
init = SwiftInit(servers)
controller = SwiftInit(servers)
try:
status = init.run_command(command, **options.__dict__)
status = controller.run_command(command, **options.__dict__)
except UnknownCommand:
parser.print_help()
print 'ERROR: unknown command, %s' % command

@ -14,6 +14,7 @@
# limitations under the License.
import unittest
from nose import SkipTest
import os
import sys
@ -97,7 +98,7 @@ class TestSwiftInitModule(unittest.TestCase):
def test_setup_env(self):
# TODO: tests
pass
raise SkipTest
def test_search_tree(self):
# file match & ext miss
@ -209,7 +210,7 @@ class TestSwiftServerClass(unittest.TestCase):
def join_run_dir(self, path):
return os.path.join(swift_init.RUN_DIR, path)
def test_server_init(self):
def test_create_server(self):
server = swift_init.SwiftServer('proxy')
self.assertEquals(server.server, 'proxy-server')
self.assertEquals(server.type, 'proxy')
@ -219,6 +220,24 @@ class TestSwiftServerClass(unittest.TestCase):
self.assertEquals(server.type, 'object')
self.assertEquals(server.cmd, 'swift-object-replicator')
def test_server_to_string(self):
server = swift_init.SwiftServer('Proxy')
self.assertEquals(str(server), 'proxy-server')
server = swift_init.SwiftServer('object-replicator')
self.assertEquals(str(server), 'object-replicator')
def test_server_repr(self):
server = swift_init.SwiftServer('proxy')
self.assert_(server.__class__.__name__ in repr(server))
self.assert_(str(server) in repr(server))
def test_server_equality(self):
server1 = swift_init.SwiftServer('Proxy')
server2 = swift_init.SwiftServer('proxy-server')
self.assertEquals(server1, server2)
# it is NOT a string
self.assertNotEquals(server1, 'proxy-server')
def test_get_pid_file_name(self):
server = swift_init.SwiftServer('proxy')
ini_file = self.join_swift_dir('proxy-server.conf')
@ -1026,7 +1045,6 @@ class TestSwiftServerClass(unittest.TestCase):
finally:
sys.stdout = old_stdout
#TODO: more tests
def test_stop(self):
ini_files = (
'account-server/1.conf',
@ -1082,18 +1100,193 @@ class TestSwiftServerClass(unittest.TestCase):
self.assertFalse(os.path.exists(conf4))
self.assertFalse(os.path.exists(conf3))
#TODO: test SwiftInit class
class TestSwiftInitClass(unittest.TestCase):
def test_placeholder(self):
pass
def test_create(self):
controller = swift_init.SwiftInit(['test'])
self.assertEquals(len(controller.servers), 1)
server = controller.servers.pop()
self.assert_(isinstance(server, swift_init.SwiftServer))
self.assertEquals(server.server, 'test-server')
# test multi-server and simple dedupe
servers = ['object-replicator', 'object-auditor', 'object-replicator']
controller = swift_init.SwiftInit(servers)
self.assertEquals(len(controller.servers), 2)
for server in controller.servers:
self.assert_(server.server in servers)
# test all
controller = swift_init.SwiftInit(['all'])
self.assertEquals(len(controller.servers), len(swift_init.ALL_SERVERS))
for server in controller.servers:
self.assert_(server.server in swift_init.ALL_SERVERS)
# test main
controller = swift_init.SwiftInit(['main'])
self.assertEquals(len(controller.servers), len(swift_init.MAIN_SERVERS))
for server in controller.servers:
self.assert_(server.server in swift_init.MAIN_SERVERS)
# test rest
controller = swift_init.SwiftInit(['rest'])
self.assertEquals(len(controller.servers), len(swift_init.REST_SERVERS))
for server in controller.servers:
self.assert_(server.server in swift_init.REST_SERVERS)
# test main + rest == all
controller = swift_init.SwiftInit(['main', 'rest'])
self.assertEquals(len(controller.servers), len(swift_init.ALL_SERVERS))
for server in controller.servers:
self.assert_(server.server in swift_init.ALL_SERVERS)
# test dedupe
controller = swift_init.SwiftInit(['main', 'rest', 'proxy', 'object',
'container', 'account'])
self.assertEquals(len(controller.servers), len(swift_init.ALL_SERVERS))
for server in controller.servers:
self.assert_(server.server in swift_init.ALL_SERVERS)
#TODO: more tests
def test_watch_server_pids(self):
raise SkipTest
def test_get_command(self):
raise SkipTest
def test_list_commands(self):
for cmd, help in swift_init.SwiftInit.list_commands():
method = getattr(swift_init.SwiftInit, cmd.replace('-', '_'), None)
self.assert_(method, '%s is not a command' % cmd)
self.assert_(getattr(method, 'publicly_accessible', False))
self.assertEquals(method.__doc__.strip(), help)
def test_run_command(self):
raise SkipTest
def test_status(self):
class MockSwiftServer():
def __init__(self, server):
self.server = server
self.called_kwargs = []
def status(self, **kwargs):
self.called_kwargs.append(kwargs)
if 'error' in self.server:
return 1
else:
return 0
old_server_class = swift_init.SwiftServer
try:
swift_init.SwiftServer = MockSwiftServer
controller = swift_init.SwiftInit(['test'])
status = controller.status()
self.assertEquals(status, 0)
controller = swift_init.SwiftInit(['error'])
status = controller.status()
self.assertEquals(status, 1)
# test multi-server
controller = swift_init.SwiftInit(['test', 'error'])
kwargs = {'key': 'value'}
status = controller.status(**kwargs)
self.assertEquals(status, 1)
for server in controller.servers:
self.assertEquals(server.called_kwargs, [kwargs])
finally:
swift_init.SwiftServer = old_server_class
def test_start(self):
def mock_setup_env():
getattr(mock_setup_env, 'called', []).append(True)
class MockSwiftServer():
def __init__(self, server):
self.server = server
self.called = defaultdict(list)
def launch(self, **kwargs):
self.called['launch'].append(kwargs)
def wait(self, **kwargs):
self.called['wait'].append(kwargs)
if 'error' in self.server:
return 1
else:
return 0
def interact(self, **kwargs):
self.called['interact'].append(kwargs)
# TODO: test user quit
"""
if 'raise' in self.server:
raise KeyboardInterrupt
el
"""
if 'error' in self.server:
return 1
else:
return 0
old_setup_env = swift_init.setup_env
old_swift_server = swift_init.SwiftServer
try:
swift_init.setup_env = mock_setup_env
swift_init.SwiftServer = MockSwiftServer
# test no errors on launch
controller = swift_init.SwiftInit(['proxy', 'error'])
status = controller.start()
self.assertEquals(status, 0)
for server in controller.servers:
self.assertEquals(server.called['launch'], [{}])
# test wait
controller = swift_init.SwiftInit(['proxy', 'error'])
kwargs = {'wait': True}
status = controller.start(**kwargs)
self.assertEquals(status, 1)
for server in controller.servers:
self.assertEquals(server.called['launch'], [kwargs])
self.assertEquals(server.called['wait'], [kwargs])
# test interact
controller = swift_init.SwiftInit(['proxy', 'error'])
kwargs = {'daemon': False}
status = controller.start(**kwargs)
self.assertEquals(status, 1)
for server in controller.servers:
self.assertEquals(server.called['launch'], [kwargs])
self.assertEquals(server.called['interact'], [kwargs])
finally:
swift_init.setup_env = old_setup_env
swift_init.SwiftServer = old_swift_server
def test_wait(self):
raise SkipTest
def test_no_daemon(self):
raise SkipTest
def test_once(self):
raise SkipTest
def test_stop(self):
raise SkipTest
def test_shutdown(self):
raise SkipTest
def test_restart(self):
raise SkipTest
def test_reload(self):
raise SkipTest
def test_force_reload(self):
raise SkipTest
#TODO: test main
class TestMain(unittest.TestCase):
def test_placeholder(self):
pass
raise SkipTest
if __name__ == '__main__':