azure-fix 0.7.0.pre3

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 (311) hide show
  1. checksums.yaml +7 -0
  2. data/.env_sample +13 -0
  3. data/.gitignore +30 -0
  4. data/.travis.yml +13 -0
  5. data/ChangeLog.txt +56 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +702 -0
  9. data/Rakefile +121 -0
  10. data/azure.gemspec +51 -0
  11. data/bin/pfxer +35 -0
  12. data/lib/azure.rb +147 -0
  13. data/lib/azure/base_management/affinity_group.rb +32 -0
  14. data/lib/azure/base_management/base_management_service.rb +220 -0
  15. data/lib/azure/base_management/location.rb +27 -0
  16. data/lib/azure/base_management/management_http_request.rb +172 -0
  17. data/lib/azure/base_management/serialization.rb +135 -0
  18. data/lib/azure/base_management/sql_management_http_request.rb +35 -0
  19. data/lib/azure/blob/auth/shared_access_signature.rb +147 -0
  20. data/lib/azure/blob/blob.rb +32 -0
  21. data/lib/azure/blob/blob_service.rb +1452 -0
  22. data/lib/azure/blob/block.rb +31 -0
  23. data/lib/azure/blob/container.rb +32 -0
  24. data/lib/azure/blob/serialization.rb +285 -0
  25. data/lib/azure/client.rb +31 -0
  26. data/lib/azure/client_services.rb +98 -0
  27. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  28. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +135 -0
  29. data/lib/azure/cloud_service_management/serialization.rb +118 -0
  30. data/lib/azure/configurable.rb +290 -0
  31. data/lib/azure/core/auth/authorizer.rb +36 -0
  32. data/lib/azure/core/auth/shared_key.rb +118 -0
  33. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  34. data/lib/azure/core/auth/signer.rb +51 -0
  35. data/lib/azure/core/error.rb +21 -0
  36. data/lib/azure/core/filtered_service.rb +45 -0
  37. data/lib/azure/core/http/debug_filter.rb +36 -0
  38. data/lib/azure/core/http/http_error.rb +86 -0
  39. data/lib/azure/core/http/http_filter.rb +53 -0
  40. data/lib/azure/core/http/http_request.rb +173 -0
  41. data/lib/azure/core/http/http_response.rb +96 -0
  42. data/lib/azure/core/http/retry_policy.rb +74 -0
  43. data/lib/azure/core/http/signer_filter.rb +33 -0
  44. data/lib/azure/core/service.rb +46 -0
  45. data/lib/azure/core/signed_service.rb +45 -0
  46. data/lib/azure/core/utility.rb +244 -0
  47. data/lib/azure/default.rb +126 -0
  48. data/lib/azure/http_client.rb +85 -0
  49. data/lib/azure/queue/message.rb +30 -0
  50. data/lib/azure/queue/queue.rb +28 -0
  51. data/lib/azure/queue/queue_service.rb +570 -0
  52. data/lib/azure/queue/serialization.rb +105 -0
  53. data/lib/azure/service/access_policy.rb +26 -0
  54. data/lib/azure/service/cors.rb +11 -0
  55. data/lib/azure/service/cors_rule.rb +15 -0
  56. data/lib/azure/service/enumeration_results.rb +21 -0
  57. data/lib/azure/service/logging.rb +32 -0
  58. data/lib/azure/service/metrics.rb +31 -0
  59. data/lib/azure/service/retention_policy.rb +25 -0
  60. data/lib/azure/service/serialization.rb +299 -0
  61. data/lib/azure/service/signed_identifier.rb +30 -0
  62. data/lib/azure/service/storage_service.rb +86 -0
  63. data/lib/azure/service/storage_service_properties.rb +37 -0
  64. data/lib/azure/service_bus/action.rb +21 -0
  65. data/lib/azure/service_bus/auth/shared_access_signer.rb +44 -0
  66. data/lib/azure/service_bus/auth/wrap_service.rb +90 -0
  67. data/lib/azure/service_bus/auth/wrap_signer.rb +77 -0
  68. data/lib/azure/service_bus/brokered_message.rb +124 -0
  69. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  70. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  71. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  72. data/lib/azure/service_bus/false_filter.rb +38 -0
  73. data/lib/azure/service_bus/filter.rb +21 -0
  74. data/lib/azure/service_bus/interval.rb +104 -0
  75. data/lib/azure/service_bus/queue.rb +230 -0
  76. data/lib/azure/service_bus/relay.rb +88 -0
  77. data/lib/azure/service_bus/resource.rb +109 -0
  78. data/lib/azure/service_bus/rule.rb +98 -0
  79. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  80. data/lib/azure/service_bus/serialization.rb +161 -0
  81. data/lib/azure/service_bus/service_bus_service.rb +899 -0
  82. data/lib/azure/service_bus/sql_filter.rb +50 -0
  83. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  84. data/lib/azure/service_bus/subscription.rb +184 -0
  85. data/lib/azure/service_bus/topic.rb +187 -0
  86. data/lib/azure/service_bus/true_filter.rb +38 -0
  87. data/lib/azure/sql_database_management/errors.rb +11 -0
  88. data/lib/azure/sql_database_management/firewall_rule.rb +30 -0
  89. data/lib/azure/sql_database_management/serialization.rb +99 -0
  90. data/lib/azure/sql_database_management/sql_database_management_service.rb +211 -0
  91. data/lib/azure/sql_database_management/sql_server.rb +32 -0
  92. data/lib/azure/storage_management/serialization.rb +204 -0
  93. data/lib/azure/storage_management/storage_account.rb +48 -0
  94. data/lib/azure/storage_management/storage_management_service.rb +207 -0
  95. data/lib/azure/table/auth/shared_key.rb +59 -0
  96. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  97. data/lib/azure/table/batch.rb +330 -0
  98. data/lib/azure/table/batch_response.rb +118 -0
  99. data/lib/azure/table/edmtype.rb +127 -0
  100. data/lib/azure/table/entity.rb +31 -0
  101. data/lib/azure/table/guid.rb +24 -0
  102. data/lib/azure/table/query.rb +112 -0
  103. data/lib/azure/table/serialization.rb +108 -0
  104. data/lib/azure/table/table_service.rb +563 -0
  105. data/lib/azure/version.rb +31 -0
  106. data/lib/azure/virtual_machine_image_management/serialization.rb +70 -0
  107. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  108. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  109. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +83 -0
  110. data/lib/azure/virtual_machine_management/serialization.rb +459 -0
  111. data/lib/azure/virtual_machine_management/virtual_machine.rb +44 -0
  112. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +552 -0
  113. data/lib/azure/virtual_network_management/serialization.rb +193 -0
  114. data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
  115. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +108 -0
  116. data/test/fixtures/32px-fulls-black.jpg +0 -0
  117. data/test/fixtures/affinity_group.xml +33 -0
  118. data/test/fixtures/all_containers.xml +20 -0
  119. data/test/fixtures/all_tables.xml +22 -0
  120. data/test/fixtures/container_acl.xml +11 -0
  121. data/test/fixtures/create_sql_database_server.xml +2 -0
  122. data/test/fixtures/create_storage_desc_error.xml +5 -0
  123. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  124. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  125. data/test/fixtures/create_storage_full_error.xml +6 -0
  126. data/test/fixtures/create_storage_label_error.xml +5 -0
  127. data/test/fixtures/create_storage_location_error.xml +5 -0
  128. data/test/fixtures/create_storage_name_error.xml +6 -0
  129. data/test/fixtures/create_table_response_entry.xml +15 -0
  130. data/test/fixtures/delete_storage_container_error.xml +5 -0
  131. data/test/fixtures/delete_storage_error.xml +5 -0
  132. data/test/fixtures/deployment_error.xml +5 -0
  133. data/test/fixtures/empty_xml_file +0 -0
  134. data/test/fixtures/get_storage_account_error.xml +5 -0
  135. data/test/fixtures/get_storage_account_properties.xml +34 -0
  136. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  137. data/test/fixtures/http_error.xml +5 -0
  138. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  139. data/test/fixtures/list_affinity_groups.xml +22 -0
  140. data/test/fixtures/list_blobs.xml +121 -0
  141. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  142. data/test/fixtures/list_blocks_all.xml +23 -0
  143. data/test/fixtures/list_blocks_committed.xml +13 -0
  144. data/test/fixtures/list_cloud_services.xml +39 -0
  145. data/test/fixtures/list_containers.xml +38 -0
  146. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  147. data/test/fixtures/list_locations.xml +212 -0
  148. data/test/fixtures/list_os_images.xml +110 -0
  149. data/test/fixtures/list_page_ranges.xml +11 -0
  150. data/test/fixtures/list_sql_database.xml +24 -0
  151. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  152. data/test/fixtures/list_storage_account_single.xml +25 -0
  153. data/test/fixtures/list_storage_accounts.xml +48 -0
  154. data/test/fixtures/list_virtual_networks.xml +92 -0
  155. data/test/fixtures/list_vm_images.xml +21 -0
  156. data/test/fixtures/logging.xml +11 -0
  157. data/test/fixtures/management_certificate.pfx +0 -0
  158. data/test/fixtures/messages.xml +12 -0
  159. data/test/fixtures/metrics.xml +10 -0
  160. data/test/fixtures/privatekey.key +28 -0
  161. data/test/fixtures/query_entities_empty_response.xml +7 -0
  162. data/test/fixtures/query_entities_response.xml +45 -0
  163. data/test/fixtures/queue_service_properties.xml +22 -0
  164. data/test/fixtures/queue_service_properties_original.xml +19 -0
  165. data/test/fixtures/queues.xml +16 -0
  166. data/test/fixtures/retention_policy.xml +5 -0
  167. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  168. data/test/fixtures/sb_default_create_relay_response.xml +15 -0
  169. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  170. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  171. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  172. data/test/fixtures/storage_service_keys.xml +8 -0
  173. data/test/fixtures/storage_service_properties.xml +55 -0
  174. data/test/fixtures/update_storage_account.xml +16 -0
  175. data/test/fixtures/update_storage_error.xml +5 -0
  176. data/test/fixtures/updated_storage_accounts.xml +55 -0
  177. data/test/fixtures/virtual_machine.xml +116 -0
  178. data/test/fixtures/windows_virtual_machine.xml +106 -0
  179. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  180. data/test/integration/affinity_group/Create_Affinity_test.rb +64 -0
  181. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  182. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  183. data/test/integration/affinity_group/Update_Affinity_test.rb +87 -0
  184. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  185. data/test/integration/blob/blob_metadata_test.rb +75 -0
  186. data/test/integration/blob/blob_pages_test.rb +119 -0
  187. data/test/integration/blob/blob_properties_test.rb +77 -0
  188. data/test/integration/blob/block_blob_test.rb +254 -0
  189. data/test/integration/blob/container/container_acl_test.rb +69 -0
  190. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  191. data/test/integration/blob/container/create_container_test.rb +60 -0
  192. data/test/integration/blob/container/delete_container_test.rb +39 -0
  193. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  194. data/test/integration/blob/container/list_containers_test.rb +79 -0
  195. data/test/integration/blob/container/root_container_test.rb +55 -0
  196. data/test/integration/blob/copy_blob_test.rb +113 -0
  197. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  198. data/test/integration/blob/create_page_blob_test.rb +83 -0
  199. data/test/integration/blob/delete_blob_test.rb +159 -0
  200. data/test/integration/blob/get_blob_test.rb +65 -0
  201. data/test/integration/blob/informative_errors_test.rb +39 -0
  202. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  203. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  204. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  205. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  206. data/test/integration/blob/list_blobs_test.rb +113 -0
  207. data/test/integration/cloud_service/Cloud_Create_test.rb +45 -0
  208. data/test/integration/cloud_service/Cloud_Delete_test.rb +45 -0
  209. data/test/integration/database/create_sql_server_firewall_test.rb +81 -0
  210. data/test/integration/database/create_sql_server_test.rb +53 -0
  211. data/test/integration/database/delete_sql_server_firewall_test.rb +64 -0
  212. data/test/integration/database/delete_sql_server_test.rb +45 -0
  213. data/test/integration/database/list_sql_server_firewall_test.rb +44 -0
  214. data/test/integration/database/list_sql_servers_test.rb +44 -0
  215. data/test/integration/database/reset_password_sql_server_test.rb +53 -0
  216. data/test/integration/location/Location_List_test.rb +39 -0
  217. data/test/integration/location/RoleSize_List_test.rb +35 -0
  218. data/test/integration/queue/clear_messages_test.rb +42 -0
  219. data/test/integration/queue/create_message_test.rb +75 -0
  220. data/test/integration/queue/create_queue_test.rb +50 -0
  221. data/test/integration/queue/delete_message_test.rb +67 -0
  222. data/test/integration/queue/delete_queue_test.rb +45 -0
  223. data/test/integration/queue/informative_errors_test.rb +42 -0
  224. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  225. data/test/integration/queue/list_messages_test.rb +79 -0
  226. data/test/integration/queue/list_queues_test.rb +43 -0
  227. data/test/integration/queue/peek_messages_test.rb +59 -0
  228. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  229. data/test/integration/queue/queue_metadata_test.rb +40 -0
  230. data/test/integration/queue/update_message_test.rb +74 -0
  231. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  232. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  233. data/test/integration/service_bus/queues_test.rb +266 -0
  234. data/test/integration/service_bus/relay_test.rb +132 -0
  235. data/test/integration/service_bus/rules_test.rb +145 -0
  236. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  237. data/test/integration/service_bus/scenario_test.rb +101 -0
  238. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  239. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  240. data/test/integration/service_bus/topics_test.rb +129 -0
  241. data/test/integration/storage_management/storage_management_test.rb +185 -0
  242. data/test/integration/table/create_table_test.rb +36 -0
  243. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  244. data/test/integration/table/delete_entity_test.rb +94 -0
  245. data/test/integration/table/delete_table_test.rb +40 -0
  246. data/test/integration/table/get_table_test.rb +37 -0
  247. data/test/integration/table/informative_errors_test.rb +39 -0
  248. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  249. data/test/integration/table/insert_entity_test.rb +88 -0
  250. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  251. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  252. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  253. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  254. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  255. data/test/integration/table/merge_entity_test.rb +113 -0
  256. data/test/integration/table/query_entities_test.rb +196 -0
  257. data/test/integration/table/query_tables_test.rb +43 -0
  258. data/test/integration/table/query_test.rb +251 -0
  259. data/test/integration/table/table_acl_test.rb +52 -0
  260. data/test/integration/table/table_gb18030_test.rb +355 -0
  261. data/test/integration/table/update_entity_batch_test.rb +149 -0
  262. data/test/integration/table/update_entity_test.rb +131 -0
  263. data/test/integration/test_helper.rb +40 -0
  264. data/test/integration/vm/VM_Create_test.rb +262 -0
  265. data/test/integration/vm/VM_Delete_test.rb +53 -0
  266. data/test/integration/vm/VM_Operations_test.rb +172 -0
  267. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  268. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  269. data/test/integration/vnet/Virtual_Network_Create_test.rb +116 -0
  270. data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
  271. data/test/support/env.rb +19 -0
  272. data/test/support/fixtures.rb +36 -0
  273. data/test/support/name_generator.rb +168 -0
  274. data/test/support/stubs.rb +42 -0
  275. data/test/support/virtual_machine_name_generator.rb +102 -0
  276. data/test/support/virtual_network_helper.rb +73 -0
  277. data/test/test_helper.rb +47 -0
  278. data/test/unit/affinity_group/affinity_group_test.rb +189 -0
  279. data/test/unit/affinity_group/serialization_test.rb +87 -0
  280. data/test/unit/base_management/base_management_service_test.rb +19 -0
  281. data/test/unit/base_management/location_test.rb +56 -0
  282. data/test/unit/base_management/role_size_test.rb +50 -0
  283. data/test/unit/blob/auth/shared_access_signature_test.rb +71 -0
  284. data/test/unit/blob/blob_service_test.rb +1970 -0
  285. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -0
  286. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  287. data/test/unit/config/azure_test.rb +112 -0
  288. data/test/unit/config/client_test.rb +37 -0
  289. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  290. data/test/unit/core/auth/shared_key_test.rb +58 -0
  291. data/test/unit/core/auth/signer_test.rb +30 -0
  292. data/test/unit/core/http/http_error_test.rb +61 -0
  293. data/test/unit/core/http/http_request_test.rb +138 -0
  294. data/test/unit/core/http/http_response_test.rb +20 -0
  295. data/test/unit/core/http/retry_policy_test.rb +23 -0
  296. data/test/unit/core/utility_test.rb +122 -0
  297. data/test/unit/database/serialization_test.rb +94 -0
  298. data/test/unit/database/sql_database_server_service_test.rb +341 -0
  299. data/test/unit/http_client_test.rb +74 -0
  300. data/test/unit/service/serialization_test.rb +533 -0
  301. data/test/unit/service/storage_service_test.rb +297 -0
  302. data/test/unit/storage_management/serialization_test.rb +244 -0
  303. data/test/unit/storage_management/storage_management_service_test.rb +247 -0
  304. data/test/unit/table/edmtype_test.rb +108 -0
  305. data/test/unit/virtual_machine_image_management/serialization_test.rb +50 -0
  306. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +114 -0
  307. data/test/unit/virtual_machine_management/serialization_test.rb +316 -0
  308. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +480 -0
  309. data/test/unit/vnet/serialization_test.rb +187 -0
  310. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  311. metadata +579 -0
