From eea8229c9c3bb567201a81230af569b7f5ac8838 Mon Sep 17 00:00:00 2001 From: Omer Anson Date: Wed, 16 Aug 2017 18:43:40 +0300 Subject: [PATCH] Add fullstack tests for DB API Change-Id: I70b6e6c52da6a9d4751b43dddf6d9336dcb3f00e Related-Bug: #1709040 --- dragonflow/db/drivers/etcd_db_driver.py | 3 +- dragonflow/tests/fullstack/test_db_api.py | 106 ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 dragonflow/tests/fullstack/test_db_api.py diff --git a/dragonflow/db/drivers/etcd_db_driver.py b/dragonflow/db/drivers/etcd_db_driver.py index bec4e82d3..3d7c447b8 100644 --- a/dragonflow/db/drivers/etcd_db_driver.py +++ b/dragonflow/db/drivers/etcd_db_driver.py @@ -102,8 +102,7 @@ class EtcdDbDriver(db_api.DbApi): pass def delete_table(self, table): - # Not needed in etcd - pass + self.client.delete_prefix(self._make_key(table)) @staticmethod def _make_key(table, obj_id=None): diff --git a/dragonflow/tests/fullstack/test_db_api.py b/dragonflow/tests/fullstack/test_db_api.py new file mode 100644 index 000000000..31f865a6b --- /dev/null +++ b/dragonflow/tests/fullstack/test_db_api.py @@ -0,0 +1,106 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import functools +import threading + +from dragonflow.common import exceptions as df_exceptions +from dragonflow.common import utils as df_utils +from dragonflow import conf as cfg +from dragonflow.tests.fullstack import test_base + + +class TestDbApi(test_base.DFTestBase): + + def setUp(self): + super(TestDbApi, self).setUp() + self.driver = df_utils.load_driver( + cfg.CONF.df.nb_db_class, + df_utils.DF_NB_DB_DRIVER_NAMESPACE) + self.driver.initialize(cfg.CONF.df.remote_db_ip, + cfg.CONF.df.remote_db_port, + config=cfg.CONF.df) + + def test_simple_create_get(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.driver.create_key('test_table', 'k1', 'v1') + self.assertEqual('v1', self.driver.get_key('test_table', 'k1')) + + def test_get_not_found(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.assertRaises(df_exceptions.DBKeyNotFound, + functools.partial(self.driver.get_key, + 'test_table', 'k1')) + + def test_delete_key(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.driver.create_key('test_table', 'k1', 'v1') + self.driver.create_key('test_table', 'k2', 'v2') + self.driver.delete_key('test_table', 'k1') + self.assertRaises(df_exceptions.DBKeyNotFound, + functools.partial(self.driver.get_key, + 'test_table', 'k1')) + self.assertEqual('v2', self.driver.get_key('test_table', 'k2')) + + def test_delete_table(self): + self.driver.create_table('test_table') + self.driver.create_key('test_table', 'k1', 'v1') + self.driver.delete_table('test_table') + self.assertRaises(df_exceptions.DBKeyNotFound, + functools.partial(self.driver.get_key, + 'test_table', 'k1')) + + def test_set_key(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.driver.create_key('test_table', 'k1', 'v1') + self.driver.create_key('test_table', 'k2', 'v2') + self.assertEqual('v1', self.driver.get_key('test_table', 'k1')) + self.driver.set_key('test_table', 'k1', 'v1_2') + self.assertEqual('v1_2', self.driver.get_key('test_table', 'k1')) + self.assertEqual('v2', self.driver.get_key('test_table', 'k2')) + + def test_get_all_entries(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.assertEqual([], self.driver.get_all_entries('test_table')) + self.driver.create_key('test_table', 'k1', 'v1') + self.driver.create_key('test_table', 'k2', 'v2') + self.assertItemsEqual(['v1', 'v2'], + self.driver.get_all_entries('test_table')) + + def test_get_all_keys(self): + self.driver.create_table('test_table') + self.addCleanup(self.driver.delete_table, 'test_table') + self.assertEqual([], self.driver.get_all_keys('test_table')) + self.driver.create_key('test_table', 'k1', 'v1') + self.driver.create_key('test_table', 'k2', 'v2') + self.assertItemsEqual(['k1', 'k2'], + self.driver.get_all_keys('test_table')) + + def test_allocate_unique_key(self): + unique_keys = [0, 0] + + def get_unique_key(idx): + unique_keys[idx] = self.driver.allocate_unique_key('test_table') + thread1 = threading.Thread(target=functools.partial(get_unique_key, 0)) + thread2 = threading.Thread(target=functools.partial(get_unique_key, 1)) + thread1.start() + thread2.start() + thread1.join(5) + thread2.join(5) + self.assertNotEqual(unique_keys[0], unique_keys[1]) + self.assertFalse(thread1.is_alive()) + self.assertFalse(thread2.is_alive())