benchmarks/plugin_benchmarks.py (143 lines of code) (raw):
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# 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.
from __future__ import annotations
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from aws_advanced_python_wrapper.driver_dialect import DriverDialect
from aws_advanced_python_wrapper import AwsWrapperConnection
from aws_advanced_python_wrapper.connection_provider import \
ConnectionProviderManager
from aws_advanced_python_wrapper.hostinfo import HostInfo
from aws_advanced_python_wrapper.plugin_service import (
PluginManager, PluginServiceManagerContainer)
from aws_advanced_python_wrapper.sql_alchemy_connection_provider import \
SqlAlchemyPooledConnectionProvider
from aws_advanced_python_wrapper.utils.properties import Properties
host_info = HostInfo(host="host", port=1234)
@pytest.fixture
def props_with_execute_time_plugin():
return Properties({"plugins": "execute_time"})
@pytest.fixture
def props_with_aurora_connection_tracker_plugin():
return Properties({"plugins": "aurora_connection_tracker"})
@pytest.fixture
def props_with_execute_time_and_aurora_connection_tracker_plugin():
return Properties({"plugins": "execute_time,aurora_connection_tracker"})
@pytest.fixture
def props_with_read_write_splitting_plugin():
return Properties({"plugins": "read_write_splitting"})
@pytest.fixture
def props_with_aurora_connection_tracker_and_read_write_splitting_plugin():
return Properties({"plugins": "aurora_connection_tracker,read_write_splitting"})
@pytest.fixture
def driver_dialect_mock(mocker):
dialect: DriverDialect = mocker.MagicMock()
dialect.get_connection_from_obj.return_value = None
return dialect
@pytest.fixture
def plugin_service_mock(mocker, driver_dialect_mock):
service_mock = mocker.MagicMock()
service_mock.driver_dialect = driver_dialect_mock
service_mock.current_host_info = host_info
return service_mock
@pytest.fixture
def plugin_service_manager_container_mock(mocker, plugin_service_mock):
container_mock: PluginServiceManagerContainer = mocker.MagicMock()
container_mock.plugin_service = plugin_service_mock
return container_mock
@pytest.fixture
def plugin_manager_with_execute_time_plugin(plugin_service_manager_container_mock, props_with_execute_time_plugin):
manager: PluginManager = PluginManager(plugin_service_manager_container_mock, props_with_execute_time_plugin)
return manager
@pytest.fixture
def plugin_manager_with_aurora_connection_tracker_plugin(
plugin_service_manager_container_mock, props_with_aurora_connection_tracker_plugin):
manager: PluginManager = PluginManager(
plugin_service_manager_container_mock, props_with_aurora_connection_tracker_plugin)
return manager
@pytest.fixture
def plugin_manager_with_execute_time_and_aurora_connection_tracker_plugin(
plugin_service_manager_container_mock, props_with_execute_time_and_aurora_connection_tracker_plugin):
manager: PluginManager = PluginManager(
plugin_service_manager_container_mock, props_with_execute_time_and_aurora_connection_tracker_plugin)
return manager
@pytest.fixture
def plugin_manager_with_read_write_splitting_plugin(
plugin_service_manager_container_mock, props_with_read_write_splitting_plugin):
manager: PluginManager = PluginManager(
plugin_service_manager_container_mock, props_with_read_write_splitting_plugin)
return manager
@pytest.fixture
def plugin_manager_with_aurora_connection_tracker_and_read_write_splitting_plugin(
plugin_service_manager_container_mock, props_with_aurora_connection_tracker_and_read_write_splitting_plugin):
manager: PluginManager = PluginManager(
plugin_service_manager_container_mock, props_with_aurora_connection_tracker_and_read_write_splitting_plugin)
return manager
def init_and_release(mocker, plugin_service_mock, plugin_manager):
wrapper = AwsWrapperConnection(mocker.MagicMock(), plugin_service_mock, plugin_service_mock, plugin_manager)
wrapper.release_resources()
return wrapper
def test_init_and_release_with_execution_time_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin):
result = benchmark(init_and_release, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin)
assert result is not None
def test_init_and_release_with_aurora_connection_tracker_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_aurora_connection_tracker_plugin):
result = benchmark(init_and_release, mocker, plugin_service_mock, plugin_manager_with_aurora_connection_tracker_plugin)
assert result is not None
def test_init_and_release_with_execute_time_and_aurora_connection_tracker_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_execute_time_and_aurora_connection_tracker_plugin):
result = benchmark(
init_and_release, mocker, plugin_service_mock, plugin_manager_with_execute_time_and_aurora_connection_tracker_plugin)
assert result is not None
def test_init_and_release_with_read_write_splitting_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_read_write_splitting_plugin):
result = benchmark(init_and_release, mocker, plugin_service_mock, plugin_manager_with_read_write_splitting_plugin)
assert result is not None
def test_init_and_release_with_aurora_connection_tracker_and_read_write_splitting_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_aurora_connection_tracker_and_read_write_splitting_plugin):
result = benchmark(
init_and_release,
mocker,
plugin_service_mock,
plugin_manager_with_aurora_connection_tracker_and_read_write_splitting_plugin)
assert result is not None
def init_and_release_internal_connection_pools(mocker, plugin_service_mock, plugin_manager):
provider = SqlAlchemyPooledConnectionProvider()
ConnectionProviderManager.set_connection_provider(provider)
wrapper = AwsWrapperConnection(mocker.MagicMock(), plugin_service_mock, plugin_service_mock, plugin_manager)
wrapper.release_resources()
ConnectionProviderManager.release_resources()
ConnectionProviderManager.reset_provider()
return wrapper
def test_init_and_release_with_read_write_splitting_plugin_internal_connection_pools(
benchmark, mocker, plugin_service_mock, plugin_manager_with_read_write_splitting_plugin):
result = benchmark(
init_and_release_internal_connection_pools,
mocker,
plugin_service_mock,
plugin_manager_with_read_write_splitting_plugin)
assert result is not None
def test_init_and_release_with_aurora_connection_tracker_and_read_write_splitting_plugin_internal_connection_pools(
benchmark, mocker, plugin_service_mock, plugin_manager_with_aurora_connection_tracker_and_read_write_splitting_plugin):
result = benchmark(
init_and_release_internal_connection_pools,
mocker,
plugin_service_mock,
plugin_manager_with_aurora_connection_tracker_and_read_write_splitting_plugin)
assert result is not None
def create_cursor_baseline(mocker, plugin_service, plugin_manager):
wrapper = AwsWrapperConnection(mocker.MagicMock(), plugin_service, plugin_service, plugin_manager)
cursor = wrapper.cursor()
return cursor
def test_create_cursor_baseline(benchmark, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin):
result = benchmark(create_cursor_baseline, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin)
assert result is not None
def execute_query(mocker, plugin_service, plugin_manager):
wrapper = AwsWrapperConnection(mocker.MagicMock(), plugin_service, plugin_service, plugin_manager)
cursor = wrapper.cursor()
results = cursor.execute("some sql")
return results
def test_execute_query_with_execute_time_plugin(
benchmark, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin):
result = benchmark(execute_query, mocker, plugin_service_mock, plugin_manager_with_execute_time_plugin)
assert result is not None