@@ -0,0 +1,297 @@
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(:verb) { :get }
25
+ let(:x_ms_version) {'2014-02-14'}
26
+
27
+ subject do
28
+ storage_service = Azure::Service::StorageService.new
29
+ storage_service.host = 'http://dumyhost.uri'
30
+ storage_service
31
+ end
32
+
33
+ describe '#call' do
34
+ let(:mock_request) { mock() }
35
+ let(:mock_signer_filter) { mock() }
36
+ let(:mock_headers) { {
37
+ 'Other-Header' => 'SomeValue',
38
+ 'Custom-Header' => 'PreviousValue',
39
+ 'connection' => 'PreviousValue'
40
+ } }
41
+
42
+ before do
43
+ Azure::Core::Http::HttpRequest.stubs(:new).with(verb, uri, anything).returns(mock_request)
44
+ Azure::Core::Http::SignerFilter.stubs(:new).returns(mock_signer_filter)
45
+
46
+ mock_request.expects(:call)
47
+ end
48
+
49
+ it 'adds a SignerFilter to the HTTP pipeline' do
50
+ mock_request.expects(:with_filter).with(mock_signer_filter)
51
+ subject.call(verb, uri)
52
+ end
53
+
54
+ describe 'when passed the optional headers arguement' do
55
+ before do
56
+ Azure::Core::Http::HttpRequest.stubs(:new).with(verb,
57
+ uri,
58
+ {
59
+ body: nil,
60
+ headers: {'Custom-Header' => 'CustomValue'},
61
+ client: nil
62
+ }).returns(mock_request)
63
+ mock_request.expects(:with_filter).with(mock_signer_filter)
64
+ end
65
+
66
+ it 'passes the custom headers into the request initializer' do
67
+ subject.call(verb, uri, nil, {'Custom-Header' => 'CustomValue'})
68
+ end
69
+ end
70
+
71
+ describe 'when passed the optional body arguement' do
72
+ before do
73
+ mock_request.expects(:with_filter).with(mock_signer_filter)
74
+ end
75
+
76
+ it 'passes the body to the to HttpRequest' do
77
+ Azure::Core::Http::HttpRequest.stubs(:new).with(verb, uri, 'body').returns(mock_request)
78
+ subject.call(verb, uri, 'body')
79
+ end
80
+ end
81
+
82
+ describe 'when with_filter was called' do
83
+ before do
84
+ mock_request.expects(:with_filter).with(mock_signer_filter)
85
+ end
86
+
87
+ it 'builds the HTTP pipeline by passing the filters to the HTTPRequest' do
88
+ filter = mock()
89
+ filter1 = mock()
90
+
91
+ subject.with_filter filter
92
+ subject.with_filter filter1
93
+
94
+ mock_request.expects(:with_filter).with(filter)
95
+ mock_request.expects(:with_filter).with(filter1)
96
+
97
+ subject.call(verb, uri)
98
+ end
99
+ end
100
+ end
101
+
102
+ describe '#with_filter' do
103
+ it 'appends filters to a list of filters that will be used in the #call method' do
104
+ initial_length = subject.filters.length
105
+ filter = mock()
106
+ subject.with_filter filter
107
+ subject.filters.length.must_equal initial_length + 1
108
+ end
109
+
110
+ it 'accepts object instances as filters' do
111
+ filter = mock()
112
+ subject.with_filter filter
113
+ subject.filters.last.must_equal filter
114
+ end
115
+
116
+ it 'accepts blocks as filters' do
117
+ subject.with_filter do |a, b|
118
+ end
119
+ subject.filters.last.class.must_equal Proc
120
+ end
121
+
122
+ it 'preserves the order of the filters' do
123
+ subject.filters = []
124
+
125
+ filter = mock()
126
+ filter1 = mock()
127
+
128
+ subject.with_filter filter
129
+ subject.with_filter filter1
130
+ subject.with_filter do |a, b|
131
+ end
132
+
133
+ subject.filters.first.must_equal filter
134
+ subject.filters[1].must_equal filter1
135
+ subject.filters.last.class.must_equal Proc
136
+ end
137
+ end
138
+
139
+ describe '#get_service_properties' do
140
+ let(:service_properties_xml) { Fixtures['storage_service_properties'] }
141
+ let(:service_properties) { Azure::Service::StorageServiceProperties.new }
142
+ let(:response) {
143
+ response = mock()
144
+ response.stubs(:body).returns(service_properties_xml)
145
+ response
146
+ }
147
+
148
+ let(:service_properties_uri) { URI.parse 'http://dummy.uri/service/properties' }
149
+ let(:service_properties_headers) { {'x-ms-version' => x_ms_version} }
150
+
151
+ before do
152
+ Azure::Service::Serialization.stubs(:service_properties_from_xml).with(service_properties_xml).returns(service_properties)
153
+ subject.stubs(:service_properties_uri).returns(service_properties_uri)
154
+ subject.stubs(:call).with(:get, service_properties_uri, nil, service_properties_headers).returns(response)
155
+ end
156
+
157
+ it 'calls the service_properties_uri method to determine the correct uri' do
158
+ subject.expects(:service_properties_uri).returns(service_properties_uri)
159
+ subject.get_service_properties
160
+ end
161
+
162
+ it 'gets the response from the HTTP API' do
163
+ subject.expects(:call).with(:get, service_properties_uri, nil, service_properties_headers).returns(response)
164
+ subject.get_service_properties
165
+ end
166
+
167
+ it 'deserializes the response from xml' do
168
+ Azure::Service::Serialization.expects(:service_properties_from_xml).with(service_properties_xml).returns(service_properties)
169
+ subject.get_service_properties
170
+ end
171
+
172
+ it 'returns a StorageServiceProperties instance' do
173
+ result = subject.get_service_properties
174
+ result.must_be_kind_of Azure::Service::StorageServiceProperties
175
+ end
176
+ end
177
+
178
+ describe '#set_service_properties' do
179
+ let(:service_properties_xml) { Fixtures['storage_service_properties'] }
180
+ let(:service_properties) { Azure::Service::StorageServiceProperties.new }
181
+ let(:response) {
182
+ response = mock()
183
+ response.stubs(:success?).returns(true)
184
+ response
185
+ }
186
+
187
+ let(:service_properties_uri) { URI.parse 'http://dummy.uri/service/properties' }
188
+ let(:service_properties_headers) { {'x-ms-version' => x_ms_version} }
189
+
190
+ before do
191
+ Azure::Service::Serialization.stubs(:service_properties_to_xml).with(service_properties).returns(service_properties_xml)
192
+ subject.stubs(:service_properties_uri).returns(service_properties_uri)
193
+ subject.stubs(:call).with(:put, service_properties_uri, service_properties_xml, service_properties_headers).returns(response)
194
+ end
195
+
196
+ it 'calls the service_properties_uri method to determine the correct uri' do
197
+ subject.expects(:service_properties_uri).returns(service_properties_uri)
198
+ subject.set_service_properties service_properties
199
+ end
200
+
201
+ it 'posts to the HTTP API' do
202
+ subject.expects(:call).with(:put, service_properties_uri, service_properties_xml, service_properties_headers).returns(response)
203
+ subject.set_service_properties service_properties
204
+ end
205
+
206
+ it 'serializes the StorageServiceProperties object to xml' do
207
+ Azure::Service::Serialization.expects(:service_properties_to_xml).with(service_properties).returns(service_properties_xml)
208
+ subject.set_service_properties service_properties
209
+ end
210
+
211
+ it 'returns nil on success' do
212
+ result = subject.set_service_properties service_properties
213
+ result.must_equal nil
214
+ end
215
+ end
216
+
217
+ describe 'service_properties_uri' do
218
+ it 'returns an instance of URI' do
219
+ subject.service_properties_uri.must_be_kind_of URI
220
+ end
221
+
222
+ it 'uses the value of the host property as the base of the url' do
223
+ subject.service_properties_uri.to_s.must_include subject.host
224
+ subject.host = 'http://something.else'
225
+ subject.service_properties_uri.to_s.must_include subject.host
226
+ end
227
+
228
+ it 'sets a query string that specifies the storage service properties endpoint' do
229
+ subject.service_properties_uri.query.must_include 'restype=service&comp=properties'
230
+ end
231
+ end
232
+
233
+ describe '#add_metadata_to_headers' do
234
+ it 'prefixes header names with x-ms-meta- but does not modify the values' do
235
+ headers = {}
236
+ subject.add_metadata_to_headers({'Foo' => 'Bar'}, headers)
237
+ headers.keys.must_include 'x-ms-meta-Foo'
238
+ headers['x-ms-meta-Foo'].must_equal 'Bar'
239
+ end
240
+
241
+ it 'updates any existing x-ms-meta-* headers with the new values' do
242
+ headers = {'x-ms-meta-Foo' => 'Foo'}
243
+ subject.add_metadata_to_headers({'Foo' => 'Bar'}, headers)
244
+ headers['x-ms-meta-Foo'].must_equal 'Bar'
245
+ end
246
+ end
247
+
248
+ describe '#generate_uri' do
249
+ it 'returns a URI instance' do
250
+ subject.generate_uri.must_be_kind_of ::URI
251
+ end
252
+
253
+ describe 'when called with no arguments' do
254
+ it 'returns the StorageService host URL' do
255
+ subject.generate_uri.to_s.must_equal 'http://dumyhost.uri/'
256
+ end
257
+ end
258
+
259
+ describe 'when passed an optional path' do
260
+ it 'adds the path to the host url' do
261
+ subject.generate_uri('resource/entity/').path.must_equal '/resource/entity/'
262
+ end
263
+
264
+ it 'correctly joins the path if the host url contained a path' do
265
+ subject.host = 'http://dummy.uri/host/path'
266
+ subject.generate_uri('resource/entity/').path.must_equal '/host/path/resource/entity/'
267
+ end
268
+ end
269
+
270
+ describe 'when passed an Hash of query parameters' do
271
+
272
+ it 'encodes the keys' do
273
+ subject.generate_uri('', {'key !' => 'value'}).query.must_include 'key+%21=value'
274
+ end
275
+
276
+ it 'encodes the values' do
277
+ subject.generate_uri('', {'key' => 'value !'}).query.must_include 'key=value+%21'
278
+ end
279
+
280
+ it 'sets the query string to the encoded result' do
281
+ subject.generate_uri('', {'key' => 'value !', 'key !' => 'value'}).query.must_equal 'key=value+%21&key+%21=value'
282
+ end
283
+
284
+ describe 'when the query parameters include a timeout key' do
285
+ it 'overrides the default timeout' do
286
+ subject.generate_uri('', {'timeout' => 45}).query.must_equal 'timeout=45'
287
+ end
288
+ end
289
+
290
+ describe 'when the query parameters are nil' do
291
+ it 'does not include any query parameters' do
292
+ subject.generate_uri('', nil).query.must_equal nil
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,244 @@
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
+ params = {
68
+ :affinity_group_name => 'my-affinity-group',
69
+ :location => 'East US'
70
+ }
71
+ results = subject.storage_services_to_xml(storage_service_name, params)
72
+ doc = Nokogiri::XML results
73
+ doc.css('AffinityGroup').text.must_equal 'my-affinity-group'
74
+ results.must_be_kind_of String
75
+ end
76
+
77
+ it 'serializes geo_replication_enabled and extended_properties to xml' do
78
+ results = subject.storage_services_to_xml(
79
+ storage_service_name, storage_options
80
+ )
81
+
82
+ doc = Nokogiri::XML(results)
83
+ doc.css('GeoReplicationEnabled').text.must_equal(
84
+ "#{storage_options[:geo_replication_enabled]}"
85
+ )
86
+ doc.css('ExtendedProperties ExtendedProperty').size.must_equal(1)
87
+ doc.css('ExtendedProperties ExtendedProperty').first.css(
88
+ 'Name'
89
+ ).text.must_equal('prop_1_name')
90
+ doc.css('ExtendedProperties ExtendedProperty').first.css(
91
+ 'Value'
92
+ ).text.must_equal(storage_options[:extended_properties][:prop_1_name])
93
+ end
94
+
95
+ it 'uses provided label instead of name for Label' do
96
+ options = {
97
+ label: 'My Label'
98
+ }
99
+ results = subject.storage_services_to_xml(storage_service_name, options)
100
+ doc = Nokogiri::XML(results)
101
+ Base64.decode64(doc.css('Label').text).must_equal(options[:label])
102
+ end
103
+
104
+ it 'uses name for Label when label is not provided' do
105
+ results = subject.storage_services_to_xml(storage_service_name)
106
+ doc = Nokogiri::XML(results)
107
+ Base64.decode64(doc.css('Label').text).must_equal(storage_service_name)
108
+ end
109
+ end
110
+
111
+ describe "#storage_update_to_xml" do
112
+ nil_options = {
113
+ description: nil,
114
+ label: nil,
115
+ geo_replication_enabled: 'nil',
116
+ extended_properties: nil
117
+ }
118
+
119
+ let(:empty_options) { {
120
+ description: '',
121
+ label: '',
122
+ geo_replication_enabled: '',
123
+ extended_properties: ''
124
+ }
125
+ }
126
+
127
+ let(:partial_options_gre_bool) { {
128
+ label: 'label',
129
+ geo_replication_enabled: false
130
+ }
131
+ }
132
+
133
+ let(:partial_options_gre_string) { {
134
+ description: 'label',
135
+ geo_replication_enabled: 'false'
136
+ }
137
+ }
138
+
139
+ let(:options) { {
140
+ extended_properties: {
141
+ prop_1_name: 'prop_1_value'
142
+ },
143
+ description: 'Test Description',
144
+ label: 'Test Label',
145
+ geo_replication_enabled: true
146
+ }
147
+ }
148
+
149
+ let(:no_options_message) { 'No options specified' }
150
+ let(:label_or_desc_required) {
151
+ 'Either one of Label or Description has to be provided.'
152
+ }
153
+
154
+ it "checks if the parameter is empty" do
155
+ exception = assert_raises RuntimeError do
156
+ subject.storage_update_to_xml Hash.new
157
+ end
158
+ assert_match no_options_message, exception.message
159
+ end
160
+
161
+ it "checks if all options are nil" do
162
+ exception = assert_raises RuntimeError do
163
+ subject.storage_update_to_xml nil_options
164
+ end
165
+ assert_match label_or_desc_required, exception.message
166
+ end
167
+
168
+ it "checks if all options are empty" do
169
+ exception = assert_raises RuntimeError do
170
+ subject.storage_update_to_xml empty_options
171
+ end
172
+ assert_match label_or_desc_required, exception.message
173
+ end
174
+
175
+ it "returns xml for the partial options provided" do
176
+ storage_update_xml_string = subject.storage_update_to_xml partial_options_gre_bool
177
+ storage_update_xml_string.must_be_kind_of String
178
+
179
+ storage_update_xml = Nokogiri::XML storage_update_xml_string
180
+ storage_update_xml.css('Label').text.must_equal(Base64::encode64(partial_options_gre_bool[:label]))
181
+ storage_update_xml.css('GeoReplicationEnabled').text.must_equal "#{partial_options_gre_bool[:geo_replication_enabled]}"
182
+
183
+ storage_update_xml.css('Description').size.must_equal 0
184
+ storage_update_xml.css('ExtendedProperties').size.must_equal 0
185
+ end
186
+
187
+ it "returns xml for the partial options provided without gre" do
188
+ storage_update_xml_string = subject.storage_update_to_xml partial_options_gre_string
189
+ storage_update_xml_string.must_be_kind_of String
190
+
191
+ storage_update_xml = Nokogiri::XML storage_update_xml_string
192
+ storage_update_xml.css('Description').size.must_equal 1
193
+ storage_update_xml.css('Description').text.must_equal partial_options_gre_string[:description]
194
+
195
+ storage_update_xml.css('GeoReplicationEnabled').size.must_equal 0
196
+
197
+ storage_update_xml.css('ExtendedProperties').size.must_equal 0
198
+ end
199
+
200
+ it "returns xml for the options provided" do
201
+ update_xml_string = subject.storage_update_to_xml options
202
+ update_xml_string.must_be_kind_of String
203
+
204
+ update_xml = Nokogiri::XML update_xml_string
205
+
206
+ update_xml.css('Label').text.must_equal(Base64::encode64(options[:label]))
207
+ update_xml.css('GeoReplicationEnabled').size.must_equal 1
208
+ update_xml.css('GeoReplicationEnabled').text.must_equal "#{options[:geo_replication_enabled]}"
209
+
210
+ update_xml.css('ExtendedProperties ExtendedProperty').size.must_equal 1
211
+ update_xml.css('ExtendedProperties ExtendedProperty Name').text.must_equal "#{:prop_1_name}"
212
+ update_xml.css('ExtendedProperties ExtendedProperty Value').text.must_equal options[:extended_properties][:prop_1_name]
213
+ end
214
+
215
+ it "returns xml for options but with description in absence of label" do
216
+ options.delete(:label)
217
+ update_xml_string = subject.storage_update_to_xml(options)
218
+ update_xml_string.must_be_kind_of(String)
219
+
220
+ update_xml = Nokogiri::XML(update_xml_string)
221
+
222
+ update_xml.css('Description').text.must_equal(options[:description])
223
+ update_xml.css('GeoReplicationEnabled').size.must_equal(1)
224
+ update_xml.css('ExtendedProperties ExtendedProperty').size.must_equal(1)
225
+ update_xml.css('ExtendedProperties ExtendedProperty Name').text
226
+ .must_equal("#{:prop_1_name}")
227
+ update_xml.css('ExtendedProperties ExtendedProperty Value')
228
+ .text.must_equal(options[:extended_properties][:prop_1_name])
229
+ end
230
+ end
231
+
232
+ describe "#regenerate_storage_account_keys_from_xml" do
233
+ let(:storage_services_access_keys) { Fixtures["storage_service_keys"] }
234
+
235
+ it "returns an Array of StorageService instances" do
236
+ storage_keys_xml = Nokogiri::XML(storage_services_access_keys)
237
+ result = subject.storage_account_keys_from_xml storage_keys_xml
238
+ result.must_be_kind_of Azure::StorageManagement::StorageAccountKeys
239
+ result.primary_key.wont_be_nil
240
+ result.secondary_key.wont_be_nil
241
+ end
242
+ end
243
+
244
+ end