From a0f239cc72bfd226ee3b4a6382f390c8d98446a2 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Sun, 18 Oct 2020 22:33:55 -0700 Subject: [PATCH 01/10] Adjust AutoLockRenewer to only allow registration of intended types (ReceivedMessage and ServiceBusSession) with the intent that if it was desired to allow an interfaced based approach it'd be easier to open that up later, and provide guardrails for now. --- .../azure/servicebus/_common/auto_lock_renewer.py | 4 +++- .../servicebus/aio/_async_auto_lock_renewer.py | 2 ++ .../tests/async_tests/mocks_async.py | 13 +++++++++++-- .../tests/async_tests/test_queues_async.py | 4 ++++ sdk/servicebus/azure-servicebus/tests/mocks.py | 13 +++++++++++-- .../azure-servicebus/tests/test_queues.py | 5 ++++- 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py index f1744342bd685..3a26e9b10ce27 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py @@ -12,12 +12,12 @@ from typing import TYPE_CHECKING from .._servicebus_session import ServiceBusSession +from .message import ReceivedMessage from ..exceptions import AutoLockRenewFailed, AutoLockRenewTimeout, ServiceBusError from .utils import renewable_start_time, utc_now if TYPE_CHECKING: from typing import Callable, Union, Optional, Awaitable - from .message import ReceivedMessage LockRenewFailureCallback = Callable[[Union[ServiceBusSession, ReceivedMessage], Optional[Exception]], None] @@ -133,6 +133,8 @@ def register(self, renewable, timeout=300, on_lock_renew_failure=None): :rtype: None """ + if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.ServiceBusSession (via a session receiver's property receiver.Session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenew has already been shutdown. Please create a new instance for" " auto lock renewing.") diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index c8cba8e946526..92ccf4a41700f 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -130,6 +130,8 @@ def register( Default value is None (no callback). :rtype: None """ + if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession (via a session receiver's property receiver.Session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenew has already been shutdown. Please create a new instance for" " auto lock renewing.") diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py index fd3f70b06c9bc..8069bd2a76759 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py @@ -1,12 +1,13 @@ from datetime import timedelta from azure.servicebus._common.utils import utc_now +from azure.servicebus.aio import ReceivedMessage class MockReceiver: def __init__(self): self._running = True -class MockReceivedMessage: +class MockReceivedMessage(ReceivedMessage): def __init__(self, prevent_renew_lock=False, exception_on_renew_lock=False): self._lock_duration = 2 @@ -29,4 +30,12 @@ async def renew_lock(self): def _lock_expired(self): if self.locked_until_utc and self.locked_until_utc <= utc_now(): return True - return False \ No newline at end of file + return False + + @property + def locked_until_utc(self): + return self._locked_until_utc + + @locked_until_utc.setter + def locked_until_utc(self, value): + self._locked_until_utc = value diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py index 5cc213603beac..0f8aecfe59ba0 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py @@ -1138,6 +1138,10 @@ async def callback_mock(renewable, error): if error: errors.append(error) + auto_lock_renew = AutoLockRenew() + with pytest.raises(TypeError): + auto_lock_renew.register(Exception()) # an arbitrary invalid type. + auto_lock_renew = AutoLockRenew() auto_lock_renew._renew_period = 1 # So we can run the test fast. async with auto_lock_renew: # Check that it is called when the object expires for any reason (silent renew failure) diff --git a/sdk/servicebus/azure-servicebus/tests/mocks.py b/sdk/servicebus/azure-servicebus/tests/mocks.py index 4bfea86dbfb66..7889e8ba08c25 100644 --- a/sdk/servicebus/azure-servicebus/tests/mocks.py +++ b/sdk/servicebus/azure-servicebus/tests/mocks.py @@ -1,12 +1,13 @@ from datetime import timedelta from azure.servicebus._common.utils import utc_now +from azure.servicebus import ReceivedMessage class MockReceiver: def __init__(self): self._running = True -class MockReceivedMessage: +class MockReceivedMessage(ReceivedMessage): def __init__(self, prevent_renew_lock=False, exception_on_renew_lock=False): self._lock_duration = 2 @@ -29,4 +30,12 @@ def renew_lock(self): def _lock_expired(self): if self.locked_until_utc and self.locked_until_utc <= utc_now(): return True - return False \ No newline at end of file + return False + + @property + def locked_until_utc(self): + return self._locked_until_utc + + @locked_until_utc.setter + def locked_until_utc(self, value): + self._locked_until_utc = value diff --git a/sdk/servicebus/azure-servicebus/tests/test_queues.py b/sdk/servicebus/azure-servicebus/tests/test_queues.py index ea03cceb0d005..ac752de4d68eb 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_queues.py +++ b/sdk/servicebus/azure-servicebus/tests/test_queues.py @@ -1408,6 +1408,10 @@ def callback_mock(renewable, error): if error: errors.append(error) + auto_lock_renew = AutoLockRenew() + with pytest.raises(TypeError): + auto_lock_renew.register(Exception()) # an arbitrary invalid type. + auto_lock_renew = AutoLockRenew() auto_lock_renew._renew_period = 1 # So we can run the test fast. with auto_lock_renew: # Check that it is called when the object expires for any reason (silent renew failure) @@ -1546,7 +1550,6 @@ def test_queue_message_properties(self): assert message.scheduled_enqueue_time_utc == new_scheduled_time message.partition_key = None - message.via_partition_key = None message.scheduled_enqueue_time_utc = None assert message.partition_key is None From e96d23183a00cfff2d4d58d42e5f766dab2ff538 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Mon, 19 Oct 2020 16:55:49 -0700 Subject: [PATCH 02/10] via_partition_key removal assumed another branch had been merged prior, reverted until that goes in. --- sdk/servicebus/azure-servicebus/tests/test_queues.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/servicebus/azure-servicebus/tests/test_queues.py b/sdk/servicebus/azure-servicebus/tests/test_queues.py index ac752de4d68eb..8a4531010def2 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_queues.py +++ b/sdk/servicebus/azure-servicebus/tests/test_queues.py @@ -1550,6 +1550,7 @@ def test_queue_message_properties(self): assert message.scheduled_enqueue_time_utc == new_scheduled_time message.partition_key = None + message.via_partition_key = None message.scheduled_enqueue_time_utc = None assert message.partition_key is None From 2cb7985a7df0ed148abeeea85770d1f2678f19ab Mon Sep 17 00:00:00 2001 From: KieranBrantnerMagee Date: Thu, 22 Oct 2020 15:16:46 -0700 Subject: [PATCH 03/10] PR fixes, session capitalization fixes in docstrings. Co-authored-by: Adam Ling (MSFT) --- .../azure/servicebus/_common/auto_lock_renewer.py | 2 +- .../azure/servicebus/aio/_async_auto_lock_renewer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py index 3a26e9b10ce27..d7213ed153d30 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py @@ -134,7 +134,7 @@ def register(self, renewable, timeout=300, on_lock_renew_failure=None): :rtype: None """ if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.ServiceBusSession (via a session receiver's property receiver.Session).") + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.ServiceBusSession (via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenew has already been shutdown. Please create a new instance for" " auto lock renewing.") diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index 92ccf4a41700f..b80ab36e085fb 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -131,7 +131,7 @@ def register( :rtype: None """ if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession (via a session receiver's property receiver.Session).") + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession (via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenew has already been shutdown. Please create a new instance for" " auto lock renewing.") From 6ecd9f898ca1d8d196f163c7def94f1f53d3a647 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Thu, 29 Oct 2020 00:19:48 -0700 Subject: [PATCH 04/10] Fix lint errors (line length) --- .../azure/servicebus/_common/auto_lock_renewer.py | 4 +++- .../azure/servicebus/aio/_async_auto_lock_renewer.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py index 17ece3ef54ee7..eb1d88b542fc7 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py @@ -134,7 +134,9 @@ def register(self, renewable, timeout=300, on_lock_renew_failure=None): :rtype: None """ if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.ServiceBusSession (via a session receiver's property receiver.session).") + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage " + "(via a receiver's receive methods) and azure.servicebus.ServiceBusSession " + "(via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenewer has already been shutdown. Please create a new instance for" " auto lock renewing.") diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index 3fb87cc2a2de8..1957f727af6ea 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -131,7 +131,9 @@ def register( :rtype: None """ if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage (via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession (via a session receiver's property receiver.session).") + raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage " + "(via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession " + "(via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenewer has already been shutdown. Please create a new instance for" " auto lock renewing.") From 8af7492a78605b8db40b43e61b66c7cddb24c5a3 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Thu, 29 Oct 2020 11:17:39 -0700 Subject: [PATCH 05/10] mypy/lint fixes (mostly imports that were missed in the big refactor due to semantic conflicts with this branch's existing work) --- .../azure/servicebus/_common/auto_lock_renewer.py | 11 +++++------ .../azure/servicebus/aio/_async_auto_lock_renewer.py | 9 +++++---- .../azure-servicebus/azure/servicebus/exceptions.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py index 3201525074012..3060b3b9d85df 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py @@ -12,13 +12,12 @@ from typing import TYPE_CHECKING from .._servicebus_session import ServiceBusSession -from .message import ReceivedMessage +from .message import ServiceBusReceivedMessage from ..exceptions import AutoLockRenewFailed, AutoLockRenewTimeout, ServiceBusError from .utils import renewable_start_time, utc_now if TYPE_CHECKING: from typing import Callable, Union, Optional, Awaitable - from .message import ServiceBusReceivedMessage LockRenewFailureCallback = Callable[[Union[ServiceBusSession, ServiceBusReceivedMessage], Optional[Exception]], None] @@ -134,10 +133,10 @@ def register(self, renewable, timeout=300, on_lock_renew_failure=None): :rtype: None """ - if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.ReceivedMessage " - "(via a receiver's receive methods) and azure.servicebus.ServiceBusSession " - "(via a session receiver's property receiver.session).") + if not isinstance(renewable, ServiceBusReceivedMessage) and not isinstance(renewable, ServiceBusSession): + raise TypeError("AutoLockRenewer only supports registration of types " + "azure.servicebus.ServiceBusReceivedMessage (via a receiver's receive methods) and " + "azure.servicebus.ServiceBusSession (via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenewer has already been shutdown. Please create a new instance for" " auto lock renewing.") diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index d1f3788c0147a..54b95554a747f 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -77,7 +77,7 @@ def _renewable(self, renewable: Union[ServiceBusReceivedMessage, ServiceBusSessi return False except AttributeError: # If for whatever reason the renewable isn't hooked up to a receiver raise ServiceBusError("Cannot renew an entity without an associated receiver. " - "ReceivedMessage and active ServiceBusReceiver.Session objects are expected.") + "ServiceBusReceivedMessage and active ServiceBusReceiver.Session objects are expected.") return True async def _auto_lock_renew(self, @@ -130,9 +130,10 @@ def register( Default value is None (no callback). :rtype: None """ - if not isinstance(renewable, ReceivedMessage) and not isinstance(renewable, ServiceBusSession): - raise TypeError("AutoLockRenewer only supports registration of types azure.servicebus.aio.ReceivedMessage " - "(via a receiver's receive methods) and azure.servicebus.aio.ServiceBusSession " + if not isinstance(renewable, ServiceBusReceivedMessage) and not isinstance(renewable, ServiceBusSession): + raise TypeError("AutoLockRenewer only supports registration of types " + "azure.servicebus.aio.ServiceBusReceivedMessage (via a receiver's receive methods) and " + "azure.servicebus.aio.ServiceBusSession " "(via a session receiver's property receiver.session).") if self._shutdown.is_set(): raise ServiceBusError("The AutoLockRenewer has already been shutdown. Please create a new instance for" diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py b/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py index d1bb0ab66e801..ba07eb19ec115 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py @@ -4,7 +4,7 @@ # license information. # ------------------------------------------------------------------------- -from typing import Optional, Any +from typing import Optional from uamqp import errors, constants from azure.core.exceptions import AzureError From 1d940cad8400baf15e4218bfeda86f544aea928c Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Thu, 29 Oct 2020 13:17:07 -0700 Subject: [PATCH 06/10] ServiceBusReceivedMessage rename was missed in mocks --- .../azure-servicebus/tests/async_tests/mocks_async.py | 4 ++-- sdk/servicebus/azure-servicebus/tests/mocks.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py index 8069bd2a76759..52451b26ad193 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py @@ -1,13 +1,13 @@ from datetime import timedelta from azure.servicebus._common.utils import utc_now -from azure.servicebus.aio import ReceivedMessage +from azure.servicebus.aio import ServiceBusReceivedMessage class MockReceiver: def __init__(self): self._running = True -class MockReceivedMessage(ReceivedMessage): +class MockReceivedMessage(ServiceBusReceivedMessage): def __init__(self, prevent_renew_lock=False, exception_on_renew_lock=False): self._lock_duration = 2 diff --git a/sdk/servicebus/azure-servicebus/tests/mocks.py b/sdk/servicebus/azure-servicebus/tests/mocks.py index 7889e8ba08c25..adb506b971d09 100644 --- a/sdk/servicebus/azure-servicebus/tests/mocks.py +++ b/sdk/servicebus/azure-servicebus/tests/mocks.py @@ -1,13 +1,13 @@ from datetime import timedelta from azure.servicebus._common.utils import utc_now -from azure.servicebus import ReceivedMessage +from azure.servicebus import ServiceBusReceivedMessage class MockReceiver: def __init__(self): self._running = True -class MockReceivedMessage(ReceivedMessage): +class MockReceivedMessage(ServiceBusReceivedMessage): def __init__(self, prevent_renew_lock=False, exception_on_renew_lock=False): self._lock_duration = 2 From bf185df769b7242263e054236a251af372b9c2d7 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Tue, 3 Nov 2020 02:37:18 -0800 Subject: [PATCH 07/10] pr comments (clean autolockrenewer isinstance checks) --- .../azure/servicebus/_common/auto_lock_renewer.py | 2 +- .../azure/servicebus/aio/_async_auto_lock_renewer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py index 67a490eb8f9ce..28607c048175a 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/auto_lock_renewer.py @@ -144,7 +144,7 @@ def register(self, receiver, renewable, timeout=300, on_lock_renew_failure=None) :rtype: None """ - if not isinstance(renewable, ServiceBusReceivedMessage) and not isinstance(renewable, ServiceBusSession): + if not isinstance(renewable, (ServiceBusReceivedMessage, ServiceBusSession)): raise TypeError("AutoLockRenewer only supports registration of types " "azure.servicebus.ServiceBusReceivedMessage (via a receiver's receive methods) and " "azure.servicebus.ServiceBusSession (via a session receiver's property receiver.session).") diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index f3fb789886569..90ab73ee824ce 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -144,7 +144,7 @@ def register( Default value is None (no callback). :rtype: None """ - if not isinstance(renewable, ServiceBusReceivedMessage) and not isinstance(renewable, ServiceBusSession): + if not isinstance(renewable, (ServiceBusReceivedMessage, ServiceBusSession)): raise TypeError("AutoLockRenewer only supports registration of types " "azure.servicebus.aio.ServiceBusReceivedMessage (via a receiver's receive methods) and " "azure.servicebus.aio.ServiceBusSession " From c148f5c7a4f2e6c1869c6c5d2c5413c1867e0206 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Tue, 3 Nov 2020 10:13:10 -0800 Subject: [PATCH 08/10] Mock import needed to change after receivedmessage refactor --- .../azure-servicebus/tests/async_tests/mocks_async.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py index ab358a3cefefb..6c4cce4bd991f 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/mocks_async.py @@ -1,7 +1,7 @@ from datetime import timedelta from azure.servicebus._common.utils import utc_now -from azure.servicebus.aio import ServiceBusReceivedMessage +from azure.servicebus import ServiceBusReceivedMessage class MockReceiver: def __init__(self): From efd70ebd12b5292ef9ed6c3d38d1f11e4c6edc5b Mon Sep 17 00:00:00 2001 From: Yunhao Ling Date: Tue, 3 Nov 2020 15:15:25 -0800 Subject: [PATCH 09/10] add preparer for async unittest and small word fix in expcetion message --- .../aio/_async_auto_lock_renewer.py | 2 +- .../tests/async_tests/test_queues_async.py | 45 ++++++++++--------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py index 90ab73ee824ce..087afddbdb5fc 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_async_auto_lock_renewer.py @@ -146,7 +146,7 @@ def register( """ if not isinstance(renewable, (ServiceBusReceivedMessage, ServiceBusSession)): raise TypeError("AutoLockRenewer only supports registration of types " - "azure.servicebus.aio.ServiceBusReceivedMessage (via a receiver's receive methods) and " + "azure.servicebus.ServiceBusReceivedMessage (via a receiver's receive methods) and " "azure.servicebus.aio.ServiceBusSession " "(via a session receiver's property receiver.session).") if self._shutdown.is_set(): diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py index b0f4ea2e3e0e4..f1ef181dadf61 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py @@ -42,10 +42,10 @@ MessageContentTooLarge, OperationTimeoutError ) -from devtools_testutils import AzureMgmtTestCase, CachedResourceGroupPreparer +from devtools_testutils import AzureMgmtTestCase, CachedResourceGroupPreparer, AzureMgmtPreparer from servicebus_preparer import CachedServiceBusNamespacePreparer, CachedServiceBusQueuePreparer, ServiceBusQueuePreparer from utilities import get_logger, print_message, sleep_until_expired -from mocks_async import MockReceivedMessage +from mocks_async import MockReceivedMessage, MockReceiver _logger = get_logger(logging.DEBUG) @@ -1135,7 +1135,7 @@ async def test_queue_message_settle_through_mgmt_link_due_to_broken_receiver_lin assert len(messages) == 1 await receiver.complete_message(messages[0]) - @pytest.mark.asyncio + @AzureMgmtPreparer(None, None) async def test_async_queue_mock_auto_lock_renew_callback(self): results = [] errors = [] @@ -1144,15 +1144,16 @@ async def callback_mock(renewable, error): if error: errors.append(error) + receiver = MockReceiver() auto_lock_renew = AutoLockRenewer() with pytest.raises(TypeError): - auto_lock_renew.register(Exception()) # an arbitrary invalid type. + auto_lock_renew.register(receiver, renewable=Exception()) # an arbitrary invalid type. auto_lock_renew = AutoLockRenewer() - auto_lock_renew._renew_period = 1 # So we can run the test fast. - async with auto_lock_renew: # Check that it is called when the object expires for any reason (silent renew failure) + auto_lock_renew._renew_period = 1 # So we can run the test fast. + async with auto_lock_renew: # Check that it is called when the object expires for any reason (silent renew failure) message = MockReceivedMessage(prevent_renew_lock=True) - auto_lock_renew.register(renewable=message, on_lock_renew_failure=callback_mock) + auto_lock_renew.register(receiver, renewable=message, on_lock_renew_failure=callback_mock) await asyncio.sleep(3) assert len(results) == 1 and results[-1]._lock_expired == True assert not errors @@ -1161,8 +1162,8 @@ async def callback_mock(renewable, error): del errors[:] auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 - async with auto_lock_renew: # Check that in normal operation it does not get called - auto_lock_renew.register(renewable=MockReceivedMessage(), on_lock_renew_failure=callback_mock) + async with auto_lock_renew: # Check that in normal operation it does not get called + auto_lock_renew.register(receiver, renewable=MockReceivedMessage(), on_lock_renew_failure=callback_mock) await asyncio.sleep(3) assert not results assert not errors @@ -1171,9 +1172,9 @@ async def callback_mock(renewable, error): del errors[:] auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 - async with auto_lock_renew: # Check that when a message is settled, it will not get called even after expiry + async with auto_lock_renew: # Check that when a message is settled, it will not get called even after expiry message = MockReceivedMessage(prevent_renew_lock=True) - auto_lock_renew.register(renewable=message, on_lock_renew_failure=callback_mock) + auto_lock_renew.register(receiver, renewable=message, on_lock_renew_failure=callback_mock) message._settled = True await asyncio.sleep(3) assert not results @@ -1185,7 +1186,7 @@ async def callback_mock(renewable, error): auto_lock_renew._renew_period = 1 async with auto_lock_renew: # Check that it is called when there is an overt renew failure message = MockReceivedMessage(exception_on_renew_lock=True) - auto_lock_renew.register(renewable=message, on_lock_renew_failure=callback_mock) + auto_lock_renew.register(receiver, renewable=message, on_lock_renew_failure=callback_mock) await asyncio.sleep(3) assert len(results) == 1 and results[-1]._lock_expired == True assert errors[-1] @@ -1194,9 +1195,9 @@ async def callback_mock(renewable, error): del errors[:] auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 - async with auto_lock_renew: # Check that it is not called when the renewer is shutdown + async with auto_lock_renew: # Check that it is not called when the renewer is shutdown message = MockReceivedMessage(prevent_renew_lock=True) - auto_lock_renew.register(renewable=message, on_lock_renew_failure=callback_mock) + auto_lock_renew.register(receiver, renewable=message, on_lock_renew_failure=callback_mock) await auto_lock_renew.close() await asyncio.sleep(3) assert not results @@ -1206,22 +1207,22 @@ async def callback_mock(renewable, error): del errors[:] auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 - async with auto_lock_renew: # Check that it is not called when the receiver is shutdown + async with auto_lock_renew: # Check that it is not called when the receiver is shutdown message = MockReceivedMessage(prevent_renew_lock=True) - auto_lock_renew.register(renewable=message, on_lock_renew_failure=callback_mock) + auto_lock_renew.register(receiver, renewable=message, on_lock_renew_failure=callback_mock) message._receiver._running = False await asyncio.sleep(3) assert not results assert not errors - - @pytest.mark.asyncio + @AzureMgmtPreparer(None, None) async def test_async_queue_mock_no_reusing_auto_lock_renew(self): auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 + receiver = MockReceiver() async with auto_lock_renew: - auto_lock_renew.register(renewable=MockReceivedMessage()) + auto_lock_renew.register(receiver, renewable=MockReceivedMessage()) await asyncio.sleep(3) with pytest.raises(ServiceBusError): @@ -1229,12 +1230,12 @@ async def test_async_queue_mock_no_reusing_auto_lock_renew(self): pass with pytest.raises(ServiceBusError): - auto_lock_renew.register(renewable=MockReceivedMessage()) + auto_lock_renew.register(receiver, renewable=MockReceivedMessage()) auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1 - auto_lock_renew.register(renewable=MockReceivedMessage()) + auto_lock_renew.register(receiver, renewable=MockReceivedMessage()) time.sleep(3) await auto_lock_renew.close() @@ -1244,7 +1245,7 @@ async def test_async_queue_mock_no_reusing_auto_lock_renew(self): pass with pytest.raises(ServiceBusError): - auto_lock_renew.register(renewable=MockReceivedMessage()) + auto_lock_renew.register(receiver, renewable=MockReceivedMessage()) @pytest.mark.liveTest @pytest.mark.live_test_only From 7b2ca964dcce34d5631584c696d391dee8c09b5d Mon Sep 17 00:00:00 2001 From: Yunhao Ling Date: Tue, 3 Nov 2020 15:28:34 -0800 Subject: [PATCH 10/10] use AzureTestCase.await_prepared_test for async unit test --- .../azure-servicebus/tests/async_tests/test_queues_async.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py index f1ef181dadf61..cd4ffeec24bf1 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/test_queues_async.py @@ -42,7 +42,7 @@ MessageContentTooLarge, OperationTimeoutError ) -from devtools_testutils import AzureMgmtTestCase, CachedResourceGroupPreparer, AzureMgmtPreparer +from devtools_testutils import AzureMgmtTestCase, CachedResourceGroupPreparer, AzureTestCase from servicebus_preparer import CachedServiceBusNamespacePreparer, CachedServiceBusQueuePreparer, ServiceBusQueuePreparer from utilities import get_logger, print_message, sleep_until_expired from mocks_async import MockReceivedMessage, MockReceiver @@ -1135,7 +1135,7 @@ async def test_queue_message_settle_through_mgmt_link_due_to_broken_receiver_lin assert len(messages) == 1 await receiver.complete_message(messages[0]) - @AzureMgmtPreparer(None, None) + @AzureTestCase.await_prepared_test async def test_async_queue_mock_auto_lock_renew_callback(self): results = [] errors = [] @@ -1215,7 +1215,7 @@ async def callback_mock(renewable, error): assert not results assert not errors - @AzureMgmtPreparer(None, None) + @AzureTestCase.await_prepared_test async def test_async_queue_mock_no_reusing_auto_lock_renew(self): auto_lock_renew = AutoLockRenewer() auto_lock_renew._renew_period = 1