From 2dd550674e56eb50a9a13b5539b08673e19971e7 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Wed, 26 Aug 2020 11:57:13 -0700 Subject: [PATCH 1/5] Small but important: does not import ServiceBusSession any more. A smattering of small test improvements. - ensure incorrect_queue_conn_str test validates success and failure cases and consistency of different entry points. - ensure specificity of authorization/authenication errors - Begin adding "raises" stanzas to docstrings. - normalize convert_connection_string_to_kwargs to throw AuthenticationError on misaligned entity_path - fix flaky scheduled tests: both moving away from the receive_messages calls in tests, and making scheduled vs enqueue time a <= relationshi rather than ==. - similarly, if we're using the "source of truth" internal time for max wait time valdiation, must be<= since the milliseconds can actually be EXACT. --- sdk/servicebus/azure-servicebus/CHANGELOG.md | 4 ++ .../azure/servicebus/__init__.py | 1 - .../azure/servicebus/_base_handler.py | 4 +- .../azure/servicebus/_servicebus_receiver.py | 3 ++ .../azure/servicebus/_servicebus_sender.py | 3 ++ .../_servicebus_session_receiver.py | 3 ++ .../aio/_servicebus_receiver_async.py | 3 ++ .../aio/_servicebus_sender_async.py | 3 ++ .../aio/_servicebus_session_receiver_async.py | 3 ++ .../tests/async_tests/test_queues_async.py | 35 +++++++------- .../azure-servicebus/tests/test_queues.py | 46 +++++++++++++------ .../azure-servicebus/tests/test_sb_client.py | 29 ++++++++++-- 12 files changed, 99 insertions(+), 38 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index 3556002dbdab..77cf0c30a97c 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -2,6 +2,10 @@ ## 7.0.0b6 (Unreleased) +**Breaking Changes** + +* ServiceBusSession is no longer exported from azure.servicebus +* Attempting to initialize a sender or receiver with a different connection string entity and specified entity (e.g. `queue_name`) will result in an AuthenticationError ## 7.0.0b5 (2020-08-10) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py index 826e54f3e087..3fefefa454da 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py @@ -30,7 +30,6 @@ 'ServiceBusClient', 'ServiceBusReceiver', 'ServiceBusSessionReceiver', - 'ServiceBusSession', 'ServiceBusSender', 'ServiceBusSharedKeyCredential', 'TransportType', diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py index 223180d1bf11..80b181d116a9 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py @@ -21,7 +21,7 @@ from ._common._configuration import Configuration from .exceptions import ( ServiceBusError, - ServiceBusAuthorizationError, + ServiceBusAuthenticationError, _create_servicebus_exception ) from ._common.utils import create_properties @@ -104,7 +104,7 @@ def _convert_connection_string_to_kwargs(conn_str, shared_key_credential_type, * entity_in_kwargs = queue_name or topic_name if entity_in_conn_str and entity_in_kwargs and (entity_in_conn_str != entity_in_kwargs): - raise ServiceBusAuthorizationError( + raise ServiceBusAuthenticationError( "Entity names do not match, the entity name in connection string is {};" " the entity name in parameter is {}.".format(entity_in_conn_str, entity_in_kwargs) ) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_receiver.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_receiver.py index 7a322e6b76a0..c22fe47e50fa 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_receiver.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_receiver.py @@ -341,6 +341,9 @@ def from_connection_string( within its request to the service. :rtype: ~azure.servicebus.ServiceBusReceiver + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/sync_samples/sample_code_servicebus.py diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_sender.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_sender.py index d7b199502c69..d04d9706ea8b 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_sender.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_sender.py @@ -282,6 +282,9 @@ def from_connection_string( :keyword str user_agent: If specified, this will be added in front of the built-in user agent string. :rtype: ~azure.servicebus.ServiceBusSenderClient + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/sync_samples/sample_code_servicebus.py diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_session_receiver.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_session_receiver.py index 417abe97bf98..d84a917e4e57 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_session_receiver.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_session_receiver.py @@ -153,6 +153,9 @@ def from_connection_string( within its request to the service. :rtype: ~azure.servicebus.ServiceBusSessionReceiver + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/sync_samples/sample_code_servicebus.py diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_receiver_async.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_receiver_async.py index 571bcdc1610b..78f746906c6c 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_receiver_async.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_receiver_async.py @@ -338,6 +338,9 @@ def from_connection_string( within its request to the service. :rtype: ~azure.servicebus.aio.ServiceBusReceiver + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_sender_async.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_sender_async.py index b82d8d754e51..4f7ac09e873b 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_sender_async.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_sender_async.py @@ -223,6 +223,9 @@ def from_connection_string( :keyword str user_agent: If specified, this will be added in front of the built-in user agent string. :rtype: ~azure.servicebus.aio.ServiceBusSender + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_session_receiver_async.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_session_receiver_async.py index f56336569da9..afcecb949871 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_session_receiver_async.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_session_receiver_async.py @@ -137,6 +137,9 @@ def from_connection_string( within its request to the service. :rtype: ~azure.servicebus.aio.ServiceBusSessionReceiver + :raises ~azure.servicebus.ServiceBusAuthenticationError: Indicates an issue in token/identity validity. + :raises ~azure.servicebus.ServiceBusAuthorizationError: Indicates an access/rights related failure. + .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py 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 7e99a5ab6921..f904451162eb 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 @@ -959,14 +959,14 @@ async def test_async_queue_schedule_message(self, servicebus_namespace_connectio async with ServiceBusClient.from_connection_string( servicebus_namespace_connection_string, logging_enable=False) as sb_client: - enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) + scheduled_enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) async with sb_client.get_queue_receiver(servicebus_queue.name) as receiver: async with sb_client.get_queue_sender(servicebus_queue.name) as sender: content = str(uuid.uuid4()) message_id = uuid.uuid4() message = Message(content) message.message_id = message_id - message.scheduled_enqueue_time_utc = enqueue_time + message.scheduled_enqueue_time_utc = scheduled_enqueue_time await sender.send_messages(message) messages = await receiver.receive_messages(max_wait_time=120) @@ -975,8 +975,8 @@ async def test_async_queue_schedule_message(self, servicebus_namespace_connectio data = str(messages[0]) assert data == content assert messages[0].message_id == message_id - assert messages[0].scheduled_enqueue_time_utc == enqueue_time - assert messages[0].scheduled_enqueue_time_utc == messages[0].enqueued_time_utc.replace(microsecond=0) + assert messages[0].scheduled_enqueue_time_utc == scheduled_enqueue_time + assert messages[0].scheduled_enqueue_time_utc <= messages[0].enqueued_time_utc.replace(microsecond=0) assert len(messages) == 1 finally: for m in messages: @@ -992,7 +992,7 @@ async def test_async_queue_schedule_message(self, servicebus_namespace_connectio async def test_async_queue_schedule_multiple_messages(self, servicebus_namespace_connection_string, servicebus_queue, **kwargs): async with ServiceBusClient.from_connection_string( servicebus_namespace_connection_string, logging_enable=False) as sb_client: - enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) + scheduled_enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) messages = [] receiver = sb_client.get_queue_receiver(servicebus_queue.name, prefetch=20) sender = sb_client.get_queue_sender(servicebus_queue.name) @@ -1007,11 +1007,12 @@ async def test_async_queue_schedule_multiple_messages(self, servicebus_namespace await sender.send_messages([message_a, message_b]) - received_messages = await receiver.receive_messages(max_batch_size=2, max_wait_time=5) - for message in received_messages: + received_messages = [] + async for message in receiver.get_streaming_message_iter(max_wait_time=5): + received_messages.append(message) await message.complete() - tokens = await sender.schedule_messages(received_messages, enqueue_time) + tokens = await sender.schedule_messages(received_messages, scheduled_enqueue_time) assert len(tokens) == 2 messages = await receiver.receive_messages(max_wait_time=120) @@ -1022,8 +1023,8 @@ async def test_async_queue_schedule_multiple_messages(self, servicebus_namespace data = str(messages[0]) assert data == content assert messages[0].message_id in (message_id_a, message_id_b) - assert messages[0].scheduled_enqueue_time_utc == enqueue_time - assert messages[0].scheduled_enqueue_time_utc == messages[0].enqueued_time_utc.replace(microsecond=0) + assert messages[0].scheduled_enqueue_time_utc == scheduled_enqueue_time + assert messages[0].scheduled_enqueue_time_utc <= messages[0].enqueued_time_utc.replace(microsecond=0) assert len(messages) == 2 finally: for m in messages: @@ -1252,7 +1253,9 @@ def message_content(): message_1st_received_cnt = 0 message_2nd_received_cnt = 0 while message_1st_received_cnt < 20 or message_2nd_received_cnt < 20: - messages = await receiver.receive_messages(max_batch_size=20, max_wait_time=5) + messages = [] + for message in receiver.get_streaming_message_iter(max_wait_time=5): + messages.append(message) if not messages: break receive_counter += 1 @@ -1382,22 +1385,22 @@ async def test_async_queue_receiver_respects_max_wait_time_overrides(self, servi async for message in receiver.get_streaming_message_iter(max_wait_time=1): messages.append(message) time_3 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=.5) < timedelta(milliseconds=(time_3 - time_2)) < timedelta(seconds=2) + assert timedelta(seconds=.5) < timedelta(milliseconds=(time_3 - time_2)) <= timedelta(seconds=2) time_4 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=8) < timedelta(milliseconds=(time_4 - time_3)) < timedelta(seconds=11) + assert timedelta(seconds=8) < timedelta(milliseconds=(time_4 - time_3)) <= timedelta(seconds=11) async for message in receiver.get_streaming_message_iter(max_wait_time=3): messages.append(message) time_5 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=1) < timedelta(milliseconds=(time_5 - time_4)) < timedelta(seconds=4) + assert timedelta(seconds=1) < timedelta(milliseconds=(time_5 - time_4)) <= timedelta(seconds=4) async for message in receiver: messages.append(message) time_6 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=3) < timedelta(milliseconds=(time_6 - time_5)) < timedelta(seconds=6) + assert timedelta(seconds=3) < timedelta(milliseconds=(time_6 - time_5)) <= timedelta(seconds=6) async for message in receiver.get_streaming_message_iter(): messages.append(message) time_7 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=3) < timedelta(milliseconds=(time_7 - time_6)) < timedelta(seconds=6) + assert timedelta(seconds=3) < timedelta(milliseconds=(time_7 - time_6)) <= timedelta(seconds=6) assert len(messages) == 1 diff --git a/sdk/servicebus/azure-servicebus/tests/test_queues.py b/sdk/servicebus/azure-servicebus/tests/test_queues.py index d4f550bd3669..191c5c8b05e2 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_queues.py +++ b/sdk/servicebus/azure-servicebus/tests/test_queues.py @@ -1199,14 +1199,14 @@ def test_queue_schedule_message(self, servicebus_namespace_connection_string, se with ServiceBusClient.from_connection_string( servicebus_namespace_connection_string, logging_enable=False) as sb_client: - enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) + scheduled_enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) with sb_client.get_queue_receiver(servicebus_queue.name) as receiver: with sb_client.get_queue_sender(servicebus_queue.name) as sender: content = str(uuid.uuid4()) message_id = uuid.uuid4() message = Message(content) message.message_id = message_id - message.scheduled_enqueue_time_utc = enqueue_time + message.scheduled_enqueue_time_utc = scheduled_enqueue_time sender.send_messages(message) messages = receiver.receive_messages(max_wait_time=120) @@ -1215,8 +1215,8 @@ def test_queue_schedule_message(self, servicebus_namespace_connection_string, se data = str(messages[0]) assert data == content assert messages[0].message_id == message_id - assert messages[0].scheduled_enqueue_time_utc == enqueue_time - assert messages[0].scheduled_enqueue_time_utc == messages[0].enqueued_time_utc.replace(microsecond=0) + assert messages[0].scheduled_enqueue_time_utc == scheduled_enqueue_time + assert messages[0].scheduled_enqueue_time_utc <= messages[0].enqueued_time_utc.replace(microsecond=0) assert len(messages) == 1 finally: for m in messages: @@ -1235,7 +1235,7 @@ def test_queue_schedule_multiple_messages(self, servicebus_namespace_connection_ with ServiceBusClient.from_connection_string( servicebus_namespace_connection_string, logging_enable=False) as sb_client: - enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) + scheduled_enqueue_time = (utc_now() + timedelta(minutes=2)).replace(microsecond=0) sender = sb_client.get_queue_sender(servicebus_queue.name) receiver = sb_client.get_queue_receiver(servicebus_queue.name, prefetch=20) @@ -1265,7 +1265,7 @@ def test_queue_schedule_multiple_messages(self, servicebus_namespace_connection_ received_messages.append(message) message.complete() - tokens = sender.schedule_messages(received_messages, enqueue_time) + tokens = sender.schedule_messages(received_messages, scheduled_enqueue_time) assert len(tokens) == 2 messages = receiver.receive_messages(max_wait_time=120) @@ -1275,8 +1275,8 @@ def test_queue_schedule_multiple_messages(self, servicebus_namespace_connection_ data = str(messages[0]) assert data == content assert messages[0].message_id in (message_id_a, message_id_b) - assert messages[0].scheduled_enqueue_time_utc == enqueue_time - assert messages[0].scheduled_enqueue_time_utc == messages[0].enqueued_time_utc.replace(microsecond=0) + assert messages[0].scheduled_enqueue_time_utc == scheduled_enqueue_time + assert messages[0].scheduled_enqueue_time_utc <= messages[0].enqueued_time_utc.replace(microsecond=0) assert messages[0].delivery_count == 0 assert messages[0].properties assert messages[0].properties[b'key'] == b'value' @@ -1619,7 +1619,9 @@ def message_content(): message_1st_received_cnt = 0 message_2nd_received_cnt = 0 while message_1st_received_cnt < 20 or message_2nd_received_cnt < 20: - messages = receiver.receive_messages(max_batch_size=20, max_wait_time=5) + messages = [] + for message in receiver.get_streaming_message_iter(max_wait_time=5): + messages.append(message) if not messages: break receive_counter += 1 @@ -1788,22 +1790,38 @@ def test_queue_receiver_respects_max_wait_time_overrides(self, servicebus_namesp for message in receiver.get_streaming_message_iter(max_wait_time=1): messages.append(message) time_3 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=.5) < timedelta(milliseconds=(time_3 - time_2)) < timedelta(seconds=2) + assert timedelta(seconds=.5) < timedelta(milliseconds=(time_3 - time_2)) <= timedelta(seconds=2) time_4 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=8) < timedelta(milliseconds=(time_4 - time_3)) < timedelta(seconds=11) + assert timedelta(seconds=8) < timedelta(milliseconds=(time_4 - time_3)) <= timedelta(seconds=11) for message in receiver.get_streaming_message_iter(max_wait_time=3): messages.append(message) time_5 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=1) < timedelta(milliseconds=(time_5 - time_4)) < timedelta(seconds=4) + assert timedelta(seconds=1) < timedelta(milliseconds=(time_5 - time_4)) <= timedelta(seconds=4) for message in receiver: messages.append(message) time_6 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=3) < timedelta(milliseconds=(time_6 - time_5)) < timedelta(seconds=6) + assert timedelta(seconds=3) < timedelta(milliseconds=(time_6 - time_5)) <= timedelta(seconds=6) for message in receiver.get_streaming_message_iter(): messages.append(message) time_7 = receiver._handler._counter.get_current_ms() - assert timedelta(seconds=3) < timedelta(milliseconds=(time_7 - time_6)) < timedelta(seconds=6) + assert timedelta(seconds=3) < timedelta(milliseconds=(time_7 - time_6)) <= timedelta(seconds=6) assert len(messages) == 1 + + + @pytest.mark.liveTest + @pytest.mark.live_test_only + @CachedResourceGroupPreparer(name_prefix='servicebustest') + @CachedServiceBusNamespacePreparer(name_prefix='servicebustest') + @CachedServiceBusQueuePreparer(name_prefix='servicebustest') + def test_queue_receiver_invalid_mode(self, servicebus_namespace_connection_string, servicebus_queue, **kwargs): + + with ServiceBusClient.from_connection_string( + servicebus_namespace_connection_string, logging_enable=False) as sb_client: +# with pytest.raises(StopIteration): + with sb_client.get_queue_receiver(servicebus_queue.name, + max_wait_time="oij") as receiver: + + assert receiver diff --git a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py index 8f69482f0c4f..efcf64cc1b17 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py +++ b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py @@ -13,7 +13,7 @@ from azure.common import AzureHttpError, AzureConflictHttpError from azure.mgmt.servicebus.models import AccessRights -from azure.servicebus import ServiceBusClient, ServiceBusSharedKeyCredential +from azure.servicebus import ServiceBusClient, ServiceBusSharedKeyCredential, ServiceBusSender from azure.servicebus._common.message import Message, PeekMessage from azure.servicebus._common.constants import ReceiveSettleMode from azure.servicebus.exceptions import ( @@ -44,7 +44,7 @@ def test_sb_client_bad_credentials(self, servicebus_namespace, servicebus_queue, credential=ServiceBusSharedKeyCredential('invalid', 'invalid'), logging_enable=False) with client: - with pytest.raises(ServiceBusError): + with pytest.raises(ServiceBusAuthenticationError): with client.get_queue_sender(servicebus_queue.name) as sender: sender.send_messages(Message("test")) @@ -87,7 +87,7 @@ def test_sb_client_readonly_credentials(self, servicebus_authorization_rule_conn with client.get_queue_receiver(servicebus_queue.name) as receiver: messages = receiver.receive_messages(max_batch_size=1, max_wait_time=1) - with pytest.raises(ServiceBusError): + with pytest.raises(ServiceBusAuthorizationError): with client.get_queue_sender(servicebus_queue.name) as sender: sender.send_messages(Message("test")) @@ -119,10 +119,29 @@ def test_sb_client_writeonly_credentials(self, servicebus_authorization_rule_con @ServiceBusQueuePreparer(name_prefix='servicebustest_qone', parameter_name='wrong_queue', dead_lettering_on_message_expiration=True) @ServiceBusQueuePreparer(name_prefix='servicebustest_qtwo', dead_lettering_on_message_expiration=True) @ServiceBusQueueAuthorizationRulePreparer(name_prefix='servicebustest_qtwo') - def test_sb_client_incorrect_queue_conn_str(self, servicebus_queue_authorization_rule_connection_string, wrong_queue, **kwargs): + def test_sb_client_incorrect_queue_conn_str(self, servicebus_queue_authorization_rule_connection_string, servicebus_queue, wrong_queue, **kwargs): client = ServiceBusClient.from_connection_string(servicebus_queue_authorization_rule_connection_string) with client: - with pytest.raises(ServiceBusError): + # Validate that the wrong queue with the right credentials fails. + with pytest.raises(ServiceBusAuthenticationError): with client.get_queue_sender(wrong_queue.name) as sender: sender.send_messages(Message("test")) + + # But that the correct one works. + with client.get_queue_sender(servicebus_queue.name) as sender: + sender.send_messages(Message("test")) + + # Now do the same but with direct connstr initialization. + with pytest.raises(ServiceBusAuthenticationError): + with ServiceBusSender.from_connection_string( + servicebus_queue_authorization_rule_connection_string, + queue_name=wrong_queue.name, + ) as sender: + sender.send_messages(Message("test")) + + with ServiceBusSender.from_connection_string( + servicebus_queue_authorization_rule_connection_string, + queue_name=servicebus_queue.name, + ) as sender: + sender.send_messages(Message("test")) From 09722ae87fae61176614e822acc040593cdf761f Mon Sep 17 00:00:00 2001 From: KieranBrantnerMagee Date: Wed, 26 Aug 2020 17:02:52 -0700 Subject: [PATCH 2/5] Update test_sb_client.py Add missing ServiceBusAuthorizationError as import for more precise tests. --- sdk/servicebus/azure-servicebus/tests/test_sb_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py index efcf64cc1b17..3ba04911e82e 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py +++ b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py @@ -20,6 +20,7 @@ ServiceBusError, ServiceBusConnectionError, ServiceBusAuthenticationError, + ServiceBusAuthorizationError, ServiceBusResourceNotFound ) from devtools_testutils import AzureMgmtTestCase, CachedResourceGroupPreparer From 57a956f0179741d7a06b6f8f6da06e13d51b31b1 Mon Sep 17 00:00:00 2001 From: KieranBrantnerMagee Date: Wed, 26 Aug 2020 19:28:57 -0700 Subject: [PATCH 3/5] Update test_queues_async.py Fix test by making for loop properly async when swapping in the iterator. --- .../azure-servicebus/tests/async_tests/test_queues_async.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f904451162eb..4902673bc919 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 @@ -1254,7 +1254,7 @@ def message_content(): message_2nd_received_cnt = 0 while message_1st_received_cnt < 20 or message_2nd_received_cnt < 20: messages = [] - for message in receiver.get_streaming_message_iter(max_wait_time=5): + async for message in receiver.get_streaming_message_iter(max_wait_time=5): messages.append(message) if not messages: break From f82ac9e1ef479d3ff8719aa5e367b0770775faa0 Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Mon, 31 Aug 2020 00:53:01 -0700 Subject: [PATCH 4/5] PR comments; remove session from aio (adjust changelog) re-adjust test to use batch as intended. --- sdk/servicebus/azure-servicebus/CHANGELOG.md | 2 +- .../azure-servicebus/azure/servicebus/aio/__init__.py | 4 +--- .../azure-servicebus/tests/async_tests/test_queues_async.py | 6 ++++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index 77cf0c30a97c..d1b214e72db8 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -4,7 +4,7 @@ **Breaking Changes** -* ServiceBusSession is no longer exported from azure.servicebus +* `ServiceBusSession` is no longer exported from `azure.servicebus` and `azure.servicebus.aio` * Attempting to initialize a sender or receiver with a different connection string entity and specified entity (e.g. `queue_name`) will result in an AuthenticationError ## 7.0.0b5 (2020-08-10) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py index 8db9f20d7b1c..1ca837e9a61d 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py @@ -8,7 +8,6 @@ from ._servicebus_sender_async import ServiceBusSender from ._servicebus_receiver_async import ServiceBusReceiver from ._servicebus_session_receiver_async import ServiceBusSessionReceiver -from ._servicebus_session_async import ServiceBusSession from ._servicebus_client_async import ServiceBusClient from ._async_auto_lock_renewer import AutoLockRenew @@ -19,6 +18,5 @@ 'ServiceBusReceiver', 'ServiceBusSessionReceiver', 'ServiceBusSharedKeyCredential', - 'AutoLockRenew', - 'ServiceBusSession' + 'AutoLockRenew' ] 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 f904451162eb..8d700eeb8b96 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 @@ -1254,8 +1254,10 @@ def message_content(): message_2nd_received_cnt = 0 while message_1st_received_cnt < 20 or message_2nd_received_cnt < 20: messages = [] - for message in receiver.get_streaming_message_iter(max_wait_time=5): - messages.append(message) + batch = await receiver.receive_messages(max_batch_size=20, max_wait_time=5) + while batch: + messages += batch + batch = await receiver.receive_messages(max_batch_size=20, max_wait_time=5) if not messages: break receive_counter += 1 From a0cca11908a64fd4fbeebc4daffe36daf75dad5e Mon Sep 17 00:00:00 2001 From: Kieran Brantner-Magee Date: Mon, 31 Aug 2020 10:27:48 -0700 Subject: [PATCH 5/5] readd servicebussession on Adam's good point that it may interfere with type hinting that uses the public path currently. Should do this while adjusting to try and use internal paths while keeping an eye on typechecking; will be larger work. --- sdk/servicebus/azure-servicebus/CHANGELOG.md | 1 - sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py | 1 + .../azure-servicebus/azure/servicebus/aio/__init__.py | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index d1b214e72db8..a504bdc809d8 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -4,7 +4,6 @@ **Breaking Changes** -* `ServiceBusSession` is no longer exported from `azure.servicebus` and `azure.servicebus.aio` * Attempting to initialize a sender or receiver with a different connection string entity and specified entity (e.g. `queue_name`) will result in an AuthenticationError ## 7.0.0b5 (2020-08-10) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py index 3fefefa454da..826e54f3e087 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py @@ -30,6 +30,7 @@ 'ServiceBusClient', 'ServiceBusReceiver', 'ServiceBusSessionReceiver', + 'ServiceBusSession', 'ServiceBusSender', 'ServiceBusSharedKeyCredential', 'TransportType', diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py index 1ca837e9a61d..4e13bf070d49 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/__init__.py @@ -8,6 +8,7 @@ from ._servicebus_sender_async import ServiceBusSender from ._servicebus_receiver_async import ServiceBusReceiver from ._servicebus_session_receiver_async import ServiceBusSessionReceiver +from ._servicebus_session_async import ServiceBusSession from ._servicebus_client_async import ServiceBusClient from ._async_auto_lock_renewer import AutoLockRenew @@ -17,6 +18,7 @@ 'ServiceBusSender', 'ServiceBusReceiver', 'ServiceBusSessionReceiver', + 'ServiceBusSession', 'ServiceBusSharedKeyCredential', 'AutoLockRenew' ]