From 2e76a86683587aba45895c1358899d229dc65dd9 Mon Sep 17 00:00:00 2001 From: GowthamShanmugam Date: Tue, 25 Oct 2016 17:04:14 +0530 Subject: [PATCH] Gluster_bridge: Testcases for gluster bridge Signed-off-by: GowthamShanmugam --- setup.py | 3 +- tendrl/gluster_bridge/gevent_util.py | 40 ------ tendrl/gluster_bridge/log.py | 3 +- tendrl/gluster_bridge/manager/rpc.py | 8 +- tendrl/gluster_bridge/tests/test_config.py | 27 ++++ .../gluster_bridge/tests/test_gevent_util.py | 51 ++++++++ .../tests/test_gluster_bridge.py | 38 +++++- tendrl/gluster_bridge/tests/test_ini2json.py | 123 ++++++++++++++++++ tendrl/gluster_bridge/tests/test_log.py | 14 ++ tendrl/gluster_bridge/tests/test_manager.py | 108 +++++++++++++++ tendrl/gluster_bridge/tests/test_persister.py | 86 ++++++++++++ tendrl/gluster_bridge/tests/test_rpc.py | 61 +++++++++ tendrl/gluster_bridge/tests/test_servers.py | 116 +++++++++++++++++ .../gluster_bridge/tests/test_syncObjects.py | 9 ++ tendrl/gluster_bridge/tests/test_util.py | 26 ++++ test-requirements.txt | 3 +- 16 files changed, 661 insertions(+), 55 deletions(-) create mode 100644 tendrl/gluster_bridge/tests/test_config.py create mode 100644 tendrl/gluster_bridge/tests/test_gevent_util.py create mode 100644 tendrl/gluster_bridge/tests/test_ini2json.py create mode 100644 tendrl/gluster_bridge/tests/test_log.py create mode 100644 tendrl/gluster_bridge/tests/test_manager.py create mode 100644 tendrl/gluster_bridge/tests/test_persister.py create mode 100644 tendrl/gluster_bridge/tests/test_rpc.py create mode 100644 tendrl/gluster_bridge/tests/test_servers.py create mode 100644 tendrl/gluster_bridge/tests/test_syncObjects.py create mode 100644 tendrl/gluster_bridge/tests/test_util.py diff --git a/setup.py b/setup.py index 5a2b670..677f02e 100644 --- a/setup.py +++ b/setup.py @@ -20,8 +20,7 @@ def extract_requirements(filename): license="LGPL-2.1+", zip_safe=False, install_requires=install_requires, - entry_points={ - 'console_scripts': [ + entry_points={'console_scripts': [ 'tendrl-gluster-bridge = tendrl.gluster_bridge.manager.manager:main' ] } diff --git a/tendrl/gluster_bridge/gevent_util.py b/tendrl/gluster_bridge/gevent_util.py index b7b1798..e795f7b 100644 --- a/tendrl/gluster_bridge/gevent_util.py +++ b/tendrl/gluster_bridge/gevent_util.py @@ -36,43 +36,3 @@ def wrapped(*args, **kwargs): return func(*args, **kwargs) return wrapped - - -if __name__ == '__main__': - # Tests for nosleep() - # =================== - - import gevent.greenlet - import gevent.queue - from gevent import sleep - - # This should raise no exception (print doesn't yield) - with nosleep_mgr(): - print("test print!") - - # This should raise an exception when we try push to a fixed size queue - try: - smallq = gevent.queue.Queue(1) - with nosleep_mgr(): - smallq.put(1) - smallq.put(2) - except ForbiddenYield: - pass - else: - raise AssertionError("Failed") - - # This should raise no exception when we try push to an unlimited - # size queue - bigq = gevent.queue.Queue(0) - with nosleep_mgr(): - for i in range(0, 10000): - bigq.put(i) - - # This should raise an exception on sleep - # FIXME!!!! - try: - sleep(0.1) - except ForbiddenYield: - pass - else: - raise AssertionError("Failed") diff --git a/tendrl/gluster_bridge/log.py b/tendrl/gluster_bridge/log.py index 1c8bf90..af9e213 100644 --- a/tendrl/gluster_bridge/log.py +++ b/tendrl/gluster_bridge/log.py @@ -10,5 +10,6 @@ def setup_logging(): handler = logging.FileHandler(config.get('gluster_bridge', 'log_path')) handler.setFormatter(logging.Formatter(FORMAT)) root.addHandler(handler) - root.setLevel(logging.getLevelName(config.get('gluster_bridge', 'log_level'))) + root.setLevel( + logging.getLevelName(config.get('gluster_bridge', 'log_level'))) logging.getLogger(__name__).info("Logging setup complete!") diff --git a/tendrl/gluster_bridge/manager/rpc.py b/tendrl/gluster_bridge/manager/rpc.py index 8185de6..609cb73 100644 --- a/tendrl/gluster_bridge/manager/rpc.py +++ b/tendrl/gluster_bridge/manager/rpc.py @@ -16,15 +16,16 @@ class EtcdRPC(object): - def __init__(self): + def __init__(self, Etcdthread): etcd_kwargs = {'port': int(config.get("bridge_common", "etcd_port")), 'host': config.get("bridge_common", "etcd_connection")} self.client = etcd.Client(**etcd_kwargs) self.bridge_id = str(uuid.uuid4()) + self.Etcdthread = Etcdthread def _acceptor(self): - while True: + while not self.Etcdthread._complete.is_set(): jobs = self.client.read("/api_job_queue") for job in jobs.children: raw_job = json.loads(job.value.decode('utf-8')) @@ -80,11 +81,10 @@ def __init__(self, manager): super(EtcdThread, self).__init__() self._manager = manager self._complete = gevent.event.Event() - self._server = EtcdRPC() + self._server = EtcdRPC(self) def stop(self): LOG.info("%s stopping" % self.__class__.__name__) - self._complete.set() if self._server: self._server.stop() diff --git a/tendrl/gluster_bridge/tests/test_config.py b/tendrl/gluster_bridge/tests/test_config.py new file mode 100644 index 0000000..f97ac57 --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_config.py @@ -0,0 +1,27 @@ +from mock import MagicMock +import pytest +from tendrl.gluster_bridge import config + + +class TestTendrlconfig(object): + def setup_method(self, method): + config.os.path.exists = MagicMock(return_value=True) + + def test_with_default_path(self): + config.TendrlConfig() + config.os.path.exists.assert_called_with( + "/etc/tendrl/tendrl.conf" + ) + + def test_with_config_path(self, monkeypatch): + monkeypatch.setattr(config.os, 'environ', {"TENDRL_CONFIG": "/temp/"}) + config.TendrlConfig() + config.os.path.exists.assert_called_with( + "/temp/" + ) + + def test_with_path_exist_error(self): + config.TendrlConfig() + config.os.path.exists = MagicMock(return_value=False) + with pytest.raises(config.ConfigNotFound): + config.TendrlConfig() diff --git a/tendrl/gluster_bridge/tests/test_gevent_util.py b/tendrl/gluster_bridge/tests/test_gevent_util.py new file mode 100644 index 0000000..9400e2c --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_gevent_util.py @@ -0,0 +1,51 @@ +import gevent.queue +from gevent import sleep +import pytest +from tendrl.gluster_bridge import gevent_util + + +def test_nosleep_mgr(): + test_nosleep_method1() + with pytest.raises(gevent_util.ForbiddenYield): + raise test_nosleep_method2() + test_nosleep_method3() + with pytest.raises(gevent_util.ForbiddenYield): + raise test_nosleep_method4() + setattr(gevent_util.getcurrent(), 'switch_out', "pytest") + test_nosleep_method1() + assert gevent_util.getcurrent().switch_out == "pytest" + + +# This should raise no exception (print doesn't yield) +@gevent_util.nosleep +def test_nosleep_method1(): + print("test print!") + + +# This should raise an exception when we try push to a fixed size queue +@gevent_util.nosleep +def test_nosleep_method2(): + smallq = gevent.queue.Queue(1) + try: + smallq.put(1) + smallq.put(2) + except gevent_util.ForbiddenYield as ex: + return ex + + +# This should raise no exception when we try push to an unlimited +# size queue +@gevent_util.nosleep +def test_nosleep_method3(): + bigq = gevent.queue.Queue(0) + for i in range(0, 10000): + bigq.put(i) + + +# This should raise an exception on sleep +@gevent_util.nosleep +def test_nosleep_method4(): + try: + sleep(0.1) + except gevent_util.ForbiddenYield as ex: + return ex diff --git a/tendrl/gluster_bridge/tests/test_gluster_bridge.py b/tendrl/gluster_bridge/tests/test_gluster_bridge.py index 6c5fa26..f9cc3ed 100644 --- a/tendrl/gluster_bridge/tests/test_gluster_bridge.py +++ b/tendrl/gluster_bridge/tests/test_gluster_bridge.py @@ -1,17 +1,41 @@ -# -*- coding: utf-8 -*- - - """ test_gluster_bridge ---------------------------------- Tests for `gluster_bridge` module. """ +from mock import MagicMock +import os +import shutil +import sys +import tempfile +sys.modules['tendrl.gluster_bridge.config'] = MagicMock() +sys.modules['tendrl.gluster_bridge.manager.rpc'] = MagicMock() +sys.modules['tendrl.gluster_bridge.persistence.persister'] = MagicMock() +sys.modules['logging'] = MagicMock() +from tendrl.gluster_bridge.manager import manager +del sys.modules['tendrl.gluster_bridge.manager.rpc'] +del sys.modules['tendrl.gluster_bridge.persistence.persister'] +del sys.modules['logging'] +del sys.modules['tendrl.gluster_bridge.config'] -from tendrl.gluster_bridge.tests import base +class TestGluster_bridge(object): + def setup_method(self, method): + manager.gevent.sleep = MagicMock() + manager.Peer = MagicMock() + manager.Brick = MagicMock() + manager.Volume = MagicMock() + manager.log = MagicMock() + self.managerobj = manager.Manager() + self.Manager = manager + self.tempdir = tempfile.mkdtemp() -class TestGluster_bridge(base.TestCase): + def teardown_method(self, method): + shutil.rmtree(self.tempdir) - def test_something(self): - assert True + def _makeFile(self, filename, text): + filename = os.path.join(self.tempdir, filename) + f = open(filename, 'w') + f.write(text) + return filename diff --git a/tendrl/gluster_bridge/tests/test_ini2json.py b/tendrl/gluster_bridge/tests/test_ini2json.py new file mode 100644 index 0000000..c66e314 --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_ini2json.py @@ -0,0 +1,123 @@ +from mock import MagicMock +import pytest +from tendrl.gluster_bridge import ini2json +from tendrl.gluster_bridge.tests.test_gluster_bridge import TestGluster_bridge + + +class Test_StrictConfigParser(TestGluster_bridge): + + def test_parse_empty_nodefaults(self): + filename = self._makeFile('empty', '') + sections = ini2json.ini_to_dict(filename) + assert sections == {} + + def test_parse_empty_with_comment_line(self): + body = """# empty with comment line""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == {} + + def test_parse_empty_no_leading_whitespace(self): + body = """rem ember_last = True""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == {} + + def test_parse_duplicate_section(self): + body = """[foo]\na=1\n[foo]\nbar=1\nbaz=2""" + filename = self._makeFile('pytest', body) + with pytest.raises(ValueError): + ini2json.ini_to_dict(filename) + + def test_parse_continuation_line(self): + body = """[foo]\nbar:1 2 jammy:jam\n foo bar\n boo""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'bar': ['1', '2', 'jammy:jam', 'foo', 'bar', 'boo']}} + ) + + def test_parse_(self): + body = """[foo]\na=1\n[memo]\n bar=1\nbaz=2""" + filename = self._makeFile('pytest', body) + with pytest.raises(ini2json.ParsingError): + ini2json.ini_to_dict(filename) + + def test_parse_body_default(self): + body = """[foo]\nbar=1\nbaz=2"\n[DEFAULT]\na=1""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'a': '1', 'bar': '1', 'baz': '2"'}} + ) + + def test_parse_missing_section(self): + body = """\nbar=1\nbaz=2"\n[DEFAULT]\na=1i""" + filename = self._makeFile('pytest', body) + with pytest.raises(ini2json.MissingSectionHeaderError): + ini2json.ini_to_dict(filename) + + def test_parse_with_tokens(self): + body = """[foo]\nbar: 1 2 3 4 jammy:jam\n""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'bar': ['1', '2', '3', '4', 'jammy:jam']}} + ) + + def test_parse_with_bad_format(self): + body = """[foo]\nbar: 1 ;\n 2 3 4 jammy:jam\n""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'bar': ['1', '2', '3', '4', 'jammy:jam']}} + ) + + def test_parse_without_token(self): + body = """[foo]\nbar:\n""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'bar': ''}} + ) + + def test_parse_without_space(self): + body = """[foo]\nbar:""\n""" + filename = self._makeFile('pytest', body) + sections = ini2json.ini_to_dict(filename) + assert sections == ( + {'foo': {'bar': ''}} + ) + + def test_dget_with_dummy_section(self): + self.strict_config_parser = ini2json.StrictConfigParser() + assert self.strict_config_parser.dget("pytest", 1, 12345) == 12345 + + def test_dget_with_type_str(self): + self.strict_config_parser = ini2json.StrictConfigParser() + self.strict_config_parser.has_option = MagicMock(return_value=True) + self.strict_config_parser.get = MagicMock(return_value="str called") + assert self.strict_config_parser.dget( + "pytest", 1, 12345, str) == "str called" + + def test_dget_with_type_int(self): + self.strict_config_parser = ini2json.StrictConfigParser() + self.strict_config_parser.has_option = MagicMock(return_value=True) + self.strict_config_parser.getint = MagicMock( + return_value="int called") + assert self.strict_config_parser.dget( + "pytest", 1, 12345, int) == "int called" + + def test_dget_with_type_bool(self): + self.strict_config_parser = ini2json.StrictConfigParser() + self.strict_config_parser.has_option = MagicMock(return_value=True) + self.strict_config_parser.getboolean = MagicMock( + return_value="bool called") + assert self.strict_config_parser.dget( + "pytest", 1, 12345, bool) == "bool called" + + def test_dget_with_not_implemented_type(self): + self.strict_config_parser = ini2json.StrictConfigParser() + self.strict_config_parser.has_option = MagicMock(return_value=True) + with pytest.raises(NotImplementedError): + assert self.strict_config_parser.dget("pytest", 1, 12345, float) diff --git a/tendrl/gluster_bridge/tests/test_log.py b/tendrl/gluster_bridge/tests/test_log.py new file mode 100644 index 0000000..b4600fc --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_log.py @@ -0,0 +1,14 @@ +from mock import MagicMock +import sys +sys.modules['logging'] = MagicMock() +sys.modules['tendrl.gluster_bridge.config'] = MagicMock() +from tendrl.gluster_bridge import log +del sys.modules['tendrl.gluster_bridge.config'] +del sys.modules['logging'] + + +class Test_log(object): + def test_log(self): + log.root = None + log.setup_logging() + log.logging.getLogger.assert_called_with('tendrl.gluster_bridge.log') diff --git a/tendrl/gluster_bridge/tests/test_manager.py b/tendrl/gluster_bridge/tests/test_manager.py new file mode 100644 index 0000000..ca8dd3c --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_manager.py @@ -0,0 +1,108 @@ +from mock import MagicMock +from tendrl.gluster_bridge import ini2json +from tendrl.gluster_bridge.tests.test_gluster_bridge import TestGluster_bridge + + +class Test_manager(TestGluster_bridge): + def Initialize(self, body): + self.Manager.subprocess = self + self.Manager.ini2json = self + filename = self._makeFile('manager', body) + self.sections = ini2json.ini_to_dict(filename) + + def test_manager_with_peer(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7 \ + \nop-version:40000\n[Peers]\npeer1.uuid=1\npeer1.hostname=pytest" \ + \npeer1.state=active""" + self.Initialize(body) + self.Manager.time.time = MagicMock(return_value=1477237162.990813) + self.managerobj._discovery_thread._run() + self.Manager.Peer.assert_called_with( + hostname='pytest"', peer_uuid='1', state='active', + updated='1477237162.99' + ) + + def test_manager_with_volume(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7 \ + \nop-version:40000\n[Volumes]\nvolume1.id=1\nvolume1.type=abc" \ + \nvolume1.name=brick1\nvolume1.status=active\nvolume1.brickcount=1""" + self.Initialize(body) + self.managerobj._discovery_thread._run() + self.Manager.Volume.assert_called_with( + brick_count='1', name='brick1', status='active', + vol_id='1', vol_type='abc"' + ) + + def test_manager_with_brick(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7 \ + \nop-version:40000\n[Volumes]\nvolume1.id=1\nvolume1.type=abc" \ + \nvolume1.name=brick1\nvolume1.status=active\nvolume1.brickcount=1 \ + \nvolume1.brick1.path=/tmp\nvolume1.brick1.hostname=abc \ + \nvolume1.brick1.port=80\nvolume1.brick1.status=active \ + \nvolume1.brick1.filesystem_type=FAT12 \ + \nvolume1.brick1.mount_options=abc""" + self.Initialize(body) + self.managerobj._discovery_thread._run() + self.Manager.Brick.assert_called_with( + filesystem_type='FAT12', hostname='abc', mount_options='abc', + path='/tmp', port='80', status='active', vol_id='1' + ) + + def test_manager_with_peer_keyerror(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7\n \ + op-version:40000\n[Peers]\npeer.uuid=1""" + self.Initialize(body) + self.managerobj._discovery_thread._run() + assert not self.Manager.Peer.called + + def test_manager_with_volume_keyerror(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7 \ + \nop-version:40000\n[Volumes]\n""" + self.Initialize(body) + self.managerobj._discovery_thread._run() + assert not self.Manager.Volume.called + + def test_manager_with_brick_keyerror(self): + body = """[Global]\nMYUUID=145b9021-d47c-4094-957b-7545e8232ab7\n \ + op-version:40000\n[Volumes]\nvolume1.id=1\nvolume1.type=abc" \ + \nvolume1.name=brick1\nvolume1.status=active\nvolume1.brickcount=1""" + self.Initialize(body) + self.managerobj._discovery_thread._run() + assert not self.Manager.Brick.called + + def test_stop(self): + self.managerobj.stop() + self.managerobj._user_request_thread.stop.assert_called() + + def test_recover(self): + self.managerobj._recover() + self.Manager.LOG.debug.assert_called() + + def test_start(self): + self.managerobj.start() + self.managerobj._user_request_thread.start.assert_called() + self.managerobj.persister.start.assert_called() + + def test_join(self): + self.Manager.gevent = MagicMock() + self.managerobj._discovery_thread = MagicMock() + self.managerobj.join() + self.managerobj._user_request_thread.join.assert_called() + self.managerobj.persister.join.assert_called() + + def test_dump_stacks(self): + self.Manager.dump_stacks() + self.Manager.LOG.errorassert_called() + + def test_main(self): + self.Manager.gevent = MagicMock() + self.Manager.main() + self.Manager.gevent.signal.assert_called() + + """Mocked subprocess call to stop while loop""" + def call(self, *args): + self.managerobj._discovery_thread.stop() + + """Mocked ini2json for return temp file""" + def ini_to_dict(self, *args): + return self.sections diff --git a/tendrl/gluster_bridge/tests/test_persister.py b/tendrl/gluster_bridge/tests/test_persister.py new file mode 100644 index 0000000..49ccfac --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_persister.py @@ -0,0 +1,86 @@ +from mock import MagicMock +import pytest +import sys +sys.modules['tendrl.gluster_bridge.config'] = MagicMock() +sys.modules['logging'] = MagicMock() +from tendrl.gluster_bridge.persistence import persister +del sys.modules['tendrl.gluster_bridge.config'] +del sys.modules['logging'] +from tendrl.gluster_bridge.persistence import servers + + +class Test_deferred_call(object): + def setup_method(self, method): + self.fn = MagicMock() + self.deferred_call = persister.deferred_call( + self.fn, ["pytest"], {"test": "pytest"} + ) + + def test_deferred_call(self): + self.deferred_call.call_it() + self.deferred_call.fn.assert_called_with( + "pytest", test="pytest" + ) + + +class Test_Persister(object): + def setup_method(self, method): + persister.etcd_server = MagicMock() + self.Persister = persister.Persister() + + def test_Persister_Creation(self): + assert self.Persister is not None + + def test_getattribute_(self): + """Check __getattribute__ with dummy function""" + with pytest.raises(AttributeError): + self.Persister.test_func() + """Check __getattribute__ raise excption for variable""" + self.Persister._testing = None + with pytest.raises(AttributeError): + self.Persister.testing() + persister.deferred_call = MagicMock(return_value=None) + with pytest.raises(Exception): + self.Persister.update_peer() + + def test_update_sync_object(self): + """Sending dummy parameters""" + data = "data" + updated = "updated" + self.Persister._update_sync_object(updated, data) + self.Persister._store.save.assert_called() + + def test_update_peer(self): + self.peer = servers.Peer + self.Persister._update_peer(self.peer) + self.Persister._store.save.assert_called_with( + self.peer + ) + + def test_update_volume(self): + self.volume = servers.Volume + self.Persister._update_volume(self.volume) + self.Persister._store.save.assert_called_with( + self.volume + ) + + def test_update_brick(self): + self.brick = servers.Brick + self.Persister._update_brick(self.brick) + self.Persister._store.save.assert_called_with( + self.brick + ) + + def test_save_events(self): + self.Persister._save_events(["event"]) + self.Persister._store.save.assert_called_with( + "event" + ) + + def test_run(self, monkeypatch): + def stop_while_loop(temp): + self.Persister.stop() + assert self.Persister._complete.is_set() is False + monkeypatch.setattr(persister.gevent, 'sleep', stop_while_loop) + self.Persister._run() + assert self.Persister._complete.is_set() is True diff --git a/tendrl/gluster_bridge/tests/test_rpc.py b/tendrl/gluster_bridge/tests/test_rpc.py new file mode 100644 index 0000000..0b87202 --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_rpc.py @@ -0,0 +1,61 @@ +import json +from mock import MagicMock +import sys +sys.modules['tendrl.gluster_bridge.config'] = MagicMock() +sys.modules['etcd'] = MagicMock() +from tendrl.gluster_bridge.manager import rpc +del sys.modules['tendrl.gluster_bridge.config'] +del sys.modules['etcd'] +import uuid + + +class Test_EtcdThread(object): + def setup_method(self, method): + mock_job = Mock_Job() + self.children = [mock_job] + self.manager = MagicMock() + self.count = 0 + self.etcdthread = rpc.EtcdThread(self.manager) + self.etcdthread._complete = self + self.etcdthread._server.client.read = MagicMock(return_value=self) + self.etcdthread._server.client.write = MagicMock() + + def test_etcdthread(self, monkeypatch): + def mock_uuid4(): + return 'aa22a6fe-87f0-45cf-8b70-2d0ff4c02af6' + monkeypatch.setattr(uuid, 'uuid4', mock_uuid4) + self.etcdthread._server.bridge_id = \ + 'aa22a6fe-87f0-45cf-8b70-2d0ff4c02af6' + self.etcdthread._complete = self + self.etcdthread._run() + self.etcdthread._server.client.write.assert_called_with( + 'pytest', + json.dumps( + { + "request_id": "aa22a6fe-87f0-45cf-8b70-2d0ff4c02af6/\ +flow_aa22a6fe-87f0-45cf-8b70-2d0ff4c02af6", + "status": "processing", + "flow": "createVolume" + })) + + def test_stop(self): + self.etcdthread._complete.set = MagicMock() + self.etcdthread.stop() + self.etcdthread._complete.set.assert_called() + + def is_set(self): + if self.count < 2: + self.count = self.count + 1 + return False + else: + return True + + def wait(self, *args): + return + + +class Mock_Job(object): + def __init__(self): + self.value = '{ "status": "new", \ + "request_id": 12345, "flow": "createVolume" }' + self.key = "pytest" diff --git a/tendrl/gluster_bridge/tests/test_servers.py b/tendrl/gluster_bridge/tests/test_servers.py new file mode 100644 index 0000000..d4f9a2e --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_servers.py @@ -0,0 +1,116 @@ +from tendrl.gluster_bridge.persistence import servers + + +class Test_Peer(object): + def test_peer(self): + self.peer = servers.Peer() + self.peer.__name__ = 'clusters/gluster/peers/%s' + assert self.peer.render() == [ + { + 'name': 'hostname', + 'key': '/clusters/gluster/peers/None/hostname', + 'dir': False, + 'value': None + }, + { + 'name': 'peer_uuid', + 'key': '/clusters/gluster/peers/None/peer_uuid', + 'dir': False, 'value': None + }, + { + 'name': 'state', + 'key': '/clusters/gluster/peers/None/state', + 'dir': False, 'value': None + }, + { + 'name': 'updated', + 'key': '/clusters/gluster/peers/None/updated', + 'dir': False, + 'value': None + }] + + +class Test_Volume(object): + def test_volume(self): + self.volume = servers.Volume() + self.volume.__name__ = 'clusters/gluster/volumes/%s' + assert self.volume.render() == [ + { + 'dir': False, + 'name': 'brick_count', + 'key': '/clusters/gluster/volumes/None/brick_count', + 'value': None + }, + { + 'dir': False, + 'name': 'name', + 'key': '/clusters/gluster/volumes/None/name', + 'value': None + }, + { + 'dir': False, + 'name': 'status', + 'key': '/clusters/gluster/volumes/None/status', + 'value': None}, + { + 'dir': False, + 'name': 'vol_id', + 'key': '/clusters/gluster/volumes/None/vol_id', + 'value': None + }, + { + 'dir': False, + 'name': 'vol_type', + 'key': '/clusters/gluster/volumes/None/vol_type', + 'value': None + }] + + +class Test_Brick(object): + def test_brick(self): + self.brick = servers.Brick() + self.brick.path = "/test/pytest" + self.brick.__name__ = 'clusters/gluster/bricks/%s' + assert self.brick.render() == [ + { + 'name': 'fs_type', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/fs_type' + }, + { + 'name': 'hostname', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/hostname' + }, + { + 'name': 'mount_opts', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/mount_opts' + }, + { + 'name': 'path', + 'value': '/test/pytest', + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/path' + }, + { + 'name': 'port', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/port' + }, + { + 'name': 'status', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/status' + }, + { + 'name': 'vol_id', + 'value': None, + 'dir': False, + 'key': '/clusters/gluster/bricks/_test_pytest/vol_id' + }] diff --git a/tendrl/gluster_bridge/tests/test_syncObjects.py b/tendrl/gluster_bridge/tests/test_syncObjects.py new file mode 100644 index 0000000..7506a71 --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_syncObjects.py @@ -0,0 +1,9 @@ +from tendrl.gluster_bridge.persistence.sync_objects import SyncObject + + +class Test_SyncObject(object): + + def test_SyncObject(self): + self.sync_object = SyncObject + assert self.sync_object.data.name == "data" + assert self.sync_object.updated.name == "updated" diff --git a/tendrl/gluster_bridge/tests/test_util.py b/tendrl/gluster_bridge/tests/test_util.py new file mode 100644 index 0000000..aa25b25 --- /dev/null +++ b/tendrl/gluster_bridge/tests/test_util.py @@ -0,0 +1,26 @@ +import datetime +from tendrl.gluster_bridge import util + + +def test_now(): + assert type(util.now()) is datetime.datetime + + +class Test_util(object): + + def test_Ticker(self): + self.ticker = util.Ticker(0, None) + self.ticker._callback = self.ticker.stop + assert self.ticker._complete.is_set() is False + self.ticker._run() + assert self.ticker._complete.is_set() is True + + def test_memoize(self): + """testing memoize else block""" + assert self.test_memoize_wrap() == "pytest" + """testing memoize if block""" + assert self.test_memoize_wrap() == "pytest" + + @util.memoize + def test_memoize_wrap(self): + return "pytest" diff --git a/test-requirements.txt b/test-requirements.txt index c23be9d..baa2e11 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -4,10 +4,11 @@ hacking<0.12,>=0.11.0 # Apache-2.0 pytest +mock pytest-cover sphinx!=1.3b1,<1.3,>=1.2.1 # BSD oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0 # releasenotes reno>=1.8.0 # Apache2 -coveralls \ No newline at end of file +coveralls