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)