From 2b9b623d2c099373846f812dca3a2b98f8598fe9 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 09:46:36 -0700 Subject: [PATCH 01/12] Aiohttp read timeout --- sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py b/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py index f6ee555cea1c..789a80334dfa 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py @@ -31,7 +31,7 @@ import aiohttp from azure.core.configuration import ConnectionConfiguration -from azure.core.exceptions import ServiceRequestError +from azure.core.exceptions import ServiceRequestError, ServiceResponseError from azure.core.pipeline import Pipeline from requests.exceptions import ( @@ -181,7 +181,8 @@ async def send(self, request: HttpRequest, **config: Any) -> Optional[AsyncHttpR await response.load_body() except aiohttp.client_exceptions.ClientConnectorError as err: error = ServiceRequestError(err, error=err) - + except asyncio.TimeoutError as err: + error = ServiceResponseError(err, error=err) if error: raise error return response From 106394773ccb84e4fbeb443ff63c30db6ea00ebf Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 09:47:01 -0700 Subject: [PATCH 02/12] Aiohttp response status code --- sdk/core/azure-core/azure/core/exceptions.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core/azure/core/exceptions.py b/sdk/core/azure-core/azure/core/exceptions.py index ae6ff7c53eb8..2f68943f7146 100644 --- a/sdk/core/azure-core/azure/core/exceptions.py +++ b/sdk/core/azure-core/azure/core/exceptions.py @@ -113,7 +113,10 @@ def __init__(self, message=None, response=None, **kwargs): self.response = response if response: self.reason = response.reason - self.status_code = response.status_code + try: + self.status_code = response.status_code # Requests + except AttributeError: + self.status_code = response.status # Aiohttp message = message or "Operation returned an invalid status '{}'".format(self.reason) try: try: From bfc85593992caf9829a87c09e791d0df4df84891 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 09:47:16 -0700 Subject: [PATCH 03/12] Aiohttp content type header --- .../azure-core/azure/core/pipeline/policies/universal.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py index 79b48bb162ce..d3b9d2aabb88 100644 --- a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py +++ b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py @@ -350,7 +350,10 @@ def deserialize_from_http_generics(cls, response): # Try to use content-type from headers if available content_type = None if response.content_type: # type: ignore - content_type = response.content_type[0].strip().lower() # type: ignore + try: + content_type = response.content_type.strip().lower() # type: ignore + except AttributeError: + content_type = response.content_type[0].strip().lower() # type: ignore # Ouch, this server did not declare what it sent... # Let's guess it's JSON... From d49db749db39436ee3a9d77ed63fcfa0f0f8ab59 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 12:02:58 -0700 Subject: [PATCH 04/12] Review feedback --- sdk/core/azure-core/azure/core/exceptions.py | 14 ++++++++++---- .../azure/core/pipeline/policies/universal.py | 13 +++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/sdk/core/azure-core/azure/core/exceptions.py b/sdk/core/azure-core/azure/core/exceptions.py index 2f68943f7146..9d1a6c89d819 100644 --- a/sdk/core/azure-core/azure/core/exceptions.py +++ b/sdk/core/azure-core/azure/core/exceptions.py @@ -36,6 +36,14 @@ from azure.core.pipeline.transport.base import _HttpResponseBase +def _get_status_code(resonse): + # type: (_HttpResponseBase) -> int + try: + return response.status_code # Requests + except AttributeError: + return response.status # Aiohttp + + def raise_with_traceback(exception, *args, **kwargs): # type: (Callable, Any, Any) -> None """Raise exception with a specified traceback. @@ -113,10 +121,8 @@ def __init__(self, message=None, response=None, **kwargs): self.response = response if response: self.reason = response.reason - try: - self.status_code = response.status_code # Requests - except AttributeError: - self.status_code = response.status # Aiohttp + self.status_code = _get_status_code(response) + message = message or "Operation returned an invalid status '{}'".format(self.reason) try: try: diff --git a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py index d3b9d2aabb88..f07da60e57f2 100644 --- a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py +++ b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py @@ -51,6 +51,14 @@ ContentDecodePolicyType = TypeVar('ContentDecodePolicyType', bound='ContentDecodePolicy') +def _get_content_type(response): + # type: (PipelineResponse) -> str + try: + return response.content_type.strip().lower() + except AttributeError: + return response.content_type[0].strip().lower() + + class HeadersPolicy(SansIOHTTPPolicy): """A simple policy that sends the given headers with the request. @@ -350,10 +358,7 @@ def deserialize_from_http_generics(cls, response): # Try to use content-type from headers if available content_type = None if response.content_type: # type: ignore - try: - content_type = response.content_type.strip().lower() # type: ignore - except AttributeError: - content_type = response.content_type[0].strip().lower() # type: ignore + content_type = _get_content_type(response) # Ouch, this server did not declare what it sent... # Let's guess it's JSON... From c85c2dc867bf16ffba656971788a8b7ba138b5f4 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 12:51:05 -0700 Subject: [PATCH 05/12] Fixed typo --- sdk/core/azure-core/azure/core/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/core/azure-core/azure/core/exceptions.py b/sdk/core/azure-core/azure/core/exceptions.py index 9d1a6c89d819..5ae8cba9173f 100644 --- a/sdk/core/azure-core/azure/core/exceptions.py +++ b/sdk/core/azure-core/azure/core/exceptions.py @@ -36,7 +36,7 @@ from azure.core.pipeline.transport.base import _HttpResponseBase -def _get_status_code(resonse): +def _get_status_code(response): # type: (_HttpResponseBase) -> int try: return response.status_code # Requests From 9fee28c91d434e9c9480f0504d243912ceb7c021 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 13:20:05 -0700 Subject: [PATCH 06/12] Fixed async transport sleep coroutine --- .../core/pipeline/transport/requests_asyncio.py | 3 +++ .../azure/core/pipeline/transport/requests_trio.py | 2 +- .../tests/azure_core_asynctests/test_pipeline.py | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py index 1f302034a173..9e48f959c15d 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py @@ -78,6 +78,9 @@ async def __aenter__(self): async def __aexit__(self, *exc_details): # pylint: disable=arguments-differ return super(AsyncioRequestsTransport, self).__exit__() + async def sleep(self, duration): + await asyncio.sleep(duration) + async def send(self, request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: # type: ignore """Send the request using this HTTP sender. diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py index c3a1c591587b..c1a4cfff2c31 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py @@ -143,7 +143,7 @@ async def __aexit__(self, *exc_details): # pylint: disable=arguments-differ return super(TrioRequestsTransport, self).__exit__() async def sleep(self, duration): - await trio.sleep(duration) + return super(TrioRequestsTransport, self).sleep(duration) async def send(self, request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: # type: ignore """Send the request using this HTTP sender. diff --git a/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py b/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py index d344a9f90fff..b7ed5084695c 100644 --- a/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py +++ b/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py @@ -119,6 +119,18 @@ async def test_basic_async_requests(): assert response.http_response.status_code == 200 +@pytest.mark.asyncio +async def test_async_transport_sleep(): + + async with AsyncioRequestsTransport() as transport: + await transport.sleep(1) + + async with AioHttpTransport() as transport: + await transport.sleep(1) + + async with TrioRequestsTransport() as transport: + await transport.sleep(1) + @pytest.mark.asyncio async def test_conf_async_requests(): From e8c075a1fc9845137555643c4cf0eeadd387034a Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 16:25:39 -0700 Subject: [PATCH 07/12] Fix for stream generators --- .../azure/core/pipeline/transport/aiohttp.py | 21 ++++++++----------- .../pipeline/transport/requests_asyncio.py | 17 +++++++-------- .../core/pipeline/transport/requests_basic.py | 20 +++++++----------- .../core/pipeline/transport/requests_trio.py | 17 +++++++-------- 4 files changed, 31 insertions(+), 44 deletions(-) diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py b/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py index 789a80334dfa..9fb2eb125a5c 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/aiohttp.py @@ -192,19 +192,16 @@ class AioHttpStreamDownloadGenerator(AsyncIterator): """Streams the response body data. :param pipeline: The pipeline object - :param request: The request object :param response: The client response object. - :type response: aiohttp.ClientResponse :param block_size: block size of data sent over connection. :type block_size: int """ - def __init__(self, pipeline: Pipeline, request: HttpRequest, - response: aiohttp.ClientResponse, block_size: int) -> None: + def __init__(self, pipeline: Pipeline, response: AsyncHttpResponse) -> None: self.pipeline = pipeline - self.request = request + self.request = response.request self.response = response - self.block_size = block_size - self.content_length = int(response.headers.get('Content-Length', 0)) + self.block_size = response.block_size + self.content_length = int(response.internal_response.headers.get('Content-Length', 0)) self.downloaded = 0 def __len__(self): @@ -216,13 +213,13 @@ async def __anext__(self): retry_interval = 1000 while retry_active: try: - chunk = await self.response.content.read(self.block_size) + chunk = await self.response.internal_response.content.read(self.block_size) if not chunk: raise _ResponseStopIteration() self.downloaded += self.block_size return chunk except _ResponseStopIteration: - self.response.close() + self.response.internal_response.close() raise StopAsyncIteration() except (ChunkedEncodingError, ConnectionError): retry_total -= 1 @@ -234,7 +231,7 @@ async def __anext__(self): resp = self.pipeline.run(self.request, stream=True, headers=headers) if resp.status_code == 416: raise - chunk = await self.response.content.read(self.block_size) + chunk = await self.response.internal_response.content.read(self.block_size) if not chunk: raise StopIteration() self.downloaded += chunk @@ -244,7 +241,7 @@ async def __anext__(self): raise except Exception as err: _LOGGER.warning("Unable to stream download: %s", err) - self.response.close() + self.response.internal_response.close() raise class AioHttpTransportResponse(AsyncHttpResponse): @@ -283,4 +280,4 @@ def stream_download(self, pipeline) -> AsyncIteratorType[bytes]: :param pipeline: The pipeline object :type pipeline: azure.core.pipeline """ - return AioHttpStreamDownloadGenerator(pipeline, self.request, self.internal_response, self.block_size) + return AioHttpStreamDownloadGenerator(pipeline, self) diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py index 9e48f959c15d..6093713c2928 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_asyncio.py @@ -138,18 +138,16 @@ class AsyncioStreamDownloadGenerator(AsyncIterator): """Streams the response body data. :param pipeline: The pipeline object - :param request: The request object :param response: The response object. - :param int block_size: block size of data sent over connection. :param generator iter_content_func: Iterator for response data. :param int content_length: size of body in bytes. """ - def __init__(self, pipeline: Pipeline, request: HttpRequest, response: requests.Response, block_size: int) -> None: + def __init__(self, pipeline: Pipeline, response: AsyncHttpResponse) -> None: self.pipeline = pipeline - self.request = request + self.request = response.request self.response = response - self.block_size = block_size - self.iter_content_func = self.response.iter_content(self.block_size) + self.block_size = response.block_size + self.iter_content_func = self.response.internal_response.iter_content(self.block_size) self.content_length = int(response.headers.get('Content-Length', 0)) self.downloaded = 0 @@ -173,7 +171,7 @@ async def __anext__(self): self.downloaded += self.block_size return chunk except _ResponseStopIteration: - self.response.close() + self.response.internal_response.close() raise StopAsyncIteration() except (requests.exceptions.ChunkedEncodingError, requests.exceptions.ConnectionError): @@ -200,7 +198,7 @@ async def __anext__(self): raise except Exception as err: _LOGGER.warning("Unable to stream download: %s", err) - self.response.close() + self.response.internal_response.close() raise @@ -209,5 +207,4 @@ class AsyncioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportRespo """ def stream_download(self, pipeline) -> AsyncIteratorType[bytes]: # type: ignore """Generator for streaming request body data.""" - return AsyncioStreamDownloadGenerator(pipeline, self.request, - self.internal_response, self.block_size) # type: ignore + return AsyncioStreamDownloadGenerator(pipeline, self) # type: ignore diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py index 8907937c9a5a..95757edb63dd 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py @@ -65,9 +65,7 @@ def __init__(self, request, requests_response, block_size=None): self.status_code = requests_response.status_code self.headers = requests_response.headers self.reason = requests_response.reason - content_type = requests_response.headers.get('content-type') - if content_type: - self.content_type = content_type.split(";") + self.content_type = requests_response.headers.get('content-type') def body(self): return self.internal_response.content @@ -82,18 +80,16 @@ class StreamDownloadGenerator(object): """Generator for streaming response data. :param pipeline: The pipeline object - :param request: The request object :param response: The response object. - :param int block_size: Number of bytes to read into memory. :param generator iter_content_func: Iterator for response data. :param int content_length: size of body in bytes. """ - def __init__(self, pipeline, request, response, block_size): + def __init__(self, pipeline, response): self.pipeline = pipeline - self.request = request + self.request = response.request self.response = response - self.block_size = block_size - self.iter_content_func = self.response.iter_content(self.block_size) + self.block_size = response.block_size + self.iter_content_func = self.response.internal_response.iter_content(self.block_size) self.content_length = int(response.headers.get('Content-Length', 0)) self.downloaded = 0 @@ -115,7 +111,7 @@ def __next__(self): self.downloaded += self.block_size return chunk except StopIteration: - self.response.close() + self.response.internal_response.close() raise StopIteration() except (requests.exceptions.ChunkedEncodingError, requests.exceptions.ConnectionError): @@ -138,7 +134,7 @@ def __next__(self): raise except Exception as err: _LOGGER.warning("Unable to stream download: %s", err) - self.response.close() + self.response.internal_response.close() raise next = __next__ # Python 2 compatibility. @@ -149,7 +145,7 @@ class RequestsTransportResponse(HttpResponse, _RequestsTransportResponseBase): def stream_download(self, pipeline): # type: (PipelineType) -> Iterator[bytes] """Generator for streaming request body data.""" - return StreamDownloadGenerator(pipeline, self.request, self.internal_response, self.block_size) + return StreamDownloadGenerator(pipeline, self) class RequestsTransport(HttpTransport): diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py index c1a4cfff2c31..dd58bf2c39f8 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py @@ -53,18 +53,16 @@ class TrioStreamDownloadGenerator(AsyncIterator): """Generator for streaming response data. :param pipeline: The pipeline object - :param request: The request object :param response: The response object. - :param int block_size: Number of bytes to read into memory. :param generator iter_content_func: Iterator for response data. :param int content_length: size of body in bytes. """ - def __init__(self, pipeline: Pipeline, request: HttpRequest, response: requests.Response, block_size: int) -> None: + def __init__(self, pipeline: Pipeline, response: AsyncHttpResponse) -> None: self.pipeline = pipeline - self.request = request + self.request = response.request self.response = response - self.block_size = block_size - self.iter_content_func = self.response.iter_content(self.block_size) + self.block_size = response.block_size + self.iter_content_func = self.response.internal_response.iter_content(self.block_size) self.content_length = int(response.headers.get('Content-Length', 0)) self.downloaded = 0 @@ -85,7 +83,7 @@ async def __anext__(self): self.downloaded += self.block_size return chunk except _ResponseStopIteration: - self.response.close() + self.response.internal_response.close() raise StopAsyncIteration() except (requests.exceptions.ChunkedEncodingError, requests.exceptions.ConnectionError): @@ -111,7 +109,7 @@ async def __anext__(self): raise except Exception as err: _LOGGER.warning("Unable to stream download: %s", err) - self.response.close() + self.response.internal_response.close() raise class TrioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): # type: ignore @@ -120,8 +118,7 @@ class TrioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse def stream_download(self, pipeline) -> AsyncIteratorType[bytes]: # type: ignore """Generator for streaming response data. """ - return TrioStreamDownloadGenerator(pipeline, self.request, - self.internal_response, self.block_size) # type: ignore + return TrioStreamDownloadGenerator(pipeline, self) # type: ignore class TrioRequestsTransport(RequestsTransport, AsyncHttpTransport): # type: ignore From bef73960967fd79f1cc97fd2d59ecd8a64eb2fbf Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 16:26:00 -0700 Subject: [PATCH 08/12] Reverted attribute error handling --- sdk/core/azure-core/azure/core/exceptions.py | 10 +--------- .../azure/core/pipeline/policies/universal.py | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/sdk/core/azure-core/azure/core/exceptions.py b/sdk/core/azure-core/azure/core/exceptions.py index 5ae8cba9173f..b69912108a40 100644 --- a/sdk/core/azure-core/azure/core/exceptions.py +++ b/sdk/core/azure-core/azure/core/exceptions.py @@ -36,14 +36,6 @@ from azure.core.pipeline.transport.base import _HttpResponseBase -def _get_status_code(response): - # type: (_HttpResponseBase) -> int - try: - return response.status_code # Requests - except AttributeError: - return response.status # Aiohttp - - def raise_with_traceback(exception, *args, **kwargs): # type: (Callable, Any, Any) -> None """Raise exception with a specified traceback. @@ -121,7 +113,7 @@ def __init__(self, message=None, response=None, **kwargs): self.response = response if response: self.reason = response.reason - self.status_code = _get_status_code(response) + self.status_code = response.status_code message = message or "Operation returned an invalid status '{}'".format(self.reason) try: diff --git a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py index f07da60e57f2..b9338950ff38 100644 --- a/sdk/core/azure-core/azure/core/pipeline/policies/universal.py +++ b/sdk/core/azure-core/azure/core/pipeline/policies/universal.py @@ -51,14 +51,6 @@ ContentDecodePolicyType = TypeVar('ContentDecodePolicyType', bound='ContentDecodePolicy') -def _get_content_type(response): - # type: (PipelineResponse) -> str - try: - return response.content_type.strip().lower() - except AttributeError: - return response.content_type[0].strip().lower() - - class HeadersPolicy(SansIOHTTPPolicy): """A simple policy that sends the given headers with the request. @@ -358,7 +350,7 @@ def deserialize_from_http_generics(cls, response): # Try to use content-type from headers if available content_type = None if response.content_type: # type: ignore - content_type = _get_content_type(response) + content_type = response.content_type.split(";")[0].strip().lower() # type: ignore # Ouch, this server did not declare what it sent... # Let's guess it's JSON... From e37b6e0ec5e72c94c4231021d9cce146239ae5ca Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 16:33:51 -0700 Subject: [PATCH 09/12] Fixed trio sleep test --- .../azure/core/pipeline/transport/requests_trio.py | 2 +- .../tests/azure_core_asynctests/test_pipeline.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py index dd58bf2c39f8..f27f034033ea 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_trio.py @@ -140,7 +140,7 @@ async def __aexit__(self, *exc_details): # pylint: disable=arguments-differ return super(TrioRequestsTransport, self).__exit__() async def sleep(self, duration): - return super(TrioRequestsTransport, self).sleep(duration) + await trio.sleep(duration) async def send(self, request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: # type: ignore """Send the request using this HTTP sender. diff --git a/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py b/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py index b7ed5084695c..bcefb9b4bb1a 100644 --- a/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py +++ b/sdk/core/azure-core/tests/azure_core_asynctests/test_pipeline.py @@ -128,8 +128,13 @@ async def test_async_transport_sleep(): async with AioHttpTransport() as transport: await transport.sleep(1) - async with TrioRequestsTransport() as transport: - await transport.sleep(1) +def test_async_trio_transport_sleep(): + + async def do(): + async with TrioRequestsTransport() as transport: + await transport.sleep(1) + + response = trio.run(do) @pytest.mark.asyncio async def test_conf_async_requests(): From 969821c81139dfa85f1c54128fb6551041183299 Mon Sep 17 00:00:00 2001 From: antisch Date: Thu, 25 Jul 2019 17:17:21 -0700 Subject: [PATCH 10/12] Fixed identity test mocks --- sdk/identity/azure-identity/tests/test_authn_client.py | 8 ++++---- sdk/identity/azure-identity/tests/test_identity.py | 4 ++-- sdk/identity/azure-identity/tests/test_identity_async.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sdk/identity/azure-identity/tests/test_authn_client.py b/sdk/identity/azure-identity/tests/test_authn_client.py index 39889f003627..1aca947b3d89 100644 --- a/sdk/identity/azure-identity/tests/test_authn_client.py +++ b/sdk/identity/azure-identity/tests/test_authn_client.py @@ -28,7 +28,7 @@ def test_authn_client_deserialization(): scope = "scope" mock_response = Mock( - headers={"content-type": "application/json"}, status_code=200, content_type=["application/json"] + headers={"content-type": "application/json"}, status_code=200, content_type="application/json" ) mock_send = Mock(return_value=mock_response) @@ -87,7 +87,7 @@ def test_caching_when_only_expires_in_set(): text=lambda: json.dumps({"access_token": access_token, "expires_in": expires_in, "token_type": "Bearer"}), headers={"content-type": "application/json"}, status_code=200, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) @@ -106,7 +106,7 @@ def test_expires_in_strings(): expected_token = "token" mock_response = Mock( - headers={"content-type": "application/json"}, status_code=200, content_type=["application/json"] + headers={"content-type": "application/json"}, status_code=200, content_type="application/json" ) mock_send = Mock(return_value=mock_response) @@ -133,7 +133,7 @@ def test_cache_expiry(): text=lambda: json.dumps(token_payload), headers={"content-type": "application/json"}, status_code=200, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) diff --git a/sdk/identity/azure-identity/tests/test_identity.py b/sdk/identity/azure-identity/tests/test_identity.py index c9756ad3b344..b017792595a8 100644 --- a/sdk/identity/azure-identity/tests/test_identity.py +++ b/sdk/identity/azure-identity/tests/test_identity.py @@ -191,7 +191,7 @@ def test_imds_credential_cache(): text=lambda: json.dumps(token_payload), headers={"content-type": "application/json"}, status_code=200, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) @@ -219,7 +219,7 @@ def test_imds_credential_retries(): mock_response = Mock( text=lambda: b"{}", headers={"content-type": "application/json", "Retry-After": "0"}, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) diff --git a/sdk/identity/azure-identity/tests/test_identity_async.py b/sdk/identity/azure-identity/tests/test_identity_async.py index ba203cd2eb59..03b53db9eccd 100644 --- a/sdk/identity/azure-identity/tests/test_identity_async.py +++ b/sdk/identity/azure-identity/tests/test_identity_async.py @@ -196,7 +196,7 @@ async def test_imds_credential_cache(): text=lambda: json.dumps(token_payload), headers={"content-type": "application/json"}, status_code=200, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) @@ -225,7 +225,7 @@ async def test_imds_credential_retries(): mock_response = Mock( text=lambda: b"{}", headers={"content-type": "application/json", "Retry-After": "0"}, - content_type=["application/json"], + content_type="application/json", ) mock_send = Mock(return_value=mock_response) From f1c8a577532ea2f5b1a9c7db5d0e1832f1872af5 Mon Sep 17 00:00:00 2001 From: Laurent Mazuel Date: Fri, 26 Jul 2019 09:23:37 -0700 Subject: [PATCH 11/12] Fix identity mock to return content-type as string --- sdk/identity/azure-identity/tests/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/identity/azure-identity/tests/helpers.py b/sdk/identity/azure-identity/tests/helpers.py index 8acb3d5f646b..694a92df922a 100644 --- a/sdk/identity/azure-identity/tests/helpers.py +++ b/sdk/identity/azure-identity/tests/helpers.py @@ -41,7 +41,7 @@ def mock_response(status_code=200, headers={}, json_payload=None): if json_payload is not None: response.text = lambda: json.dumps(json_payload) response.headers["content-type"] = "application/json" - response.content_type = ["application/json"] + response.content_type = "application/json" return response From 6d6810304be9abba54b4c5af8c78e8be92a6c9a9 Mon Sep 17 00:00:00 2001 From: Laurent Mazuel Date: Fri, 26 Jul 2019 10:26:08 -0700 Subject: [PATCH 12/12] Fix universal policy tests --- sdk/core/azure-core/tests/test_universal_pipeline.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk/core/azure-core/tests/test_universal_pipeline.py b/sdk/core/azure-core/tests/test_universal_pipeline.py index 0049e2277374..cc783b0d4c74 100644 --- a/sdk/core/azure-core/tests/test_universal_pipeline.py +++ b/sdk/core/azure-core/tests/test_universal_pipeline.py @@ -123,9 +123,7 @@ class MockResponse(HttpResponse): def __init__(self, body, content_type): super(MockResponse, self).__init__(None, None) self._body = body - self.content_type = None - if content_type: - self.content_type = [content_type] + self.content_type = content_type def body(self): return self._body