azure 0.1.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/ChangeLog.txt +5 -0
- data/Gemfile +16 -3
- data/README.md +344 -2
- data/Rakefile +66 -37
- data/azure.gemspec +30 -11
- data/lib/azure.rb +35 -4
- data/lib/azure/blob/blob.rb +32 -0
- data/lib/azure/blob/blob_service.rb +1423 -0
- data/lib/azure/blob/block.rb +31 -0
- data/lib/azure/blob/container.rb +32 -0
- data/lib/azure/blob/serialization.rb +285 -0
- data/lib/azure/core.rb +32 -0
- data/lib/azure/core/auth/authorizer.rb +36 -0
- data/lib/azure/core/auth/shared_key.rb +21 -6
- data/lib/azure/core/auth/shared_key_lite.rb +17 -3
- data/lib/azure/core/auth/signer.rb +48 -0
- data/lib/azure/core/configuration.rb +152 -0
- data/lib/azure/core/error.rb +22 -0
- data/lib/azure/core/filtered_service.rb +44 -0
- data/lib/azure/core/http/debug_filter.rb +36 -0
- data/lib/azure/core/http/http_error.rb +84 -0
- data/lib/azure/core/http/http_filter.rb +53 -0
- data/lib/azure/core/http/http_request.rb +157 -0
- data/lib/azure/core/http/http_response.rb +133 -0
- data/lib/azure/core/http/retry_policy.rb +68 -0
- data/lib/azure/core/http/signer_filter.rb +34 -0
- data/lib/azure/core/service.rb +38 -32
- data/lib/azure/core/signed_service.rb +43 -0
- data/lib/azure/queue/message.rb +30 -0
- data/lib/azure/queue/queue.rb +29 -0
- data/lib/azure/queue/queue_service.rb +568 -0
- data/lib/azure/queue/serialization.rb +103 -0
- data/lib/azure/service/access_policy.rb +26 -0
- data/lib/azure/service/enumeration_results.rb +21 -0
- data/lib/azure/service/logging.rb +32 -0
- data/lib/azure/service/metrics.rb +31 -0
- data/lib/azure/service/retention_policy.rb +25 -0
- data/lib/azure/service/serialization.rb +240 -0
- data/lib/azure/service/signed_identifier.rb +30 -0
- data/lib/azure/service/storage_service.rb +79 -0
- data/lib/azure/service/storage_service_properties.rb +32 -0
- data/lib/azure/service_bus/action.rb +21 -0
- data/lib/azure/service_bus/auth/wrap_service.rb +59 -46
- data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
- data/lib/azure/service_bus/brokered_message.rb +36 -51
- data/lib/azure/service_bus/brokered_message_serializer.rb +48 -34
- data/lib/azure/service_bus/correlation_filter.rb +45 -0
- data/lib/azure/service_bus/empty_rule_action.rb +30 -0
- data/lib/azure/service_bus/false_filter.rb +38 -0
- data/lib/azure/service_bus/filter.rb +21 -0
- data/lib/azure/{core/utils → service_bus}/interval.rb +29 -22
- data/lib/azure/service_bus/queue.rb +230 -0
- data/lib/azure/service_bus/resource.rb +109 -0
- data/lib/azure/service_bus/rule.rb +98 -0
- data/lib/azure/service_bus/rule_aspect.rb +34 -0
- data/lib/azure/service_bus/serialization.rb +160 -0
- data/lib/azure/service_bus/service_bus_service.rb +819 -12
- data/lib/azure/service_bus/sql_filter.rb +50 -0
- data/lib/azure/service_bus/sql_rule_action.rb +50 -0
- data/lib/azure/service_bus/subscription.rb +184 -0
- data/lib/azure/service_bus/topic.rb +187 -0
- data/lib/azure/service_bus/true_filter.rb +38 -0
- data/lib/azure/{tables → table}/auth/shared_key.rb +33 -12
- data/lib/azure/table/auth/shared_key_lite.rb +44 -0
- data/lib/azure/table/batch.rb +330 -0
- data/lib/azure/table/batch_response.rb +117 -0
- data/lib/azure/table/edmtype.rb +127 -0
- data/lib/azure/table/entity.rb +31 -0
- data/lib/azure/table/guid.rb +24 -0
- data/lib/azure/table/query.rb +112 -0
- data/lib/azure/table/serialization.rb +105 -0
- data/lib/azure/table/table_service.rb +557 -0
- data/lib/azure/version.rb +31 -0
- data/test/fixtures/container_acl.xml +11 -0
- data/test/fixtures/{error.xml → http_error.xml} +0 -0
- data/test/fixtures/list_blobs.xml +121 -0
- data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
- data/test/fixtures/list_blocks_all.xml +23 -0
- data/test/fixtures/list_blocks_committed.xml +13 -0
- data/test/fixtures/list_containers.xml +38 -0
- data/test/fixtures/list_page_ranges.xml +11 -0
- data/test/fixtures/logging.xml +11 -0
- data/test/fixtures/metrics.xml +10 -0
- data/test/fixtures/queues.xml +1 -1
- data/test/fixtures/retention_policy.xml +5 -0
- data/test/fixtures/storage_service_properties.xml +23 -0
- data/test/integration/blob/blob_metadata_test.rb +75 -0
- data/test/integration/blob/blob_pages_test.rb +119 -0
- data/test/integration/blob/blob_properties_test.rb +77 -0
- data/test/integration/blob/block_blob_test.rb +254 -0
- data/test/integration/blob/container/container_acl_test.rb +69 -0
- data/test/integration/blob/container/container_metadata_test.rb +50 -0
- data/test/integration/blob/container/create_container_test.rb +60 -0
- data/test/integration/blob/container/delete_container_test.rb +39 -0
- data/test/integration/blob/container/get_container_properties_test.rb +48 -0
- data/test/integration/blob/container/list_containers_test.rb +79 -0
- data/test/integration/blob/container/root_container_test.rb +50 -0
- data/test/integration/blob/copy_blob_test.rb +113 -0
- data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
- data/test/integration/blob/create_page_blob_test.rb +83 -0
- data/test/integration/blob/delete_blob_test.rb +159 -0
- data/test/integration/blob/get_blob_test.rb +65 -0
- data/test/integration/blob/informative_errors_test.rb +39 -0
- data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
- data/test/integration/blob/lease/break_lease_test.rb +40 -0
- data/test/integration/blob/lease/release_lease_test.rb +40 -0
- data/test/integration/blob/lease/renew_lease_test.rb +42 -0
- data/test/integration/blob/list_blobs_test.rb +113 -0
- data/test/integration/queue/clear_messages_test.rb +42 -0
- data/test/integration/queue/create_message_test.rb +75 -0
- data/test/integration/queue/create_queue_test.rb +50 -0
- data/test/integration/queue/delete_message_test.rb +67 -0
- data/test/integration/queue/delete_queue_test.rb +45 -0
- data/test/integration/queue/informative_errors_test.rb +42 -0
- data/test/integration/queue/list_messages_encoded_test.rb +79 -0
- data/test/integration/queue/list_messages_test.rb +79 -0
- data/test/integration/queue/list_queues_test.rb +44 -0
- data/test/integration/queue/peek_messages_test.rb +59 -0
- data/test/integration/queue/queue_metadata_test.rb +40 -0
- data/test/integration/queue/update_message_test.rb +74 -0
- data/test/integration/service_bus/informative_errors_test.rb +37 -0
- data/test/integration/service_bus/queues_scenario_test.rb +200 -0
- data/test/integration/service_bus/queues_test.rb +266 -0
- data/test/integration/service_bus/rules_test.rb +145 -0
- data/test/integration/service_bus/scenario_test.rb +102 -0
- data/test/integration/service_bus/subscriptions_test.rb +211 -0
- data/test/integration/service_bus/topics_scenario_test.rb +406 -0
- data/test/integration/service_bus/topics_test.rb +129 -0
- data/test/integration/table/create_table_test.rb +36 -0
- data/test/integration/table/delete_entity_batch_test.rb +107 -0
- data/test/integration/table/delete_entity_test.rb +94 -0
- data/test/integration/table/delete_table_test.rb +40 -0
- data/test/integration/table/get_table_test.rb +37 -0
- data/test/integration/table/informative_errors_test.rb +39 -0
- data/test/integration/table/insert_entity_batch_test.rb +100 -0
- data/test/integration/table/insert_entity_test.rb +88 -0
- data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
- data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
- data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
- data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
- data/test/integration/table/merge_entity_batch_test.rb +128 -0
- data/test/integration/table/merge_entity_test.rb +113 -0
- data/test/integration/table/query_entities_test.rb +195 -0
- data/test/integration/table/query_tables_test.rb +43 -0
- data/test/integration/table/query_test.rb +251 -0
- data/test/integration/table/table_acl_test.rb +52 -0
- data/test/integration/table/update_entity_batch_test.rb +149 -0
- data/test/integration/table/update_entity_test.rb +131 -0
- data/test/integration/test_helper.rb +23 -9
- data/test/support/env.rb +15 -1
- data/test/support/fixtures.rb +14 -0
- data/test/support/name_generator.rb +74 -0
- data/test/support/stubs.rb +14 -0
- data/test/test_helper.rb +43 -3
- data/test/unit/blob/blob_service_test.rb +1947 -0
- data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
- data/test/unit/core/auth/shared_key_test.rb +58 -0
- data/test/unit/core/auth/signer_test.rb +30 -0
- data/test/unit/core/http/http_error_test.rb +57 -0
- data/test/unit/core/http/http_request_test.rb +66 -0
- data/test/unit/core/http/http_response_test.rb +45 -0
- data/test/unit/service/serialization_test.rb +502 -0
- data/test/unit/service/storage_service_test.rb +291 -0
- data/test/unit/table/edmtype_test.rb +108 -0
- metadata +231 -230
- data/Gemfile.lock +0 -36
- data/lib/azure/atom.rb +0 -170
- data/lib/azure/auth.rb +0 -29
- data/lib/azure/blobs.rb +0 -620
- data/lib/azure/blobs/blob.rb +0 -360
- data/lib/azure/blobs/container.rb +0 -209
- data/lib/azure/blobs/service.rb +0 -396
- data/lib/azure/blobs/shared_access_signature.rb +0 -84
- data/lib/azure/blobs/uri.rb +0 -60
- data/lib/azure/configuration.rb +0 -121
- data/lib/azure/core/collection.rb +0 -118
- data/lib/azure/core/signer.rb +0 -32
- data/lib/azure/core/utils/queryable.rb +0 -74
- data/lib/azure/core/utils/storage_service_properties.rb +0 -83
- data/lib/azure/core/utils/string.rb +0 -59
- data/lib/azure/error.rb +0 -72
- data/lib/azure/queues.rb +0 -272
- data/lib/azure/queues/message.rb +0 -174
- data/lib/azure/queues/queue.rb +0 -187
- data/lib/azure/queues/service.rb +0 -263
- data/lib/azure/queues/service_properties.rb +0 -152
- data/lib/azure/queues/uri.rb +0 -78
- data/lib/azure/request.rb +0 -102
- data/lib/azure/response.rb +0 -93
- data/lib/azure/service_bus.rb +0 -4
- data/lib/azure/service_bus/auth/authorizer.rb +0 -22
- data/lib/azure/service_bus/auth/uri.rb +0 -52
- data/lib/azure/service_bus/auth/wrap.rb +0 -37
- data/lib/azure/service_bus/auth/wrap_token.rb +0 -45
- data/lib/azure/service_bus/auth/wrap_token_manager.rb +0 -46
- data/lib/azure/service_bus/queues.rb +0 -194
- data/lib/azure/service_bus/queues/queue.rb +0 -100
- data/lib/azure/service_bus/queues/queue_serializer.rb +0 -51
- data/lib/azure/service_bus/queues/service.rb +0 -154
- data/lib/azure/service_bus/queues/uri.rb +0 -80
- data/lib/azure/service_bus/rules.rb +0 -110
- data/lib/azure/service_bus/rules/rule.rb +0 -97
- data/lib/azure/service_bus/rules/service.rb +0 -122
- data/lib/azure/service_bus/rules/uri.rb +0 -39
- data/lib/azure/service_bus/subscriptions.rb +0 -170
- data/lib/azure/service_bus/subscriptions/service.rb +0 -133
- data/lib/azure/service_bus/subscriptions/subscription.rb +0 -164
- data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +0 -74
- data/lib/azure/service_bus/subscriptions/uri.rb +0 -71
- data/lib/azure/service_bus/topics.rb +0 -120
- data/lib/azure/service_bus/topics/service.rb +0 -98
- data/lib/azure/service_bus/topics/topic.rb +0 -122
- data/lib/azure/service_bus/topics/topic_serializer.rb +0 -44
- data/lib/azure/service_bus/topics/uri.rb +0 -58
- data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +0 -21
- data/lib/azure/service_runtime/client/goal_state_protocol.rb +0 -18
- data/lib/azure/service_runtime/client/runtime_client.rb +0 -135
- data/lib/azure/service_runtime/deployment.rb +0 -24
- data/lib/azure/service_runtime/local_resource.rb +0 -15
- data/lib/azure/service_runtime/role.rb +0 -17
- data/lib/azure/service_runtime/role_environment.rb +0 -206
- data/lib/azure/service_runtime/role_environment_change.rb +0 -32
- data/lib/azure/service_runtime/role_instance.rb +0 -35
- data/lib/azure/service_runtime/role_instance_endpoint.rb +0 -14
- data/lib/azure/tables.rb +0 -215
- data/lib/azure/tables/auth/shared_key_lite.rb +0 -30
- data/lib/azure/tables/entities_collection.rb +0 -66
- data/lib/azure/tables/entity.rb +0 -127
- data/lib/azure/tables/service.rb +0 -211
- data/lib/azure/tables/table.rb +0 -129
- data/lib/azure/tables/tables_collection.rb +0 -62
- data/lib/azure/tables/types.rb +0 -65
- data/lib/azure/tables/uri.rb +0 -62
- data/test/integration/blobs/auth_test.rb +0 -19
- data/test/integration/blobs/blob_test.rb +0 -61
- data/test/integration/blobs/clear_page_range_test.rb +0 -19
- data/test/integration/blobs/copy_test.rb +0 -33
- data/test/integration/blobs/create_blobs_test.rb +0 -51
- data/test/integration/blobs/create_container_test.rb +0 -13
- data/test/integration/blobs/create_snapshot_test.rb +0 -17
- data/test/integration/blobs/delete_blob_snapshots_test.rb +0 -19
- data/test/integration/blobs/delete_blobs_test.rb +0 -25
- data/test/integration/blobs/delete_container_test.rb +0 -24
- data/test/integration/blobs/delete_snapshot_test.rb +0 -17
- data/test/integration/blobs/get_blob_snapshot_test.rb +0 -18
- data/test/integration/blobs/get_blobs_test.rb +0 -31
- data/test/integration/blobs/get_page_range_test.rb +0 -19
- data/test/integration/blobs/list_blobs_test.rb +0 -39
- data/test/integration/blobs/list_containers_test.rb +0 -28
- data/test/integration/blobs/manage_blob_leases_test.rb +0 -45
- data/test/integration/blobs/manage_blob_metadata_test.rb +0 -51
- data/test/integration/blobs/manage_blob_properties_test.rb +0 -25
- data/test/integration/blobs/manage_blob_service_properties_test.rb +0 -38
- data/test/integration/blobs/manage_container_metadata_test.rb +0 -46
- data/test/integration/blobs/manage_container_permissions_test.rb +0 -17
- data/test/integration/blobs/update_page_range_test.rb +0 -20
- data/test/integration/queues/clear_messages_test.rb +0 -22
- data/test/integration/queues/create_queue_test.rb +0 -13
- data/test/integration/queues/delete_message_test.rb +0 -42
- data/test/integration/queues/delete_queue_test.rb +0 -24
- data/test/integration/queues/get_messages_test.rb +0 -39
- data/test/integration/queues/list_queues_test.rb +0 -43
- data/test/integration/queues/manage_queue_metadata_test.rb +0 -45
- data/test/integration/queues/manage_queue_service_properties_test.rb +0 -27
- data/test/integration/queues/peek_messages_test.rb +0 -55
- data/test/integration/queues/put_message_test.rb +0 -31
- data/test/integration/queues/update_message_test.rb +0 -46
- data/test/integration/service_bus/auth_test.rb +0 -18
- data/test/integration/service_bus/queues/create_queue_test.rb +0 -25
- data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +0 -29
- data/test/integration/service_bus/queues/delete_queue_test.rb +0 -25
- data/test/integration/service_bus/queues/get_queue_test.rb +0 -23
- data/test/integration/service_bus/queues/list_queues_test.rb +0 -39
- data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +0 -34
- data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +0 -31
- data/test/integration/service_bus/queues/send_message_to_queue_test.rb +0 -22
- data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +0 -36
- data/test/integration/service_bus/rules/create_rule_test.rb +0 -19
- data/test/integration/service_bus/rules/delete_rule_test.rb +0 -17
- data/test/integration/service_bus/rules/get_rule_test.rb +0 -21
- data/test/integration/service_bus/rules/list_rules_test.rb +0 -24
- data/test/integration/service_bus/rules/rule_test.rb +0 -16
- data/test/integration/service_bus/subscriptions/create_subscription_test.rb +0 -25
- data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +0 -31
- data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +0 -30
- data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +0 -28
- data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +0 -23
- data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +0 -42
- data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +0 -36
- data/test/integration/service_bus/subscriptions/subscription_test.rb +0 -31
- data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +0 -43
- data/test/integration/service_bus/topics/create_topic_test.rb +0 -25
- data/test/integration/service_bus/topics/delete_topic_test.rb +0 -25
- data/test/integration/service_bus/topics/get_topic_test.rb +0 -23
- data/test/integration/service_bus/topics/list_topics_test.rb +0 -39
- data/test/integration/service_bus/topics/send_message_to_topic_test.rb +0 -23
- data/test/integration/tables/auth_test.rb +0 -29
- data/test/integration/tables/creating_tables_test.rb +0 -16
- data/test/integration/tables/delete_entity_test.rb +0 -39
- data/test/integration/tables/deleting_table_test.rb +0 -22
- data/test/integration/tables/insert_entity_test.rb +0 -23
- data/test/integration/tables/merge_entity_test.rb +0 -28
- data/test/integration/tables/query_entities_test.rb +0 -131
- data/test/integration/tables/query_tables_test.rb +0 -63
- data/test/integration/tables/update_entity_test.rb +0 -54
- data/test/support/blobs.rb +0 -12
- data/test/support/table_names.rb +0 -44
- data/test/unit/atom_test.rb +0 -58
- data/test/unit/auth_test.rb +0 -24
- data/test/unit/blobs/blob_test.rb +0 -5
- data/test/unit/blobs/container_test.rb +0 -67
- data/test/unit/blobs/service_test.rb +0 -17
- data/test/unit/blobs/shared_access_signature_test.rb +0 -66
- data/test/unit/blobs_test.rb +0 -156
- data/test/unit/core/service_test.rb +0 -57
- data/test/unit/core/utils/interval_test.rb +0 -70
- data/test/unit/core/utils/queryable_test.rb +0 -69
- data/test/unit/core/utils/storage_service_properties_test.rb +0 -66
- data/test/unit/error_test.rb +0 -39
- data/test/unit/queues/message_test.rb +0 -40
- data/test/unit/queues/queue_test.rb +0 -64
- data/test/unit/queues/service_properties.rb +0 -35
- data/test/unit/request_test.rb +0 -38
- data/test/unit/response_test.rb +0 -43
- data/test/unit/service_bus/auth/authorizer_test.rb +0 -27
- data/test/unit/service_bus/auth/wrap_token_test.rb +0 -28
- data/test/unit/service_bus/queues/queue_test.rb +0 -38
- data/test/unit/service_bus/topics/topic_test.rb +0 -33
- data/test/unit/service_runtime/data/goalstate.xml +0 -9
- data/test/unit/service_runtime/data/roleenvironmentdata.xml +0 -29
- data/test/unit/service_runtime/data/runtime.xml +0 -6
- data/test/unit/service_runtime/role_environment_test.rb +0 -144
- data/test/unit/tables/auth/shared_key_lite_test.rb +0 -39
- data/test/unit/tables/auth/shared_key_test.rb +0 -45
- data/test/unit/tables/entities_collection_test.rb +0 -39
- data/test/unit/tables/entity_test.rb +0 -72
- data/test/unit/tables/table_test.rb +0 -57
- data/test/unit/tables_test.rb +0 -302
- data/test/unit/types_test.rb +0 -67
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/auth/shared_key_lite"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Auth::SharedKeyLite do
|
|
19
|
+
subject { Azure::Core::Auth::SharedKeyLite.new "account-name", "YWNjZXNzLWtleQ==" }
|
|
20
|
+
|
|
21
|
+
let(:method) { "POST" }
|
|
22
|
+
let(:uri) { URI.parse "http://dummy.uri/resource" }
|
|
23
|
+
let(:headers) do
|
|
24
|
+
{
|
|
25
|
+
"Content-MD5"=> "foo",
|
|
26
|
+
"Content-Type"=> "foo",
|
|
27
|
+
"Date"=> "foo"
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
let(:headers_without_date) {
|
|
31
|
+
headers_without_date = headers.clone
|
|
32
|
+
headers_without_date.delete "Date"
|
|
33
|
+
headers_without_date
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe "sign" do
|
|
37
|
+
it "creates a signature from the provided HTTP method, uri, and reduced set of standard headers" do
|
|
38
|
+
subject.sign(method, uri, headers).must_equal "account-name:vVFnj/+27JFABZgpt5H8g/JVU2HuWFnjv5aeUIxQvBE="
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "ignores standard headers other than Content-MD5, Content-Type, and Date" do
|
|
42
|
+
subject.sign(method, uri, headers.merge({"Content-Encoding"=> "foo"})).must_equal "account-name:vVFnj/+27JFABZgpt5H8g/JVU2HuWFnjv5aeUIxQvBE="
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "throws IndexError when there is no Date header" do
|
|
46
|
+
assert_raises IndexError do
|
|
47
|
+
subject.sign(method, uri, headers_without_date)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/auth/shared_key"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Auth::SharedKey do
|
|
19
|
+
subject { Azure::Core::Auth::SharedKey.new "account-name", "YWNjZXNzLWtleQ==" }
|
|
20
|
+
|
|
21
|
+
let(:method) { "POST" }
|
|
22
|
+
let(:uri) { URI.parse "http://dummy.uri/resource" }
|
|
23
|
+
let(:headers) do
|
|
24
|
+
{
|
|
25
|
+
"Content-Encoding"=> "foo",
|
|
26
|
+
"Content-Language"=> "foo",
|
|
27
|
+
"Content-Length"=> "foo",
|
|
28
|
+
"Content-MD5"=> "foo",
|
|
29
|
+
"Content-Type"=> "foo",
|
|
30
|
+
"Date"=> "foo",
|
|
31
|
+
"If-Modified-Since"=> "foo",
|
|
32
|
+
"If-Match"=> "foo",
|
|
33
|
+
"If-None-Match"=> "foo",
|
|
34
|
+
"If-Unmodified-Since"=> "foo",
|
|
35
|
+
"Range"=> "foo",
|
|
36
|
+
"x-ms-ImATeapot"=> "teapot",
|
|
37
|
+
"x-ms-ShortAndStout"=>"True"
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "sign" do
|
|
42
|
+
it "creates a signature from the provided HTTP method, uri, and a specific set of standard headers" do
|
|
43
|
+
subject.sign(method, uri, headers).must_equal "account-name:vcdxlDVoE1QvJerkg0ci3Wlnj2Qq8yzlsrkRf5dEU/I="
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "canonicalized_headers" do
|
|
48
|
+
it "creates a canonicalized header string" do
|
|
49
|
+
subject.canonicalized_headers(headers).must_equal "x-ms-imateapot:teapot\nx-ms-shortandstout:True"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "canonicalized_resource" do
|
|
54
|
+
it "creates a canonicalized resource string" do
|
|
55
|
+
subject.canonicalized_resource(uri).must_equal "/account-name/resource"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/auth/signer"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Auth::Signer do
|
|
19
|
+
subject { Azure::Core::Auth::Signer.new "YWNjZXNzLWtleQ==" }
|
|
20
|
+
|
|
21
|
+
it "decodes the base64 encoded access_key" do
|
|
22
|
+
subject.access_key.must_equal "access-key"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "sign" do
|
|
26
|
+
it "creates a signature for the body, as a base64 encoded string, which represents a HMAC hash using the access_key" do
|
|
27
|
+
subject.sign("body").must_equal "iuUxVhs1E7PeSNx/90ViyJNO24160qYpoWeCcOsnMoM="
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/http/http_error"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Http::HTTPError do
|
|
19
|
+
let :http_response do
|
|
20
|
+
double(:body=> Fixtures[:http_error], :status_code=> 409, :uri=>'http://dummy.uri')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
subject do
|
|
24
|
+
Azure::Core::Http::HTTPError.new(http_response)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "is an instance of Azure::Core::Error" do
|
|
28
|
+
subject.must_be_kind_of Azure::Core::Error
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "lets us see the original uri" do
|
|
32
|
+
subject.uri.must_equal 'http://dummy.uri'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "lets us see the errors'status code" do
|
|
36
|
+
subject.status_code.must_equal 409
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "lets us see the error's type" do
|
|
40
|
+
subject.type.must_equal "TableAlreadyExists"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "lets us see the error's description" do
|
|
44
|
+
subject.description.must_equal "The table specified already exists."
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "generates an error message that wraps both the type and description" do
|
|
48
|
+
subject.message.must_equal "TableAlreadyExists (409): The table specified already exists."
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "sets the type to unknown if the response body is not an XML" do
|
|
52
|
+
http_response.body = "\r\nInvalid request\r\n"
|
|
53
|
+
|
|
54
|
+
subject.type.must_equal "Unknown"
|
|
55
|
+
subject.description.must_equal "Invalid request"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/http/http_request"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Http::HttpRequest do
|
|
19
|
+
describe " default_headers " do
|
|
20
|
+
subject do
|
|
21
|
+
Azure::Core::Http::HttpRequest.new(:get, URI("/"), nil, "Thu, 04 Oct 2012 06:38:27 GMT")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "sets the x-ms-date header to the current_time" do
|
|
25
|
+
subject.headers["x-ms-date"] = "Thu, 04 Oct 2012 06:38:27 GMT"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "sets the x-ms-version header to the current API version" do
|
|
29
|
+
subject.headers["x-ms-version"] = "2011-08-18"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "sets the DataServiceVersion header to the current API version" do
|
|
33
|
+
subject.headers["DataServiceVersion"] = "1.0;NetFx"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "sets the MaxDataServiceVersion header to the current max` API version" do
|
|
37
|
+
subject.headers["MaxDataServiceVersion"] = "2.0;NetFx"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe " when passed a body " do
|
|
41
|
+
subject do
|
|
42
|
+
Azure::Core::Http::HttpRequest.new(:get, URI("/"), "<body/>")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "sets the default Content-Type header" do
|
|
46
|
+
subject.headers["Content-Type"].must_equal "application/atom+xml; charset=utf-8"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "sets the Content-Length header" do
|
|
50
|
+
subject.headers["Content-Length"].must_equal "7"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "sets the Content-MD5 header to a Base64 encoded representation of the MD5 hash of the body" do
|
|
54
|
+
subject.headers["Content-MD5"].must_equal "PNeJy7qyzV4XUoBBHkVu0g=="
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe " when the body is nil " do
|
|
59
|
+
it "leaves the Content-Type, Content-Length, and Content-MD5 headers blank" do
|
|
60
|
+
subject.headers["Content-Type"].must_equal ""
|
|
61
|
+
subject.headers["Content-Length"].must_equal "0"
|
|
62
|
+
subject.headers["Content-MD5"].must_be_nil
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/core/http/http_response"
|
|
17
|
+
|
|
18
|
+
describe Azure::Core::Http::HttpResponse do
|
|
19
|
+
it "converts net/http headers into strings" do
|
|
20
|
+
http_response = MiniTest::Mock.new
|
|
21
|
+
http_response.stub(:to_hash, { "Content-Type" => ["text/xml"] })
|
|
22
|
+
|
|
23
|
+
response = Azure::Core::Http::HttpResponse.new(http_response)
|
|
24
|
+
response.headers["Content-Type"].must_equal "text/xml"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Azure::Core::Http::HttpResponse::HeaderHash do
|
|
28
|
+
subject do
|
|
29
|
+
Azure::Core::Http::HttpResponse::HeaderHash.new(
|
|
30
|
+
"AsdAsd" => ["1"], "bazqux" => ["2"], "QUXFOO" => ["3"]
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "returns the header values as strings, not arrays" do
|
|
35
|
+
subject["AsdAsd"].must_equal "1"
|
|
36
|
+
subject["bazqux"].must_equal "2"
|
|
37
|
+
subject["QUXFOO"].must_equal "3"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "obtains keys in a case-insensitive fashion" do
|
|
41
|
+
subject["asdasd"].must_equal "1"
|
|
42
|
+
subject["BaZqUx"].must_equal "2"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft. 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/serialization"
|
|
17
|
+
|
|
18
|
+
require 'azure/service/enumeration_results'
|
|
19
|
+
require 'azure/service/signed_identifier'
|
|
20
|
+
require 'azure/service/access_policy'
|
|
21
|
+
|
|
22
|
+
require 'azure/service/storage_service_properties'
|
|
23
|
+
require 'azure/service/logging'
|
|
24
|
+
require 'azure/service/metrics'
|
|
25
|
+
require 'azure/service/retention_policy'
|
|
26
|
+
|
|
27
|
+
describe Azure::Service::Serialization do
|
|
28
|
+
subject { Azure::Service::Serialization }
|
|
29
|
+
|
|
30
|
+
let(:storage_service_properties) { Azure::Service::StorageServiceProperties.new }
|
|
31
|
+
let(:storage_service_properties_xml) { Fixtures["storage_service_properties"] }
|
|
32
|
+
|
|
33
|
+
describe "#signed_identifiers_from_xml" do
|
|
34
|
+
let(:signed_identifiers_xml) { Fixtures["container_acl"]}
|
|
35
|
+
|
|
36
|
+
it "accepts an XML string" do
|
|
37
|
+
subject.signed_identifiers_from_xml signed_identifiers_xml
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "returns an Array of SignedIdentifier instances" do
|
|
41
|
+
results = subject.signed_identifiers_from_xml signed_identifiers_xml
|
|
42
|
+
results.must_be_kind_of Array
|
|
43
|
+
results[0].must_be_kind_of Azure::Service::SignedIdentifier
|
|
44
|
+
results.count.must_equal 1
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "#signed_identifiers_to_xml" do
|
|
49
|
+
let(:signed_identifiers) {
|
|
50
|
+
identifier = Azure::Service::SignedIdentifier.new
|
|
51
|
+
identifier.id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
|
|
52
|
+
identifier.access_policy.start = "2009-09-28T08:49:37.0000000Z"
|
|
53
|
+
identifier.access_policy.expiry = "2009-09-29T08:49:37.0000000Z"
|
|
54
|
+
identifier.access_policy.permission = "rwd"
|
|
55
|
+
[identifier]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let(:signed_identifiers_xml) { Fixtures["container_acl"]}
|
|
59
|
+
|
|
60
|
+
it "accepts a list of SignedIdentifier instances" do
|
|
61
|
+
subject.signed_identifiers_to_xml signed_identifiers
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "returns a XML graph of the provided values" do
|
|
65
|
+
xml = subject.signed_identifiers_to_xml signed_identifiers
|
|
66
|
+
xml.must_equal signed_identifiers_xml
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe "#signed_identifier_from_xml" do
|
|
71
|
+
let(:signed_identifier_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier }
|
|
72
|
+
let(:mock_access_policy) { mock() }
|
|
73
|
+
before { subject.expects(:access_policy_from_xml).with(signed_identifier_xml.AccessPolicy).returns(mock_access_policy) }
|
|
74
|
+
|
|
75
|
+
it "accepts an XML node" do
|
|
76
|
+
subject.signed_identifier_from_xml signed_identifier_xml
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "returns a SignedIdentifier instance" do
|
|
80
|
+
identifier = subject.signed_identifier_from_xml signed_identifier_xml
|
|
81
|
+
identifier.must_be_kind_of Azure::Service::SignedIdentifier
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "sets the properties of the SignedIdentifier" do
|
|
85
|
+
identifier = subject.signed_identifier_from_xml signed_identifier_xml
|
|
86
|
+
identifier.wont_be_nil
|
|
87
|
+
identifier.id.must_equal "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "#access_policy_from_xml" do
|
|
92
|
+
let(:access_policy_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier.AccessPolicy }
|
|
93
|
+
|
|
94
|
+
it "accepts an XML node" do
|
|
95
|
+
subject.access_policy_from_xml access_policy_xml
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "returns a AccessPolicy instance" do
|
|
99
|
+
access_policy = subject.access_policy_from_xml access_policy_xml
|
|
100
|
+
access_policy.must_be_kind_of Azure::Service::AccessPolicy
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "sets the properties of the AccessPolicy" do
|
|
104
|
+
access_policy = subject.access_policy_from_xml access_policy_xml
|
|
105
|
+
|
|
106
|
+
access_policy.wont_be_nil
|
|
107
|
+
access_policy.start.must_equal "2009-09-28T08:49:37.0000000Z"
|
|
108
|
+
access_policy.expiry.must_equal "2009-09-29T08:49:37.0000000Z"
|
|
109
|
+
access_policy.permission.must_equal "rwd"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe "#enumeration_results_from_xml" do
|
|
114
|
+
let(:enumeration_results_xml) { Fixtures[:list_containers] }
|
|
115
|
+
|
|
116
|
+
describe "when passed an instance of EnumerationResults" do
|
|
117
|
+
let(:enumeration_results) { Azure::Service::EnumerationResults.new }
|
|
118
|
+
|
|
119
|
+
it "parses the XML and populates the provided EnumerationResults instance" do
|
|
120
|
+
result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
|
|
121
|
+
result.must_be :kind_of?, Azure::Service::EnumerationResults
|
|
122
|
+
result.continuation_token.must_equal "video"
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "returns the same instance provided" do
|
|
126
|
+
result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
|
|
127
|
+
result.must_equal enumeration_results
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "when passed nil" do
|
|
132
|
+
it "returns a new instance of EnumerationResults" do
|
|
133
|
+
result = subject.enumeration_results_from_xml enumeration_results_xml, nil
|
|
134
|
+
result.must_be_kind_of Azure::Service::EnumerationResults
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
describe "#metadata_from_xml" do
|
|
140
|
+
let(:list_containers_xml) { Fixtures["list_containers"] }
|
|
141
|
+
let(:metadata_xml_node) { Nokogiri.Slop(list_containers_xml).root.Containers.Container[1].Metadata }
|
|
142
|
+
|
|
143
|
+
it "converts a Metadata XML element to a Hash" do
|
|
144
|
+
subject.metadata_from_xml(metadata_xml_node).must_be_kind_of Hash
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "uses the child element names as keys" do
|
|
148
|
+
hash = subject.metadata_from_xml(metadata_xml_node)
|
|
149
|
+
hash.has_key?("mymetadata1").must_equal true
|
|
150
|
+
hash.has_key?("mymetadata2").must_equal true
|
|
151
|
+
hash.has_key?("x-ms-invalid-name").must_equal true
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "uses the child element text contents as values" do
|
|
155
|
+
hash = subject.metadata_from_xml(metadata_xml_node)
|
|
156
|
+
hash["mymetadata1"].must_equal "first value"
|
|
157
|
+
hash["mymetadata2"].must_equal "second value"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
describe "when it encounters more than one of the same element name" do
|
|
161
|
+
it "returns and array of values for that key" do
|
|
162
|
+
hash = subject.metadata_from_xml(metadata_xml_node)
|
|
163
|
+
hash["x-ms-invalid-name"].must_be_kind_of Array
|
|
164
|
+
hash["x-ms-invalid-name"].must_equal ["invalid-metadata-name","invalid-metadata-name2"]
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
describe "#metadata_from_headers" do
|
|
170
|
+
let(:headers) { { "Content-Type"=>"application/xml", "Content-Length"=>"37" } }
|
|
171
|
+
|
|
172
|
+
let(:metadata_headers) { headers.merge({ "x-ms-meta-MyMetadata1" => "first value", "x-ms-meta-MyMetadata2" => "second value" })}
|
|
173
|
+
|
|
174
|
+
it "returns a Hash" do
|
|
175
|
+
subject.metadata_from_headers(metadata_headers).must_be_kind_of Hash
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "extracts metadata from a Hash for keys that start with x-ms-meta-* and removes that prefix" do
|
|
179
|
+
hash = subject.metadata_from_headers(metadata_headers)
|
|
180
|
+
hash.has_key?("MyMetadata1").must_equal true
|
|
181
|
+
hash.has_key?("MyMetadata2").must_equal true
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "sets the metadata values to the corresponding header values" do
|
|
185
|
+
hash = subject.metadata_from_headers(metadata_headers)
|
|
186
|
+
hash["MyMetadata1"].must_equal "first value"
|
|
187
|
+
hash["MyMetadata2"].must_equal "second value"
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
describe "#retention_policy_to_xml" do
|
|
192
|
+
let(:retention_policy) {
|
|
193
|
+
retention_policy = Azure::Service::RetentionPolicy.new
|
|
194
|
+
retention_policy.enabled = true
|
|
195
|
+
retention_policy.days = 7
|
|
196
|
+
|
|
197
|
+
retention_policy
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
let(:retention_policy_xml) { Fixtures["retention_policy"]}
|
|
201
|
+
|
|
202
|
+
it "accepts a RetentionPolicy instance and an Nokogiri::XML::Builder instance" do
|
|
203
|
+
Nokogiri::XML::Builder.new do |xml|
|
|
204
|
+
subject.retention_policy_to_xml retention_policy, xml
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "adds to the XML Builder, which will create the XML graph of the provided values" do
|
|
209
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
210
|
+
subject.retention_policy_to_xml retention_policy, xml
|
|
211
|
+
end
|
|
212
|
+
builder.to_xml.must_equal retention_policy_xml
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
describe "#retention_policy_from_xml" do
|
|
217
|
+
let(:retention_policy_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.Metrics.RetentionPolicy }
|
|
218
|
+
|
|
219
|
+
it "accepts an XML Node" do
|
|
220
|
+
subject.retention_policy_from_xml retention_policy_xml
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "returns an RetentionPolicy instance" do
|
|
224
|
+
retention_policy = subject.retention_policy_from_xml retention_policy_xml
|
|
225
|
+
retention_policy.wont_be_nil
|
|
226
|
+
retention_policy.must_be_kind_of Azure::Service::RetentionPolicy
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it "sets the properties of the RetentionPolicy instance" do
|
|
230
|
+
retention_policy = subject.retention_policy_from_xml retention_policy_xml
|
|
231
|
+
retention_policy.enabled.must_equal true
|
|
232
|
+
retention_policy.days.must_equal 7
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
describe "#metrics_to_xml" do
|
|
237
|
+
let(:metrics) {
|
|
238
|
+
metrics = Azure::Service::Metrics.new
|
|
239
|
+
metrics.version = "1.0"
|
|
240
|
+
metrics.enabled = true
|
|
241
|
+
metrics.include_apis = false
|
|
242
|
+
retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
|
|
243
|
+
retention_policy.enabled = true
|
|
244
|
+
retention_policy.days = 7
|
|
245
|
+
|
|
246
|
+
metrics
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
let(:metrics_xml) { Fixtures["metrics"]}
|
|
250
|
+
|
|
251
|
+
it "accepts a Metrics instance and an Nokogiri::XML::Builder instance" do
|
|
252
|
+
Nokogiri::XML::Builder.new do |xml|
|
|
253
|
+
subject.metrics_to_xml metrics, xml
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
it "adds to the XML Builder, which will create the XML graph of the provided values" do
|
|
258
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
259
|
+
subject.metrics_to_xml metrics, xml
|
|
260
|
+
end
|
|
261
|
+
builder.to_xml.must_equal metrics_xml
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
describe "#metrics_from_xml" do
|
|
266
|
+
let(:metrics_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.Metrics }
|
|
267
|
+
let(:mock_retention_policy) { mock }
|
|
268
|
+
|
|
269
|
+
before {
|
|
270
|
+
subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
it "accepts an XML Node" do
|
|
274
|
+
subject.metrics_from_xml metrics_xml
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it "returns an Metrics instance" do
|
|
278
|
+
metrics = subject.metrics_from_xml metrics_xml
|
|
279
|
+
metrics.wont_be_nil
|
|
280
|
+
metrics.must_be_kind_of Azure::Service::Metrics
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "sets the properties of the Metrics instance" do
|
|
284
|
+
metrics = subject.metrics_from_xml metrics_xml
|
|
285
|
+
metrics.version.must_equal "1.0"
|
|
286
|
+
metrics.enabled.must_equal true
|
|
287
|
+
metrics.include_apis.must_equal false
|
|
288
|
+
metrics.retention_policy.must_equal mock_retention_policy
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
describe "#logging_to_xml" do
|
|
294
|
+
let(:logging) {
|
|
295
|
+
logging = Azure::Service::Logging.new
|
|
296
|
+
logging.version = "1.0"
|
|
297
|
+
logging.delete = true
|
|
298
|
+
logging.read = false
|
|
299
|
+
logging.write = true
|
|
300
|
+
|
|
301
|
+
retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
|
|
302
|
+
retention_policy.enabled = true
|
|
303
|
+
retention_policy.days = 7
|
|
304
|
+
|
|
305
|
+
logging
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
let(:logging_xml) { Fixtures["logging"]}
|
|
309
|
+
|
|
310
|
+
it "accepts a Logging instance and an Nokogiri::XML::Builder instance" do
|
|
311
|
+
Nokogiri::XML::Builder.new do |xml|
|
|
312
|
+
subject.logging_to_xml logging, xml
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it "adds to the XML Builder, which will create the XML graph of the provided values" do
|
|
317
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
318
|
+
subject.logging_to_xml logging, xml
|
|
319
|
+
end
|
|
320
|
+
builder.to_xml.must_equal logging_xml
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
describe "#logging_from_xml" do
|
|
325
|
+
let(:logging_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.Logging }
|
|
326
|
+
let(:mock_retention_policy) { mock }
|
|
327
|
+
|
|
328
|
+
before {
|
|
329
|
+
subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
it "accepts an XML Node" do
|
|
333
|
+
subject.logging_from_xml logging_xml
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it "returns an Logging instance" do
|
|
337
|
+
logging = subject.logging_from_xml logging_xml
|
|
338
|
+
logging.wont_be_nil
|
|
339
|
+
logging.must_be_kind_of Azure::Service::Logging
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
it "sets the properties of the Logging instance" do
|
|
343
|
+
logging = subject.logging_from_xml logging_xml
|
|
344
|
+
logging.version.must_equal "1.0"
|
|
345
|
+
logging.delete.must_equal true
|
|
346
|
+
logging.read.must_equal false
|
|
347
|
+
logging.write.must_equal true
|
|
348
|
+
logging.retention_policy.must_equal mock_retention_policy
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
describe "#service_properties_to_xml" do
|
|
353
|
+
let(:service_properties) {
|
|
354
|
+
service_properties = Azure::Service::StorageServiceProperties.new
|
|
355
|
+
service_properties.default_service_version = "2011-08-18"
|
|
356
|
+
logging = service_properties.logging = Azure::Service::Logging.new
|
|
357
|
+
logging.version = "1.0"
|
|
358
|
+
logging.delete = true
|
|
359
|
+
logging.read = false
|
|
360
|
+
logging.write = true
|
|
361
|
+
retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
|
|
362
|
+
retention_policy.enabled = true
|
|
363
|
+
retention_policy.days = 7
|
|
364
|
+
|
|
365
|
+
metrics = service_properties.metrics = Azure::Service::Metrics.new
|
|
366
|
+
metrics.version = "1.0"
|
|
367
|
+
metrics.enabled = true
|
|
368
|
+
metrics.include_apis = false
|
|
369
|
+
retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
|
|
370
|
+
retention_policy.enabled = true
|
|
371
|
+
retention_policy.days = 7
|
|
372
|
+
|
|
373
|
+
service_properties
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
let(:service_properties_xml) { Fixtures["storage_service_properties"]}
|
|
377
|
+
|
|
378
|
+
it "accepts a StorageServiceProperties instance" do
|
|
379
|
+
subject.service_properties_to_xml service_properties
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
it "returns a XML graph of the provided values" do
|
|
383
|
+
xml = subject.service_properties_to_xml service_properties
|
|
384
|
+
xml.must_equal service_properties_xml
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
describe "#service_properties_from_xml" do
|
|
389
|
+
let(:service_properties_xml) { Fixtures["storage_service_properties"]}
|
|
390
|
+
let(:mock_logging) { mock }
|
|
391
|
+
let(:mock_metrics) { mock }
|
|
392
|
+
|
|
393
|
+
before {
|
|
394
|
+
subject.expects(:logging_from_xml).returns(mock_logging)
|
|
395
|
+
subject.expects(:metrics_from_xml).returns(mock_metrics)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
it "accepts an XML string" do
|
|
399
|
+
subject.service_properties_from_xml service_properties_xml
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
it "returns an StorageServiceProperties instance" do
|
|
403
|
+
service_properties = subject.service_properties_from_xml service_properties_xml
|
|
404
|
+
service_properties.wont_be_nil
|
|
405
|
+
service_properties.must_be_kind_of Azure::Service::StorageServiceProperties
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
it "sets the properties of the StorageServiceProperties instance" do
|
|
409
|
+
service_properties = subject.service_properties_from_xml service_properties_xml
|
|
410
|
+
service_properties.default_service_version.must_equal "2011-08-18"
|
|
411
|
+
service_properties.logging.must_equal mock_logging
|
|
412
|
+
service_properties.metrics.must_equal mock_metrics
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
describe "#to_bool" do
|
|
417
|
+
it "converts a valid string value to a Boolean" do
|
|
418
|
+
subject.to_bool('true').must_be_kind_of TrueClass
|
|
419
|
+
subject.to_bool('false').must_be_kind_of FalseClass
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
it "is case insensitive" do
|
|
423
|
+
# mixed case
|
|
424
|
+
subject.to_bool('True').must_equal true
|
|
425
|
+
|
|
426
|
+
# upper case
|
|
427
|
+
subject.to_bool('TRUE').must_equal true
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it "returns false for any value other than 'true'" do
|
|
431
|
+
subject.to_bool('random string').must_equal false
|
|
432
|
+
subject.to_bool(nil).must_equal false
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
describe "#slopify" do
|
|
437
|
+
let(:xml_data) { '<?xml version="1.0" encoding="utf-8"?><Foo></Foo>' }
|
|
438
|
+
let(:document) { Nokogiri.Slop xml_data }
|
|
439
|
+
let(:root_node) { document.root }
|
|
440
|
+
let(:non_slop_node) { Nokogiri.parse(xml_data).root }
|
|
441
|
+
|
|
442
|
+
describe "when passed a String" do
|
|
443
|
+
|
|
444
|
+
it "parses the string into a Nokogiri::XML::Element node" do
|
|
445
|
+
result = subject.slopify(xml_data)
|
|
446
|
+
result.must_be_kind_of Nokogiri::XML::Element
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it "returns the root of the parsed Document" do
|
|
450
|
+
result = subject.slopify(xml_data)
|
|
451
|
+
result.name.must_equal root_node.name
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
it "enables Nokogiri 'Slop' mode on the returned Element" do
|
|
455
|
+
result = subject.slopify(xml_data)
|
|
456
|
+
result.must_respond_to :method_missing
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
describe "when passed a Nokogiri::XML::Document" do
|
|
461
|
+
it "returns a Nokogiri::XML::Element node" do
|
|
462
|
+
result = subject.slopify(document)
|
|
463
|
+
result.must_be_kind_of Nokogiri::XML::Element
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
it "returns the root of the Document" do
|
|
467
|
+
result = subject.slopify(document)
|
|
468
|
+
result.name.must_equal root_node.name
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
it "enables Nokogiri 'Slop' mode on the returned Element" do
|
|
472
|
+
result = subject.slopify(xml_data)
|
|
473
|
+
result.must_respond_to :method_missing
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
describe "when passed a Nokogiri::XML::Element" do
|
|
478
|
+
it "returns the Element unchanged" do
|
|
479
|
+
result = subject.slopify(root_node)
|
|
480
|
+
result.must_equal root_node
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
it "does not enable Nokogiri 'Slop' mode on the returned Element if it didn't already have it" do
|
|
484
|
+
result = subject.slopify(root_node)
|
|
485
|
+
result.respond_to?(:method_missing).must_equal root_node.respond_to?(:method_missing)
|
|
486
|
+
|
|
487
|
+
result = subject.slopify(non_slop_node)
|
|
488
|
+
result.respond_to?(:method_missing).must_equal non_slop_node.respond_to?(:method_missing)
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
describe "#expect_node" do
|
|
494
|
+
let(:node) { mock() }
|
|
495
|
+
it "throws an error if the xml node doesn't match the passed element name" do
|
|
496
|
+
node.expects(:name).returns("NotFoo")
|
|
497
|
+
assert_raises RuntimeError do
|
|
498
|
+
subject.expect_node("Foo", node)
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
end
|
|
502
|
+
end
|