stuartpreston-azure-sdk-for-ruby 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +11 -11
- data/.travis.yml +10 -10
- data/ChangeLog.txt +70 -68
- data/Gemfile +15 -15
- data/README.md +618 -618
- data/Rakefile +133 -133
- data/azure.gemspec +44 -44
- data/lib/azure.rb +52 -52
- data/lib/azure/base_management/affinity_group.rb +32 -32
- data/lib/azure/base_management/base_management_service.rb +304 -304
- data/lib/azure/base_management/location.rb +27 -27
- data/lib/azure/base_management/management_http_request.rb +171 -171
- data/lib/azure/base_management/serialization.rb +129 -129
- data/lib/azure/base_management/sql_management_http_request.rb +45 -45
- data/lib/azure/blob/blob.rb +31 -31
- data/lib/azure/blob/blob_service.rb +1423 -1423
- data/lib/azure/blob/block.rb +30 -30
- data/lib/azure/blob/container.rb +31 -31
- data/lib/azure/blob/serialization.rb +284 -284
- data/lib/azure/cloud_service_management/cloud_service.rb +38 -38
- data/lib/azure/cloud_service_management/cloud_service_management_service.rb +140 -140
- data/lib/azure/cloud_service_management/serialization.rb +117 -117
- data/lib/azure/core.rb +39 -39
- data/lib/azure/core/auth/authorizer.rb +36 -36
- data/lib/azure/core/auth/shared_key.rb +110 -110
- data/lib/azure/core/auth/shared_key_lite.rb +48 -48
- data/lib/azure/core/auth/signer.rb +48 -48
- data/lib/azure/core/configuration.rb +211 -211
- data/lib/azure/core/error.rb +22 -22
- data/lib/azure/core/filtered_service.rb +43 -43
- data/lib/azure/core/http/debug_filter.rb +35 -35
- data/lib/azure/core/http/http_error.rb +88 -88
- data/lib/azure/core/http/http_filter.rb +52 -52
- data/lib/azure/core/http/http_request.rb +157 -157
- data/lib/azure/core/http/http_response.rb +140 -140
- data/lib/azure/core/http/retry_policy.rb +73 -73
- data/lib/azure/core/http/signer_filter.rb +33 -33
- data/lib/azure/core/service.rb +62 -62
- data/lib/azure/core/signed_service.rb +42 -42
- data/lib/azure/core/utility.rb +190 -190
- data/lib/azure/queue/message.rb +29 -29
- data/lib/azure/queue/queue.rb +28 -28
- data/lib/azure/queue/queue_service.rb +567 -567
- data/lib/azure/queue/serialization.rb +106 -106
- data/lib/azure/service/access_policy.rb +25 -25
- data/lib/azure/service/cors.rb +11 -11
- data/lib/azure/service/cors_rule.rb +15 -15
- data/lib/azure/service/enumeration_results.rb +20 -20
- data/lib/azure/service/logging.rb +31 -31
- data/lib/azure/service/metrics.rb +30 -30
- data/lib/azure/service/retention_policy.rb +24 -24
- data/lib/azure/service/serialization.rb +297 -297
- data/lib/azure/service/signed_identifier.rb +29 -29
- data/lib/azure/service/storage_service.rb +82 -82
- data/lib/azure/service/storage_service_properties.rb +37 -37
- data/lib/azure/service_bus/action.rb +21 -21
- data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
- data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
- data/lib/azure/service_bus/brokered_message.rb +123 -123
- data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
- data/lib/azure/service_bus/correlation_filter.rb +45 -45
- data/lib/azure/service_bus/empty_rule_action.rb +29 -29
- data/lib/azure/service_bus/false_filter.rb +38 -38
- data/lib/azure/service_bus/filter.rb +21 -21
- data/lib/azure/service_bus/interval.rb +103 -103
- data/lib/azure/service_bus/queue.rb +229 -229
- data/lib/azure/service_bus/relay.rb +87 -87
- data/lib/azure/service_bus/resource.rb +108 -108
- data/lib/azure/service_bus/rule.rb +97 -97
- data/lib/azure/service_bus/rule_aspect.rb +34 -34
- data/lib/azure/service_bus/serialization.rb +161 -161
- data/lib/azure/service_bus/service_bus_service.rb +896 -896
- data/lib/azure/service_bus/sql_filter.rb +50 -50
- data/lib/azure/service_bus/sql_rule_action.rb +50 -50
- data/lib/azure/service_bus/subscription.rb +183 -183
- data/lib/azure/service_bus/topic.rb +186 -186
- data/lib/azure/service_bus/true_filter.rb +38 -38
- data/lib/azure/sql_database_management/serialization.rb +111 -111
- data/lib/azure/sql_database_management/sql_database.rb +31 -31
- data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -200
- data/lib/azure/storage_management/serialization.rb +184 -184
- data/lib/azure/storage_management/storage_account.rb +40 -40
- data/lib/azure/storage_management/storage_management_service.rb +166 -166
- data/lib/azure/table/auth/shared_key.rb +92 -92
- data/lib/azure/table/auth/shared_key_lite.rb +44 -44
- data/lib/azure/table/batch.rb +329 -329
- data/lib/azure/table/batch_response.rb +118 -118
- data/lib/azure/table/edmtype.rb +126 -126
- data/lib/azure/table/entity.rb +30 -30
- data/lib/azure/table/guid.rb +23 -23
- data/lib/azure/table/query.rb +111 -111
- data/lib/azure/table/serialization.rb +107 -107
- data/lib/azure/table/table_service.rb +559 -559
- data/lib/azure/version.rb +31 -31
- data/lib/azure/virtual_machine_image_management/serialization.rb +66 -66
- data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +94 -94
- data/lib/azure/virtual_machine_management/serialization.rb +462 -462
- data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -45
- data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +588 -588
- data/lib/azure/virtual_network_management/serialization.rb +190 -190
- data/lib/azure/virtual_network_management/virtual_network.rb +37 -37
- data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
- data/test/fixtures/affinity_group.xml +33 -33
- data/test/fixtures/all_containers.xml +20 -20
- data/test/fixtures/all_tables.xml +22 -22
- data/test/fixtures/certificate.pem +21 -21
- data/test/fixtures/container_acl.xml +11 -11
- data/test/fixtures/create_sql_database_server.xml +1 -1
- data/test/fixtures/create_storage_desc_error.xml +5 -5
- data/test/fixtures/create_storage_extendedprop_error.xml +8 -8
- data/test/fixtures/create_storage_extendedpropname_error.xml +6 -6
- data/test/fixtures/create_storage_full_error.xml +6 -6
- data/test/fixtures/create_storage_label_error.xml +5 -5
- data/test/fixtures/create_storage_location_error.xml +5 -5
- data/test/fixtures/create_storage_name_error.xml +6 -6
- data/test/fixtures/create_table_response_entry.xml +15 -15
- data/test/fixtures/delete_storage_container_error.xml +5 -5
- data/test/fixtures/delete_storage_error.xml +5 -5
- data/test/fixtures/deployment_error.xml +5 -5
- data/test/fixtures/get_storage_account_error.xml +5 -5
- data/test/fixtures/get_storage_account_properties.xml +31 -31
- data/test/fixtures/get_storage_account_properties_new.xml +31 -31
- data/test/fixtures/http_error.xml +5 -5
- data/test/fixtures/insert_entity_response_entry.xml +25 -25
- data/test/fixtures/list_affinity_groups.xml +22 -22
- data/test/fixtures/list_blobs.xml +120 -120
- data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
- data/test/fixtures/list_blocks_all.xml +22 -22
- data/test/fixtures/list_blocks_committed.xml +12 -12
- data/test/fixtures/list_cloud_services.xml +38 -38
- data/test/fixtures/list_containers.xml +37 -37
- data/test/fixtures/list_firewall_management_endpoint.xml +27 -27
- data/test/fixtures/list_images.xml +110 -110
- data/test/fixtures/list_locations.xml +62 -62
- data/test/fixtures/list_page_ranges.xml +10 -10
- data/test/fixtures/list_sql_database.xml +36 -36
- data/test/fixtures/list_sql_server_firewall.xml +23 -23
- data/test/fixtures/list_storage_account_single.xml +24 -24
- data/test/fixtures/list_storage_accounts.xml +45 -45
- data/test/fixtures/list_virtual_networks.xml +92 -92
- data/test/fixtures/logging.xml +11 -11
- data/test/fixtures/management_certificate.pem +55 -55
- data/test/fixtures/messages.xml +12 -12
- data/test/fixtures/metrics.xml +10 -10
- data/test/fixtures/privatekey.key +28 -28
- data/test/fixtures/query_entities_empty_response.xml +7 -7
- data/test/fixtures/query_entities_response.xml +45 -45
- data/test/fixtures/queue_service_properties.xml +22 -22
- data/test/fixtures/queue_service_properties_original.xml +19 -19
- data/test/fixtures/queues.xml +16 -16
- data/test/fixtures/retention_policy.xml +5 -5
- data/test/fixtures/sb_default_create_queue_response.xml +23 -23
- data/test/fixtures/sb_default_create_relay_response.xml +15 -15
- data/test/fixtures/sb_default_create_topic_response.xml +18 -18
- data/test/fixtures/sb_get_access_token_response.txt +1 -1
- data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
- data/test/fixtures/storage_service_properties.xml +54 -54
- data/test/fixtures/update_storage_account.xml +16 -16
- data/test/fixtures/update_storage_error.xml +4 -4
- data/test/fixtures/updated_storage_accounts.xml +52 -52
- data/test/fixtures/virtual_machine.xml +113 -113
- data/test/fixtures/windows_virtual_machine.xml +106 -106
- data/test/integration/affinity_group/Affinity_test.rb +55 -55
- data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
- data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
- data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
- data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
- data/test/integration/blob/blob_gb18030_test.rb +199 -199
- data/test/integration/blob/blob_metadata_test.rb +75 -75
- data/test/integration/blob/blob_pages_test.rb +119 -119
- data/test/integration/blob/blob_properties_test.rb +77 -77
- data/test/integration/blob/block_blob_test.rb +254 -254
- data/test/integration/blob/container/container_acl_test.rb +69 -69
- data/test/integration/blob/container/container_metadata_test.rb +50 -50
- data/test/integration/blob/container/create_container_test.rb +60 -60
- data/test/integration/blob/container/delete_container_test.rb +39 -39
- data/test/integration/blob/container/get_container_properties_test.rb +48 -48
- data/test/integration/blob/container/list_containers_test.rb +79 -79
- data/test/integration/blob/container/root_container_test.rb +53 -53
- data/test/integration/blob/copy_blob_test.rb +113 -113
- data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
- data/test/integration/blob/create_page_blob_test.rb +83 -83
- data/test/integration/blob/delete_blob_test.rb +159 -159
- data/test/integration/blob/get_blob_test.rb +65 -65
- data/test/integration/blob/informative_errors_test.rb +38 -38
- data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
- data/test/integration/blob/lease/break_lease_test.rb +40 -40
- data/test/integration/blob/lease/release_lease_test.rb +40 -40
- data/test/integration/blob/lease/renew_lease_test.rb +42 -42
- data/test/integration/blob/list_blobs_test.rb +113 -113
- data/test/integration/cloud_service/Cloud_Create_test.rb +44 -44
- data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -44
- data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
- data/test/integration/database/create_sql_server_test.rb +53 -53
- data/test/integration/database/delete_sql_server_firewall_test.rb +70 -70
- data/test/integration/database/delete_sql_server_test.rb +58 -58
- data/test/integration/database/list_sql_server_firewall_test.rb +45 -45
- data/test/integration/database/list_sql_servers_test.rb +44 -44
- data/test/integration/database/reset_password_sql_server_test.rb +55 -55
- data/test/integration/location/Location_List_test.rb +39 -39
- data/test/integration/queue/clear_messages_test.rb +42 -42
- data/test/integration/queue/create_message_test.rb +75 -75
- data/test/integration/queue/create_queue_test.rb +50 -50
- data/test/integration/queue/delete_message_test.rb +67 -67
- data/test/integration/queue/delete_queue_test.rb +45 -45
- data/test/integration/queue/informative_errors_test.rb +41 -41
- data/test/integration/queue/list_messages_encoded_test.rb +79 -79
- data/test/integration/queue/list_messages_test.rb +79 -79
- data/test/integration/queue/list_queues_test.rb +44 -44
- data/test/integration/queue/peek_messages_test.rb +59 -59
- data/test/integration/queue/queue_gb18030_test.rb +131 -131
- data/test/integration/queue/queue_metadata_test.rb +40 -40
- data/test/integration/queue/update_message_test.rb +74 -74
- data/test/integration/service_bus/informative_errors_test.rb +36 -36
- data/test/integration/service_bus/queues_scenario_test.rb +200 -200
- data/test/integration/service_bus/queues_test.rb +265 -265
- data/test/integration/service_bus/relay_test.rb +131 -131
- data/test/integration/service_bus/rules_test.rb +144 -144
- data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
- data/test/integration/service_bus/scenario_test.rb +101 -101
- data/test/integration/service_bus/subscriptions_test.rb +211 -211
- data/test/integration/service_bus/topics_scenario_test.rb +406 -406
- data/test/integration/service_bus/topics_test.rb +129 -129
- data/test/integration/storage_management/storage_management_test.rb +160 -160
- data/test/integration/table/create_table_test.rb +35 -35
- data/test/integration/table/delete_entity_batch_test.rb +106 -106
- data/test/integration/table/delete_entity_test.rb +93 -93
- data/test/integration/table/delete_table_test.rb +39 -39
- data/test/integration/table/get_table_test.rb +36 -36
- data/test/integration/table/informative_errors_test.rb +38 -38
- data/test/integration/table/insert_entity_batch_test.rb +99 -99
- data/test/integration/table/insert_entity_test.rb +87 -87
- data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
- data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
- data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
- data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
- data/test/integration/table/merge_entity_batch_test.rb +127 -127
- data/test/integration/table/merge_entity_test.rb +112 -112
- data/test/integration/table/query_entities_test.rb +194 -194
- data/test/integration/table/query_tables_test.rb +42 -42
- data/test/integration/table/query_test.rb +250 -250
- data/test/integration/table/table_acl_test.rb +51 -51
- data/test/integration/table/table_gb18030_test.rb +355 -355
- data/test/integration/table/update_entity_batch_test.rb +148 -148
- data/test/integration/table/update_entity_test.rb +130 -130
- data/test/integration/test_helper.rb +42 -42
- data/test/integration/vm/VM_Create_test.rb +260 -260
- data/test/integration/vm/VM_Delete_test.rb +55 -55
- data/test/integration/vm/VM_Operations_test.rb +173 -173
- data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
- data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
- data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
- data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
- data/test/support/env.rb +19 -19
- data/test/support/fixtures.rb +36 -36
- data/test/support/name_generator.rb +168 -168
- data/test/support/stubs.rb +42 -42
- data/test/support/virtual_machine_name_generator.rb +102 -102
- data/test/support/virtual_network_helper.rb +73 -73
- data/test/test_helper.rb +53 -53
- data/test/unit/affinity_group/affinity_group_test.rb +192 -192
- data/test/unit/affinity_group/serialization_test.rb +88 -88
- data/test/unit/base_management/location_test.rb +57 -57
- data/test/unit/blob/blob_service_test.rb +1946 -1946
- data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
- data/test/unit/cloud_service_management/serialization_test.rb +169 -169
- data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
- data/test/unit/core/auth/shared_key_test.rb +58 -58
- data/test/unit/core/auth/signer_test.rb +30 -30
- data/test/unit/core/http/http_error_test.rb +57 -57
- data/test/unit/core/http/http_request_test.rb +66 -66
- data/test/unit/core/http/http_response_test.rb +45 -45
- data/test/unit/core/http/retry_policy_test.rb +23 -23
- data/test/unit/database/serialization_test.rb +97 -97
- data/test/unit/database/sql_database_server_service_test.rb +288 -288
- data/test/unit/service/serialization_test.rb +532 -532
- data/test/unit/service/storage_service_test.rb +292 -292
- data/test/unit/storage_management/serialization_test.rb +232 -232
- data/test/unit/storage_management/storage_management_service_test.rb +261 -261
- data/test/unit/table/edmtype_test.rb +107 -107
- data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -35
- data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -65
- data/test/unit/virtual_machine_management/serialization_test.rb +258 -258
- data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -440
- data/test/unit/vnet/serialization_test.rb +187 -187
- data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
- metadata +34 -27
@@ -1,211 +1,211 @@
|
|
1
|
-
#-------------------------------------------------------------------------
|
2
|
-
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
#--------------------------------------------------------------------------
|
15
|
-
require "integration/test_helper"
|
16
|
-
|
17
|
-
describe "ServiceBus Subscriptions" do
|
18
|
-
subject { Azure::ServiceBus::ServiceBusService.new }
|
19
|
-
after { ServiceBusTopicNameHelper.clean }
|
20
|
-
let(:topic){ ServiceBusTopicNameHelper.name }
|
21
|
-
let(:subscription) { "mySubscription" }
|
22
|
-
let(:subscription_alternative) { "mySubscription" }
|
23
|
-
let(:description_alternative) {{
|
24
|
-
:lock_duration => 'PT30S',
|
25
|
-
:requires_session => true,
|
26
|
-
:default_message_time_to_live => 'PT30M',
|
27
|
-
:dead_lettering_on_message_expiration => true,
|
28
|
-
:dead_lettering_on_filter_evaluation_exceptions => true,
|
29
|
-
:max_delivery_count => 20,
|
30
|
-
:enable_batched_operations => true
|
31
|
-
}}
|
32
|
-
|
33
|
-
before { subject.create_topic topic }
|
34
|
-
|
35
|
-
it "should be able to set description values to false" do
|
36
|
-
s = Azure::ServiceBus::Subscription.new(subscription, {
|
37
|
-
:requires_session => false
|
38
|
-
})
|
39
|
-
|
40
|
-
s.requires_session.must_equal false
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should be able to create a new subscription" do
|
44
|
-
result = subject.create_subscription topic, subscription
|
45
|
-
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
46
|
-
result.name.must_equal subscription
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should be able to create a new subscription from a string and description Hash" do
|
50
|
-
result = subject.create_subscription topic, subscription_alternative, description_alternative
|
51
|
-
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
52
|
-
result.name.must_equal subscription_alternative
|
53
|
-
|
54
|
-
result.lock_duration.must_equal 30.0
|
55
|
-
result.requires_session.must_equal description_alternative[:requires_session]
|
56
|
-
result.default_message_time_to_live.must_equal 1800.0
|
57
|
-
result.dead_lettering_on_message_expiration.must_equal description_alternative[:dead_lettering_on_message_expiration]
|
58
|
-
result.dead_lettering_on_filter_evaluation_exceptions.must_equal description_alternative[:dead_lettering_on_filter_evaluation_exceptions]
|
59
|
-
result.max_delivery_count.must_equal description_alternative[:max_delivery_count]
|
60
|
-
result.enable_batched_operations.must_equal description_alternative[:enable_batched_operations]
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should be able to create a new subscription with objects" do
|
64
|
-
subscriptionObject = Azure::ServiceBus::Subscription.new "my_other_sub"
|
65
|
-
subscriptionObject.topic = topic
|
66
|
-
subscriptionObject.max_delivery_count = 3
|
67
|
-
|
68
|
-
result = subject.create_subscription subscriptionObject
|
69
|
-
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
70
|
-
result.name.must_equal subscriptionObject.name
|
71
|
-
result.max_delivery_count.must_equal subscriptionObject.max_delivery_count
|
72
|
-
|
73
|
-
subject.delete_subscription result
|
74
|
-
end
|
75
|
-
|
76
|
-
describe "when a subscription exists" do
|
77
|
-
before { subject.create_subscription topic, subscription }
|
78
|
-
it "should be able to delete the subscription" do
|
79
|
-
subject.delete_subscription topic, subscription
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should be able to get the subscription" do
|
83
|
-
result = subject.get_subscription topic, subscription
|
84
|
-
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
85
|
-
result.name.must_equal subscription
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should be able to list subscriptions" do
|
89
|
-
result = subject.list_subscriptions topic
|
90
|
-
subscription_found = false
|
91
|
-
result.each { |s|
|
92
|
-
subscription_found = true if s.name == subscription
|
93
|
-
}
|
94
|
-
assert subscription_found, "list_subscriptions didn't include the expected subscription"
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "when there are messages" do
|
98
|
-
let(:msg) {
|
99
|
-
m = Azure::ServiceBus::BrokeredMessage.new("some message body", {:prop1 => "val1"})
|
100
|
-
m.to = "me"
|
101
|
-
m.label = "my_label"
|
102
|
-
m
|
103
|
-
}
|
104
|
-
before {
|
105
|
-
subject.send_topic_message topic, msg
|
106
|
-
}
|
107
|
-
|
108
|
-
it "should be able to peek lock a message" do
|
109
|
-
retrieved = subject.peek_lock_subscription_message topic, subscription
|
110
|
-
|
111
|
-
retrieved.to.must_equal msg.to
|
112
|
-
retrieved.body.must_equal msg.body
|
113
|
-
retrieved.label.must_equal msg.label
|
114
|
-
|
115
|
-
retrieved = subject.read_delete_subscription_message topic, subscription, { :timeout => 1 }
|
116
|
-
retrieved.must_be_nil
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should be able to read delete a message" do
|
120
|
-
retrieved = subject.read_delete_subscription_message topic, subscription
|
121
|
-
|
122
|
-
retrieved.must_be :kind_of?, Azure::ServiceBus::BrokeredMessage
|
123
|
-
retrieved.body.must_equal msg.body
|
124
|
-
retrieved.to.must_equal msg.to
|
125
|
-
|
126
|
-
# it should be deleted
|
127
|
-
retrieved = subject.read_delete_subscription_message topic, subscription, { :timeout => 1 }
|
128
|
-
retrieved.must_be_nil
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should be able to unlock a message" do
|
132
|
-
retrieved = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
133
|
-
retrieved.body.must_equal msg.body
|
134
|
-
|
135
|
-
# There shouldn't be an available message in the queue
|
136
|
-
retrieved2 = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
137
|
-
retrieved2.must_be_nil
|
138
|
-
|
139
|
-
# Unlock the message
|
140
|
-
res = subject.unlock_subscription_message retrieved
|
141
|
-
res.must_be_nil
|
142
|
-
|
143
|
-
# The message should be available once again
|
144
|
-
retrieved = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
145
|
-
retrieved.body.must_equal msg.body
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should be able to read a message from a subscription" do
|
149
|
-
subject.send_topic_message topic, msg
|
150
|
-
retrieved = subject.receive_subscription_message topic, subscription
|
151
|
-
|
152
|
-
retrieved.to.must_equal msg.to
|
153
|
-
retrieved.body.must_equal msg.body
|
154
|
-
retrieved.label.must_equal msg.label
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe 'when there are multiple subscriptions' do
|
159
|
-
let(:subscription1) { ServiceBusTopicNameHelper.name }
|
160
|
-
let(:subscription2) { ServiceBusTopicNameHelper.name }
|
161
|
-
|
162
|
-
before {
|
163
|
-
subject.create_subscription topic, subscription1
|
164
|
-
subject.create_subscription topic, subscription2
|
165
|
-
}
|
166
|
-
|
167
|
-
it "should be able to list subscriptions" do
|
168
|
-
result = subject.list_subscriptions topic
|
169
|
-
|
170
|
-
subscription_found = false
|
171
|
-
subscription1_found = false
|
172
|
-
subscription2_found = false
|
173
|
-
|
174
|
-
result.each { |s|
|
175
|
-
subscription_found = true if s.name == subscription
|
176
|
-
subscription1_found = true if s.name == subscription1
|
177
|
-
subscription2_found = true if s.name == subscription2
|
178
|
-
}
|
179
|
-
|
180
|
-
assert (subscription_found and subscription1_found and subscription2_found), "list_subscriptions didn't include the expected subscriptions"
|
181
|
-
end
|
182
|
-
|
183
|
-
it "should be able to use $skip token" do
|
184
|
-
result = subject.list_subscriptions topic
|
185
|
-
result2 = subject.list_subscriptions topic, { :skip => 1 }
|
186
|
-
result2.length.must_equal result.length - 1
|
187
|
-
result2.continuation_token.must_be_nil
|
188
|
-
result2[0].id.must_equal result[1].id
|
189
|
-
end
|
190
|
-
|
191
|
-
it "should be able to use $top token" do
|
192
|
-
result = subject.list_subscriptions topic
|
193
|
-
result.length.wont_equal 1
|
194
|
-
result.continuation_token.must_be_nil
|
195
|
-
|
196
|
-
result2 = subject.list_subscriptions topic, { :top => 1 }
|
197
|
-
result2.continuation_token.wont_be_nil
|
198
|
-
result2.continuation_token[:skip].wont_be_nil
|
199
|
-
result2.continuation_token[:top].wont_be_nil
|
200
|
-
result2.length.must_equal 1
|
201
|
-
end
|
202
|
-
|
203
|
-
it "should be able to use $skip and $top token together" do
|
204
|
-
result = subject.list_subscriptions topic
|
205
|
-
result2 = subject.list_subscriptions topic, { :skip => 1, :top => 1 }
|
206
|
-
result2.length.must_equal 1
|
207
|
-
result2[0].id.must_equal result[1].id
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
1
|
+
#-------------------------------------------------------------------------
|
2
|
+
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
#--------------------------------------------------------------------------
|
15
|
+
require "integration/test_helper"
|
16
|
+
|
17
|
+
describe "ServiceBus Subscriptions" do
|
18
|
+
subject { Azure::ServiceBus::ServiceBusService.new }
|
19
|
+
after { ServiceBusTopicNameHelper.clean }
|
20
|
+
let(:topic){ ServiceBusTopicNameHelper.name }
|
21
|
+
let(:subscription) { "mySubscription" }
|
22
|
+
let(:subscription_alternative) { "mySubscription" }
|
23
|
+
let(:description_alternative) {{
|
24
|
+
:lock_duration => 'PT30S',
|
25
|
+
:requires_session => true,
|
26
|
+
:default_message_time_to_live => 'PT30M',
|
27
|
+
:dead_lettering_on_message_expiration => true,
|
28
|
+
:dead_lettering_on_filter_evaluation_exceptions => true,
|
29
|
+
:max_delivery_count => 20,
|
30
|
+
:enable_batched_operations => true
|
31
|
+
}}
|
32
|
+
|
33
|
+
before { subject.create_topic topic }
|
34
|
+
|
35
|
+
it "should be able to set description values to false" do
|
36
|
+
s = Azure::ServiceBus::Subscription.new(subscription, {
|
37
|
+
:requires_session => false
|
38
|
+
})
|
39
|
+
|
40
|
+
s.requires_session.must_equal false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be able to create a new subscription" do
|
44
|
+
result = subject.create_subscription topic, subscription
|
45
|
+
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
46
|
+
result.name.must_equal subscription
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be able to create a new subscription from a string and description Hash" do
|
50
|
+
result = subject.create_subscription topic, subscription_alternative, description_alternative
|
51
|
+
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
52
|
+
result.name.must_equal subscription_alternative
|
53
|
+
|
54
|
+
result.lock_duration.must_equal 30.0
|
55
|
+
result.requires_session.must_equal description_alternative[:requires_session]
|
56
|
+
result.default_message_time_to_live.must_equal 1800.0
|
57
|
+
result.dead_lettering_on_message_expiration.must_equal description_alternative[:dead_lettering_on_message_expiration]
|
58
|
+
result.dead_lettering_on_filter_evaluation_exceptions.must_equal description_alternative[:dead_lettering_on_filter_evaluation_exceptions]
|
59
|
+
result.max_delivery_count.must_equal description_alternative[:max_delivery_count]
|
60
|
+
result.enable_batched_operations.must_equal description_alternative[:enable_batched_operations]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should be able to create a new subscription with objects" do
|
64
|
+
subscriptionObject = Azure::ServiceBus::Subscription.new "my_other_sub"
|
65
|
+
subscriptionObject.topic = topic
|
66
|
+
subscriptionObject.max_delivery_count = 3
|
67
|
+
|
68
|
+
result = subject.create_subscription subscriptionObject
|
69
|
+
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
70
|
+
result.name.must_equal subscriptionObject.name
|
71
|
+
result.max_delivery_count.must_equal subscriptionObject.max_delivery_count
|
72
|
+
|
73
|
+
subject.delete_subscription result
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "when a subscription exists" do
|
77
|
+
before { subject.create_subscription topic, subscription }
|
78
|
+
it "should be able to delete the subscription" do
|
79
|
+
subject.delete_subscription topic, subscription
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should be able to get the subscription" do
|
83
|
+
result = subject.get_subscription topic, subscription
|
84
|
+
result.must_be :kind_of?, Azure::ServiceBus::Subscription
|
85
|
+
result.name.must_equal subscription
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should be able to list subscriptions" do
|
89
|
+
result = subject.list_subscriptions topic
|
90
|
+
subscription_found = false
|
91
|
+
result.each { |s|
|
92
|
+
subscription_found = true if s.name == subscription
|
93
|
+
}
|
94
|
+
assert subscription_found, "list_subscriptions didn't include the expected subscription"
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "when there are messages" do
|
98
|
+
let(:msg) {
|
99
|
+
m = Azure::ServiceBus::BrokeredMessage.new("some message body", {:prop1 => "val1"})
|
100
|
+
m.to = "me"
|
101
|
+
m.label = "my_label"
|
102
|
+
m
|
103
|
+
}
|
104
|
+
before {
|
105
|
+
subject.send_topic_message topic, msg
|
106
|
+
}
|
107
|
+
|
108
|
+
it "should be able to peek lock a message" do
|
109
|
+
retrieved = subject.peek_lock_subscription_message topic, subscription
|
110
|
+
|
111
|
+
retrieved.to.must_equal msg.to
|
112
|
+
retrieved.body.must_equal msg.body
|
113
|
+
retrieved.label.must_equal msg.label
|
114
|
+
|
115
|
+
retrieved = subject.read_delete_subscription_message topic, subscription, { :timeout => 1 }
|
116
|
+
retrieved.must_be_nil
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should be able to read delete a message" do
|
120
|
+
retrieved = subject.read_delete_subscription_message topic, subscription
|
121
|
+
|
122
|
+
retrieved.must_be :kind_of?, Azure::ServiceBus::BrokeredMessage
|
123
|
+
retrieved.body.must_equal msg.body
|
124
|
+
retrieved.to.must_equal msg.to
|
125
|
+
|
126
|
+
# it should be deleted
|
127
|
+
retrieved = subject.read_delete_subscription_message topic, subscription, { :timeout => 1 }
|
128
|
+
retrieved.must_be_nil
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should be able to unlock a message" do
|
132
|
+
retrieved = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
133
|
+
retrieved.body.must_equal msg.body
|
134
|
+
|
135
|
+
# There shouldn't be an available message in the queue
|
136
|
+
retrieved2 = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
137
|
+
retrieved2.must_be_nil
|
138
|
+
|
139
|
+
# Unlock the message
|
140
|
+
res = subject.unlock_subscription_message retrieved
|
141
|
+
res.must_be_nil
|
142
|
+
|
143
|
+
# The message should be available once again
|
144
|
+
retrieved = subject.peek_lock_subscription_message topic, subscription, { :timeout => 1 }
|
145
|
+
retrieved.body.must_equal msg.body
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should be able to read a message from a subscription" do
|
149
|
+
subject.send_topic_message topic, msg
|
150
|
+
retrieved = subject.receive_subscription_message topic, subscription
|
151
|
+
|
152
|
+
retrieved.to.must_equal msg.to
|
153
|
+
retrieved.body.must_equal msg.body
|
154
|
+
retrieved.label.must_equal msg.label
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe 'when there are multiple subscriptions' do
|
159
|
+
let(:subscription1) { ServiceBusTopicNameHelper.name }
|
160
|
+
let(:subscription2) { ServiceBusTopicNameHelper.name }
|
161
|
+
|
162
|
+
before {
|
163
|
+
subject.create_subscription topic, subscription1
|
164
|
+
subject.create_subscription topic, subscription2
|
165
|
+
}
|
166
|
+
|
167
|
+
it "should be able to list subscriptions" do
|
168
|
+
result = subject.list_subscriptions topic
|
169
|
+
|
170
|
+
subscription_found = false
|
171
|
+
subscription1_found = false
|
172
|
+
subscription2_found = false
|
173
|
+
|
174
|
+
result.each { |s|
|
175
|
+
subscription_found = true if s.name == subscription
|
176
|
+
subscription1_found = true if s.name == subscription1
|
177
|
+
subscription2_found = true if s.name == subscription2
|
178
|
+
}
|
179
|
+
|
180
|
+
assert (subscription_found and subscription1_found and subscription2_found), "list_subscriptions didn't include the expected subscriptions"
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should be able to use $skip token" do
|
184
|
+
result = subject.list_subscriptions topic
|
185
|
+
result2 = subject.list_subscriptions topic, { :skip => 1 }
|
186
|
+
result2.length.must_equal result.length - 1
|
187
|
+
result2.continuation_token.must_be_nil
|
188
|
+
result2[0].id.must_equal result[1].id
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should be able to use $top token" do
|
192
|
+
result = subject.list_subscriptions topic
|
193
|
+
result.length.wont_equal 1
|
194
|
+
result.continuation_token.must_be_nil
|
195
|
+
|
196
|
+
result2 = subject.list_subscriptions topic, { :top => 1 }
|
197
|
+
result2.continuation_token.wont_be_nil
|
198
|
+
result2.continuation_token[:skip].wont_be_nil
|
199
|
+
result2.continuation_token[:top].wont_be_nil
|
200
|
+
result2.length.must_equal 1
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should be able to use $skip and $top token together" do
|
204
|
+
result = subject.list_subscriptions topic
|
205
|
+
result2 = subject.list_subscriptions topic, { :skip => 1, :top => 1 }
|
206
|
+
result2.length.must_equal 1
|
207
|
+
result2[0].id.must_equal result[1].id
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -1,406 +1,406 @@
|
|
1
|
-
#-------------------------------------------------------------------------
|
2
|
-
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
#--------------------------------------------------------------------------
|
15
|
-
require "integration/test_helper"
|
16
|
-
# require "integration/test/service_bus/scenario_helper"
|
17
|
-
|
18
|
-
require "azure/service_bus/brokered_message"
|
19
|
-
|
20
|
-
describe "ServiceBus Topics Scenario" do
|
21
|
-
let(:topic_name){ ServiceBusTopicNameHelper.name }
|
22
|
-
let(:subscription_name1){ 'noRules' }
|
23
|
-
let(:subscription_name2){ 'intRuleSub' }
|
24
|
-
let(:subscription_name3){ 'strAndBoolRuleSub' }
|
25
|
-
let(:subscription_name4){ 'tripleMsgRuleSub' }
|
26
|
-
|
27
|
-
subject { Azure::ServiceBus::ServiceBusService.new }
|
28
|
-
after { ServiceBusTopicNameHelper.clean }
|
29
|
-
|
30
|
-
def setup_topic()
|
31
|
-
topics = subject.list_topics({ :skip => 20, :top => 2 })
|
32
|
-
topics.each { |t|
|
33
|
-
ScenarioHelper.out "Topic name is " + t.title
|
34
|
-
}
|
35
|
-
|
36
|
-
ScenarioHelper.out "checking if topic already exists " + topic_name
|
37
|
-
begin
|
38
|
-
subject.get_topic topic_name
|
39
|
-
ScenarioHelper.out "Topic already exists deleting it"
|
40
|
-
subject.delete_topic topic_name
|
41
|
-
rescue Azure::Core::Http::HTTPError => error
|
42
|
-
ScenarioHelper.out "could not get an existing topic (" + error.type + "), proceeding..."
|
43
|
-
error.status_code.must_equal 404
|
44
|
-
error.type.must_equal "ResourceNotFound"
|
45
|
-
end
|
46
|
-
|
47
|
-
t = Azure::ServiceBus::Topic.new(topic_name, {
|
48
|
-
:max_size_in_megabytes => 1024,
|
49
|
-
:requires_duplicate_detection => true,
|
50
|
-
:enable_batched_operations => true
|
51
|
-
})
|
52
|
-
t.max_size_in_megabytes.must_equal 1024
|
53
|
-
t.requires_duplicate_detection.must_equal true
|
54
|
-
t.enable_batched_operations.must_equal true
|
55
|
-
|
56
|
-
ScenarioHelper.out 'Creating topic ' + topic_name
|
57
|
-
t2 = subject.create_topic topic_name, {
|
58
|
-
:max_size_in_megabytes => 1024,
|
59
|
-
:requires_duplicate_detection => true,
|
60
|
-
:enable_batched_operations => true
|
61
|
-
}
|
62
|
-
t2.max_size_in_megabytes.must_equal 1024
|
63
|
-
t2.requires_duplicate_detection.must_equal true
|
64
|
-
t2.enable_batched_operations.must_equal true
|
65
|
-
|
66
|
-
success = false
|
67
|
-
retry_counter = 0
|
68
|
-
while !success && retry_counter < 5
|
69
|
-
begin
|
70
|
-
subject.get_topic topic_name
|
71
|
-
success = true
|
72
|
-
rescue error
|
73
|
-
ScenarioHelper.out "got error: " + error
|
74
|
-
retry_counter = retry_counter + 1
|
75
|
-
if retry_counter > 5
|
76
|
-
throw error
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def setup_subscriptions()
|
83
|
-
s = Azure::ServiceBus::Subscription.new(subscription_name1, {
|
84
|
-
:dead_lettering_on_filter_evaluation_exceptions => true,
|
85
|
-
:dead_lettering_on_message_expiration => true,
|
86
|
-
:enable_batched_operations => true,
|
87
|
-
:max_delivery_count => 20,
|
88
|
-
:requires_session => false
|
89
|
-
})
|
90
|
-
s.topic = topic_name
|
91
|
-
|
92
|
-
s_prime = subject.create_subscription s
|
93
|
-
s_prime.dead_lettering_on_filter_evaluation_exceptions.must_equal s.dead_lettering_on_filter_evaluation_exceptions
|
94
|
-
s_prime.dead_lettering_on_message_expiration.must_equal s.dead_lettering_on_message_expiration
|
95
|
-
s_prime.enable_batched_operations.must_equal s.enable_batched_operations
|
96
|
-
s_prime.max_delivery_count.must_equal s.max_delivery_count
|
97
|
-
s_prime.requires_session.must_equal s.requires_session
|
98
|
-
|
99
|
-
s2 = subject.create_subscription topic_name, subscription_name2, {
|
100
|
-
:dead_lettering_on_filter_evaluation_exceptions => true,
|
101
|
-
:dead_lettering_on_message_expiration => true,
|
102
|
-
:enable_batched_operations => true,
|
103
|
-
:max_delivery_count => 20,
|
104
|
-
:requires_session => false
|
105
|
-
}
|
106
|
-
s2.dead_lettering_on_filter_evaluation_exceptions.must_equal true
|
107
|
-
s2.dead_lettering_on_message_expiration.must_equal true
|
108
|
-
s2.enable_batched_operations.must_equal true
|
109
|
-
s2.max_delivery_count.must_equal 20
|
110
|
-
s2.requires_session.must_equal false
|
111
|
-
|
112
|
-
subject.create_subscription topic_name, subscription_name3
|
113
|
-
subject.create_subscription topic_name, subscription_name4
|
114
|
-
|
115
|
-
show_subscriptions
|
116
|
-
end
|
117
|
-
|
118
|
-
def setup_rules()
|
119
|
-
# See this topic for more information on what SQL filter strings are allowed:
|
120
|
-
# http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.sqlfilter.sqlexpression.aspx
|
121
|
-
# See this topic for more information on what SQL action strings are allowed:
|
122
|
-
# http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.sqlruleaction.sqlexpression
|
123
|
-
|
124
|
-
# subscription_name1 is left unchanged
|
125
|
-
|
126
|
-
# subscription_name2 gets a rule that works on integers
|
127
|
-
subject.delete_rule topic_name, subscription_name2, '$Default'
|
128
|
-
rule2 = Azure::ServiceBus::Rule.new('intType')
|
129
|
-
rule2.filter = Azure::ServiceBus::SqlFilter.new({
|
130
|
-
:sql_expression => 'int < 53'
|
131
|
-
})
|
132
|
-
subject.create_rule topic_name, subscription_name2, rule2.name, rule2.description
|
133
|
-
|
134
|
-
# subscription_name3 gets a rule that works on strings and booleans
|
135
|
-
subject.delete_rule topic_name, subscription_name3, '$Default'
|
136
|
-
rule3 = Azure::ServiceBus::Rule.new('strAndBoolRule')
|
137
|
-
rule3.topic = topic_name;
|
138
|
-
rule3.subscription = subscription_name3
|
139
|
-
rule3.filter = Azure::ServiceBus::SqlFilter.new({
|
140
|
-
:sql_expression => 'name LIKE \'%3\' OR user.even = TRUE'
|
141
|
-
})
|
142
|
-
subject.create_rule rule3
|
143
|
-
|
144
|
-
# subscription_name4 gets two rules to enable duplicate messages
|
145
|
-
lst = subject.list_rules topic_name, subscription_name4
|
146
|
-
rule4a = lst[0]
|
147
|
-
rule4a.action = Azure::ServiceBus::SqlRuleAction.new({
|
148
|
-
:sql_expression => 'SET trueRuleA=TRUE; ' +
|
149
|
-
'SET actionGuid=newid(); ' +
|
150
|
-
'SET actionDouble=3.5; ' +
|
151
|
-
'REMOVE int;'
|
152
|
-
})
|
153
|
-
subject.delete_rule rule4a
|
154
|
-
subject.create_rule rule4a
|
155
|
-
|
156
|
-
rule4b_title = 'trueRuleB'
|
157
|
-
action = Azure::ServiceBus::SqlRuleAction.new({
|
158
|
-
:sql_expression => 'SET trueRuleB=TRUE; ' +
|
159
|
-
'SET actionString=\'hello\'; ' +
|
160
|
-
# SQL uses '' to represent ' in strings.
|
161
|
-
'SET actionStringSingleQuote=\'\'\'\'; ' +
|
162
|
-
'SET actionStringDoubleQuote=\'"\'; ' +
|
163
|
-
# ReverseSolidus is just \
|
164
|
-
'SET actionStringReverseSolidus=\'\\\'; ' +
|
165
|
-
'SET actionStringSlashN=\'' + "\n" + '\'; ' +
|
166
|
-
'SET actionStringTab=\'' + "\t" + '\'; ' +
|
167
|
-
'SET actionNull=null; ' +
|
168
|
-
# "test" was originally a date, so this
|
169
|
-
# string gets converted into a date.
|
170
|
-
'SET test=\'1999-12-25\'; ' +
|
171
|
-
# There was no "actionNewDate" defined
|
172
|
-
# before, so this is a string.
|
173
|
-
'SET actionNewDate=\'1999-12-25\'; ' +
|
174
|
-
'REMOVE float;'
|
175
|
-
})
|
176
|
-
subject.create_rule topic_name, subscription_name4, rule4b_title, { "Action" => action.to_hash }
|
177
|
-
|
178
|
-
show_subscriptions
|
179
|
-
end
|
180
|
-
|
181
|
-
def send_messages()
|
182
|
-
expected_messages = []
|
183
|
-
expected_messages[0] = ScenarioHelper.create_issue_message '1', 'First message information', 'label1'
|
184
|
-
expected_messages[1] = ScenarioHelper.create_issue_message '2', 'Second message information', 'label2'
|
185
|
-
expected_messages[2] = ScenarioHelper.create_issue_message '3', 'Third message information', 'label3'
|
186
|
-
expected_messages[3] = ScenarioHelper.create_issue_message '4', 'Fourth message information', 'label4'
|
187
|
-
expected_messages.each { |message|
|
188
|
-
subject.send_topic_message topic_name, message
|
189
|
-
ScenarioHelper.out 'Message sent with id: ' + message.message_id + ' Body of $message ' + message.body
|
190
|
-
}
|
191
|
-
ScenarioHelper.out "Sleeping for 10 seconds to let SB process the messages"
|
192
|
-
sleep(10)
|
193
|
-
expected_messages
|
194
|
-
end
|
195
|
-
|
196
|
-
def show_subscriptions()
|
197
|
-
lst = subject.list_subscriptions topic_name
|
198
|
-
lst.each { |item|
|
199
|
-
show_rules item.title
|
200
|
-
}
|
201
|
-
end
|
202
|
-
|
203
|
-
def show_rules(sub_name)
|
204
|
-
ScenarioHelper.out 'Subscription: ' + sub_name
|
205
|
-
lst = subject.list_rules topic_name, sub_name
|
206
|
-
lst.each { |item|
|
207
|
-
ScenarioHelper.out ' Rule: ' + item.title
|
208
|
-
filter = item.filter
|
209
|
-
ScenarioHelper.out ' Filter: ' + filter.class.to_s
|
210
|
-
ScenarioHelper.out ' ' + filter.sql_expression
|
211
|
-
}
|
212
|
-
end
|
213
|
-
|
214
|
-
def get_message_counts()
|
215
|
-
topic = subject.get_topic topic_name
|
216
|
-
topic.title.must_equal topic_name
|
217
|
-
|
218
|
-
# Subscription 1
|
219
|
-
subscription1 = subject.get_subscription topic_name, subscription_name1
|
220
|
-
ScenarioHelper.out 'Subscription 1 message count: ' + subscription1.message_count.to_s
|
221
|
-
subscription1.message_count.must_equal 4
|
222
|
-
|
223
|
-
# Subscription 2
|
224
|
-
subscription2 = subject.get_subscription topic_name, subscription_name2
|
225
|
-
ScenarioHelper.out 'Subscription 2 message count ' + subscription2.message_count.to_s
|
226
|
-
subscription2.message_count.must_equal 2
|
227
|
-
|
228
|
-
# Subscription 3
|
229
|
-
subscription3 = subject.get_subscription topic_name, subscription_name3
|
230
|
-
ScenarioHelper.out 'Subscription 3 message count ' + subscription3.message_count.to_s
|
231
|
-
subscription3.message_count.must_equal 3
|
232
|
-
|
233
|
-
# Subscription 4
|
234
|
-
subscription4 = subject.get_subscription topic_name, subscription_name4
|
235
|
-
ScenarioHelper.out 'Subscription 4 message count ' + subscription4.message_count.to_s
|
236
|
-
subscription4.message_count.must_equal 8
|
237
|
-
end
|
238
|
-
|
239
|
-
def get_message_from_sub(expected_messages, subscription_name, exp_custom_props = nil)
|
240
|
-
ScenarioHelper.out "expected_messages: " + expected_messages.to_yaml
|
241
|
-
|
242
|
-
expected_count = expected_messages.length
|
243
|
-
if exp_custom_props == nil
|
244
|
-
exp_custom_props = []
|
245
|
-
for i in 1..expected_count
|
246
|
-
exp_custom_props[i-1] = nil
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
ScenarioHelper.out '=============================================='
|
251
|
-
ScenarioHelper.out 'Getting messages from ' +
|
252
|
-
'subscription ' + subscription_name +
|
253
|
-
', expecting ' + expected_count.to_s + ' messages'
|
254
|
-
|
255
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
256
|
-
ScenarioHelper.out 'Before getting any messages, Message count: ' + message_count.to_s
|
257
|
-
message_count.must_equal expected_count
|
258
|
-
|
259
|
-
# Peek the first message
|
260
|
-
message1 = subject.peek_lock_subscription_message topic_name, subscription_name, { :timeout => 20 }
|
261
|
-
ScenarioHelper.compare_messages expected_messages[0], message1, exp_custom_props[0]
|
262
|
-
|
263
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
264
|
-
ScenarioHelper.out 'Peek locked first message, Message count: ' + message_count.to_s
|
265
|
-
message_count.must_equal expected_count # Peek locked first message, count should not change
|
266
|
-
|
267
|
-
# Get the second message
|
268
|
-
message2 = subject.read_delete_subscription_message topic_name, subscription_name, { :timeout => 5 }
|
269
|
-
expected_count = expected_count - 1
|
270
|
-
ScenarioHelper.compare_messages expected_messages[1], message2, exp_custom_props[1]
|
271
|
-
|
272
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
273
|
-
ScenarioHelper.out 'RECEIVE_AND_DELETE second message, Message count: ' + message_count.to_s
|
274
|
-
message_count.must_equal expected_count # RECEIVE_AND_DELETE second message, count decrements
|
275
|
-
|
276
|
-
# Unlock and get the first message
|
277
|
-
subject.unlock_subscription_message message1
|
278
|
-
|
279
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
280
|
-
ScenarioHelper.out 'Unlocked first message, Message count: ' + message_count.to_s
|
281
|
-
message_count.must_equal expected_count # Unlocked first message, count stays the same
|
282
|
-
|
283
|
-
# Get the first unlocked message
|
284
|
-
message1again = subject.read_delete_subscription_message topic_name, subscription_name
|
285
|
-
expected_count = expected_count - 1
|
286
|
-
# Should be the original, now that it is unlocked
|
287
|
-
ScenarioHelper.compare_messages expected_messages[0], message1again, exp_custom_props[0]
|
288
|
-
|
289
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
290
|
-
ScenarioHelper.out 'got first message again, Message count: ' + message_count.to_s
|
291
|
-
message_count.must_equal expected_count # Got message one again (destructive), count should decrease
|
292
|
-
|
293
|
-
# Negative test, make sure unlocked messages cannot be deleted.
|
294
|
-
begin
|
295
|
-
subject.delete_subscription_message message1again.location
|
296
|
-
flunk 'Deleting a RECEIVEANDDELETE messasge should fail'
|
297
|
-
rescue Azure::Core::Http::HTTPError => error
|
298
|
-
ScenarioHelper.out "As expected, could not delete a deleted message"
|
299
|
-
error.status_code.must_equal 400
|
300
|
-
error.type.must_equal "Unknown"
|
301
|
-
end
|
302
|
-
|
303
|
-
if expected_count > 0
|
304
|
-
# Get the third
|
305
|
-
message3 = subject.peek_lock_subscription_message topic_name, subscription_name
|
306
|
-
ScenarioHelper.compare_messages expected_messages[2], message3, exp_custom_props[2]
|
307
|
-
|
308
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
309
|
-
ScenarioHelper.out 'Got third message, Message count: ' + message_count.to_s
|
310
|
-
message_count.must_equal expected_count # Peeked third message, count should not change
|
311
|
-
|
312
|
-
# Delete it
|
313
|
-
subject.delete_subscription_message message3
|
314
|
-
expected_count = expected_count - 1
|
315
|
-
|
316
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
317
|
-
ScenarioHelper.out 'Deleted third message, Message count: ' + message_count.to_s
|
318
|
-
message_count.must_equal expected_count # Deleted third message, count decrements
|
319
|
-
end
|
320
|
-
|
321
|
-
if expected_count > 0
|
322
|
-
# Get the fourth
|
323
|
-
message4 = subject.read_delete_subscription_message topic_name, subscription_name
|
324
|
-
expected_count = expected_count - 1
|
325
|
-
ScenarioHelper.compare_messages expected_messages[3], message4, exp_custom_props[3]
|
326
|
-
|
327
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
328
|
-
ScenarioHelper.out 'Got fourth message, Message count: ' + message_count.to_s
|
329
|
-
message_count.must_equal expected_count # Got fourth message, count decrements
|
330
|
-
end
|
331
|
-
|
332
|
-
# Get the rest of the messages
|
333
|
-
message_id = 4
|
334
|
-
while expected_count > 0 && message_count > 0
|
335
|
-
message = subject.read_delete_subscription_message topic_name, subscription_name
|
336
|
-
expected_count = expected_count - 1
|
337
|
-
ScenarioHelper.compare_messages expected_messages[message_id], message, exp_custom_props[message_id]
|
338
|
-
|
339
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
340
|
-
ScenarioHelper.out 'Got message #' + message_id.to_s + ' message, Message count: ' + message_count.to_s
|
341
|
-
message_count.must_equal expected_count
|
342
|
-
|
343
|
-
message_id = message_id + 1
|
344
|
-
end
|
345
|
-
|
346
|
-
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
347
|
-
ScenarioHelper.out 'Got all messages, Message count: ' + message_count.to_s
|
348
|
-
message_count.must_equal 0
|
349
|
-
end
|
350
|
-
|
351
|
-
it "should be able to upload many messages to a topic and read them back from all subscriptions" do
|
352
|
-
setup_topic
|
353
|
-
setup_subscriptions
|
354
|
-
setup_rules
|
355
|
-
|
356
|
-
messages = send_messages
|
357
|
-
|
358
|
-
get_message_counts
|
359
|
-
|
360
|
-
exp_sub1_messages = messages
|
361
|
-
exp_sub2_messages = [messages[0], messages[1]]
|
362
|
-
exp_sub3_messages = [messages[1], messages[2], messages[3]]
|
363
|
-
|
364
|
-
# The rules for subscription 4 add and remove custom properties.
|
365
|
-
exp_custom_props4 = []
|
366
|
-
exp_sub4_messages = []
|
367
|
-
for i in 1..4 do
|
368
|
-
tmp = ScenarioHelper.get_custom_properties i
|
369
|
-
tmp['trueRuleA'] = true
|
370
|
-
tmp['actionGuid'] = 'GUID'
|
371
|
-
tmp['actionDouble'] = 3.5
|
372
|
-
tmp['rulename'] = '$Default'
|
373
|
-
tmp.delete 'int'
|
374
|
-
exp_custom_props4[2*i-2] = tmp
|
375
|
-
exp_sub4_messages[2*i-2] = messages[i-1].dup
|
376
|
-
|
377
|
-
tmp = ScenarioHelper.get_custom_properties i
|
378
|
-
tmp['trueRuleB'] = true
|
379
|
-
tmp['actionString'] = 'hello'
|
380
|
-
tmp['actionStringSingleQuote'] = '\''
|
381
|
-
tmp['actionStringDoubleQuote'] = '"'
|
382
|
-
tmp['actionStringReverseSolidus'] = '\\'
|
383
|
-
tmp['actionStringSlashN'] = "\n"
|
384
|
-
tmp['actionStringTab'] = "\t"
|
385
|
-
# Null valued properties are not returned
|
386
|
-
|
387
|
-
# "test" was originally a date, so this is a date.
|
388
|
-
# This has to be GMT, because the updating string
|
389
|
-
# had no timezone information.
|
390
|
-
tmp['test'] = Time.gm(1999, 12, 25)
|
391
|
-
# There was no "actionNewDate" defined
|
392
|
-
# before, so this is a string.
|
393
|
-
tmp['actionNewDate'] = '1999-12-25'
|
394
|
-
tmp['rulename'] = 'trueRuleB'
|
395
|
-
tmp.delete 'float'
|
396
|
-
exp_custom_props4[2*i-1] = tmp
|
397
|
-
exp_sub4_messages[2*i-1] = messages[i-1].dup
|
398
|
-
end
|
399
|
-
|
400
|
-
|
401
|
-
get_message_from_sub exp_sub1_messages, subscription_name1
|
402
|
-
get_message_from_sub exp_sub2_messages, subscription_name2
|
403
|
-
get_message_from_sub exp_sub3_messages, subscription_name3
|
404
|
-
get_message_from_sub exp_sub4_messages, subscription_name4, exp_custom_props4
|
405
|
-
end
|
406
|
-
end
|
1
|
+
#-------------------------------------------------------------------------
|
2
|
+
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
#--------------------------------------------------------------------------
|
15
|
+
require "integration/test_helper"
|
16
|
+
# require "integration/test/service_bus/scenario_helper"
|
17
|
+
|
18
|
+
require "azure/service_bus/brokered_message"
|
19
|
+
|
20
|
+
describe "ServiceBus Topics Scenario" do
|
21
|
+
let(:topic_name){ ServiceBusTopicNameHelper.name }
|
22
|
+
let(:subscription_name1){ 'noRules' }
|
23
|
+
let(:subscription_name2){ 'intRuleSub' }
|
24
|
+
let(:subscription_name3){ 'strAndBoolRuleSub' }
|
25
|
+
let(:subscription_name4){ 'tripleMsgRuleSub' }
|
26
|
+
|
27
|
+
subject { Azure::ServiceBus::ServiceBusService.new }
|
28
|
+
after { ServiceBusTopicNameHelper.clean }
|
29
|
+
|
30
|
+
def setup_topic()
|
31
|
+
topics = subject.list_topics({ :skip => 20, :top => 2 })
|
32
|
+
topics.each { |t|
|
33
|
+
ScenarioHelper.out "Topic name is " + t.title
|
34
|
+
}
|
35
|
+
|
36
|
+
ScenarioHelper.out "checking if topic already exists " + topic_name
|
37
|
+
begin
|
38
|
+
subject.get_topic topic_name
|
39
|
+
ScenarioHelper.out "Topic already exists deleting it"
|
40
|
+
subject.delete_topic topic_name
|
41
|
+
rescue Azure::Core::Http::HTTPError => error
|
42
|
+
ScenarioHelper.out "could not get an existing topic (" + error.type + "), proceeding..."
|
43
|
+
error.status_code.must_equal 404
|
44
|
+
error.type.must_equal "ResourceNotFound"
|
45
|
+
end
|
46
|
+
|
47
|
+
t = Azure::ServiceBus::Topic.new(topic_name, {
|
48
|
+
:max_size_in_megabytes => 1024,
|
49
|
+
:requires_duplicate_detection => true,
|
50
|
+
:enable_batched_operations => true
|
51
|
+
})
|
52
|
+
t.max_size_in_megabytes.must_equal 1024
|
53
|
+
t.requires_duplicate_detection.must_equal true
|
54
|
+
t.enable_batched_operations.must_equal true
|
55
|
+
|
56
|
+
ScenarioHelper.out 'Creating topic ' + topic_name
|
57
|
+
t2 = subject.create_topic topic_name, {
|
58
|
+
:max_size_in_megabytes => 1024,
|
59
|
+
:requires_duplicate_detection => true,
|
60
|
+
:enable_batched_operations => true
|
61
|
+
}
|
62
|
+
t2.max_size_in_megabytes.must_equal 1024
|
63
|
+
t2.requires_duplicate_detection.must_equal true
|
64
|
+
t2.enable_batched_operations.must_equal true
|
65
|
+
|
66
|
+
success = false
|
67
|
+
retry_counter = 0
|
68
|
+
while !success && retry_counter < 5
|
69
|
+
begin
|
70
|
+
subject.get_topic topic_name
|
71
|
+
success = true
|
72
|
+
rescue error
|
73
|
+
ScenarioHelper.out "got error: " + error
|
74
|
+
retry_counter = retry_counter + 1
|
75
|
+
if retry_counter > 5
|
76
|
+
throw error
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def setup_subscriptions()
|
83
|
+
s = Azure::ServiceBus::Subscription.new(subscription_name1, {
|
84
|
+
:dead_lettering_on_filter_evaluation_exceptions => true,
|
85
|
+
:dead_lettering_on_message_expiration => true,
|
86
|
+
:enable_batched_operations => true,
|
87
|
+
:max_delivery_count => 20,
|
88
|
+
:requires_session => false
|
89
|
+
})
|
90
|
+
s.topic = topic_name
|
91
|
+
|
92
|
+
s_prime = subject.create_subscription s
|
93
|
+
s_prime.dead_lettering_on_filter_evaluation_exceptions.must_equal s.dead_lettering_on_filter_evaluation_exceptions
|
94
|
+
s_prime.dead_lettering_on_message_expiration.must_equal s.dead_lettering_on_message_expiration
|
95
|
+
s_prime.enable_batched_operations.must_equal s.enable_batched_operations
|
96
|
+
s_prime.max_delivery_count.must_equal s.max_delivery_count
|
97
|
+
s_prime.requires_session.must_equal s.requires_session
|
98
|
+
|
99
|
+
s2 = subject.create_subscription topic_name, subscription_name2, {
|
100
|
+
:dead_lettering_on_filter_evaluation_exceptions => true,
|
101
|
+
:dead_lettering_on_message_expiration => true,
|
102
|
+
:enable_batched_operations => true,
|
103
|
+
:max_delivery_count => 20,
|
104
|
+
:requires_session => false
|
105
|
+
}
|
106
|
+
s2.dead_lettering_on_filter_evaluation_exceptions.must_equal true
|
107
|
+
s2.dead_lettering_on_message_expiration.must_equal true
|
108
|
+
s2.enable_batched_operations.must_equal true
|
109
|
+
s2.max_delivery_count.must_equal 20
|
110
|
+
s2.requires_session.must_equal false
|
111
|
+
|
112
|
+
subject.create_subscription topic_name, subscription_name3
|
113
|
+
subject.create_subscription topic_name, subscription_name4
|
114
|
+
|
115
|
+
show_subscriptions
|
116
|
+
end
|
117
|
+
|
118
|
+
def setup_rules()
|
119
|
+
# See this topic for more information on what SQL filter strings are allowed:
|
120
|
+
# http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.sqlfilter.sqlexpression.aspx
|
121
|
+
# See this topic for more information on what SQL action strings are allowed:
|
122
|
+
# http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.sqlruleaction.sqlexpression
|
123
|
+
|
124
|
+
# subscription_name1 is left unchanged
|
125
|
+
|
126
|
+
# subscription_name2 gets a rule that works on integers
|
127
|
+
subject.delete_rule topic_name, subscription_name2, '$Default'
|
128
|
+
rule2 = Azure::ServiceBus::Rule.new('intType')
|
129
|
+
rule2.filter = Azure::ServiceBus::SqlFilter.new({
|
130
|
+
:sql_expression => 'int < 53'
|
131
|
+
})
|
132
|
+
subject.create_rule topic_name, subscription_name2, rule2.name, rule2.description
|
133
|
+
|
134
|
+
# subscription_name3 gets a rule that works on strings and booleans
|
135
|
+
subject.delete_rule topic_name, subscription_name3, '$Default'
|
136
|
+
rule3 = Azure::ServiceBus::Rule.new('strAndBoolRule')
|
137
|
+
rule3.topic = topic_name;
|
138
|
+
rule3.subscription = subscription_name3
|
139
|
+
rule3.filter = Azure::ServiceBus::SqlFilter.new({
|
140
|
+
:sql_expression => 'name LIKE \'%3\' OR user.even = TRUE'
|
141
|
+
})
|
142
|
+
subject.create_rule rule3
|
143
|
+
|
144
|
+
# subscription_name4 gets two rules to enable duplicate messages
|
145
|
+
lst = subject.list_rules topic_name, subscription_name4
|
146
|
+
rule4a = lst[0]
|
147
|
+
rule4a.action = Azure::ServiceBus::SqlRuleAction.new({
|
148
|
+
:sql_expression => 'SET trueRuleA=TRUE; ' +
|
149
|
+
'SET actionGuid=newid(); ' +
|
150
|
+
'SET actionDouble=3.5; ' +
|
151
|
+
'REMOVE int;'
|
152
|
+
})
|
153
|
+
subject.delete_rule rule4a
|
154
|
+
subject.create_rule rule4a
|
155
|
+
|
156
|
+
rule4b_title = 'trueRuleB'
|
157
|
+
action = Azure::ServiceBus::SqlRuleAction.new({
|
158
|
+
:sql_expression => 'SET trueRuleB=TRUE; ' +
|
159
|
+
'SET actionString=\'hello\'; ' +
|
160
|
+
# SQL uses '' to represent ' in strings.
|
161
|
+
'SET actionStringSingleQuote=\'\'\'\'; ' +
|
162
|
+
'SET actionStringDoubleQuote=\'"\'; ' +
|
163
|
+
# ReverseSolidus is just \
|
164
|
+
'SET actionStringReverseSolidus=\'\\\'; ' +
|
165
|
+
'SET actionStringSlashN=\'' + "\n" + '\'; ' +
|
166
|
+
'SET actionStringTab=\'' + "\t" + '\'; ' +
|
167
|
+
'SET actionNull=null; ' +
|
168
|
+
# "test" was originally a date, so this
|
169
|
+
# string gets converted into a date.
|
170
|
+
'SET test=\'1999-12-25\'; ' +
|
171
|
+
# There was no "actionNewDate" defined
|
172
|
+
# before, so this is a string.
|
173
|
+
'SET actionNewDate=\'1999-12-25\'; ' +
|
174
|
+
'REMOVE float;'
|
175
|
+
})
|
176
|
+
subject.create_rule topic_name, subscription_name4, rule4b_title, { "Action" => action.to_hash }
|
177
|
+
|
178
|
+
show_subscriptions
|
179
|
+
end
|
180
|
+
|
181
|
+
def send_messages()
|
182
|
+
expected_messages = []
|
183
|
+
expected_messages[0] = ScenarioHelper.create_issue_message '1', 'First message information', 'label1'
|
184
|
+
expected_messages[1] = ScenarioHelper.create_issue_message '2', 'Second message information', 'label2'
|
185
|
+
expected_messages[2] = ScenarioHelper.create_issue_message '3', 'Third message information', 'label3'
|
186
|
+
expected_messages[3] = ScenarioHelper.create_issue_message '4', 'Fourth message information', 'label4'
|
187
|
+
expected_messages.each { |message|
|
188
|
+
subject.send_topic_message topic_name, message
|
189
|
+
ScenarioHelper.out 'Message sent with id: ' + message.message_id + ' Body of $message ' + message.body
|
190
|
+
}
|
191
|
+
ScenarioHelper.out "Sleeping for 10 seconds to let SB process the messages"
|
192
|
+
sleep(10)
|
193
|
+
expected_messages
|
194
|
+
end
|
195
|
+
|
196
|
+
def show_subscriptions()
|
197
|
+
lst = subject.list_subscriptions topic_name
|
198
|
+
lst.each { |item|
|
199
|
+
show_rules item.title
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
def show_rules(sub_name)
|
204
|
+
ScenarioHelper.out 'Subscription: ' + sub_name
|
205
|
+
lst = subject.list_rules topic_name, sub_name
|
206
|
+
lst.each { |item|
|
207
|
+
ScenarioHelper.out ' Rule: ' + item.title
|
208
|
+
filter = item.filter
|
209
|
+
ScenarioHelper.out ' Filter: ' + filter.class.to_s
|
210
|
+
ScenarioHelper.out ' ' + filter.sql_expression
|
211
|
+
}
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_message_counts()
|
215
|
+
topic = subject.get_topic topic_name
|
216
|
+
topic.title.must_equal topic_name
|
217
|
+
|
218
|
+
# Subscription 1
|
219
|
+
subscription1 = subject.get_subscription topic_name, subscription_name1
|
220
|
+
ScenarioHelper.out 'Subscription 1 message count: ' + subscription1.message_count.to_s
|
221
|
+
subscription1.message_count.must_equal 4
|
222
|
+
|
223
|
+
# Subscription 2
|
224
|
+
subscription2 = subject.get_subscription topic_name, subscription_name2
|
225
|
+
ScenarioHelper.out 'Subscription 2 message count ' + subscription2.message_count.to_s
|
226
|
+
subscription2.message_count.must_equal 2
|
227
|
+
|
228
|
+
# Subscription 3
|
229
|
+
subscription3 = subject.get_subscription topic_name, subscription_name3
|
230
|
+
ScenarioHelper.out 'Subscription 3 message count ' + subscription3.message_count.to_s
|
231
|
+
subscription3.message_count.must_equal 3
|
232
|
+
|
233
|
+
# Subscription 4
|
234
|
+
subscription4 = subject.get_subscription topic_name, subscription_name4
|
235
|
+
ScenarioHelper.out 'Subscription 4 message count ' + subscription4.message_count.to_s
|
236
|
+
subscription4.message_count.must_equal 8
|
237
|
+
end
|
238
|
+
|
239
|
+
def get_message_from_sub(expected_messages, subscription_name, exp_custom_props = nil)
|
240
|
+
ScenarioHelper.out "expected_messages: " + expected_messages.to_yaml
|
241
|
+
|
242
|
+
expected_count = expected_messages.length
|
243
|
+
if exp_custom_props == nil
|
244
|
+
exp_custom_props = []
|
245
|
+
for i in 1..expected_count
|
246
|
+
exp_custom_props[i-1] = nil
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
ScenarioHelper.out '=============================================='
|
251
|
+
ScenarioHelper.out 'Getting messages from ' +
|
252
|
+
'subscription ' + subscription_name +
|
253
|
+
', expecting ' + expected_count.to_s + ' messages'
|
254
|
+
|
255
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
256
|
+
ScenarioHelper.out 'Before getting any messages, Message count: ' + message_count.to_s
|
257
|
+
message_count.must_equal expected_count
|
258
|
+
|
259
|
+
# Peek the first message
|
260
|
+
message1 = subject.peek_lock_subscription_message topic_name, subscription_name, { :timeout => 20 }
|
261
|
+
ScenarioHelper.compare_messages expected_messages[0], message1, exp_custom_props[0]
|
262
|
+
|
263
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
264
|
+
ScenarioHelper.out 'Peek locked first message, Message count: ' + message_count.to_s
|
265
|
+
message_count.must_equal expected_count # Peek locked first message, count should not change
|
266
|
+
|
267
|
+
# Get the second message
|
268
|
+
message2 = subject.read_delete_subscription_message topic_name, subscription_name, { :timeout => 5 }
|
269
|
+
expected_count = expected_count - 1
|
270
|
+
ScenarioHelper.compare_messages expected_messages[1], message2, exp_custom_props[1]
|
271
|
+
|
272
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
273
|
+
ScenarioHelper.out 'RECEIVE_AND_DELETE second message, Message count: ' + message_count.to_s
|
274
|
+
message_count.must_equal expected_count # RECEIVE_AND_DELETE second message, count decrements
|
275
|
+
|
276
|
+
# Unlock and get the first message
|
277
|
+
subject.unlock_subscription_message message1
|
278
|
+
|
279
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
280
|
+
ScenarioHelper.out 'Unlocked first message, Message count: ' + message_count.to_s
|
281
|
+
message_count.must_equal expected_count # Unlocked first message, count stays the same
|
282
|
+
|
283
|
+
# Get the first unlocked message
|
284
|
+
message1again = subject.read_delete_subscription_message topic_name, subscription_name
|
285
|
+
expected_count = expected_count - 1
|
286
|
+
# Should be the original, now that it is unlocked
|
287
|
+
ScenarioHelper.compare_messages expected_messages[0], message1again, exp_custom_props[0]
|
288
|
+
|
289
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
290
|
+
ScenarioHelper.out 'got first message again, Message count: ' + message_count.to_s
|
291
|
+
message_count.must_equal expected_count # Got message one again (destructive), count should decrease
|
292
|
+
|
293
|
+
# Negative test, make sure unlocked messages cannot be deleted.
|
294
|
+
begin
|
295
|
+
subject.delete_subscription_message message1again.location
|
296
|
+
flunk 'Deleting a RECEIVEANDDELETE messasge should fail'
|
297
|
+
rescue Azure::Core::Http::HTTPError => error
|
298
|
+
ScenarioHelper.out "As expected, could not delete a deleted message"
|
299
|
+
error.status_code.must_equal 400
|
300
|
+
error.type.must_equal "Unknown"
|
301
|
+
end
|
302
|
+
|
303
|
+
if expected_count > 0
|
304
|
+
# Get the third
|
305
|
+
message3 = subject.peek_lock_subscription_message topic_name, subscription_name
|
306
|
+
ScenarioHelper.compare_messages expected_messages[2], message3, exp_custom_props[2]
|
307
|
+
|
308
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
309
|
+
ScenarioHelper.out 'Got third message, Message count: ' + message_count.to_s
|
310
|
+
message_count.must_equal expected_count # Peeked third message, count should not change
|
311
|
+
|
312
|
+
# Delete it
|
313
|
+
subject.delete_subscription_message message3
|
314
|
+
expected_count = expected_count - 1
|
315
|
+
|
316
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
317
|
+
ScenarioHelper.out 'Deleted third message, Message count: ' + message_count.to_s
|
318
|
+
message_count.must_equal expected_count # Deleted third message, count decrements
|
319
|
+
end
|
320
|
+
|
321
|
+
if expected_count > 0
|
322
|
+
# Get the fourth
|
323
|
+
message4 = subject.read_delete_subscription_message topic_name, subscription_name
|
324
|
+
expected_count = expected_count - 1
|
325
|
+
ScenarioHelper.compare_messages expected_messages[3], message4, exp_custom_props[3]
|
326
|
+
|
327
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
328
|
+
ScenarioHelper.out 'Got fourth message, Message count: ' + message_count.to_s
|
329
|
+
message_count.must_equal expected_count # Got fourth message, count decrements
|
330
|
+
end
|
331
|
+
|
332
|
+
# Get the rest of the messages
|
333
|
+
message_id = 4
|
334
|
+
while expected_count > 0 && message_count > 0
|
335
|
+
message = subject.read_delete_subscription_message topic_name, subscription_name
|
336
|
+
expected_count = expected_count - 1
|
337
|
+
ScenarioHelper.compare_messages expected_messages[message_id], message, exp_custom_props[message_id]
|
338
|
+
|
339
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
340
|
+
ScenarioHelper.out 'Got message #' + message_id.to_s + ' message, Message count: ' + message_count.to_s
|
341
|
+
message_count.must_equal expected_count
|
342
|
+
|
343
|
+
message_id = message_id + 1
|
344
|
+
end
|
345
|
+
|
346
|
+
message_count = (subject.get_subscription topic_name, subscription_name).message_count
|
347
|
+
ScenarioHelper.out 'Got all messages, Message count: ' + message_count.to_s
|
348
|
+
message_count.must_equal 0
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should be able to upload many messages to a topic and read them back from all subscriptions" do
|
352
|
+
setup_topic
|
353
|
+
setup_subscriptions
|
354
|
+
setup_rules
|
355
|
+
|
356
|
+
messages = send_messages
|
357
|
+
|
358
|
+
get_message_counts
|
359
|
+
|
360
|
+
exp_sub1_messages = messages
|
361
|
+
exp_sub2_messages = [messages[0], messages[1]]
|
362
|
+
exp_sub3_messages = [messages[1], messages[2], messages[3]]
|
363
|
+
|
364
|
+
# The rules for subscription 4 add and remove custom properties.
|
365
|
+
exp_custom_props4 = []
|
366
|
+
exp_sub4_messages = []
|
367
|
+
for i in 1..4 do
|
368
|
+
tmp = ScenarioHelper.get_custom_properties i
|
369
|
+
tmp['trueRuleA'] = true
|
370
|
+
tmp['actionGuid'] = 'GUID'
|
371
|
+
tmp['actionDouble'] = 3.5
|
372
|
+
tmp['rulename'] = '$Default'
|
373
|
+
tmp.delete 'int'
|
374
|
+
exp_custom_props4[2*i-2] = tmp
|
375
|
+
exp_sub4_messages[2*i-2] = messages[i-1].dup
|
376
|
+
|
377
|
+
tmp = ScenarioHelper.get_custom_properties i
|
378
|
+
tmp['trueRuleB'] = true
|
379
|
+
tmp['actionString'] = 'hello'
|
380
|
+
tmp['actionStringSingleQuote'] = '\''
|
381
|
+
tmp['actionStringDoubleQuote'] = '"'
|
382
|
+
tmp['actionStringReverseSolidus'] = '\\'
|
383
|
+
tmp['actionStringSlashN'] = "\n"
|
384
|
+
tmp['actionStringTab'] = "\t"
|
385
|
+
# Null valued properties are not returned
|
386
|
+
|
387
|
+
# "test" was originally a date, so this is a date.
|
388
|
+
# This has to be GMT, because the updating string
|
389
|
+
# had no timezone information.
|
390
|
+
tmp['test'] = Time.gm(1999, 12, 25)
|
391
|
+
# There was no "actionNewDate" defined
|
392
|
+
# before, so this is a string.
|
393
|
+
tmp['actionNewDate'] = '1999-12-25'
|
394
|
+
tmp['rulename'] = 'trueRuleB'
|
395
|
+
tmp.delete 'float'
|
396
|
+
exp_custom_props4[2*i-1] = tmp
|
397
|
+
exp_sub4_messages[2*i-1] = messages[i-1].dup
|
398
|
+
end
|
399
|
+
|
400
|
+
|
401
|
+
get_message_from_sub exp_sub1_messages, subscription_name1
|
402
|
+
get_message_from_sub exp_sub2_messages, subscription_name2
|
403
|
+
get_message_from_sub exp_sub3_messages, subscription_name3
|
404
|
+
get_message_from_sub exp_sub4_messages, subscription_name4, exp_custom_props4
|
405
|
+
end
|
406
|
+
end
|