@@ -54,3 +54,155 @@ async def test_set_user_agent_for_session(session: AioSession):
5454 assert session .user_agent_name == "aiobotocore"
5555 assert session .user_agent_version == __version__
5656 assert session .user_agent_extra .startswith ("botocore/" )
57+
58+
59+ @pytest .mark .parametrize (
60+ "service_name, api_version" ,
61+ [
62+ ("s3" , None ),
63+ ("s3" , "2006-03-01" ),
64+ ("ec2" , "2016-11-16" ),
65+ ],
66+ )
67+ def test_warm_up_loader_caches (
68+ session : AioSession , service_name , api_version , mocker
69+ ):
70+ loader = mocker .Mock ()
71+ get_component = mocker .patch .object (
72+ session , "get_component" , return_value = loader
73+ )
74+
75+ session .warm_up_loader_caches (service_name , api_version )
76+
77+ get_component .assert_called_once_with ("data_loader" )
78+ assert loader .mock_calls == [
79+ mocker .call .load_data_with_path ("endpoints" ),
80+ mocker .call .load_data ("sdk-default-configuration" ),
81+ mocker .call .load_service_model (service_name , "waiters-2" , api_version ),
82+ mocker .call .load_service_model (
83+ service_name , "paginators-1" , api_version
84+ ),
85+ mocker .call .load_service_model (
86+ service_name , type_name = "service-2" , api_version = api_version
87+ ),
88+ mocker .call .list_available_services (type_name = "service-2" ),
89+ mocker .call .load_data ("partitions" ),
90+ mocker .call .load_service_model (
91+ service_name , "service-2" , api_version = api_version
92+ ),
93+ mocker .call .load_service_model (
94+ service_name , "endpoint-rule-set-1" , api_version = api_version
95+ ),
96+ mocker .call .load_data ("_retry" ),
97+ mocker .call .load_service_model (
98+ service_name , "examples-1" , api_version
99+ ),
100+ ]
101+
102+
103+ @pytest .mark .parametrize (
104+ "warm_up_loader_caches" ,
105+ [False , True ],
106+ )
107+ async def test_warm_up_loader_caches_config (
108+ session : AioSession ,
109+ warm_up_loader_caches : bool ,
110+ mocker ,
111+ ):
112+ config = AioConfig (warm_up_loader_caches = warm_up_loader_caches )
113+ mocker .patch .object (
114+ session , "warm_up_loader_caches" , wraps = session .warm_up_loader_caches
115+ )
116+
117+ async with session .create_client (
118+ "s3" ,
119+ config = config ,
120+ aws_secret_access_key = "xxx" ,
121+ aws_access_key_id = "xxx" ,
122+ ):
123+ pass
124+
125+ if warm_up_loader_caches :
126+ session .warm_up_loader_caches .assert_called_once_with ("s3" , None )
127+ else :
128+ session .warm_up_loader_caches .assert_not_called ()
129+
130+
131+ @pytest .mark .parametrize (
132+ "warm_up_loader_caches" ,
133+ [False , True ],
134+ )
135+ async def test_non_blocking_create_client (
136+ session : AioSession ,
137+ warm_up_loader_caches : bool ,
138+ mocker ,
139+ ):
140+ config = AioConfig (warm_up_loader_caches = warm_up_loader_caches )
141+ loader = session .get_component ("data_loader" )
142+ file_loader = mocker .patch .object (
143+ loader , "file_loader" , wraps = loader .file_loader
144+ )
145+ # perform implicit warm-up, while avoiding any other file I/O by stubbing relevant codepathes
146+ session ._internal_components .lazy_register_component (
147+ 'endpoint_resolver' , lambda : None
148+ )
149+ mocker .patch .object (
150+ session , "_resolve_defaults_mode" , return_value = "legacy"
151+ )
152+ client_creator_cls_mock = mocker .patch (
153+ "aiobotocore.session.AioClientCreator" , autospec = True
154+ )
155+
156+ async with session .create_client (
157+ "s3" ,
158+ config = config ,
159+ aws_secret_access_key = "xxx" ,
160+ aws_access_key_id = "xxx" ,
161+ ):
162+ pass
163+
164+ if warm_up_loader_caches :
165+ # warm-up triggered file I/O (non-blocking)
166+ file_loader .exists .assert_called ()
167+ file_loader .load_file .assert_called ()
168+ else :
169+ # no file I/O
170+ file_loader .exists .assert_not_called ()
171+ file_loader .load_file .assert_not_called ()
172+
173+ mocker .stop (client_creator_cls_mock )
174+ session ._register_endpoint_resolver ()
175+ file_loader .reset_mock ()
176+
177+ # regular client creation #1
178+ async with session .create_client (
179+ "s3" ,
180+ config = config ,
181+ aws_secret_access_key = "xxx" ,
182+ aws_access_key_id = "xxx" ,
183+ ):
184+ pass
185+
186+ if warm_up_loader_caches :
187+ # no file I/O
188+ file_loader .exists .assert_not_called ()
189+ file_loader .load_file .assert_not_called ()
190+ else :
191+ # file I/O (blocking)
192+ file_loader .exists .assert_called ()
193+ file_loader .load_file .assert_called ()
194+
195+ file_loader .reset_mock ()
196+
197+ # regular client creation #2
198+ async with session .create_client (
199+ "s3" ,
200+ config = config ,
201+ aws_secret_access_key = "xxx" ,
202+ aws_access_key_id = "xxx" ,
203+ ):
204+ pass
205+
206+ # no file I/O
207+ file_loader .exists .assert_not_called ()
208+ file_loader .load_file .assert_not_called ()
0 commit comments