|
1 | 1 | import logging |
| 2 | +from unittest import mock |
2 | 3 |
|
3 | 4 | import pytest |
4 | 5 | from _pytest.logging import LogCaptureFixture |
@@ -54,3 +55,104 @@ async def test_set_user_agent_for_session(session: AioSession): |
54 | 55 | assert session.user_agent_name == "aiobotocore" |
55 | 56 | assert session.user_agent_version == __version__ |
56 | 57 | assert session.user_agent_extra.startswith("botocore/") |
| 58 | + |
| 59 | + |
| 60 | +@pytest.mark.parametrize( |
| 61 | + "service_name, api_version", |
| 62 | + [ |
| 63 | + ("s3", None), |
| 64 | + ("s3", "2006-03-01"), |
| 65 | + ("ec2", "2016-11-16"), |
| 66 | + ], |
| 67 | +) |
| 68 | +def test_warm_up_loader_caches(session: AioSession, service_name, api_version): |
| 69 | + loader = mock.Mock() |
| 70 | + with mock.patch.object( |
| 71 | + session, "get_component", return_value=loader |
| 72 | + ) as get_component: |
| 73 | + session.warm_up_loader_caches(service_name, api_version) |
| 74 | + |
| 75 | + get_component.assert_called_once_with("data_loader") |
| 76 | + loader.mock_calls == [ |
| 77 | + mock.call.load_data_with_path("endpoints"), |
| 78 | + mock.call.load_data("sdk-default-configuration"), |
| 79 | + mock.call.load_service_model(service_name, "waiters-2", api_version), |
| 80 | + mock.call.load_service_model( |
| 81 | + service_name, "paginators-1", api_version |
| 82 | + ), |
| 83 | + mock.call.load_service_model( |
| 84 | + service_name, type_name="service-2", api_version=api_version |
| 85 | + ), |
| 86 | + mock.call.list_available_services(type_name="service-2"), |
| 87 | + mock.call.load_data("partitions"), |
| 88 | + mock.call.load_service_model( |
| 89 | + service_name, "service-2", api_version=api_version |
| 90 | + ), |
| 91 | + mock.call.load_service_model( |
| 92 | + service_name, "endpoint-rule-set-1", api_version=api_version |
| 93 | + ), |
| 94 | + mock.call.load_data("_retry"), |
| 95 | + mock.call.load_service_model(service_name, "examples-1", api_version), |
| 96 | + ] |
| 97 | + |
| 98 | + |
| 99 | +async def test_blocking_create_client(session: AioSession): |
| 100 | + config = AioConfig(warm_up_loader_caches=False) |
| 101 | + |
| 102 | + loader = session.get_component("data_loader") |
| 103 | + with mock.patch.object( |
| 104 | + loader, "file_loader", wraps=loader.file_loader |
| 105 | + ) as file_loader: |
| 106 | + async with session.create_client( |
| 107 | + "s3", |
| 108 | + config=config, |
| 109 | + aws_secret_access_key="xxx", |
| 110 | + aws_access_key_id="xxx", |
| 111 | + ): |
| 112 | + pass |
| 113 | + |
| 114 | + # file_loader performed blocking file I/O during first create_session() call |
| 115 | + assert file_loader.exists.called |
| 116 | + assert file_loader.load_file.called |
| 117 | + |
| 118 | + file_loader.reset_mock() |
| 119 | + |
| 120 | + async with session.create_client( |
| 121 | + "s3", |
| 122 | + config=config, |
| 123 | + aws_secret_access_key="xxx", |
| 124 | + aws_access_key_id="xxx", |
| 125 | + ): |
| 126 | + pass |
| 127 | + |
| 128 | + # file_loader performed no file I/O during second create_session() call |
| 129 | + assert not file_loader.exists.called |
| 130 | + assert not file_loader.load_file.called |
| 131 | + |
| 132 | + |
| 133 | +async def test_non_blocking_create_client(session: AioSession): |
| 134 | + config = AioConfig(warm_up_loader_caches=True) |
| 135 | + |
| 136 | + loader = session.get_component("data_loader") |
| 137 | + with mock.patch.object( |
| 138 | + loader, "file_loader", wraps=loader.file_loader |
| 139 | + ) as file_loader: |
| 140 | + session.warm_up_loader_caches("s3") |
| 141 | + |
| 142 | + # file_loader performed blocking file I/O during warm_up_loader_caches() call |
| 143 | + assert file_loader.exists.called |
| 144 | + assert file_loader.load_file.called |
| 145 | + |
| 146 | + file_loader.reset_mock() |
| 147 | + |
| 148 | + async with session.create_client( |
| 149 | + "s3", |
| 150 | + config=config, |
| 151 | + aws_secret_access_key="xxx", |
| 152 | + aws_access_key_id="xxx", |
| 153 | + ): |
| 154 | + pass |
| 155 | + |
| 156 | + # file_loader performed no file I/O during (first) create_session() call |
| 157 | + assert not file_loader.exists.called |
| 158 | + assert not file_loader.load_file.called |
0 commit comments