class TestSQLDriverReconnection(unittest.TestCase): def setUp(self): """ Set up for testing reconnection to database of swift.common.key_manager.driver.sql.SQLDriver class. """ self.conf = {'crypto_keystore_sql_url': 'fake'} self.patcher = mock.patch( 'swift.common.key_manager.drivers.sql.driver.create_engine') self.mock_create_engine = self.patcher.start() self.key_driver = SQLDriver(self.conf, initialize_table=True) self.mock_connect = self.mock_create_engine.return_value.connect def tearDown(self): """ Tear down of testing reconnection to database of swift.common.key_manager.driver.sql.SQLDriver class. """ self.patcher.stop() def test_on_init(self): """ Check reconnection on driver initialization. """ self.assertEqual(self.key_driver.engine.connect.call_count, 1) def test_success(self): """ Check reconnect on happy path. """ self.mock_connect.reset_mock() self.key_driver.reconnect_to_db() self.assertEqual(self.key_driver.engine.connect.call_count, 1) def test_db_failed(self): """ Connection always fails try to fixed attempts count. """ self.mock_connect.reset_mock() self.key_driver.engine.connect.side_effect = exc.SQLAlchemyError self.assertRaises(exc.SQLAlchemyError, self.key_driver.reconnect_to_db) attempts = self.key_driver.engine.connect.call_count self.assertEquals(self.key_driver.connection_attempts, attempts) def test_failed_success(self): """ First two connections fails but third successful. """ self.mock_connect.reset_mock() connect_results = [exc.SQLAlchemyError, exc.SQLAlchemyError, 1] self.key_driver.engine.connect.side_effect = connect_results self.key_driver.reconnect_to_db() self.assertEquals(self.key_driver.engine.connect.call_count, 3)