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,291 @@
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 "test_helper"
16
+ require "azure/service/storage_service"
17
+ require "azure/core/http/http_request"
18
+ require "azure/core/http/signer_filter"
19
+ require "azure/service/storage_service_properties"
20
+
21
+ describe Azure::Service::StorageService do
22
+
23
+ let(:uri){ URI.parse "http://dummy.uri/resource" }
24
+ let(:method){ :get }
25
+
26
+ subject do
27
+ storage_service = Azure::Service::StorageService.new
28
+ storage_service.host = "http://dumyhost.uri"
29
+ storage_service
30
+ end
31
+
32
+ describe "#call" do
33
+ let(:mock_request){ mock() }
34
+ let(:mock_signer_filter){ mock() }
35
+
36
+ before do
37
+ Azure::Core::Http::HttpRequest.stubs(:new).with(method, uri, nil).returns(mock_request)
38
+ Azure::Core::Http::SignerFilter.stubs(:new).returns(mock_signer_filter)
39
+
40
+ mock_request.expects(:call)
41
+ end
42
+
43
+ it "adds a SignerFilter to the HTTP pipeline" do
44
+ mock_request.expects(:with_filter).with(mock_signer_filter)
45
+ subject.call(method, uri)
46
+ end
47
+
48
+ describe "when passed the optional headers arguement" do
49
+ before do
50
+ mock_request.expects(:with_filter).with(mock_signer_filter)
51
+ end
52
+
53
+ let(:mock_headers) {{
54
+ "Other-Header"=>"SomeValue",
55
+ "Custom-Header"=>"PreviousValue",
56
+ "connection"=>"PreviousValue"
57
+ }}
58
+
59
+ it "merges the custom headers with the HttpRequest headers" do
60
+ mock_request.expects(:headers).returns(mock_headers).at_least(2)
61
+ subject.call(method, uri, nil, { "Custom-Header"=>"CustomValue"} )
62
+
63
+ mock_headers["Other-Header"].must_equal "SomeValue"
64
+ mock_headers["Custom-Header"].must_equal "CustomValue"
65
+ mock_headers["connection"].must_equal "keep-alive"
66
+ end
67
+ end
68
+
69
+ describe "when passed the optional body arguement" do
70
+ before do
71
+ mock_request.expects(:with_filter).with(mock_signer_filter)
72
+ end
73
+
74
+ it "passes the body to the to HttpRequest" do
75
+ Azure::Core::Http::HttpRequest.stubs(:new).with(method, uri, 'body').returns(mock_request)
76
+ subject.call(method, uri, "body")
77
+ end
78
+ end
79
+
80
+ describe "when with_filter was called" do
81
+ before do
82
+ mock_request.expects(:with_filter).with(mock_signer_filter)
83
+ end
84
+
85
+ it "builds the HTTP pipeline by passing the filters to the HTTPRequest" do
86
+ filter = mock()
87
+ filter1 = mock()
88
+
89
+ subject.with_filter filter
90
+ subject.with_filter filter1
91
+
92
+ mock_request.expects(:with_filter).with(filter)
93
+ mock_request.expects(:with_filter).with(filter1)
94
+
95
+ subject.call(method, uri)
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "#with_filter" do
101
+ it "appends filters to a list of filters that will be used in the #call method" do
102
+ initial_length = subject.filters.length
103
+ filter = mock()
104
+ subject.with_filter filter
105
+ subject.filters.length.must_equal initial_length + 1
106
+ end
107
+
108
+ it "accepts object instances as filters" do
109
+ filter = mock()
110
+ subject.with_filter filter
111
+ subject.filters.last.must_equal filter
112
+ end
113
+
114
+ it "accepts blocks as filters" do
115
+ subject.with_filter do |a,b| end
116
+ subject.filters.last.class.must_equal Proc
117
+ end
118
+
119
+ it "preserves the order of the filters" do
120
+ subject.filters = []
121
+
122
+ filter = mock()
123
+ filter1 = mock()
124
+
125
+ subject.with_filter filter
126
+ subject.with_filter filter1
127
+ subject.with_filter do |a,b| end
128
+
129
+ subject.filters.first.must_equal filter
130
+ subject.filters[1].must_equal filter1
131
+ subject.filters.last.class.must_equal Proc
132
+ end
133
+ end
134
+
135
+ describe "#get_service_properties" do
136
+ let(:service_properties_xml) { Fixtures["storage_service_properties"] }
137
+ let(:service_properties) { Azure::Service::StorageServiceProperties.new }
138
+ let(:response) {
139
+ response = mock()
140
+ response.stubs(:body).returns(service_properties_xml)
141
+ response
142
+ }
143
+
144
+ let(:service_properties_uri) { URI.parse 'http://dummy.uri/service/properties' }
145
+
146
+ before do
147
+ Azure::Service::Serialization.stubs(:service_properties_from_xml).with(service_properties_xml).returns(service_properties)
148
+ subject.stubs(:service_properties_uri).returns(service_properties_uri)
149
+ subject.stubs(:call).with(:get, service_properties_uri).returns(response)
150
+ end
151
+
152
+ it "calls the service_properties_uri method to determine the correct uri" do
153
+ subject.expects(:service_properties_uri).returns(service_properties_uri)
154
+ subject.get_service_properties
155
+ end
156
+
157
+ it "gets the response from the HTTP API" do
158
+ subject.expects(:call).with(:get, service_properties_uri).returns(response)
159
+ subject.get_service_properties
160
+ end
161
+
162
+ it "deserializes the response from xml" do
163
+ Azure::Service::Serialization.expects(:service_properties_from_xml).with(service_properties_xml).returns(service_properties)
164
+ subject.get_service_properties
165
+ end
166
+
167
+ it "returns a StorageServiceProperties instance" do
168
+ result = subject.get_service_properties
169
+ result.must_be_kind_of Azure::Service::StorageServiceProperties
170
+ end
171
+ end
172
+
173
+ describe "#set_service_properties" do
174
+ let(:service_properties_xml) { Fixtures["storage_service_properties"] }
175
+ let(:service_properties) { Azure::Service::StorageServiceProperties.new }
176
+ let(:response) {
177
+ response = mock()
178
+ response.stubs(:success?).returns(true)
179
+ response
180
+ }
181
+
182
+ let(:service_properties_uri) { URI.parse 'http://dummy.uri/service/properties' }
183
+
184
+ before do
185
+ Azure::Service::Serialization.stubs(:service_properties_to_xml).with(service_properties).returns(service_properties_xml)
186
+ subject.stubs(:service_properties_uri).returns(service_properties_uri)
187
+ subject.stubs(:call).with(:put, service_properties_uri, service_properties_xml).returns(response)
188
+ end
189
+
190
+ it "calls the service_properties_uri method to determine the correct uri" do
191
+ subject.expects(:service_properties_uri).returns(service_properties_uri)
192
+ subject.set_service_properties service_properties
193
+ end
194
+
195
+ it "posts to the HTTP API" do
196
+ subject.expects(:call).with(:put, service_properties_uri, service_properties_xml).returns(response)
197
+ subject.set_service_properties service_properties
198
+ end
199
+
200
+ it "serializes the StorageServiceProperties object to xml" do
201
+ Azure::Service::Serialization.expects(:service_properties_to_xml).with(service_properties).returns(service_properties_xml)
202
+ subject.set_service_properties service_properties
203
+ end
204
+
205
+ it "returns nil on success" do
206
+ result = subject.set_service_properties service_properties
207
+ result.must_equal nil
208
+ end
209
+ end
210
+
211
+ describe "service_properties_uri" do
212
+ it "returns an instance of URI" do
213
+ subject.service_properties_uri.must_be_kind_of URI
214
+ end
215
+
216
+ it "uses the value of the host property as the base of the url" do
217
+ subject.service_properties_uri.to_s.must_include subject.host
218
+ subject.host = "http://something.else"
219
+ subject.service_properties_uri.to_s.must_include subject.host
220
+ end
221
+
222
+ it "sets a query string that specifies the storage service properties endpoint" do
223
+ subject.service_properties_uri.query.must_include "restype=service&comp=properties"
224
+ end
225
+ end
226
+
227
+ describe "#add_metadata_to_headers" do
228
+ it "prefixes header names with x-ms-meta- but does not modify the values" do
229
+ headers = {}
230
+ subject.add_metadata_to_headers({"Foo"=> "Bar"}, headers)
231
+ headers.keys.must_include "x-ms-meta-Foo"
232
+ headers["x-ms-meta-Foo"].must_equal "Bar"
233
+ end
234
+
235
+ it "updates any existing x-ms-meta-* headers with the new values" do
236
+ headers = { "x-ms-meta-Foo"=> "Foo"}
237
+ subject.add_metadata_to_headers({"Foo"=> "Bar"}, headers)
238
+ headers["x-ms-meta-Foo"].must_equal "Bar"
239
+ end
240
+ end
241
+
242
+ describe "#generate_uri" do
243
+ it "returns a URI instance" do
244
+ subject.generate_uri().must_be_kind_of ::URI
245
+ end
246
+
247
+ describe "when called with no arguments" do
248
+ it "returns the StorageService host URL" do
249
+ subject.generate_uri().to_s.must_equal "http://dumyhost.uri/"
250
+ end
251
+ end
252
+
253
+ describe "when passed an optional path" do
254
+ it "adds the path to the host url" do
255
+ subject.generate_uri("resource/entity/").path.must_equal "/resource/entity/"
256
+ end
257
+
258
+ it "correctly joins the path if the host url contained a path" do
259
+ subject.host = "http://dummy.uri/host/path"
260
+ subject.generate_uri("resource/entity/").path.must_equal "/host/path/resource/entity/"
261
+ end
262
+ end
263
+
264
+ describe "when passed an Hash of query parameters" do
265
+
266
+ it "encodes the keys" do
267
+ subject.generate_uri('',{"key !" => "value"}).query.must_include "key+%21=value"
268
+ end
269
+
270
+ it "encodes the values" do
271
+ subject.generate_uri('',{"key" => "value !"}).query.must_include "key=value+%21"
272
+ end
273
+
274
+ it "sets the query string to the encoded result" do
275
+ subject.generate_uri('',{ "key" => "value !", "key !"=>"value"}).query.must_equal "key=value+%21&key+%21=value"
276
+ end
277
+
278
+ describe "when the query parameters include a timeout key" do
279
+ it "overrides the default timeout" do
280
+ subject.generate_uri('', {"timeout" => 45}).query.must_equal "timeout=45"
281
+ end
282
+ end
283
+
284
+ describe "when the query parameters are nil" do
285
+ it "does not include any query parameters" do
286
+ subject.generate_uri('', nil).query.must_equal nil
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end
@@ -0,0 +1,232 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2013 Microsoft Open Technologies, Inc.
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 "test_helper"
16
+
17
+ describe Azure::StorageManagement::Serialization do
18
+ subject { Azure::StorageManagement::Serialization }
19
+
20
+ let(:storage_services_from_xml) { Fixtures["list_storage_accounts"] }
21
+
22
+ describe "#storage_services_from_xml" do
23
+
24
+ it "accepts an XML string" do
25
+ subject.storage_services_from_xml Nokogiri::XML(storage_services_from_xml)
26
+ end
27
+
28
+ it "returns an Array of StorageService instances" do
29
+ results = subject.storage_services_from_xml Nokogiri::XML(storage_services_from_xml)
30
+ results.must_be_kind_of Array
31
+ results[0].must_be_kind_of Azure::StorageManagement::StorageAccount
32
+ results.count.must_equal 2
33
+ end
34
+ end
35
+
36
+ describe "#storage_services_to_xml" do
37
+ let(:storage_service_name) {'storage-service'}
38
+ let(:storage_options) { {
39
+ :extended_properties=> {
40
+ :prop_1_name=>"prop_1_value"
41
+ },
42
+ :label=>"Test Label",
43
+ :geo_replication_enabled=>true
44
+ }
45
+ }
46
+
47
+ it "accepts an name and options hash" do
48
+ subject.storage_services_to_xml storage_service_name
49
+ end
50
+
51
+ it "serializes the argument to xml" do
52
+ results = subject.storage_services_to_xml(storage_service_name, :location => "West US")
53
+ doc = Nokogiri::XML results
54
+ doc.css('ServiceName').text.must_equal storage_service_name
55
+ doc.css('Location').text.must_equal "West US"
56
+ results.must_be_kind_of String
57
+ end
58
+
59
+ it "serializes the options hash to xml" do
60
+ results = subject.storage_services_to_xml(storage_service_name, {:location => 'East US'})
61
+ doc = Nokogiri::XML results
62
+ doc.css('Location').text.must_equal 'East US'
63
+ results.must_be_kind_of String
64
+ end
65
+
66
+ it "uses affinity_group from the hash instead of location" do
67
+ results = subject.storage_services_to_xml(storage_service_name, {:affinity_group_name => 'my-affinity-group', :location => 'East US'})
68
+ doc = Nokogiri::XML results
69
+ doc.css('AffinityGroup').text.must_equal 'my-affinity-group'
70
+ results.must_be_kind_of String
71
+ end
72
+
73
+ it 'serializes geo_replication_enabled and extended_properties to xml' do
74
+ results = subject.storage_services_to_xml(
75
+ storage_service_name, storage_options
76
+ )
77
+
78
+ doc = Nokogiri::XML(results)
79
+ doc.css('GeoReplicationEnabled').text.must_equal(
80
+ "#{storage_options[:geo_replication_enabled]}"
81
+ )
82
+ doc.css('ExtendedProperties ExtendedProperty').size.must_equal(1)
83
+ doc.css('ExtendedProperties ExtendedProperty').first.css(
84
+ 'Name'
85
+ ).text.must_equal('prop_1_name')
86
+ doc.css('ExtendedProperties ExtendedProperty').first.css(
87
+ 'Value'
88
+ ).text.must_equal(storage_options[:extended_properties][:prop_1_name])
89
+ end
90
+
91
+ it 'uses provided label instead of name for Label' do
92
+ options = {
93
+ label: 'My Label'
94
+ }
95
+ results = subject.storage_services_to_xml(storage_service_name, options)
96
+ doc = Nokogiri::XML(results)
97
+ Base64.decode64(doc.css('Label').text).must_equal(options[:label])
98
+ end
99
+
100
+ it 'uses name for Label when label is not provided' do
101
+ results = subject.storage_services_to_xml(storage_service_name)
102
+ doc = Nokogiri::XML(results)
103
+ Base64.decode64(doc.css('Label').text).must_equal(storage_service_name)
104
+ end
105
+ end
106
+
107
+ describe "#storage_update_to_xml" do
108
+ nil_options = {
109
+ description: nil,
110
+ label: nil,
111
+ geo_replication_enabled: 'nil',
112
+ extended_properties: nil
113
+ }
114
+
115
+ let(:empty_options) { {
116
+ description: '',
117
+ label: '',
118
+ geo_replication_enabled: '',
119
+ extended_properties: ''
120
+ }
121
+ }
122
+
123
+ let(:partial_options_gre_bool) { {
124
+ label: 'label',
125
+ geo_replication_enabled: false
126
+ }
127
+ }
128
+
129
+ let(:partial_options_gre_string) { {
130
+ description: 'label',
131
+ geo_replication_enabled: 'false'
132
+ }
133
+ }
134
+
135
+ let(:options) { {
136
+ extended_properties: {
137
+ prop_1_name: 'prop_1_value'
138
+ },
139
+ description: 'Test Description',
140
+ label: 'Test Label',
141
+ geo_replication_enabled: true
142
+ }
143
+ }
144
+
145
+ let(:no_options_message) {'No options specified'}
146
+ let(:label_or_desc_required) { 'Either one of Label or Description has to be provided. Both cannot be empty' }
147
+
148
+ it "checks if the parameter is nil" do
149
+ exception = assert_raises RuntimeError do
150
+ subject.storage_update_to_xml nil
151
+ end
152
+ assert_match no_options_message, exception.message
153
+ end
154
+
155
+ it "checks if the parameter is empty" do
156
+ exception = assert_raises RuntimeError do
157
+ subject.storage_update_to_xml Hash.new
158
+ end
159
+ assert_match no_options_message, exception.message
160
+ end
161
+
162
+ it "checks if all options are nil" do
163
+ exception = assert_raises RuntimeError do
164
+ subject.storage_update_to_xml nil_options
165
+ end
166
+ assert_match label_or_desc_required, exception.message
167
+ end
168
+
169
+ it "checks if all options are empty" do
170
+ exception = assert_raises RuntimeError do
171
+ subject.storage_update_to_xml empty_options
172
+ end
173
+ assert_match label_or_desc_required, exception.message
174
+ end
175
+
176
+ it "returns xml for the partial options provided" do
177
+ storage_update_xml_string = subject.storage_update_to_xml partial_options_gre_bool
178
+ storage_update_xml_string.must_be_kind_of String
179
+
180
+ storage_update_xml = Nokogiri::XML storage_update_xml_string
181
+ storage_update_xml.css('Label').text.must_equal(Base64::encode64(partial_options_gre_bool[:label]))
182
+ storage_update_xml.css('GeoReplicationEnabled').text.must_equal "#{partial_options_gre_bool[:geo_replication_enabled]}"
183
+
184
+ storage_update_xml.css('Description').size.must_equal 0
185
+ storage_update_xml.css('ExtendedProperties').size.must_equal 0
186
+ end
187
+
188
+ it "returns xml for the partial options provided without gre" do
189
+ storage_update_xml_string = subject.storage_update_to_xml partial_options_gre_string
190
+ storage_update_xml_string.must_be_kind_of String
191
+
192
+ storage_update_xml = Nokogiri::XML storage_update_xml_string
193
+ storage_update_xml.css('Description').size.must_equal 1
194
+ storage_update_xml.css('Description').text.must_equal partial_options_gre_string[:description]
195
+
196
+ storage_update_xml.css('GeoReplicationEnabled').size.must_equal 0
197
+
198
+ storage_update_xml.css('ExtendedProperties').size.must_equal 0
199
+ end
200
+
201
+ it "returns xml for the options provided" do
202
+ update_xml_string = subject.storage_update_to_xml options
203
+ update_xml_string.must_be_kind_of String
204
+
205
+ update_xml = Nokogiri::XML update_xml_string
206
+
207
+ update_xml.css('Label').text.must_equal(Base64::encode64(options[:label]))
208
+ update_xml.css('GeoReplicationEnabled').size.must_equal 1
209
+ update_xml.css('GeoReplicationEnabled').text.must_equal "#{options[:geo_replication_enabled]}"
210
+
211
+ update_xml.css('ExtendedProperties ExtendedProperty').size.must_equal 1
212
+ update_xml.css('ExtendedProperties ExtendedProperty Name').text.must_equal "#{:prop_1_name}"
213
+ update_xml.css('ExtendedProperties ExtendedProperty Value').text.must_equal options[:extended_properties][:prop_1_name]
214
+ end
215
+
216
+ it "returns xml for options but with description in absence of label" do
217
+ options.delete(:label)
218
+ update_xml_string = subject.storage_update_to_xml(options)
219
+ update_xml_string.must_be_kind_of(String)
220
+
221
+ update_xml = Nokogiri::XML(update_xml_string)
222
+
223
+ update_xml.css('Description').text.must_equal(options[:description])
224
+ update_xml.css('GeoReplicationEnabled').size.must_equal(1)
225
+ update_xml.css('ExtendedProperties ExtendedProperty').size.must_equal(1)
226
+ update_xml.css('ExtendedProperties ExtendedProperty Name').text
227
+ .must_equal("#{:prop_1_name}")
228
+ update_xml.css('ExtendedProperties ExtendedProperty Value')
229
+ .text.must_equal(options[:extended_properties][:prop_1_name])
230
+ end
231
+ end
232
+ end