azure-plus 0.6.5

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 (298) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +11 -0
  4. data/ChangeLog.txt +40 -0
  5. data/Gemfile +16 -0
  6. data/README.md +590 -0
  7. data/Rakefile +129 -0
  8. data/azure.gemspec +47 -0
  9. data/lib/azure.rb +52 -0
  10. data/lib/azure/base_management/affinity_group.rb +32 -0
  11. data/lib/azure/base_management/base_management_service.rb +238 -0
  12. data/lib/azure/base_management/location.rb +27 -0
  13. data/lib/azure/base_management/management_http_request.rb +244 -0
  14. data/lib/azure/base_management/serialization.rb +129 -0
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -0
  16. data/lib/azure/blob/blob.rb +32 -0
  17. data/lib/azure/blob/blob_service.rb +1424 -0
  18. data/lib/azure/blob/block.rb +31 -0
  19. data/lib/azure/blob/container.rb +32 -0
  20. data/lib/azure/blob/serialization.rb +285 -0
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +361 -0
  23. data/lib/azure/cloud_service_management/configuration_set.rb +28 -0
  24. data/lib/azure/cloud_service_management/deployment.rb +64 -0
  25. data/lib/azure/cloud_service_management/input_endpoint.rb +29 -0
  26. data/lib/azure/cloud_service_management/instance_endpoint.rb +31 -0
  27. data/lib/azure/cloud_service_management/persistent_vm_downtime.rb +29 -0
  28. data/lib/azure/cloud_service_management/role.rb +30 -0
  29. data/lib/azure/cloud_service_management/role_instance.rb +40 -0
  30. data/lib/azure/cloud_service_management/serialization.rb +329 -0
  31. data/lib/azure/cloud_service_management/virtual_ip.rb +29 -0
  32. data/lib/azure/core.rb +39 -0
  33. data/lib/azure/core/auth/authorizer.rb +36 -0
  34. data/lib/azure/core/auth/shared_key.rb +110 -0
  35. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  36. data/lib/azure/core/auth/signer.rb +48 -0
  37. data/lib/azure/core/configuration.rb +211 -0
  38. data/lib/azure/core/error.rb +22 -0
  39. data/lib/azure/core/filtered_service.rb +44 -0
  40. data/lib/azure/core/http/debug_filter.rb +36 -0
  41. data/lib/azure/core/http/http_error.rb +88 -0
  42. data/lib/azure/core/http/http_filter.rb +53 -0
  43. data/lib/azure/core/http/http_request.rb +159 -0
  44. data/lib/azure/core/http/http_response.rb +140 -0
  45. data/lib/azure/core/http/retry_policy.rb +74 -0
  46. data/lib/azure/core/http/signer_filter.rb +34 -0
  47. data/lib/azure/core/service.rb +63 -0
  48. data/lib/azure/core/signed_service.rb +43 -0
  49. data/lib/azure/core/utility.rb +190 -0
  50. data/lib/azure/queue/message.rb +30 -0
  51. data/lib/azure/queue/queue.rb +29 -0
  52. data/lib/azure/queue/queue_service.rb +568 -0
  53. data/lib/azure/queue/serialization.rb +106 -0
  54. data/lib/azure/service/access_policy.rb +26 -0
  55. data/lib/azure/service/enumeration_results.rb +21 -0
  56. data/lib/azure/service/logging.rb +32 -0
  57. data/lib/azure/service/metrics.rb +31 -0
  58. data/lib/azure/service/retention_policy.rb +25 -0
  59. data/lib/azure/service/serialization.rb +240 -0
  60. data/lib/azure/service/signed_identifier.rb +30 -0
  61. data/lib/azure/service/storage_service.rb +79 -0
  62. data/lib/azure/service/storage_service_properties.rb +32 -0
  63. data/lib/azure/service_bus/action.rb +21 -0
  64. data/lib/azure/service_bus/auth/wrap_service.rb +89 -0
  65. data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
  66. data/lib/azure/service_bus/brokered_message.rb +124 -0
  67. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  68. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  69. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  70. data/lib/azure/service_bus/false_filter.rb +38 -0
  71. data/lib/azure/service_bus/filter.rb +21 -0
  72. data/lib/azure/service_bus/interval.rb +104 -0
  73. data/lib/azure/service_bus/queue.rb +230 -0
  74. data/lib/azure/service_bus/resource.rb +109 -0
  75. data/lib/azure/service_bus/rule.rb +98 -0
  76. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  77. data/lib/azure/service_bus/serialization.rb +160 -0
  78. data/lib/azure/service_bus/service_bus_service.rb +829 -0
  79. data/lib/azure/service_bus/sql_filter.rb +50 -0
  80. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  81. data/lib/azure/service_bus/subscription.rb +184 -0
  82. data/lib/azure/service_bus/topic.rb +187 -0
  83. data/lib/azure/service_bus/true_filter.rb +38 -0
  84. data/lib/azure/sql_database_management/serialization.rb +111 -0
  85. data/lib/azure/sql_database_management/sql_database.rb +31 -0
  86. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -0
  87. data/lib/azure/storage_management/serialization.rb +184 -0
  88. data/lib/azure/storage_management/storage_account.rb +40 -0
  89. data/lib/azure/storage_management/storage_management_service.rb +166 -0
  90. data/lib/azure/table/auth/shared_key.rb +92 -0
  91. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  92. data/lib/azure/table/batch.rb +330 -0
  93. data/lib/azure/table/batch_response.rb +118 -0
  94. data/lib/azure/table/edmtype.rb +127 -0
  95. data/lib/azure/table/entity.rb +31 -0
  96. data/lib/azure/table/guid.rb +24 -0
  97. data/lib/azure/table/query.rb +112 -0
  98. data/lib/azure/table/serialization.rb +108 -0
  99. data/lib/azure/table/table_service.rb +560 -0
  100. data/lib/azure/version.rb +31 -0
  101. data/lib/azure/virtual_machine_image_management/serialization.rb +51 -0
  102. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  103. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  104. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -0
  105. data/lib/azure/virtual_machine_management/serialization.rb +436 -0
  106. data/lib/azure/virtual_machine_management/virtual_machine.rb +42 -0
  107. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +549 -0
  108. data/lib/azure/virtual_network_management/serialization.rb +186 -0
  109. data/lib/azure/virtual_network_management/virtual_network.rb +36 -0
  110. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -0
  111. data/test/fixtures/32px-fulls-black.jpg +0 -0
  112. data/test/fixtures/affinity_group.xml +33 -0
  113. data/test/fixtures/all_containers.xml +20 -0
  114. data/test/fixtures/all_tables.xml +22 -0
  115. data/test/fixtures/certificate.pem +21 -0
  116. data/test/fixtures/container_acl.xml +11 -0
  117. data/test/fixtures/create_sql_database_server.xml +2 -0
  118. data/test/fixtures/create_storage_desc_error.xml +5 -0
  119. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  120. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  121. data/test/fixtures/create_storage_full_error.xml +6 -0
  122. data/test/fixtures/create_storage_label_error.xml +5 -0
  123. data/test/fixtures/create_storage_location_error.xml +5 -0
  124. data/test/fixtures/create_storage_name_error.xml +6 -0
  125. data/test/fixtures/create_table_response_entry.xml +15 -0
  126. data/test/fixtures/delete_storage_container_error.xml +5 -0
  127. data/test/fixtures/delete_storage_error.xml +5 -0
  128. data/test/fixtures/deployment_error.xml +5 -0
  129. data/test/fixtures/empty_xml_file +0 -0
  130. data/test/fixtures/get_deployment.xml +94 -0
  131. data/test/fixtures/get_deployment_existing.xml +94 -0
  132. data/test/fixtures/get_deployment_missing.xml +5 -0
  133. data/test/fixtures/get_storage_account_error.xml +5 -0
  134. data/test/fixtures/get_storage_account_properties.xml +32 -0
  135. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  136. data/test/fixtures/http_error.xml +5 -0
  137. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  138. data/test/fixtures/list_affinity_groups.xml +22 -0
  139. data/test/fixtures/list_blobs.xml +121 -0
  140. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  141. data/test/fixtures/list_blocks_all.xml +23 -0
  142. data/test/fixtures/list_blocks_committed.xml +13 -0
  143. data/test/fixtures/list_cloud_services.xml +39 -0
  144. data/test/fixtures/list_containers.xml +38 -0
  145. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  146. data/test/fixtures/list_images.xml +110 -0
  147. data/test/fixtures/list_locations.xml +62 -0
  148. data/test/fixtures/list_page_ranges.xml +11 -0
  149. data/test/fixtures/list_sql_database.xml +36 -0
  150. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  151. data/test/fixtures/list_storage_account_single.xml +25 -0
  152. data/test/fixtures/list_storage_accounts.xml +46 -0
  153. data/test/fixtures/list_virtual_networks.xml +92 -0
  154. data/test/fixtures/logging.xml +11 -0
  155. data/test/fixtures/management_certificate.pem +55 -0
  156. data/test/fixtures/messages.xml +12 -0
  157. data/test/fixtures/metrics.xml +10 -0
  158. data/test/fixtures/privatekey.key +28 -0
  159. data/test/fixtures/query_entities_empty_response.xml +7 -0
  160. data/test/fixtures/query_entities_response.xml +45 -0
  161. data/test/fixtures/queue_service_properties.xml +22 -0
  162. data/test/fixtures/queue_service_properties_original.xml +19 -0
  163. data/test/fixtures/queues.xml +16 -0
  164. data/test/fixtures/retention_policy.xml +5 -0
  165. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  166. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  167. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  168. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  169. data/test/fixtures/storage_service_properties.xml +23 -0
  170. data/test/fixtures/update_storage_account.xml +16 -0
  171. data/test/fixtures/update_storage_error.xml +5 -0
  172. data/test/fixtures/updated_storage_accounts.xml +53 -0
  173. data/test/fixtures/virtual_machine.xml +113 -0
  174. data/test/fixtures/windows_virtual_machine.xml +106 -0
  175. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  176. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -0
  177. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  178. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  179. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -0
  180. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  181. data/test/integration/blob/blob_metadata_test.rb +75 -0
  182. data/test/integration/blob/blob_pages_test.rb +119 -0
  183. data/test/integration/blob/blob_properties_test.rb +77 -0
  184. data/test/integration/blob/block_blob_test.rb +254 -0
  185. data/test/integration/blob/container/container_acl_test.rb +69 -0
  186. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  187. data/test/integration/blob/container/create_container_test.rb +60 -0
  188. data/test/integration/blob/container/delete_container_test.rb +39 -0
  189. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  190. data/test/integration/blob/container/list_containers_test.rb +79 -0
  191. data/test/integration/blob/container/root_container_test.rb +54 -0
  192. data/test/integration/blob/copy_blob_test.rb +113 -0
  193. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  194. data/test/integration/blob/create_page_blob_test.rb +83 -0
  195. data/test/integration/blob/delete_blob_test.rb +159 -0
  196. data/test/integration/blob/get_blob_test.rb +65 -0
  197. data/test/integration/blob/informative_errors_test.rb +39 -0
  198. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  199. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  200. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  201. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  202. data/test/integration/blob/list_blobs_test.rb +113 -0
  203. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
  204. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
  205. data/test/integration/database/create_sql_server_firewall_test.rb +86 -0
  206. data/test/integration/database/create_sql_server_test.rb +53 -0
  207. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -0
  208. data/test/integration/database/delete_sql_server_test.rb +58 -0
  209. data/test/integration/database/list_sql_server_firewall_test.rb +45 -0
  210. data/test/integration/database/list_sql_servers_test.rb +44 -0
  211. data/test/integration/database/reset_password_sql_server_test.rb +55 -0
  212. data/test/integration/location/Location_List_test.rb +39 -0
  213. data/test/integration/queue/clear_messages_test.rb +42 -0
  214. data/test/integration/queue/create_message_test.rb +75 -0
  215. data/test/integration/queue/create_queue_test.rb +50 -0
  216. data/test/integration/queue/delete_message_test.rb +67 -0
  217. data/test/integration/queue/delete_queue_test.rb +45 -0
  218. data/test/integration/queue/informative_errors_test.rb +42 -0
  219. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  220. data/test/integration/queue/list_messages_test.rb +79 -0
  221. data/test/integration/queue/list_queues_test.rb +44 -0
  222. data/test/integration/queue/peek_messages_test.rb +59 -0
  223. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  224. data/test/integration/queue/queue_metadata_test.rb +40 -0
  225. data/test/integration/queue/update_message_test.rb +74 -0
  226. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  227. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  228. data/test/integration/service_bus/queues_test.rb +266 -0
  229. data/test/integration/service_bus/rules_test.rb +145 -0
  230. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  231. data/test/integration/service_bus/scenario_test.rb +101 -0
  232. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  233. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  234. data/test/integration/service_bus/topics_test.rb +129 -0
  235. data/test/integration/storage_management/storage_management_test.rb +160 -0
  236. data/test/integration/table/create_table_test.rb +36 -0
  237. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  238. data/test/integration/table/delete_entity_test.rb +94 -0
  239. data/test/integration/table/delete_table_test.rb +40 -0
  240. data/test/integration/table/get_table_test.rb +37 -0
  241. data/test/integration/table/informative_errors_test.rb +39 -0
  242. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  243. data/test/integration/table/insert_entity_test.rb +88 -0
  244. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  245. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  246. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  247. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  248. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  249. data/test/integration/table/merge_entity_test.rb +113 -0
  250. data/test/integration/table/query_entities_test.rb +195 -0
  251. data/test/integration/table/query_tables_test.rb +43 -0
  252. data/test/integration/table/query_test.rb +251 -0
  253. data/test/integration/table/table_acl_test.rb +52 -0
  254. data/test/integration/table/table_gb18030_test.rb +355 -0
  255. data/test/integration/table/update_entity_batch_test.rb +149 -0
  256. data/test/integration/table/update_entity_test.rb +131 -0
  257. data/test/integration/test_helper.rb +42 -0
  258. data/test/integration/vm/VM_Create_test.rb +260 -0
  259. data/test/integration/vm/VM_Delete_test.rb +55 -0
  260. data/test/integration/vm/VM_Operations_test.rb +173 -0
  261. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  262. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  263. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -0
  264. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -0
  265. data/test/support/env.rb +19 -0
  266. data/test/support/fixtures.rb +36 -0
  267. data/test/support/name_generator.rb +160 -0
  268. data/test/support/stubs.rb +42 -0
  269. data/test/support/virtual_machine_name_generator.rb +102 -0
  270. data/test/support/virtual_network_helper.rb +73 -0
  271. data/test/test_helper.rb +53 -0
  272. data/test/unit/affinity_group/affinity_group_test.rb +192 -0
  273. data/test/unit/affinity_group/serialization_test.rb +88 -0
  274. data/test/unit/base_management/location_test.rb +57 -0
  275. data/test/unit/blob/blob_service_test.rb +1947 -0
  276. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +276 -0
  277. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  278. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  279. data/test/unit/core/auth/shared_key_test.rb +58 -0
  280. data/test/unit/core/auth/signer_test.rb +30 -0
  281. data/test/unit/core/http/http_error_test.rb +57 -0
  282. data/test/unit/core/http/http_request_test.rb +66 -0
  283. data/test/unit/core/http/http_response_test.rb +45 -0
  284. data/test/unit/core/http/retry_policy_test.rb +23 -0
  285. data/test/unit/database/serialization_test.rb +97 -0
  286. data/test/unit/database/sql_database_server_service_test.rb +288 -0
  287. data/test/unit/service/serialization_test.rb +502 -0
  288. data/test/unit/service/storage_service_test.rb +291 -0
  289. data/test/unit/storage_management/serialization_test.rb +232 -0
  290. data/test/unit/storage_management/storage_management_service_test.rb +261 -0
  291. data/test/unit/table/edmtype_test.rb +108 -0
  292. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -0
  293. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -0
  294. data/test/unit/virtual_machine_management/serialization_test.rb +247 -0
  295. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -0
  296. data/test/unit/vnet/serialization_test.rb +187 -0
  297. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  298. metadata +470 -0
