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.
Files changed (290) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/.travis.yml +10 -10
  4. data/ChangeLog.txt +70 -68
  5. data/Gemfile +15 -15
  6. data/README.md +618 -618
  7. data/Rakefile +133 -133
  8. data/azure.gemspec +44 -44
  9. data/lib/azure.rb +52 -52
  10. data/lib/azure/base_management/affinity_group.rb +32 -32
  11. data/lib/azure/base_management/base_management_service.rb +304 -304
  12. data/lib/azure/base_management/location.rb +27 -27
  13. data/lib/azure/base_management/management_http_request.rb +171 -171
  14. data/lib/azure/base_management/serialization.rb +129 -129
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -45
  16. data/lib/azure/blob/blob.rb +31 -31
  17. data/lib/azure/blob/blob_service.rb +1423 -1423
  18. data/lib/azure/blob/block.rb +30 -30
  19. data/lib/azure/blob/container.rb +31 -31
  20. data/lib/azure/blob/serialization.rb +284 -284
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -38
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +140 -140
  23. data/lib/azure/cloud_service_management/serialization.rb +117 -117
  24. data/lib/azure/core.rb +39 -39
  25. data/lib/azure/core/auth/authorizer.rb +36 -36
  26. data/lib/azure/core/auth/shared_key.rb +110 -110
  27. data/lib/azure/core/auth/shared_key_lite.rb +48 -48
  28. data/lib/azure/core/auth/signer.rb +48 -48
  29. data/lib/azure/core/configuration.rb +211 -211
  30. data/lib/azure/core/error.rb +22 -22
  31. data/lib/azure/core/filtered_service.rb +43 -43
  32. data/lib/azure/core/http/debug_filter.rb +35 -35
  33. data/lib/azure/core/http/http_error.rb +88 -88
  34. data/lib/azure/core/http/http_filter.rb +52 -52
  35. data/lib/azure/core/http/http_request.rb +157 -157
  36. data/lib/azure/core/http/http_response.rb +140 -140
  37. data/lib/azure/core/http/retry_policy.rb +73 -73
  38. data/lib/azure/core/http/signer_filter.rb +33 -33
  39. data/lib/azure/core/service.rb +62 -62
  40. data/lib/azure/core/signed_service.rb +42 -42
  41. data/lib/azure/core/utility.rb +190 -190
  42. data/lib/azure/queue/message.rb +29 -29
  43. data/lib/azure/queue/queue.rb +28 -28
  44. data/lib/azure/queue/queue_service.rb +567 -567
  45. data/lib/azure/queue/serialization.rb +106 -106
  46. data/lib/azure/service/access_policy.rb +25 -25
  47. data/lib/azure/service/cors.rb +11 -11
  48. data/lib/azure/service/cors_rule.rb +15 -15
  49. data/lib/azure/service/enumeration_results.rb +20 -20
  50. data/lib/azure/service/logging.rb +31 -31
  51. data/lib/azure/service/metrics.rb +30 -30
  52. data/lib/azure/service/retention_policy.rb +24 -24
  53. data/lib/azure/service/serialization.rb +297 -297
  54. data/lib/azure/service/signed_identifier.rb +29 -29
  55. data/lib/azure/service/storage_service.rb +82 -82
  56. data/lib/azure/service/storage_service_properties.rb +37 -37
  57. data/lib/azure/service_bus/action.rb +21 -21
  58. data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
  59. data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
  60. data/lib/azure/service_bus/brokered_message.rb +123 -123
  61. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
  62. data/lib/azure/service_bus/correlation_filter.rb +45 -45
  63. data/lib/azure/service_bus/empty_rule_action.rb +29 -29
  64. data/lib/azure/service_bus/false_filter.rb +38 -38
  65. data/lib/azure/service_bus/filter.rb +21 -21
  66. data/lib/azure/service_bus/interval.rb +103 -103
  67. data/lib/azure/service_bus/queue.rb +229 -229
  68. data/lib/azure/service_bus/relay.rb +87 -87
  69. data/lib/azure/service_bus/resource.rb +108 -108
  70. data/lib/azure/service_bus/rule.rb +97 -97
  71. data/lib/azure/service_bus/rule_aspect.rb +34 -34
  72. data/lib/azure/service_bus/serialization.rb +161 -161
  73. data/lib/azure/service_bus/service_bus_service.rb +896 -896
  74. data/lib/azure/service_bus/sql_filter.rb +50 -50
  75. data/lib/azure/service_bus/sql_rule_action.rb +50 -50
  76. data/lib/azure/service_bus/subscription.rb +183 -183
  77. data/lib/azure/service_bus/topic.rb +186 -186
  78. data/lib/azure/service_bus/true_filter.rb +38 -38
  79. data/lib/azure/sql_database_management/serialization.rb +111 -111
  80. data/lib/azure/sql_database_management/sql_database.rb +31 -31
  81. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -200
  82. data/lib/azure/storage_management/serialization.rb +184 -184
  83. data/lib/azure/storage_management/storage_account.rb +40 -40
  84. data/lib/azure/storage_management/storage_management_service.rb +166 -166
  85. data/lib/azure/table/auth/shared_key.rb +92 -92
  86. data/lib/azure/table/auth/shared_key_lite.rb +44 -44
  87. data/lib/azure/table/batch.rb +329 -329
  88. data/lib/azure/table/batch_response.rb +118 -118
  89. data/lib/azure/table/edmtype.rb +126 -126
  90. data/lib/azure/table/entity.rb +30 -30
  91. data/lib/azure/table/guid.rb +23 -23
  92. data/lib/azure/table/query.rb +111 -111
  93. data/lib/azure/table/serialization.rb +107 -107
  94. data/lib/azure/table/table_service.rb +559 -559
  95. data/lib/azure/version.rb +31 -31
  96. data/lib/azure/virtual_machine_image_management/serialization.rb +66 -66
  97. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -25
  98. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -25
  99. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +94 -94
  100. data/lib/azure/virtual_machine_management/serialization.rb +462 -462
  101. data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -45
  102. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +588 -588
  103. data/lib/azure/virtual_network_management/serialization.rb +190 -190
  104. data/lib/azure/virtual_network_management/virtual_network.rb +37 -37
  105. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
  106. data/test/fixtures/affinity_group.xml +33 -33
  107. data/test/fixtures/all_containers.xml +20 -20
  108. data/test/fixtures/all_tables.xml +22 -22
  109. data/test/fixtures/certificate.pem +21 -21
  110. data/test/fixtures/container_acl.xml +11 -11
  111. data/test/fixtures/create_sql_database_server.xml +1 -1
  112. data/test/fixtures/create_storage_desc_error.xml +5 -5
  113. data/test/fixtures/create_storage_extendedprop_error.xml +8 -8
  114. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -6
  115. data/test/fixtures/create_storage_full_error.xml +6 -6
  116. data/test/fixtures/create_storage_label_error.xml +5 -5
  117. data/test/fixtures/create_storage_location_error.xml +5 -5
  118. data/test/fixtures/create_storage_name_error.xml +6 -6
  119. data/test/fixtures/create_table_response_entry.xml +15 -15
  120. data/test/fixtures/delete_storage_container_error.xml +5 -5
  121. data/test/fixtures/delete_storage_error.xml +5 -5
  122. data/test/fixtures/deployment_error.xml +5 -5
  123. data/test/fixtures/get_storage_account_error.xml +5 -5
  124. data/test/fixtures/get_storage_account_properties.xml +31 -31
  125. data/test/fixtures/get_storage_account_properties_new.xml +31 -31
  126. data/test/fixtures/http_error.xml +5 -5
  127. data/test/fixtures/insert_entity_response_entry.xml +25 -25
  128. data/test/fixtures/list_affinity_groups.xml +22 -22
  129. data/test/fixtures/list_blobs.xml +120 -120
  130. data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
  131. data/test/fixtures/list_blocks_all.xml +22 -22
  132. data/test/fixtures/list_blocks_committed.xml +12 -12
  133. data/test/fixtures/list_cloud_services.xml +38 -38
  134. data/test/fixtures/list_containers.xml +37 -37
  135. data/test/fixtures/list_firewall_management_endpoint.xml +27 -27
  136. data/test/fixtures/list_images.xml +110 -110
  137. data/test/fixtures/list_locations.xml +62 -62
  138. data/test/fixtures/list_page_ranges.xml +10 -10
  139. data/test/fixtures/list_sql_database.xml +36 -36
  140. data/test/fixtures/list_sql_server_firewall.xml +23 -23
  141. data/test/fixtures/list_storage_account_single.xml +24 -24
  142. data/test/fixtures/list_storage_accounts.xml +45 -45
  143. data/test/fixtures/list_virtual_networks.xml +92 -92
  144. data/test/fixtures/logging.xml +11 -11
  145. data/test/fixtures/management_certificate.pem +55 -55
  146. data/test/fixtures/messages.xml +12 -12
  147. data/test/fixtures/metrics.xml +10 -10
  148. data/test/fixtures/privatekey.key +28 -28
  149. data/test/fixtures/query_entities_empty_response.xml +7 -7
  150. data/test/fixtures/query_entities_response.xml +45 -45
  151. data/test/fixtures/queue_service_properties.xml +22 -22
  152. data/test/fixtures/queue_service_properties_original.xml +19 -19
  153. data/test/fixtures/queues.xml +16 -16
  154. data/test/fixtures/retention_policy.xml +5 -5
  155. data/test/fixtures/sb_default_create_queue_response.xml +23 -23
  156. data/test/fixtures/sb_default_create_relay_response.xml +15 -15
  157. data/test/fixtures/sb_default_create_topic_response.xml +18 -18
  158. data/test/fixtures/sb_get_access_token_response.txt +1 -1
  159. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
  160. data/test/fixtures/storage_service_properties.xml +54 -54
  161. data/test/fixtures/update_storage_account.xml +16 -16
  162. data/test/fixtures/update_storage_error.xml +4 -4
  163. data/test/fixtures/updated_storage_accounts.xml +52 -52
  164. data/test/fixtures/virtual_machine.xml +113 -113
  165. data/test/fixtures/windows_virtual_machine.xml +106 -106
  166. data/test/integration/affinity_group/Affinity_test.rb +55 -55
  167. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
  168. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
  169. data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
  170. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
  171. data/test/integration/blob/blob_gb18030_test.rb +199 -199
  172. data/test/integration/blob/blob_metadata_test.rb +75 -75
  173. data/test/integration/blob/blob_pages_test.rb +119 -119
  174. data/test/integration/blob/blob_properties_test.rb +77 -77
  175. data/test/integration/blob/block_blob_test.rb +254 -254
  176. data/test/integration/blob/container/container_acl_test.rb +69 -69
  177. data/test/integration/blob/container/container_metadata_test.rb +50 -50
  178. data/test/integration/blob/container/create_container_test.rb +60 -60
  179. data/test/integration/blob/container/delete_container_test.rb +39 -39
  180. data/test/integration/blob/container/get_container_properties_test.rb +48 -48
  181. data/test/integration/blob/container/list_containers_test.rb +79 -79
  182. data/test/integration/blob/container/root_container_test.rb +53 -53
  183. data/test/integration/blob/copy_blob_test.rb +113 -113
  184. data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
  185. data/test/integration/blob/create_page_blob_test.rb +83 -83
  186. data/test/integration/blob/delete_blob_test.rb +159 -159
  187. data/test/integration/blob/get_blob_test.rb +65 -65
  188. data/test/integration/blob/informative_errors_test.rb +38 -38
  189. data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
  190. data/test/integration/blob/lease/break_lease_test.rb +40 -40
  191. data/test/integration/blob/lease/release_lease_test.rb +40 -40
  192. data/test/integration/blob/lease/renew_lease_test.rb +42 -42
  193. data/test/integration/blob/list_blobs_test.rb +113 -113
  194. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -44
  195. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -44
  196. data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
  197. data/test/integration/database/create_sql_server_test.rb +53 -53
  198. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -70
  199. data/test/integration/database/delete_sql_server_test.rb +58 -58
  200. data/test/integration/database/list_sql_server_firewall_test.rb +45 -45
  201. data/test/integration/database/list_sql_servers_test.rb +44 -44
  202. data/test/integration/database/reset_password_sql_server_test.rb +55 -55
  203. data/test/integration/location/Location_List_test.rb +39 -39
  204. data/test/integration/queue/clear_messages_test.rb +42 -42
  205. data/test/integration/queue/create_message_test.rb +75 -75
  206. data/test/integration/queue/create_queue_test.rb +50 -50
  207. data/test/integration/queue/delete_message_test.rb +67 -67
  208. data/test/integration/queue/delete_queue_test.rb +45 -45
  209. data/test/integration/queue/informative_errors_test.rb +41 -41
  210. data/test/integration/queue/list_messages_encoded_test.rb +79 -79
  211. data/test/integration/queue/list_messages_test.rb +79 -79
  212. data/test/integration/queue/list_queues_test.rb +44 -44
  213. data/test/integration/queue/peek_messages_test.rb +59 -59
  214. data/test/integration/queue/queue_gb18030_test.rb +131 -131
  215. data/test/integration/queue/queue_metadata_test.rb +40 -40
  216. data/test/integration/queue/update_message_test.rb +74 -74
  217. data/test/integration/service_bus/informative_errors_test.rb +36 -36
  218. data/test/integration/service_bus/queues_scenario_test.rb +200 -200
  219. data/test/integration/service_bus/queues_test.rb +265 -265
  220. data/test/integration/service_bus/relay_test.rb +131 -131
  221. data/test/integration/service_bus/rules_test.rb +144 -144
  222. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
  223. data/test/integration/service_bus/scenario_test.rb +101 -101
  224. data/test/integration/service_bus/subscriptions_test.rb +211 -211
  225. data/test/integration/service_bus/topics_scenario_test.rb +406 -406
  226. data/test/integration/service_bus/topics_test.rb +129 -129
  227. data/test/integration/storage_management/storage_management_test.rb +160 -160
  228. data/test/integration/table/create_table_test.rb +35 -35
  229. data/test/integration/table/delete_entity_batch_test.rb +106 -106
  230. data/test/integration/table/delete_entity_test.rb +93 -93
  231. data/test/integration/table/delete_table_test.rb +39 -39
  232. data/test/integration/table/get_table_test.rb +36 -36
  233. data/test/integration/table/informative_errors_test.rb +38 -38
  234. data/test/integration/table/insert_entity_batch_test.rb +99 -99
  235. data/test/integration/table/insert_entity_test.rb +87 -87
  236. data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
  237. data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
  238. data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
  239. data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
  240. data/test/integration/table/merge_entity_batch_test.rb +127 -127
  241. data/test/integration/table/merge_entity_test.rb +112 -112
  242. data/test/integration/table/query_entities_test.rb +194 -194
  243. data/test/integration/table/query_tables_test.rb +42 -42
  244. data/test/integration/table/query_test.rb +250 -250
  245. data/test/integration/table/table_acl_test.rb +51 -51
  246. data/test/integration/table/table_gb18030_test.rb +355 -355
  247. data/test/integration/table/update_entity_batch_test.rb +148 -148
  248. data/test/integration/table/update_entity_test.rb +130 -130
  249. data/test/integration/test_helper.rb +42 -42
  250. data/test/integration/vm/VM_Create_test.rb +260 -260
  251. data/test/integration/vm/VM_Delete_test.rb +55 -55
  252. data/test/integration/vm/VM_Operations_test.rb +173 -173
  253. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
  254. data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
  255. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
  256. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
  257. data/test/support/env.rb +19 -19
  258. data/test/support/fixtures.rb +36 -36
  259. data/test/support/name_generator.rb +168 -168
  260. data/test/support/stubs.rb +42 -42
  261. data/test/support/virtual_machine_name_generator.rb +102 -102
  262. data/test/support/virtual_network_helper.rb +73 -73
  263. data/test/test_helper.rb +53 -53
  264. data/test/unit/affinity_group/affinity_group_test.rb +192 -192
  265. data/test/unit/affinity_group/serialization_test.rb +88 -88
  266. data/test/unit/base_management/location_test.rb +57 -57
  267. data/test/unit/blob/blob_service_test.rb +1946 -1946
  268. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
  269. data/test/unit/cloud_service_management/serialization_test.rb +169 -169
  270. data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
  271. data/test/unit/core/auth/shared_key_test.rb +58 -58
  272. data/test/unit/core/auth/signer_test.rb +30 -30
  273. data/test/unit/core/http/http_error_test.rb +57 -57
  274. data/test/unit/core/http/http_request_test.rb +66 -66
  275. data/test/unit/core/http/http_response_test.rb +45 -45
  276. data/test/unit/core/http/retry_policy_test.rb +23 -23
  277. data/test/unit/database/serialization_test.rb +97 -97
  278. data/test/unit/database/sql_database_server_service_test.rb +288 -288
  279. data/test/unit/service/serialization_test.rb +532 -532
  280. data/test/unit/service/storage_service_test.rb +292 -292
  281. data/test/unit/storage_management/serialization_test.rb +232 -232
  282. data/test/unit/storage_management/storage_management_service_test.rb +261 -261
  283. data/test/unit/table/edmtype_test.rb +107 -107
  284. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -35
  285. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -65
  286. data/test/unit/virtual_machine_management/serialization_test.rb +258 -258
  287. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -440
  288. data/test/unit/vnet/serialization_test.rb +187 -187
  289. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
  290. 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