@@ -0,0 +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
@@ -0,0 +1,129 @@
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 Topics" do
18
+ subject { Azure::ServiceBus::ServiceBusService.new }
19
+ after { ServiceBusTopicNameHelper.clean }
20
+ let(:topic){ ServiceBusTopicNameHelper.name }
21
+ let(:topic_alternative){ ServiceBusTopicNameHelper.name }
22
+ let(:description_alternative) {{
23
+ :default_message_time_to_live => 'PT30M',
24
+ :maximum_number_of_subscriptions => 3,
25
+ :max_size_in_megabytes => 2048,
26
+ :requires_duplicate_detection => true,
27
+ :dead_lettering_on_filter_evaluation_exceptions => true,
28
+ :duplicate_detection_history_time_window => 'PT20M',
29
+ :enable_batched_operations => true,
30
+ }}
31
+
32
+ it "should be able to create a new topic" do
33
+ result = subject.create_topic topic, { :max_size_in_megabytes => 2048 }
34
+ result.must_be :kind_of?, Azure::ServiceBus::Topic
35
+ result.name.must_equal topic
36
+ result.max_size_in_megabytes.must_equal 2048
37
+ end
38
+
39
+ it "should be able to create a new topic from a string and description Hash" do
40
+ result = subject.create_topic topic_alternative, description_alternative
41
+ result.must_be :kind_of?, Azure::ServiceBus::Topic
42
+ result.name.must_equal topic_alternative
43
+
44
+ result.default_message_time_to_live.must_equal 1800.0
45
+ #result.maximum_number_of_subscriptions.must_equal description_alternative[:maximum_number_of_subscriptions]
46
+ result.max_size_in_megabytes.must_equal description_alternative[:max_size_in_megabytes]
47
+ result.requires_duplicate_detection.must_equal description_alternative[:requires_duplicate_detection]
48
+ result.dead_lettering_on_filter_evaluation_exceptions.must_equal description_alternative[:dead_lettering_on_filter_evaluation_exceptions]
49
+ result.duplicate_detection_history_time_window.must_equal 1200.0
50
+ result.enable_batched_operations.must_equal description_alternative[:enable_batched_operations]
51
+ end
52
+
53
+ describe "when a topic exists" do
54
+ before { subject.create_topic topic }
55
+
56
+ it "should be able to delete the topic" do
57
+ subject.delete_topic topic
58
+ end
59
+
60
+ it "should be able to get the topic" do
61
+ result = subject.get_topic topic
62
+ result.must_be :kind_of?, Azure::ServiceBus::Topic
63
+ result.name.must_equal topic
64
+ end
65
+
66
+ it "should be able to list topics" do
67
+ result = subject.list_topics
68
+ topic_found = false
69
+ result.each { |t|
70
+ topic_found = true if t.name == topic
71
+ }
72
+ assert topic_found, "list_topics didn't include the expected topic"
73
+ end
74
+
75
+ it "should be able to send the topic a message" do
76
+ message = Azure::ServiceBus::BrokeredMessage.new("some text", {:prop1 => "val1"}) do |m|
77
+ m.to = "me"
78
+ m.label = 'my_label'
79
+ end
80
+ result = subject.send_topic_message topic, message
81
+ result.must_be_nil
82
+ end
83
+
84
+ describe 'when there are multiple topics' do
85
+ let(:topic1) { ServiceBusTopicNameHelper.name }
86
+ let(:topic2) { ServiceBusTopicNameHelper.name }
87
+
88
+ before {
89
+ subject.create_topic topic1
90
+ subject.create_topic topic2
91
+ }
92
+
93
+ it "should be able to list topics" do
94
+ result = subject.list_topics
95
+ topic_found = false
96
+ topic1_found = false
97
+ topic2_found = false
98
+ result.each { |t|
99
+ topic_found = true if t.name == topic
100
+ topic1_found = true if t.name == topic1
101
+ topic2_found = true if t.name == topic2
102
+ }
103
+ assert (topic_found and topic1_found and topic2_found), "list_topics didn't include the expected topic"
104
+ end
105
+
106
+ it "should be able to use $skip token with list_topics" do
107
+ result = subject.list_topics
108
+ result2 = subject.list_topics({ :skip => 1 })
109
+ result2.length.must_equal result.length - 1
110
+ result2[0].id.must_equal result[1].id
111
+ end
112
+
113
+ it "should be able to use $top token with list_topics" do
114
+ result = subject.list_topics
115
+ result.length.wont_equal 1
116
+
117
+ result2 = subject.list_topics({ :top => 1 })
118
+ result2.length.must_equal 1
119
+ end
120
+
121
+ it "should be able to use $skip and $top token together with list_topics" do
122
+ result = subject.list_topics
123
+ result2 = subject.list_topics({ :skip => 1, :top => 1 })
124
+ result2.length.must_equal 1
125
+ result2[0].id.must_equal result[1].id
126
+ end
127
+ end
128
+ end
129
+ end