From 32691fce55ba9e41d7ec049af0f68821735c5b16 Mon Sep 17 00:00:00 2001 From: weidong huang Date: Mon, 30 Jul 2012 10:36:38 -0700 Subject: [PATCH 1/4] This contains all the bug fixes after first official publish and also added some tests. --- README.md | 81 +- src/azure/__init__.py | 102 +- src/azure/http/__init__.py | 1 + src/azure/http/winhttp.py | 30 +- src/azure/servicebus/__init__.py | 340 +++-- src/azure/servicebus/servicebusservice.py | 8 +- src/azure/storage/__init__.py | 135 +- src/azure/storage/blobservice.py | 29 +- src/azure/storage/queueservice.py | 12 +- src/azure/storage/storageclient.py | 21 +- src/azure/storage/tableservice.py | 38 +- src/codegenerator/blob_input.txt | 7 +- src/codegenerator/codegenerator.py | 84 +- src/codegenerator/servicebus_input.txt | 2 - src/codegenerator/table_input.txt | 17 +- test/azuretest.pyproj | 18 +- test/azuretest/clean.py | 78 ++ test/azuretest/doctest_blobservice.py | 65 + test/azuretest/doctest_queueservice.py | 81 ++ .../doctest_servicebusservicequeue.py | 64 + .../doctest_servicebusservicetopic.py | 95 ++ test/azuretest/doctest_tableservice.py | 116 ++ test/azuretest/test_blobservice.py | 551 +++++++- test/azuretest/test_cloudstorageaccount.py | 77 ++ test/azuretest/test_queueservice.py | 55 +- test/azuretest/test_servicebusservice.py | 270 +++- test/azuretest/test_sharedaccesssignature.py | 137 ++ test/azuretest/test_tableservice.py | 1122 +++++++++++------ test/azuretest/util.py | 22 +- 29 files changed, 2873 insertions(+), 785 deletions(-) create mode 100644 test/azuretest/clean.py create mode 100644 test/azuretest/doctest_blobservice.py create mode 100644 test/azuretest/doctest_queueservice.py create mode 100644 test/azuretest/doctest_servicebusservicequeue.py create mode 100644 test/azuretest/doctest_servicebusservicetopic.py create mode 100644 test/azuretest/doctest_tableservice.py create mode 100644 test/azuretest/test_cloudstorageaccount.py create mode 100644 test/azuretest/test_sharedaccesssignature.py diff --git a/README.md b/README.md index cf8df8a0f985..3bba4f23244a 100644 --- a/README.md +++ b/README.md @@ -45,20 +45,21 @@ the local Storage Emulator (with the exception of Service Bus features). # Usage ## Table Storage -To ensure a table exists, call **create_table**: +To ensure a table exists, call **create\_table**: ```Python from azure.storage import TableService ts = TableService(account_name, account_key) -table = ts.create_table('tasktable') +ts.create_table('tasktable') ``` -A new entity can be added by calling **insert_entity**: +A new entity can be added by calling **insert\_entity**: ```Python +from datetime import datetime ts = TableService(account_name, account_key) -table = ts.create_table('tasktable') -table.insert_entity( +ts.create_table('tasktable') +ts.insert_entity( 'tasktable', { 'PartitionKey' : 'tasksSeattle', @@ -69,7 +70,7 @@ table.insert_entity( ) ``` -The method **get_entity** can then be used to fetch the entity that was just inserted: +The method **get\_entity** can then be used to fetch the entity that was just inserted: ```Python ts = TableService(account_name, account_key) @@ -78,27 +79,25 @@ entity = ts.get_entity('tasktable', 'tasksSeattle', '1') ## Blob Storage -The **create_container** method can be used to create a +The **create\_container** method can be used to create a container in which to store a blob: ```Python from azure.storage import BlobService -blob_service = BlobService() -container = blob_service.create_container('taskcontainer') +blob_service = BlobService(account_name, account_key) +blob_service.create_container('taskcontainer') ``` -To upload a file (assuming it is called task1-upload.txt, it contains the exact text "hello world" (no quotation marks), and it is placed in the same folder as the script below), the method **put_blob** can be used: +To upload a file (assuming it is called task1-upload.txt, it contains the exact text "hello world" (no quotation marks), and it is placed in the same folder as the script below), the method **put\_blob** can be used: ```Python from azure.storage import BlobService blob_service = BlobService(account_name, account_key) -blob_service.put_blob('taskcontainer', 'task1', -blobService = azure.createBlobService() -blobService.put_blob('taskcontainer', 'task1', file('task1-upload.txt').read()) +blob_service.put_blob('taskcontainer', 'task1', file('task1-upload.txt').read(), 'BlockBlob') ``` -To download the blob and write it to the file system, the **get_blob** method can be used: +To download the blob and write it to the file system, the **get\_blob** method can be used: ```Python from azure.storage import BlobService @@ -108,15 +107,15 @@ blob = blob_service.get_blob('taskcontainer', 'task1') ## Storage Queues -The **create_queue** method can be used to ensure a queue exists: +The **create\_queue** method can be used to ensure a queue exists: ```Python from azure.storage import QueueService queue_service = QueueService(account_name, account_key) -queue = queue_service.create_queue('taskqueue') +queue_service.create_queue('taskqueue') ``` -The **put_message** method can then be called to insert the message into the queue: +The **put\_message** method can then be called to insert the message into the queue: ```Python from azure.storage import QueueService @@ -124,69 +123,73 @@ queue_service = QueueService(account_name, account_key) queue_service.put_message('taskqueue', 'Hello world!') ``` -It is then possible to call the **get___messages** method, process the message and then call **delete_message** on the messages ID. This two-step process ensures messages don't get lost when they are removed from the queue. +It is then possible to call the **get\_messages** method, process the message and then call **delete\_message** with the message id and receipt. This two-step process ensures messages don't get lost when they are removed from the queue. ```Python from azure.storage import QueueService queue_service = QueueService(account_name, account_key) messages = queue_service.get_messages('taskqueue') -queue_service.delete_message('taskqueue', messages[0].message_id) +queue_service.delete_message('taskqueue', messages[0].message_id, messages[0].pop_receipt) ``` ## ServiceBus Queues ServiceBus Queues are an alternative to Storage Queues that might be useful in scenarios where more advanced messaging features are needed (larger message sizes, message ordering, single-operaiton destructive reads, scheduled delivery) using push-style delivery (using long polling). -The **create_queue** method can be used to ensure a queue exists: +The **create\_queue** method can be used to ensure a queue exists: ```Python from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) -queue = sbs.create_queue('taskqueue'); +sbs = ServiceBusService(service_namespace, account_key, 'owner') +sbs.create_queue('taskqueue') ``` -The **send__queue__message** method can then be called to insert the message into the queue: +The **send\_queue\_message** method can then be called to insert the message into the queue: ```Python -from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) -sbs.send_queue_message('taskqueue', 'Hello World!') +from azure.servicebus import ServiceBusService, Message +sbs = ServiceBusService(service_namespace, account_key, 'owner') +msg = Message('Hello World!') +sbs.send_queue_message('taskqueue', msg) ``` -It is then possible to call the **read__delete___queue__message** method to dequeue the message. +It is then possible to call the **receive\_queue\_message** method to dequeue the message. ```Python from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) -msg = sbs.read_delete_queue_message('taskqueue') +sbs = ServiceBusService(service_namespace, account_key, 'owner') +msg = sbs.receive_queue_message('taskqueue') ``` ## ServiceBus Topics ServiceBus topics are an abstraction on top of ServiceBus Queues that make pub/sub scenarios easy to implement. -The **create_topic** method can be used to create a server-side topic: +The **create\_topic** method can be used to create a server-side topic: ```Python from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) -topic = sbs.create_topic('taskdiscussion') +sbs = ServiceBusService(service_namespace, account_key, 'owner') +sbs.create_topic('taskdiscussion') ``` -The **send__topic__message** method can be used to send a message to a topic: +The **send\_topic\_message** method can be used to send a message to a topic: ```Python -from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) -sbs.send_topic_message('taskdiscussion', 'Hello world!') +from azure.servicebus import ServiceBusService, Message +sbs = ServiceBusService(service_namespace, account_key, 'owner') +msg = Message('Hello World!') +sbs.send_topic_message('taskdiscussion', msg) ``` -A client can then create a subscription and start consuming messages by calling the **create__subscription** method followed by the **receive__subscription__message** method. Please note that any messages sent before the subscription is created will not be received. +A client can then create a subscription and start consuming messages by calling the **create\_subscription** method followed by the **receive\_subscription\_message** method. Please note that any messages sent before the subscription is created will not be received. ```Python -from azure.servicebus import ServiceBusService -sbs = ServiceBusService(service_namespace, account_key) +from azure.servicebus import ServiceBusService, Message +sbs = ServiceBusService(service_namespace, account_key, 'owner') sbs.create_subscription('taskdiscussion', 'client1') +msg = Message('Hello World!') +sbs.send_topic_message('taskdiscussion', msg) msg = sbs.receive_subscription_message('taskdiscussion', 'client1') ``` diff --git a/src/azure/__init__.py b/src/azure/__init__.py index eccc0d681e02..bb0f4ad116c8 100644 --- a/src/azure/__init__.py +++ b/src/azure/__init__.py @@ -43,12 +43,12 @@ _ERROR_CANNOT_FIND_ROW_KEY = 'Cannot find row key in request.' _ERROR_INCORRECT_TABLE_IN_BATCH = 'Table should be the same in a batch operations' _ERROR_INCORRECT_PARTITION_KEY_IN_BATCH = 'Partition Key should be the same in a batch operations' -_ERROR_DUPLICATE_ROW_KEY_IN_BATCH = 'Partition Key should be the same in a batch operations' +_ERROR_DUPLICATE_ROW_KEY_IN_BATCH = 'Row Keys should not be the same in a batch operations' _ERROR_BATCH_COMMIT_FAIL = 'Batch Commit Fail' _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE = 'Message is not peek locked and cannot be deleted.' _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK = 'Message is not peek locked and cannot be unlocked.' -_ERROR_QUEUE_NOT_FOUND = 'Queue is not Found' -_ERROR_TOPIC_NOT_FOUND = 'Topic is not Found' +_ERROR_QUEUE_NOT_FOUND = 'Queue was not found' +_ERROR_TOPIC_NOT_FOUND = 'Topic was not found' _ERROR_CONFLICT = 'Conflict' _ERROR_NOT_FOUND = 'Not found' _ERROR_UNKNOWN = 'Unknown error (%s)' @@ -58,6 +58,8 @@ _ERROR_VALUE_SHOULD_NOT_BE_NULL = '%s should not be None.' _ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY = 'Cannot serialize the specified value (%s) to an entity. Please use an EntityProperty (which can specify custom types), int, str, bool, or datetime' +METADATA_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' + class WindowsAzureData(object): ''' This is the base of data class. It is only used to check whether it is instance or not. ''' pass @@ -80,8 +82,11 @@ def __init__(self, message): self.message = message class Feed: - def __init__(self, type): - self.type = type + pass + +class HeaderDict(dict): + def __getitem__(self, index): + return super(HeaderDict, self).__getitem__(index.lower()) def _get_readable_id(id_name): """simplified an id to be more friendly for us people""" @@ -97,6 +102,9 @@ def _get_entry_properties(xmlstr, include_id): properties = {} for entry in _get_child_nodes(xmldoc, 'entry'): + etag = entry.getAttributeNS(METADATA_NS, 'etag') + if etag: + properties['etag'] = etag for updated in _get_child_nodes(entry, 'updated'): properties['updated'] = updated.firstChild.nodeValue for name in _get_children_from_path(entry, 'author', 'name'): @@ -109,6 +117,14 @@ def _get_entry_properties(xmlstr, include_id): return properties +def _get_first_child_node_value(parent_node, node_name): + xml_attrs = _get_child_nodes(parent_node, node_name) + if xml_attrs: + xml_attr = xml_attrs[0] + if xml_attr.firstChild: + value = xml_attr.firstChild.nodeValue + return value + def _get_child_nodes(node, tagName): return [childNode for childNode in node.getElementsByTagName(tagName) if childNode.parentNode == node] @@ -142,7 +158,7 @@ def _create_entry(entry_body): updated_str += '+00:00' entry_start = ''' - + <updated>{updated}</updated><author><name /></author><id /> <content type="application/xml"> {body}</content></entry>''' @@ -242,9 +258,23 @@ def _clone_node_with_namespaces(node_to_clone, original_doc): return clone def _convert_response_to_feeds(response, convert_func): - feeds = [] + if response is None: + return None + + feeds = _list_of(Feed) + + x_ms_continuation = HeaderDict() + for name, value in response.headers: + if 'x-ms-continuation' in name: + x_ms_continuation[name[len('x-ms-continuation')+1:]] = value + if x_ms_continuation: + setattr(feeds, 'x_ms_continuation', x_ms_continuation) + xmldoc = minidom.parseString(response.body) - for xml_entry in _get_children_from_path(xmldoc, 'feed', 'entry'): + xml_entries = _get_children_from_path(xmldoc, 'feed', 'entry') + if not xml_entries: + xml_entries = _get_children_from_path(xmldoc, 'entry') #in some cases, response contains only entry but no feed + for xml_entry in xml_entries: new_node = _clone_node_with_namespaces(xml_entry, xmldoc) feeds.append(convert_func(new_node.toxml())) @@ -254,16 +284,19 @@ def _validate_not_none(param_name, param): if param is None: raise TypeError(_ERROR_VALUE_SHOULD_NOT_BE_NULL % (param_name)) -def _html_encode(html): - ch_map = (('&', '&'), ('<', '<'), ('>', '>'), ('"', '"'), ('\'', '&apos')) - for name, value in ch_map: - html = html.replace(name, value) - return html - def _fill_list_of(xmldoc, element_type): xmlelements = _get_child_nodes(xmldoc, element_type.__name__) return [_parse_response_body(xmlelement.toxml(), element_type) for xmlelement in xmlelements] +def _fill_dict(xmldoc, element_name): + xmlelements = _get_child_nodes(xmldoc, element_name) + if xmlelements: + return_obj = {} + for child in xmlelements[0].childNodes: + if child.firstChild: + return_obj[child.nodeName] = child.firstChild.nodeValue + return return_obj + def _fill_instance_child(xmldoc, element_name, return_type): '''Converts a child of the current dom element to the specified type. The child name ''' @@ -272,7 +305,10 @@ def _fill_instance_child(xmldoc, element_name, return_type): if not xmlelements: return None - return _fill_instance_element(xmlelements[0], return_type) + return_obj = return_type() + _fill_data_to_return_object(xmlelements[0], return_obj) + + return return_obj def _fill_instance_element(element, return_type): """Converts a DOM element into the specified object""" @@ -367,6 +403,19 @@ def _parse_response(response, return_type): ''' return _parse_response_body(response.body, return_type) +def _fill_data_to_return_object(node, return_obj): + for name, value in vars(return_obj).iteritems(): + if isinstance(value, _list_of): + setattr(return_obj, name, _fill_list_of(node, value.list_type)) + elif isinstance(value, WindowsAzureData): + setattr(return_obj, name, _fill_instance_child(node, name, value.__class__)) + elif isinstance(value, dict): + setattr(return_obj, name, _fill_dict(node, _get_serialization_name(name))) + else: + value = _fill_data_minidom(node, name, value) + if value is not None: + setattr(return_obj, name, value) + def _parse_response_body(respbody, return_type): ''' parse the xml and fill all the data into a class of return_type @@ -374,15 +423,7 @@ def _parse_response_body(respbody, return_type): doc = minidom.parseString(respbody) return_obj = return_type() for node in _get_child_nodes(doc, return_type.__name__): - for name, value in vars(return_obj).iteritems(): - if isinstance(value, _list_of): - setattr(return_obj, name, _fill_list_of(node, value.list_type)) - elif isinstance(value, WindowsAzureData): - setattr(return_obj, name, _fill_instance_child(node, name, value.__class__)) - else: - value = _fill_data_minidom(node, name, value) - if value is not None: - setattr(return_obj, name, value) + _fill_data_to_return_object(node, return_obj) return return_obj @@ -446,11 +487,12 @@ def _dont_fail_not_exist(error): def _parse_response_for_dict(response): ''' Extracts name-values from response header. Filter out the standard http headers.''' - + + if response is None: + return None http_headers = ['server', 'date', 'location', 'host', - 'via', 'proxy-connection', 'x-ms-version', 'connection', - 'content-length'] - return_dict = {} + 'via', 'proxy-connection', 'connection'] + return_dict = HeaderDict() if response.headers: for name, value in response.headers: if not name.lower() in http_headers: @@ -461,6 +503,8 @@ def _parse_response_for_dict(response): def _parse_response_for_dict_prefix(response, prefix): ''' Extracts name-values for names starting with prefix from response header. Filter out the standard http headers.''' + if response is None: + return None return_dict = {} orig_dict = _parse_response_for_dict(response) if orig_dict: @@ -475,6 +519,8 @@ def _parse_response_for_dict_prefix(response, prefix): def _parse_response_for_dict_filter(response, filter): ''' Extracts name-values for names in filter from response header. Filter out the standard http headers.''' + if response is None: + return None return_dict = {} orig_dict = _parse_response_for_dict(response) if orig_dict: diff --git a/src/azure/http/__init__.py b/src/azure/http/__init__.py index 3a2dfc515a6f..3aeb36ebe1f2 100644 --- a/src/azure/http/__init__.py +++ b/src/azure/http/__init__.py @@ -13,6 +13,7 @@ # limitations under the License. #-------------------------------------------------------------------------- +HTTP_RESPONSE_NO_CONTENT = 204 class HTTPError(Exception): ''' HTTP Exception when response status code >= 300 ''' diff --git a/src/azure/http/winhttp.py b/src/azure/http/winhttp.py index f67f6de49ee0..4340389214aa 100644 --- a/src/azure/http/winhttp.py +++ b/src/azure/http/winhttp.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. #-------------------------------------------------------------------------- -from ctypes import c_void_p, c_long, c_ulong, c_longlong, c_ulonglong, c_short, c_ushort, c_wchar_p, c_byte +from ctypes import c_void_p, c_long, c_ulong, c_longlong, c_ulonglong, c_short, c_ushort, c_wchar_p, c_byte, c_size_t from ctypes import byref, Structure, Union, POINTER, WINFUNCTYPE, HRESULT, oledll, WinDLL, cast, create_string_buffer import ctypes import urllib2 @@ -41,11 +41,23 @@ _oleaut32 = WinDLL('oleaut32') _CLSIDFromString = _ole32.CLSIDFromString _CoInitialize = _ole32.CoInitialize +_CoInitialize.argtypes = [c_void_p] + _CoCreateInstance = _ole32.CoCreateInstance + _SysAllocString = _oleaut32.SysAllocString +_SysAllocString.restype = c_void_p +_SysAllocString.argtypes = [c_wchar_p] + _SysFreeString = _oleaut32.SysFreeString +_SysFreeString.argtypes = [c_void_p] + _SafeArrayDestroy = _oleaut32.SafeArrayDestroy +_SafeArrayDestroy.argtypes = [c_void_p] + _CoTaskMemAlloc = _ole32.CoTaskMemAlloc +_CoTaskMemAlloc.restype = c_void_p +_CoTaskMemAlloc.argtypes = [c_size_t] #------------------------------------------------------------------------------ class BSTR(c_wchar_p): @@ -215,17 +227,7 @@ def status_text(self): status_text = bstr_status_text.value _SysFreeString(bstr_status_text) return status_text - - def response_text(self): - ''' Gets response body as text. ''' - - bstr_resptext = c_void_p() - _WinHttpRequest._ResponseText(self, byref(bstr_resptext)) - bstr_resptext = ctypes.cast(bstr_resptext, c_wchar_p) - resptext = bstr_resptext.value - _SysFreeString(bstr_resptext) - return resptext - + def response_body(self): ''' Gets response body as a SAFEARRAY and converts the SAFEARRAY to str. If it is an xml @@ -283,7 +285,7 @@ def __init__(self, host, cert_file=None, key_file=None, protocol='http'): self.protocol = protocol clsid = GUID('{2087C2F4-2CEF-4953-A8AB-66779B670495}') iid = GUID('{016FE2EC-B2C8-45F8-B23B-39E53A75396B}') - _CoInitialize(0) + _CoInitialize(None) _CoCreateInstance(byref(clsid), 0, 1, byref(iid), byref(self._httprequest)) def putrequest(self, method, uri): @@ -330,7 +332,7 @@ def getresponse(self): for resp_header in fixed_headers: if ':' in resp_header: pos = resp_header.find(':') - headers.append((resp_header[:pos], resp_header[pos+1:].strip())) + headers.append((resp_header[:pos].lower(), resp_header[pos+1:].strip())) body = self._httprequest.response_body() length = len(body) diff --git a/src/azure/servicebus/__init__.py b/src/azure/servicebus/__init__.py index a0a959bae615..3cca653ab3d5 100644 --- a/src/azure/servicebus/__init__.py +++ b/src/azure/servicebus/__init__.py @@ -23,10 +23,10 @@ from azure.http import HTTPError from azure import (WindowsAzureError, WindowsAzureData, - _create_entry, _get_entry_properties, _html_encode, + _create_entry, _get_entry_properties, xml_escape, _get_child_nodes, WindowsAzureMissingResourceError, WindowsAzureConflictError, _get_serialization_name, - _get_children_from_path) + _get_children_from_path, _get_first_child_node_value) import azure #default rule name for subscription @@ -47,52 +47,90 @@ class Queue(WindowsAzureData): ''' Queue class corresponding to Queue Description: http://msdn.microsoft.com/en-us/library/windowsazure/hh780773''' - def __init__(self): - self.lock_duration = None - self.max_size_in_megabytes = None - self.duplicate_detection = None - self.requires_duplicate_detection = None - self.requires_session = None - self.default_message_time_to_live = None - self.enable_dead_lettering_on_message_expiration = None - self.duplicate_detection_history_time_window = None - self.max_delivery_count = None - self.enable_batched_operations = None - self.size_in_bytes = None - self.message_count = None + def __init__(self, + lock_duration=None, + max_size_in_megabytes=None, + requires_duplicate_detection=None, + requires_session=None, + default_message_time_to_live=None, + dead_lettering_on_message_expiration=None, + duplicate_detection_history_time_window=None, + max_delivery_count=None, + enable_batched_operations=None, + size_in_bytes=None, + message_count=None): + + self.lock_duration = lock_duration + self.max_size_in_megabytes = max_size_in_megabytes + self.requires_duplicate_detection = requires_duplicate_detection + self.requires_session = requires_session + self.default_message_time_to_live = default_message_time_to_live + self.dead_lettering_on_message_expiration = dead_lettering_on_message_expiration + self.duplicate_detection_history_time_window = duplicate_detection_history_time_window + self.max_delivery_count = max_delivery_count + self.enable_batched_operations = enable_batched_operations + self.size_in_bytes = size_in_bytes + self.message_count = message_count class Topic(WindowsAzureData): ''' Topic class corresponding to Topic Description: http://msdn.microsoft.com/en-us/library/windowsazure/hh780749. ''' - def __init__(self): - self.default_message_time_to_live = None - self.max_size_in_mega_bytes = None - self.requires_duplicate_detection = None - self.duplicate_detection_history_time_window = None - self.enable_batched_operations = None - self.size_in_bytes = None + def __init__(self, + default_message_time_to_live=None, + max_size_in_megabytes=None, + requires_duplicate_detection=None, + duplicate_detection_history_time_window=None, + enable_batched_operations=None, + size_in_bytes=None): + + self.default_message_time_to_live = default_message_time_to_live + self.max_size_in_megabytes = max_size_in_megabytes + self.requires_duplicate_detection = requires_duplicate_detection + self.duplicate_detection_history_time_window = duplicate_detection_history_time_window + self.enable_batched_operations = enable_batched_operations + self.size_in_bytes = size_in_bytes + + @property + def max_size_in_mega_bytes(self): + import warnings + warnings.warn('This attribute has been changed to max_size_in_megabytes.') + return self.max_size_in_megabytes + + @max_size_in_mega_bytes.setter + def max_size_in_mega_bytes(self, value): + self.max_size_in_megabytes = value + class Subscription(WindowsAzureData): ''' Subscription class corresponding to Subscription Description: http://msdn.microsoft.com/en-us/library/windowsazure/hh780763. ''' - def __init__(self): - self.lock_duration = None - self.requires_session = None - self.default_message_time_to_live = None - self.dead_lettering_on_message_expiration = None - self.dead_lettering_on_filter_evaluation_exceptions = None - self.enable_batched_operations = None - self.max_delivery_count = None - self.message_count = None + def __init__(self, + lock_duration=None, + requires_session=None, + default_message_time_to_live=None, + dead_lettering_on_message_expiration=None, + dead_lettering_on_filter_evaluation_exceptions=None, + enable_batched_operations=None, + max_delivery_count=None, + message_count=None): + + self.lock_duration = lock_duration + self.requires_session = requires_session + self.default_message_time_to_live = default_message_time_to_live + self.dead_lettering_on_message_expiration = dead_lettering_on_message_expiration + self.dead_lettering_on_filter_evaluation_exceptions = dead_lettering_on_filter_evaluation_exceptions + self.enable_batched_operations = enable_batched_operations + self.max_delivery_count = max_delivery_count + self.message_count = message_count class Rule(WindowsAzureData): ''' Rule class corresponding to Rule Description: http://msdn.microsoft.com/en-us/library/windowsazure/hh780753. ''' - def __init__(self): - self.filter_type = '' - self.filter_expression = '' - self.action_type = '' - self.action_expression = '' + def __init__(self, filter_type=None, filter_expression=None, action_type=None, action_expression=None): + self.filter_type = filter_type + self.filter_expression = filter_expression + self.action_type = action_type + self.action_expression = action_type class Message(WindowsAzureData): ''' Message class that used in send message/get mesage apis. ''' @@ -156,7 +194,7 @@ def add_headers(self, request): elif isinstance(value, datetime): request.headers.append((name, '"' + value.strftime('%a, %d %b %Y %H:%M:%S GMT') + '"')) else: - request.headers.append((name, str(value))) + request.headers.append((name, str(value).lower())) # Adds content-type request.headers.append(('Content-Type', self.type)) @@ -268,11 +306,23 @@ def _create_message(response, service_instance): message_location = value elif name.lower() not in ['content-type', 'brokerproperties', 'transfer-encoding', 'server', 'location', 'date']: if '"' in value: - custom_properties[name] = value[1:-1] - else: - custom_properties[name] = value + value = value[1:-1] + try: + custom_properties[name] = datetime.strptime(value, '%a, %d %b %Y %H:%M:%S GMT') + except ValueError: + custom_properties[name] = value + else: #only int, float or boolean + if value.lower() == 'true': + custom_properties[name] = True + elif value.lower() == 'false': + custom_properties[name] = False + elif str(int(float(value))) == value: #int('3.1') doesn't work so need to get float('3.14') first + custom_properties[name] = int(value) + else: + custom_properties[name] = float(value) + if message_type == None: - message = Message(respbody, service_instance, message_location, custom_properties, broker_properties) + message = Message(respbody, service_instance, message_location, custom_properties, 'application/atom+xml;type=entry;charset=utf-8', broker_properties) else: message = Message(respbody, service_instance, message_location, custom_properties, message_type, broker_properties) return message @@ -332,18 +382,6 @@ def _parse_bool(value): return True return False - -_QUEUE_CONVERSION = { - 'MaxSizeInMegaBytes': int, - 'RequiresGroupedReceives': _parse_bool, - 'SupportsDuplicateDetection': _parse_bool, - 'SizeinBytes': int, - 'MessageCount': int, - 'EnableBatchedOperations': _parse_bool, - 'RequiresSession': _parse_bool, - 'LockDuration': int, -} - def _convert_xml_to_queue(xmlstr): ''' Converts xml response to queue object. @@ -363,18 +401,51 @@ def _convert_xml_to_queue(xmlstr): invalid_queue = True #get node for each attribute in Queue class, if nothing found then the response is not valid xml for Queue. - for queue_desc in _get_children_from_path(xmldoc, 'entry', 'content', 'QueueDescription'): - for attr_name, attr_value in vars(queue).iteritems(): - xml_attrs = _get_child_nodes(queue_desc, _get_serialization_name(attr_name)) - if xml_attrs: - xml_attr = xml_attrs[0] - if xml_attr.firstChild: - value = xml_attr.firstChild.nodeValue - conversion = _QUEUE_CONVERSION.get(attr_name) - if conversion is not None: - value = conversion(value) - setattr(queue, attr_name, value) - invalid_queue = False + for desc in _get_children_from_path(xmldoc, 'entry', 'content', 'QueueDescription'): + node_value = _get_first_child_node_value(desc, 'LockDuration') + if node_value is not None: + queue.lock_duration = node_value + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') + if node_value is not None: + queue.max_size_in_megabytes = int(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'RequiresDuplicateDetection') + if node_value is not None: + queue.requires_duplicate_detection = _parse_bool(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'RequiresSession') + if node_value is not None: + queue.requires_session = _parse_bool(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'DefaultMessageTimeToLive') + if node_value is not None: + queue.default_message_time_to_live = node_value + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'DeadLetteringOnMessageExpiration') + if node_value is not None: + queue.dead_lettering_on_message_expiration = _parse_bool(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'DuplicateDetectionHistoryTimeWindow') + if node_value is not None: + queue.duplicate_detection_history_time_window = node_value + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'EnableBatchedOperations') + if node_value is not None: + queue.enable_batched_operations = _parse_bool(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'MaxDeliveryCount') + if node_value is not None: + queue.max_delivery_count = int(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'MessageCount') + if node_value is not None: + queue.message_count = int(node_value) + invalid_queue = False + node_value = _get_first_child_node_value(desc, 'SizeInBytes') + if node_value is not None: + queue.size_in_bytes = int(node_value) + invalid_queue = False if invalid_queue: raise WindowsAzureError(azure._ERROR_QUEUE_NOT_FOUND) @@ -388,12 +459,6 @@ def _convert_xml_to_queue(xmlstr): def _convert_response_to_topic(response): return _convert_xml_to_topic(response.body) -_TOPIC_CONVERSION = { - 'MaxSizeInMegaBytes': int, - 'RequiresDuplicateDetection': _parse_bool, - 'DeadLetteringOnFilterEvaluationExceptions': _parse_bool -} - def _convert_xml_to_topic(xmlstr): '''Converts xml response to topic @@ -402,7 +467,7 @@ def _convert_xml_to_topic(xmlstr): <content type='application/xml'> <TopicDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> - <MaxSizeInMegaBytes>1024</MaxSizeInMegaBytes> + <MaxSizeInMegabytes>1024</MaxSizeInMegabytes> <RequiresDuplicateDetection>false</RequiresDuplicateDetection> <DuplicateDetectionHistoryTimeWindow>P7D</DuplicateDetectionHistoryTimeWindow> <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> @@ -414,20 +479,34 @@ def _convert_xml_to_topic(xmlstr): topic = Topic() invalid_topic = True + #get node for each attribute in Topic class, if nothing found then the response is not valid xml for Topic. for desc in _get_children_from_path(xmldoc, 'entry', 'content', 'TopicDescription'): invalid_topic = True - for attr_name, attr_value in vars(topic).iteritems(): - xml_attrs = _get_child_nodes(desc, _get_serialization_name(attr_name)) - if xml_attrs: - xml_attr = xml_attrs[0] - if xml_attr.firstChild: - value = xml_attr.firstChild.nodeValue - conversion = _TOPIC_CONVERSION.get(attr_name) - if conversion is not None: - value = conversion(value) - setattr(topic, attr_name, value) - invalid_topic = False + node_value = _get_first_child_node_value(desc, 'DefaultMessageTimeToLive') + if node_value is not None: + topic.default_message_time_to_live = node_value + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') + if node_value is not None: + topic.max_size_in_megabytes = int(node_value) + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'RequiresDuplicateDetection') + if node_value is not None: + topic.requires_duplicate_detection = _parse_bool(node_value) + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'DuplicateDetectionHistoryTimeWindow') + if node_value is not None: + topic.duplicate_detection_history_time_window = node_value + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'EnableBatchedOperations') + if node_value is not None: + topic.enable_batched_operations = _parse_bool(node_value) + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'SizeInBytes') + if node_value is not None: + topic.size_in_bytes = int(node_value) + invalid_topic = False if invalid_topic: raise WindowsAzureError(azure._ERROR_TOPIC_NOT_FOUND) @@ -440,15 +519,6 @@ def _convert_xml_to_topic(xmlstr): def _convert_response_to_subscription(response): return _convert_xml_to_subscription(response.body) -_SUBSCRIPTION_CONVERSION = { - 'RequiresSession' : _parse_bool, - 'DeadLetteringOnMessageExpiration': _parse_bool, - 'DefaultMessageTimeToLive': int, - 'EnableBatchedOperations': _parse_bool, - 'MaxDeliveryCount': int, - 'MessageCount': int, -} - def _convert_xml_to_subscription(xmlstr): '''Converts xml response to subscription @@ -467,18 +537,31 @@ def _convert_xml_to_subscription(xmlstr): xmldoc = minidom.parseString(xmlstr) subscription = Subscription() - for desc in _get_children_from_path(xmldoc, 'entry', 'content', 'subscriptiondescription'): - for attr_name, attr_value in vars(subscription).iteritems(): - tag_name = attr_name.replace('_', '') - xml_attrs = _get_child_nodes(desc, tag_name) - if xml_attrs: - xml_attr = xml_attrs[0] - if xml_attr.firstChild: - value = xml_attr.firstChild.nodeValue - conversion = _SUBSCRIPTION_CONVERSION.get(attr_name) - if conversion is not None: - value = conversion(value) - setattr(subscription, attr_name, value) + for desc in _get_children_from_path(xmldoc, 'entry', 'content', 'SubscriptionDescription'): + node_value = _get_first_child_node_value(desc, 'LockDuration') + if node_value is not None: + subscription.lock_duration = node_value + node_value = _get_first_child_node_value(desc, 'RequiresSession') + if node_value is not None: + subscription.requires_session = _parse_bool(node_value) + node_value = _get_first_child_node_value(desc, 'DefaultMessageTimeToLive') + if node_value is not None: + subscription.default_message_time_to_live = node_value + node_value = _get_first_child_node_value(desc, 'DeadLetteringOnFilterEvaluationExceptions') + if node_value is not None: + subscription.dead_lettering_on_filter_evaluation_exceptions = _parse_bool(node_value) + node_value = _get_first_child_node_value(desc, 'DeadLetteringOnMessageExpiration') + if node_value is not None: + subscription.dead_lettering_on_message_expiration = _parse_bool(node_value) + node_value = _get_first_child_node_value(desc, 'EnableBatchedOperations') + if node_value is not None: + subscription.enable_batched_operations = _parse_bool(node_value) + node_value = _get_first_child_node_value(desc, 'MaxDeliveryCount') + if node_value is not None: + subscription.max_delivery_count = int(node_value) + node_value = _get_first_child_node_value(desc, 'MessageCount') + if node_value is not None: + subscription.message_count = int(node_value) for name, value in _get_entry_properties(xmlstr, True).iteritems(): setattr(subscription, name, value) @@ -496,21 +579,21 @@ def convert_subscription_to_xml(subscription): subscription_body = '<SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' if subscription: if subscription.lock_duration is not None: - subscription_body += ''.join(['<LockDuration>', subscription.lock_duration, '</LockDuration>']) + subscription_body += ''.join(['<LockDuration>', str(subscription.lock_duration), '</LockDuration>']) if subscription.requires_session is not None: - subscription_body += ''.join(['<RequiresSession>', subscription.requires_session, '</RequiresSession>']) + subscription_body += ''.join(['<RequiresSession>', str(subscription.requires_session).lower(), '</RequiresSession>']) if subscription.default_message_time_to_live is not None: - subscription_body += ''.join(['<DefaultMessageTimeToLive>', subscription.default_message_time_to_live, '</DefaultMessageTimeToLive>']) + subscription_body += ''.join(['<DefaultMessageTimeToLive>', str(subscription.default_message_time_to_live), '</DefaultMessageTimeToLive>']) if subscription.dead_lettering_on_message_expiration is not None: - subscription_body += ''.join(['<DeadLetteringOnMessageExpiration>', subscription.dead_lettering_on_message_expiration, '</DeadLetteringOnMessageExpiration>']) + subscription_body += ''.join(['<DeadLetteringOnMessageExpiration>', str(subscription.dead_lettering_on_message_expiration).lower(), '</DeadLetteringOnMessageExpiration>']) if subscription.dead_lettering_on_filter_evaluation_exceptions is not None: - subscription_body += ''.join(['<DeadLetteringOnFilterEvaluationExceptions>', subscription.dead_lettering_on_filter_evaluation_exceptions, '</DeadLetteringOnFilterEvaluationExceptions>']) + subscription_body += ''.join(['<DeadLetteringOnFilterEvaluationExceptions>', str(subscription.dead_lettering_on_filter_evaluation_exceptions).lower(), '</DeadLetteringOnFilterEvaluationExceptions>']) if subscription.enable_batched_operations is not None: - subscription_body += ''.join(['<EnableBatchedOperations>', subscription.enable_batched_operations, '</EnableBatchedOperations>']) + subscription_body += ''.join(['<EnableBatchedOperations>', str(subscription.enable_batched_operations).lower(), '</EnableBatchedOperations>']) if subscription.max_delivery_count is not None: - subscription_body += ''.join(['<MaxDeliveryCount>', subscription.max_delivery_count, '</MaxDeliveryCount>']) + subscription_body += ''.join(['<MaxDeliveryCount>', str(subscription.max_delivery_count), '</MaxDeliveryCount>']) if subscription.message_count is not None: - subscription_body += ''.join(['<MessageCount>', subscription.message_count, '</MessageCount>']) + subscription_body += ''.join(['<MessageCount>', str(subscription.message_count), '</MessageCount>']) subscription_body += '</SubscriptionDescription>' return _create_entry(subscription_body) @@ -525,17 +608,18 @@ def convert_rule_to_xml(rule): rule_body = '<RuleDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' if rule: if rule.filter_type: - rule_body += ''.join(['<Filter i:type="', _html_encode(rule.filter_type), '">']) + rule_body += ''.join(['<Filter i:type="', xml_escape(rule.filter_type), '">']) if rule.filter_type == 'CorrelationFilter': - rule_body += ''.join(['<CorrelationId>', _html_encode(rule.filter_expression), '</CorrelationId>']) + rule_body += ''.join(['<CorrelationId>', xml_escape(rule.filter_expression), '</CorrelationId>']) else: - rule_body += ''.join(['<SqlExpression>', _html_encode(rule.filter_expression), '</SqlExpression>']) + rule_body += ''.join(['<SqlExpression>', xml_escape(rule.filter_expression), '</SqlExpression>']) rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' rule_body += '</Filter>' if rule.action_type: - rule_body += ''.join(['<Action i:type="', _html_encode(rule.action_type), '">']) - if rule.action_type == 'SqlFilterAction': - rule_body += ''.join(['<SqlExpression>', _html_encode(rule.action_expression), '</SqlExpression>']) + rule_body += ''.join(['<Action i:type="', xml_escape(rule.action_type), '">']) + if rule.action_type == 'SqlRuleAction': + rule_body += ''.join(['<SqlExpression>', xml_escape(rule.action_expression), '</SqlExpression>']) + rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' rule_body += '</Action>' rule_body += '</RuleDescription>' @@ -553,16 +637,16 @@ def convert_topic_to_xml(topic): if topic: if topic.default_message_time_to_live is not None: topic_body += ''.join(['<DefaultMessageTimeToLive>', str(topic.default_message_time_to_live), '</DefaultMessageTimeToLive>']) - if topic.max_size_in_mega_bytes is not None: + if topic.max_size_in_megabytes is not None: topic_body += ''.join(['<MaxSizeInMegabytes>', str(topic.max_size_in_megabytes), '</MaxSizeInMegabytes>']) if topic.requires_duplicate_detection is not None: - topic_body += ''.join(['<RequiresDuplicateDetection>', str(topic.requires_duplicate_detection), '</RequiresDuplicateDetection>']) + topic_body += ''.join(['<RequiresDuplicateDetection>', str(topic.requires_duplicate_detection).lower(), '</RequiresDuplicateDetection>']) if topic.duplicate_detection_history_time_window is not None: topic_body += ''.join(['<DuplicateDetectionHistoryTimeWindow>', str(topic.duplicate_detection_history_time_window), '</DuplicateDetectionHistoryTimeWindow>']) if topic.enable_batched_operations is not None: - topic_body += ''.join(['<EnableBatchedOperations>', str(topic.enable_batched_operations), '</EnableBatchedOperations>']) + topic_body += ''.join(['<EnableBatchedOperations>', str(topic.enable_batched_operations).lower(), '</EnableBatchedOperations>']) if topic.size_in_bytes is not None: - topic_body += ''.join(['<SizeinBytes>', str(topic.size_in_bytes), '</SizeinBytes>']) + topic_body += ''.join(['<SizeInBytes>', str(topic.size_in_bytes), '</SizeInBytes>']) topic_body += '</TopicDescription>' return _create_entry(topic_body) @@ -581,21 +665,21 @@ def convert_queue_to_xml(queue): if queue.max_size_in_megabytes is not None: queue_body += ''.join(['<MaxSizeInMegabytes>', str(queue.max_size_in_megabytes), '</MaxSizeInMegabytes>']) if queue.requires_duplicate_detection is not None: - queue_body += ''.join(['<RequiresDuplicateDetection>', str(queue.requires_duplicate_detection), '</RequiresDuplicateDetection>']) + queue_body += ''.join(['<RequiresDuplicateDetection>', str(queue.requires_duplicate_detection).lower(), '</RequiresDuplicateDetection>']) if queue.requires_session is not None: - queue_body += ''.join(['<RequiresSession>', str(queue.requires_session), '</RequiresSession>']) + queue_body += ''.join(['<RequiresSession>', str(queue.requires_session).lower(), '</RequiresSession>']) if queue.default_message_time_to_live is not None: queue_body += ''.join(['<DefaultMessageTimeToLive>', str(queue.default_message_time_to_live), '</DefaultMessageTimeToLive>']) - if queue.enable_dead_lettering_on_message_expiration is not None: - queue_body += ''.join(['<EnableDeadLetteringOnMessageExpiration>', str(queue.enable_dead_lettering_on_message_expiration), '</EnableDeadLetteringOnMessageExpiration>']) + if queue.dead_lettering_on_message_expiration is not None: + queue_body += ''.join(['<DeadLetteringOnMessageExpiration>', str(queue.dead_lettering_on_message_expiration).lower(), '</DeadLetteringOnMessageExpiration>']) if queue.duplicate_detection_history_time_window is not None: queue_body += ''.join(['<DuplicateDetectionHistoryTimeWindow>', str(queue.duplicate_detection_history_time_window), '</DuplicateDetectionHistoryTimeWindow>']) if queue.max_delivery_count is not None: queue_body += ''.join(['<MaxDeliveryCount>', str(queue.max_delivery_count), '</MaxDeliveryCount>']) if queue.enable_batched_operations is not None: - queue_body += ''.join(['<EnableBatchedOperations>', str(queue.enable_batched_operations), '</EnableBatchedOperations>']) + queue_body += ''.join(['<EnableBatchedOperations>', str(queue.enable_batched_operations).lower(), '</EnableBatchedOperations>']) if queue.size_in_bytes is not None: - queue_body += ''.join(['<SizeinBytes>', str(queue.size_in_bytes), '</SizeinBytes>']) + queue_body += ''.join(['<SizeInBytes>', str(queue.size_in_bytes), '</SizeInBytes>']) if queue.message_count is not None: queue_body += ''.join(['<MessageCount>', str(queue.message_count), '</MessageCount>']) diff --git a/src/azure/servicebus/servicebusservice.py b/src/azure/servicebus/servicebusservice.py index 6694a6b0ef3f..ccd4d2f9d13c 100644 --- a/src/azure/servicebus/servicebusservice.py +++ b/src/azure/servicebus/servicebusservice.py @@ -17,7 +17,7 @@ import urllib2 from azure.http.httpclient import _HTTPClient -from azure.http import HTTPError +from azure.http import HTTPError, HTTP_RESPONSE_NO_CONTENT from azure.servicebus import (_update_service_bus_header, _create_message, convert_topic_to_xml, _convert_response_to_topic, convert_queue_to_xml, _convert_response_to_queue, @@ -27,11 +27,11 @@ _convert_xml_to_subscription, _convert_xml_to_rule, _service_bus_error_handler, AZURE_SERVICEBUS_NAMESPACE, AZURE_SERVICEBUS_ACCESS_KEY, AZURE_SERVICEBUS_ISSUER) -from azure.http import HTTPRequest +from azure.http import HTTPRequest, HTTP_RESPONSE_NO_CONTENT from azure import (_validate_not_none, Feed, _convert_response_to_feeds, _str_or_none, _int_or_none, _get_request_body, _update_request_uri_query, - _dont_fail_on_exist, _dont_fail_not_exist, + _dont_fail_on_exist, _dont_fail_not_exist, WindowsAzureConflictError, WindowsAzureError, _parse_response, _convert_class_to_xml, _parse_response_for_dict, _parse_response_for_dict_prefix, _parse_response_for_dict_filter, @@ -699,7 +699,5 @@ def _perform_request(self, request): except HTTPError as e: return _service_bus_error_handler(e) - if not resp: - return None return resp diff --git a/src/azure/storage/__init__.py b/src/azure/storage/__init__.py index bbb6847b8182..85767d895789 100644 --- a/src/azure/storage/__init__.py +++ b/src/azure/storage/__init__.py @@ -21,8 +21,8 @@ import types from datetime import datetime -from azure import (_create_entry, - _get_entry_properties, _html_encode, WindowsAzureError, +from azure import (_create_entry, METADATA_NS, _parse_response_for_dict, + _get_entry_properties, WindowsAzureError, _get_child_nodes, _get_child_nodesNS, WindowsAzureConflictError, WindowsAzureMissingResourceError, _list_of, @@ -51,10 +51,13 @@ class ContainerEnumResults(EnumResultsBase): def __init__(self): EnumResultsBase.__init__(self) self.containers = _list_of(Container) + def __iter__(self): return iter(self.containers) + def __len__(self): return len(self.containers) + def __getitem__(self, index): return self.containers[index] @@ -65,7 +68,7 @@ def __init__(self): self.name = '' self.url = '' self.properties = Properties() - self.metadata = Metadata() + self.metadata = {} class Properties(WindowsAzureData): ''' Blob container's properties class. ''' @@ -74,29 +77,20 @@ def __init__(self): self.last_modified = '' self.etag = '' -class Metadata(WindowsAzureData): - ''' Metadata class. ''' - - def __init__(self): - self.metadata_name = '' - class RetentionPolicy(WindowsAzureData): ''' RetentionPolicy in service properties. ''' + def __init__(self): self.enabled = False self.__dict__['days'] = None - def get_days(self): - + def get_days(self): #convert days to int value return int(self.__dict__['days']) def set_days(self, value): ''' set default days if days is set to empty. ''' - if value == '': - self.__dict__['days'] = 10 - else: - self.__dict__['days'] = value + self.__dict__['days'] = value days = property(fget=get_days, fset=set_days) @@ -143,10 +137,18 @@ def __init__(self): class SignedIdentifiers(WindowsAzureData): ''' SignedIdentifier list. ''' + def __init__(self): - self.signed_identifiers = _list_of(SignedIdentifier) + self.signed_identifiers = _list_of(SignedIdentifier) + def __iter__(self): - return self.signed_identifiers + return iter(self.signed_identifiers) + + def __len__(self): + return len(self.signed_identifiers) + + def __getitem__(self, index): + return self.signed_identifiers[index] class BlobEnumResults(EnumResultsBase): ''' Blob list.''' @@ -154,13 +156,24 @@ class BlobEnumResults(EnumResultsBase): def __init__(self): EnumResultsBase.__init__(self) self.blobs = _list_of(Blob) + def __iter__(self): return iter(self.blobs) + def __len__(self): return len(self.blobs) + def __getitem__(self, index): return self.blobs[index] +class BlobResult(str): + + def __new__(cls, blob, properties): + return str.__new__(cls, blob) + + def __init__(self, blob, properties): + self.properties = properties + class Blob(WindowsAzureData): ''' Blob class. ''' @@ -169,7 +182,7 @@ def __init__(self): self.snapshot = '' self.url = '' self.properties = BlobProperties() - self.metadata = Metadata() + self.metadata = {} self.blob_prefix = BlobPrefix() class BlobProperties(WindowsAzureData): @@ -202,20 +215,14 @@ def __init__(self, id=None, size=None): class BlobBlockList(WindowsAzureData): ''' BlobBlockList class ''' + def __init__(self): self.committed_blocks = [] self.uncommitted_blocks = [] -class BlockList(WindowsAzureData): - ''' BlockList used to submit block list. ''' - - def __init__(self): - self.committed = [] - self.uncommitted = [] - self.latest = [] - class PageRange(WindowsAzureData): ''' Page Range for page blob. ''' + def __init__(self): self.start = 0 self.end = 0 @@ -225,8 +232,15 @@ class PageList: def __init__(self): self.page_ranges = _list_of(PageRange) + def __iter__(self): - return self.page_ranges + return iter(self.page_ranges) + + def __len__(self): + return len(self.page_ranges) + + def __getitem__(self, index): + return self.page_ranges[index] class QueueEnumResults(EnumResultsBase): ''' Queue list''' @@ -234,10 +248,13 @@ class QueueEnumResults(EnumResultsBase): def __init__(self): EnumResultsBase.__init__(self) self.queues = _list_of(Queue) + def __iter__(self): return iter(self.queues) + def __len__(self): return len(self.queues) + def __getitem__(self, index): return self.queues[index] @@ -247,17 +264,20 @@ class Queue(WindowsAzureData): def __init__(self): self.name = '' self.url = '' - self.metadata = Metadata() + self.metadata = {} class QueueMessagesList(WindowsAzureData): ''' Queue message list. ''' def __init__(self): self.queue_messages = _list_of(QueueMessage) + def __iter__(self): return iter(self.queue_messages) + def __len__(self): return len(self.queue_messages) + def __getitem__(self, index): return self.queue_messages[index] @@ -273,17 +293,6 @@ def __init__(self): self.dequeue_count = '' self.message_text = '' -class TableEnumResult(EnumResultsBase): - def __init__(): - EnumResultsBase.__init__(self) - self.tables = _list_of(Table) - def __iter__(self): - return iter(self.tables) - def __len__(self): - return len(self.tables) - def __getitem__(self, index): - return self.tables[index] - class Entity(WindowsAzureData): ''' Entity class. The attributes of entity will be created dynamically. ''' pass @@ -430,15 +439,18 @@ def _sign_storage_table_request(request, account_name, account_key): auth_string = 'SharedKey ' + account_name + ':' + base64.b64encode(signed_hmac_sha256.digest()) return auth_string - - def _to_python_bool(value): if value.lower() == 'true': return True return False def _to_entity_int(data): - return 'Edm.Int32', str(data) + int_max = (2 << 30) - 1 + import sys + if data > (int_max) or data < (int_max + 1)*(-1): + return 'Edm.Int64', str(data) + else: + return 'Edm.Int32', str(data) def _to_entity_bool(value): if value: @@ -469,7 +481,10 @@ def _from_entity_int(value): return int(value) def _from_entity_datetime(value): - return datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ') + if value.endswith('Z'): + return datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ') + else: + return datetime.strptime(value, '%Y-%m-%dT%H:%M:%S') _ENTITY_TO_PYTHON_CONVERSIONS = { 'Edm.Int32': _from_entity_int, @@ -542,9 +557,12 @@ def convert_entity_to_xml(source): #form the property node properties_str += ''.join(['<d:', name]) - if mtype: - properties_str += ''.join([' m:type="', mtype, '"']) - properties_str += ''.join(['>', xml_escape(value), '</d:', name, '>']) + if value == '': + properties_str += ' m:null="true" />' + else: + if mtype: + properties_str += ''.join([' m:type="', mtype, '"']) + properties_str += ''.join(['>', xml_escape(value), '</d:', name, '>']) #generate the entity_body entity_body = entity_body.format(properties=properties_str) @@ -576,6 +594,10 @@ def convert_block_list_to_xml(block_id_list): return xml+'</BlockList>' +def _create_blob_result(response): + blob_properties = _parse_response_for_dict(response) + return BlobResult(response.body, blob_properties) + def convert_response_to_block_list(response): ''' Converts xml response to block list class. @@ -601,8 +623,9 @@ def _remove_prefix(name): return name[colon + 1:] return name -METADATA_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' def _convert_response_to_entity(response): + if response is None: + return response return _convert_xml_to_entity(response.body) def _convert_xml_to_entity(xmlstr): @@ -644,7 +667,6 @@ def _convert_xml_to_entity(xmlstr): return None entity = Entity() - #extract each property node and get the type from attribute and node value for xml_property in xml_properties[0].childNodes: if xml_property.firstChild: @@ -662,19 +684,24 @@ def _convert_xml_to_entity(xmlstr): #if not isnull and no type info, then it is a string and we just need the str type to hold the property. if not isnull and not mtype: setattr(entity, name, value) + elif isnull == 'true': + if mtype: + property = EntityProperty(mtype, None) + else: + property = EntityProperty('Edm.String', None) else: #need an object to hold the property conv = _ENTITY_TO_PYTHON_CONVERSIONS.get(mtype) if conv is not None: property = conv(value) else: - property = EntityProperty() - setattr(property, 'value', value) - if isnull: - property.isnull = str(isnull) - if mtype: - property.type = str(mtype) + property = EntityProperty(mtype, value) setattr(entity, name, property) + #extract id, updated and name value from feed entry and set them of rule. + for name, value in _get_entry_properties(xmlstr, True).iteritems(): + if name in ['etag']: + setattr(entity, name, value) + return entity def _convert_xml_to_table(xmlstr): diff --git a/src/azure/storage/blobservice.py b/src/azure/storage/blobservice.py index 28bbacc1f453..92186e8638a1 100644 --- a/src/azure/storage/blobservice.py +++ b/src/azure/storage/blobservice.py @@ -18,13 +18,13 @@ from azure.storage import * from azure.storage.storageclient import _StorageClient -from azure.storage import (_update_storage_blob_header, +from azure.storage import (_update_storage_blob_header, _create_blob_result, convert_block_list_to_xml, convert_response_to_block_list) -from azure.http import HTTPRequest +from azure.http import HTTPRequest, HTTP_RESPONSE_NO_CONTENT from azure import (_validate_not_none, Feed, _convert_response_to_feeds, _str_or_none, _int_or_none, _get_request_body, _update_request_uri_query, - _dont_fail_on_exist, _dont_fail_not_exist, + _dont_fail_on_exist, _dont_fail_not_exist, WindowsAzureConflictError, WindowsAzureError, _parse_response, _convert_class_to_xml, _parse_response_for_dict, _parse_response_for_dict_prefix, _parse_response_for_dict_filter, @@ -49,7 +49,8 @@ def list_containers(self, prefix=None, marker=None, maxresults=None, include=Non with the next list operation. maxresults: Optional. Specifies the maximum number of containers to return. include: Optional. Include this parameter to specify that the container's metadata be - returned as part of the response body. + returned as part of the response body. set this parameter to string 'metadata' to + get container's metadata. ''' request = HTTPRequest() request.method = 'GET' @@ -312,7 +313,7 @@ def set_blob_properties(self, container_name, blob_name, x_ms_blob_cache_control request.headers = _update_storage_blob_header(request, self.account_name, self.account_key) response = self._perform_request(request) - def put_blob(self, container_name, blob_name, blob, x_ms_blob_type, content_encoding=None, content_language=None, content_m_d5=None, cache_control=None, x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, x_ms_blob_content_language=None, x_ms_blob_content_md5=None, x_ms_blob_cache_control=None, x_ms_meta_name_values=None, x_ms_lease_id=None, x_ms_blob_content_length=None, x_ms_blob_sequence_number=None): + def put_blob(self, container_name, blob_name, blob, x_ms_blob_type, content_encoding=None, content_language=None, content_md5=None, cache_control=None, x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, x_ms_blob_content_language=None, x_ms_blob_content_md5=None, x_ms_blob_cache_control=None, x_ms_meta_name_values=None, x_ms_lease_id=None, x_ms_blob_content_length=None, x_ms_blob_sequence_number=None): ''' Creates a new block blob or page blob, or updates the content of an existing block blob. @@ -335,7 +336,7 @@ def put_blob(self, container_name, blob_name, blob, x_ms_blob_type, content_enco ('x-ms-blob-type', _str_or_none(x_ms_blob_type)), ('Content-Encoding', _str_or_none(content_encoding)), ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_m_d5)), + ('Content-MD5', _str_or_none(content_md5)), ('Cache-Control', _str_or_none(cache_control)), ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), ('x-ms-blob-content-encoding', _str_or_none(x_ms_blob_content_encoding)), @@ -376,7 +377,7 @@ def get_blob(self, container_name, blob_name, snapshot=None, x_ms_range=None, x_ request.headers = _update_storage_blob_header(request, self.account_name, self.account_key) response = self._perform_request(request) - return response.body + return _create_blob_result(response) def get_blob_metadata(self, container_name, blob_name, snapshot=None, x_ms_lease_id=None): ''' @@ -481,6 +482,8 @@ def snapshot_blob(self, container_name, blob_name, x_ms_meta_name_values=None, i request.headers = _update_storage_blob_header(request, self.account_name, self.account_key) response = self._perform_request(request) + return _parse_response_for_dict_filter(response, filter=['x-ms-snapshot', 'etag', 'last-modified']) + def copy_blob(self, container_name, blob_name, x_ms_copy_source, x_ms_meta_name_values=None, x_ms_source_if_modified_since=None, x_ms_source_if_unmodified_since=None, x_ms_source_if_match=None, x_ms_source_if_none_match=None, if_modified_since=None, if_unmodified_since=None, if_match=None, if_none_match=None, x_ms_lease_id=None, x_ms_source_lease_id=None): ''' Copies a blob to a destination within the storage account. @@ -559,7 +562,7 @@ def delete_blob(self, container_name, blob_name, snapshot=None, x_ms_lease_id=No request.headers = _update_storage_blob_header(request, self.account_name, self.account_key) response = self._perform_request(request) - def put_block(self, container_name, blob_name, block, blockid, content_m_d5=None, x_ms_lease_id=None): + def put_block(self, container_name, blob_name, block, blockid, content_md5=None, x_ms_lease_id=None): ''' Creates a new block to be committed as part of a blob. @@ -580,7 +583,7 @@ def put_block(self, container_name, blob_name, block, blockid, content_m_d5=None request.host = _get_blob_host(self.account_name, self.use_local_storage) request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=block' request.headers = [ - ('Content-MD5', _str_or_none(content_m_d5)), + ('Content-MD5', _str_or_none(content_md5)), ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) ] request.query = [('blockid', base64.b64encode(_str_or_none(blockid)))] @@ -589,7 +592,7 @@ def put_block(self, container_name, blob_name, block, blockid, content_m_d5=None request.headers = _update_storage_blob_header(request, self.account_name, self.account_key) response = self._perform_request(request) - def put_block_list(self, container_name, blob_name, block_list, content_m_d5=None, x_ms_blob_cache_control=None, x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, x_ms_blob_content_language=None, x_ms_blob_content_md5=None, x_ms_meta_name_values=None, x_ms_lease_id=None): + def put_block_list(self, container_name, blob_name, block_list, content_md5=None, x_ms_blob_cache_control=None, x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, x_ms_blob_content_language=None, x_ms_blob_content_md5=None, x_ms_meta_name_values=None, x_ms_lease_id=None): ''' Writes a blob by specifying the list of block IDs that make up the blob. In order to be written as part of a blob, a block must have been successfully written to the server @@ -624,7 +627,7 @@ def put_block_list(self, container_name, blob_name, block_list, content_m_d5=Non request.host = _get_blob_host(self.account_name, self.use_local_storage) request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=blocklist' request.headers = [ - ('Content-MD5', _str_or_none(content_m_d5)), + ('Content-MD5', _str_or_none(content_md5)), ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), ('x-ms-blob-content-encoding', _str_or_none(x_ms_blob_content_encoding)), @@ -666,7 +669,7 @@ def get_block_list(self, container_name, blob_name, snapshot=None, blocklisttype return convert_response_to_block_list(response) - def put_page(self, container_name, blob_name, page, x_ms_range, x_ms_page_write, timeout=None, content_m_d5=None, x_ms_lease_id=None, x_ms_if_sequence_number_lte=None, x_ms_if_sequence_number_lt=None, x_ms_if_sequence_number_eq=None, if_modified_since=None, if_unmodified_since=None, if_match=None, if_none_match=None): + def put_page(self, container_name, blob_name, page, x_ms_range, x_ms_page_write, timeout=None, content_md5=None, x_ms_lease_id=None, x_ms_if_sequence_number_lte=None, x_ms_if_sequence_number_lt=None, x_ms_if_sequence_number_eq=None, if_modified_since=None, if_unmodified_since=None, if_match=None, if_none_match=None): ''' Writes a range of pages to a page blob. @@ -698,7 +701,7 @@ def put_page(self, container_name, blob_name, page, x_ms_range, x_ms_page_write, request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=page' request.headers = [ ('x-ms-range', _str_or_none(x_ms_range)), - ('Content-MD5', _str_or_none(content_m_d5)), + ('Content-MD5', _str_or_none(content_md5)), ('x-ms-page-write', _str_or_none(x_ms_page_write)), ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), ('x-ms-if-sequence-number-lte', _str_or_none(x_ms_if_sequence_number_lte)), diff --git a/src/azure/storage/queueservice.py b/src/azure/storage/queueservice.py index 602f71f7177a..baffc0a005c2 100644 --- a/src/azure/storage/queueservice.py +++ b/src/azure/storage/queueservice.py @@ -19,11 +19,11 @@ from azure.storage import * from azure.storage.storageclient import _StorageClient from azure.storage import (_update_storage_queue_header) -from azure.http import HTTPRequest +from azure.http import HTTPRequest, HTTP_RESPONSE_NO_CONTENT from azure import (_validate_not_none, Feed, _convert_response_to_feeds, _str_or_none, _int_or_none, _get_request_body, _update_request_uri_query, - _dont_fail_on_exist, _dont_fail_not_exist, + _dont_fail_on_exist, _dont_fail_not_exist, WindowsAzureConflictError, WindowsAzureError, _parse_response, _convert_class_to_xml, _parse_response_for_dict, _parse_response_for_dict_prefix, _parse_response_for_dict_filter, @@ -96,13 +96,17 @@ def create_queue(self, queue_name, x_ms_meta_name_values=None, fail_on_exist=Fal request.headers = _update_storage_queue_header(request, self.account_name, self.account_key) if not fail_on_exist: try: - self._perform_request(request) + response = self._perform_request(request) + if response.status == HTTP_RESPONSE_NO_CONTENT: + return False return True except WindowsAzureError as e: _dont_fail_on_exist(e) return False else: - self._perform_request(request) + response = self._perform_request(request) + if response.status == HTTP_RESPONSE_NO_CONTENT: + raise WindowsAzureConflictError(azure._ERROR_CONFLICT) return True def delete_queue(self, queue_name, fail_not_exist=False): diff --git a/src/azure/storage/storageclient.py b/src/azure/storage/storageclient.py index 15ff95378a52..862da608b450 100644 --- a/src/azure/storage/storageclient.py +++ b/src/azure/storage/storageclient.py @@ -18,6 +18,7 @@ import hashlib import os + from azure.storage import _storage_error_handler, X_MS_VERSION from azure.http.httpclient import _HTTPClient from azure.http import HTTPError @@ -38,8 +39,15 @@ class _StorageClient(object): ''' def __init__(self, account_name=None, account_key=None, protocol='http'): - self.account_name = account_name - self.account_key = account_key + if account_name is not None: + self.account_name = account_name.encode('ascii', 'ignore') + else: + self.account_name = None + if account_key is not None: + self.account_key = account_key.encode('ascii', 'ignore') + else: + self.account_key = None + self.requestid = None self.protocol = protocol @@ -60,7 +68,7 @@ def __init__(self, account_name=None, account_key=None, protocol='http'): #get the account and key from environment variables if the app is not run #in azure emulator or use default development storage account and key if #app is run in emulator. - if not account_name or not account_key: + if not self.account_name or not self.account_key: if self.is_emulated: self.account_name = DEV_ACCOUNT_NAME self.account_key = DEV_ACCOUNT_KEY @@ -70,15 +78,12 @@ def __init__(self, account_name=None, account_key=None, protocol='http'): self.account_name = os.environ[AZURE_STORAGE_ACCOUNT] if os.environ.has_key(AZURE_STORAGE_ACCESS_KEY): self.account_key = os.environ[AZURE_STORAGE_ACCESS_KEY] - else: - self.account_name = account_name - self.account_key = account_key if not self.account_name or not self.account_key: raise WindowsAzureError(azure._ERROR_STORAGE_MISSING_INFO) self.x_ms_version = X_MS_VERSION - self._httpclient = _HTTPClient(service_instance=self, account_key=account_key, account_name=account_name, x_ms_version=self.x_ms_version, protocol=protocol) + self._httpclient = _HTTPClient(service_instance=self, account_key=self.account_key, account_name=self.account_name, x_ms_version=self.x_ms_version, protocol=protocol) self._batchclient = None self._filter = self._perform_request_worker @@ -111,6 +116,4 @@ def _perform_request(self, request): except HTTPError as e: _storage_error_handler(e) - if not resp: - return None return resp \ No newline at end of file diff --git a/src/azure/storage/tableservice.py b/src/azure/storage/tableservice.py index 722342756571..9de4858d7b9e 100644 --- a/src/azure/storage/tableservice.py +++ b/src/azure/storage/tableservice.py @@ -23,11 +23,11 @@ convert_entity_to_xml, _convert_response_to_entity, _convert_xml_to_entity, _sign_storage_table_request) from azure.http.batchclient import _BatchClient -from azure.http import HTTPRequest +from azure.http import HTTPRequest, HTTP_RESPONSE_NO_CONTENT from azure import (_validate_not_none, Feed, _convert_response_to_feeds, _str_or_none, _int_or_none, _get_request_body, _update_request_uri_query, - _dont_fail_on_exist, _dont_fail_not_exist, + _dont_fail_on_exist, _dont_fail_not_exist, WindowsAzureConflictError, WindowsAzureError, _parse_response, _convert_class_to_xml, _parse_response_for_dict, _parse_response_for_dict_prefix, _parse_response_for_dict_filter, @@ -90,7 +90,7 @@ def set_table_service_properties(self, storage_service_properties): return _parse_response_for_dict(response) - def query_tables(self, table_name = None, top=None): + def query_tables(self, table_name = None, top=None, next_table_name=None): ''' Returns a list of tables under the specified account. @@ -105,7 +105,10 @@ def query_tables(self, table_name = None, top=None): else: uri_part_table_name = "" request.path = '/Tables' + uri_part_table_name + '' - request.query = [('$top', _int_or_none(top))] + request.query = [ + ('$top', _int_or_none(top)), + ('NextTableName', _str_or_none(next_table_name)) + ] request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage) request.headers = _update_storage_table_header(request) response = self._perform_request(request) @@ -116,7 +119,9 @@ def create_table(self, table, fail_on_exist=False): ''' Creates a new table in the storage account. - table: name of the table to create. + table: name of the table to create. Table name may contain only alphanumeric characters + and cannot begin with a numeric character. It is case-insensitive and must be from + 3 to 63 characters long. fail_on_exist: specify whether throw exception when table exists. ''' _validate_not_none('table', table) @@ -184,7 +189,7 @@ def get_entity(self, table_name, partition_key, row_key, select=''): return _convert_response_to_entity(response) - def query_entities(self, table_name, filter=None, select=None, top=None): + def query_entities(self, table_name, filter=None, select=None, top=None, next_partition_key=None, next_row_key=None): ''' Get entities in a table; includes the $filter and $select options. @@ -201,7 +206,9 @@ def query_entities(self, table_name, filter=None, select=None, top=None): request.query = [ ('$filter', _str_or_none(filter)), ('$select', _str_or_none(select)), - ('$top', _int_or_none(top)) + ('$top', _int_or_none(top)), + ('NextPartitionKey', _str_or_none(next_partition_key)), + ('NextRowKey', _str_or_none(next_row_key)) ] request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage) request.headers = _update_storage_table_header(request) @@ -229,6 +236,8 @@ def insert_entity(self, table_name, entity, content_type='application/atom+xml') request.headers = _update_storage_table_header(request) response = self._perform_request(request) + return _convert_response_to_entity(response) + def update_entity(self, table_name, partition_key, row_key, entity, content_type='application/atom+xml', if_match='*'): ''' Updates an existing entity in a table. The Update Entity operation replaces the entire @@ -257,6 +266,8 @@ def update_entity(self, table_name, partition_key, row_key, entity, content_type request.headers = _update_storage_table_header(request) response = self._perform_request(request) + return _parse_response_for_dict_filter(response, filter=['etag']) + def merge_entity(self, table_name, partition_key, row_key, entity, content_type='application/atom+xml', if_match='*'): ''' Updates an existing entity by updating the entity's properties. This operation does @@ -285,6 +296,8 @@ def merge_entity(self, table_name, partition_key, row_key, entity, content_type= request.headers = _update_storage_table_header(request) response = self._perform_request(request) + return _parse_response_for_dict_filter(response, filter=['etag']) + def delete_entity(self, table_name, partition_key, row_key, content_type='application/atom+xml', if_match='*'): ''' Deletes an existing entity in a table. @@ -338,7 +351,9 @@ def insert_or_replace_entity(self, table_name, partition_key, row_key, entity, c request.headers = _update_storage_table_header(request) response = self._perform_request(request) - def insert_or_merge_entity(self, table_name, partition_key, row_key, entity, content_type='application/atom+xml', if_match='*'): + return _parse_response_for_dict_filter(response, filter=['etag']) + + def insert_or_merge_entity(self, table_name, partition_key, row_key, entity, content_type='application/atom+xml'): ''' Merges an existing entity or inserts a new entity if it does not exist in the table. Because this operation can insert or update an entity, it is also known as an "upsert" @@ -358,15 +373,14 @@ def insert_or_merge_entity(self, table_name, partition_key, row_key, entity, con request.method = 'MERGE' request.host = _get_table_host(self.account_name, self.use_local_storage) request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')' - request.headers = [ - ('Content-Type', _str_or_none(content_type)), - ('If-Match', _str_or_none(if_match)) - ] + request.headers = [('Content-Type', _str_or_none(content_type))] request.body = _get_request_body(convert_entity_to_xml(entity)) request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage) request.headers = _update_storage_table_header(request) response = self._perform_request(request) + return _parse_response_for_dict_filter(response, filter=['etag']) + def _perform_request_worker(self, request): auth = _sign_storage_table_request(request, diff --git a/src/codegenerator/blob_input.txt b/src/codegenerator/blob_input.txt index 550b5dec6939..55b52f616939 100644 --- a/src/codegenerator/blob_input.txt +++ b/src/codegenerator/blob_input.txt @@ -21,7 +21,8 @@ marker: Optional. A string value that identifies the portion of the list to be r with the next list operation. maxresults: Optional. Specifies the maximum number of containers to return. include: Optional. Include this parameter to specify that the container's metadata be - returned as part of the response body. + returned as part of the response body. set this parameter to string 'metadata' to + get container's metadata. [return] ContainerEnumResults [url] @@ -243,7 +244,7 @@ container_name: the name of container to get the blob blob_name: the name of blob x_ms_range: Optional. Return only the bytes of the blob in the specified range. [return] -str +BlobResult [url] GET http://<account-name>.blob.core.windows.net/<container-name>/<blob-name> [query] @@ -320,6 +321,8 @@ x_ms_lease_id: Optional. If this header is specified, the operation will be perf 1. The blob's lease is currently active 2. The lease ID specified in the request matches that of the blob. [return] +dict +filter=['x-ms-snapshot', 'etag', 'last-modified'] [url] PUT http://<account-name>.blob.core.windows.net/<container-name>/<blob-name>?comp=snapshot [query] diff --git a/src/codegenerator/codegenerator.py b/src/codegenerator/codegenerator.py index 587df94d6dae..eb6dc6e4d814 100644 --- a/src/codegenerator/codegenerator.py +++ b/src/codegenerator/codegenerator.py @@ -40,8 +40,8 @@ def to_legalname(name): if ch.isupper(): legalname += '_' legalname += ch - legalname = legalname.replace('__', '_').replace('_m_d5', '_md5') - return legalname.lower() + legalname = legalname.replace('__', '_').lower().replace('_m_d5', '_md5') + return legalname def normalize_xml(xmlstr): if xmlstr: @@ -99,7 +99,7 @@ def output_import(output_file, class_name): output_str += 'from azure.storage import *\n' output_str += 'from azure.storage.storageclient import _StorageClient\n' if 'Blob' in class_name: - output_str += 'from azure.storage import (_update_storage_blob_header,\n' + output_str += 'from azure.storage import (_update_storage_blob_header, _create_blob_result,\n' output_str += indent*8 + 'convert_block_list_to_xml, convert_response_to_block_list) \n' elif 'Queue' in class_name: output_str += 'from azure.storage import (_update_storage_queue_header)\n' @@ -115,7 +115,7 @@ def output_import(output_file, class_name): output_str += 'from azure import (_validate_not_none, Feed,\n' output_str += indent*8 + '_convert_response_to_feeds, _str_or_none, _int_or_none,\n' output_str += indent*8 + '_get_request_body, _update_request_uri_query, \n' - output_str += indent*8 + '_dont_fail_on_exist, _dont_fail_not_exist, \n' + output_str += indent*8 + '_dont_fail_on_exist, _dont_fail_not_exist, WindowsAzureConflictError, \n' output_str += indent*8 + 'WindowsAzureError, _parse_response, _convert_class_to_xml, \n' output_str += indent*8 + '_parse_response_for_dict, _parse_response_for_dict_prefix, \n' output_str += indent*8 + '_parse_response_for_dict_filter, \n' @@ -260,7 +260,7 @@ def output_list(list_name, request_list, validate_conversions): return output_list_str -def output_method_body(return_type, method_params, uri_param, req_protocol, req_host, host_param, req_method, req_uri, req_query, req_header, req_body, req_param): +def output_method_body(method_name, return_type, method_params, uri_param, req_protocol, req_host, host_param, req_method, req_uri, req_query, req_header, req_body, req_param): indent = ' ' output_body = ''.join([indent*2, 'request = HTTPRequest()\n']) @@ -341,16 +341,32 @@ def output_method_body(return_type, method_params, uri_param, req_protocol, req_ for name, value in method_params: if 'fail_on_exist' in name: - output_body += indent*2 + 'if not ' + name + ':\n' - output_body += indent*3 + 'try:\n' - output_body += ''.join([indent*4, 'self._perform_request(request)\n']) - output_body += ''.join([indent*4, 'return True\n']) - output_body += indent*3 + 'except WindowsAzureError as e:\n' - output_body += indent*4 + '_dont_fail_on_exist(e)\n' - output_body += indent*4 + 'return False\n' - output_body += indent*2 + 'else:\n' - output_body += ''.join([indent*3, 'self._perform_request(request)\n']) - output_body += ''.join([indent*3, 'return True\n\n']) + if method_name == 'create_queue' and 'queue.core' in req_host: #QueueService create_queue + output_body += indent*2 + 'if not ' + name + ':\n' + output_body += indent*3 + 'try:\n' + output_body += ''.join([indent*4, 'response = self._perform_request(request)\n']) + output_body += ''.join([indent*4, 'if response.status == 204:\n']) + output_body += ''.join([indent*5, 'return False\n']) + output_body += ''.join([indent*4, 'return True\n']) + output_body += indent*3 + 'except WindowsAzureError as e:\n' + output_body += indent*4 + '_dont_fail_on_exist(e)\n' + output_body += indent*4 + 'return False\n' + output_body += indent*2 + 'else:\n' + output_body += ''.join([indent*3, 'response = self._perform_request(request)\n']) + output_body += ''.join([indent*3, 'if response.status == 204:\n']) + output_body += ''.join([indent*4, 'raise WindowsAzureConflictError(azure._ERROR_CONFLICT)\n']) + output_body += ''.join([indent*3, 'return True\n\n']) + else: + output_body += indent*2 + 'if not ' + name + ':\n' + output_body += indent*3 + 'try:\n' + output_body += ''.join([indent*4, 'self._perform_request(request)\n']) + output_body += ''.join([indent*4, 'return True\n']) + output_body += indent*3 + 'except WindowsAzureError as e:\n' + output_body += indent*4 + '_dont_fail_on_exist(e)\n' + output_body += indent*4 + 'return False\n' + output_body += indent*2 + 'else:\n' + output_body += ''.join([indent*3, 'self._perform_request(request)\n']) + output_body += ''.join([indent*3, 'return True\n\n']) break elif 'fail_not_exist' in name: output_body += indent*2 + 'if not ' + name + ':\n' @@ -383,13 +399,15 @@ def output_method_body(return_type, method_params, uri_param, req_protocol, req_ elif return_type == 'PageList': output_body += indent*2 + 'return _parse_simple_list(response, PageList, PageRange, "page_ranges")' else: - if return_type == 'Message': + if return_type == 'BlobResult': + output_body += indent*2 + 'return _create_blob_result(response)\n\n' + elif return_type == 'Message': output_body += indent*2 + 'return _create_message(response, self)\n\n' elif return_type == 'str': output_body += indent*2 + 'return response.body\n\n' elif return_type == 'BlobBlockList': output_body += indent*2 + 'return convert_response_to_block_list(response)\n\n' - elif 'Feed' in return_type: + elif 'Feed' in return_type: for name in ['table', 'entity', 'topic', 'subscription', 'queue', 'rule']: if name +'\'),' in return_type: convert_func = '_convert_xml_to_' + name @@ -412,7 +430,7 @@ def output_method(output_file, method_name, method_params, method_comment, retur output_str += output_method_def(method_name, method_params, uri_param, req_param, req_query, req_header) output_str += output_method_comments(method_comment, req_param, req_query, req_header) output_str += output_method_validates(uri_param, req_param, req_query, req_header) - output_str += output_method_body(return_type, method_params, uri_param, req_protocol, req_host, host_param, req_method, req_uri, req_query, req_header, req_body, req_param) + output_str += output_method_body(method_name, return_type, method_params, uri_param, req_protocol, req_host, host_param, req_method, req_uri, req_query, req_header, req_body, req_param) output_file.write(output_str) @@ -686,20 +704,32 @@ def auto_codegen(source_filename, output_filename='output.py'): auto_codegen('queue_input.txt', '../azure/storage/queueservice.py') auto_codegen('servicebus_input.txt', '../azure/servicebus/servicebusservice.py') - def add_license(license_file_name, output_file_name): - license_file = open(license_file_name, 'r') + def add_license(license_str, output_file_name): output_file = open(output_file_name, 'r') content = output_file.read() - license_txt = license_file.read() - license_file.close() output_file.close() output_file = open(output_file_name, 'w') - output_file.write(license_txt) + output_file.write(license_str) output_file.write(content) output_file.close() + license_str = '''#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +''' - add_license('license.txt', '../azure/storage/blobservice.py') - add_license('license.txt', '../azure/storage/tableservice.py') - add_license('license.txt', '../azure/storage/queueservice.py') - add_license('license.txt', '../azure/servicebus/servicebusservice.py') \ No newline at end of file + add_license(license_str, '../azure/storage/blobservice.py') + add_license(license_str, '../azure/storage/tableservice.py') + add_license(license_str, '../azure/storage/queueservice.py') + add_license(license_str, '../azure/servicebus/servicebusservice.py') \ No newline at end of file diff --git a/src/codegenerator/servicebus_input.txt b/src/codegenerator/servicebus_input.txt index 226fbf12b640..8aac7ac4edd5 100644 --- a/src/codegenerator/servicebus_input.txt +++ b/src/codegenerator/servicebus_input.txt @@ -470,8 +470,6 @@ def _perform_request(self, request): except HTTPError as e: return _service_bus_error_handler(e) - if not resp: - return None return resp [end] diff --git a/src/codegenerator/table_input.txt b/src/codegenerator/table_input.txt index 5cb5c124e67c..be01432922c8 100644 --- a/src/codegenerator/table_input.txt +++ b/src/codegenerator/table_input.txt @@ -46,13 +46,16 @@ top: the maximum number of tables to return GET http://<account-name>.table.core.windows.net/Tables<?table_name:('[table_name]')> [query] $top= +NextTableName= [method] create_table [comment] Creates a new table in the storage account. -table: name of the table to create. +table: name of the table to create. Table name may contain only alphanumeric characters + and cannot begin with a numeric character. It is case-insensitive and must be from + 3 to 63 characters long. fail_on_exist: specify whether throw exception when table exists. [params] fail_on_exist=False @@ -105,6 +108,8 @@ GET http://<account-name>.table.core.windows.net/<table-name>() $filter= $select= $top= +NextPartitionKey= +NextRowKey= [method] insert_entity @@ -113,6 +118,7 @@ Inserts a new entity into a table. entity: Required. The entity object to insert. Could be a dict format or entity object. [return] +Feed('entity') [url] POST http://<account-name>.table.core.windows.net/<table-name> [requestheader] @@ -130,6 +136,8 @@ entity: Required. The entity object to insert. Could be a dict format or entity partition_key: PartitionKey of the entity. row_key: RowKey of the entity. [return] +dict +filter=['etag'] [url] PUT http://<account-name>.table.core.windows.net/<table-name>(PartitionKey=\'<partition-key>\',RowKey=\'<row-key>\') [requestheader] @@ -148,6 +156,8 @@ entity: Required. The entity object to insert. Can be a dict format or entity ob partition_key: PartitionKey of the entity. row_key: RowKey of the entity. [return] +dict +filter=['etag'] [url] MERGE http://<account-name>.table.core.windows.net/<table-name>(PartitionKey=\'<partition-key>\',RowKey=\'<row-key>\') [requestheader] @@ -183,6 +193,8 @@ entity: Required. The entity object to insert. Could be a dict format or entity partition_key: PartitionKey of the entity. row_key: RowKey of the entity. [return] +dict +filter=['etag'] [url] PUT http://<account-name>.table.core.windows.net/<table-name>(PartitionKey=\'<partition-key>\',RowKey=\'<row-key>\') [requestheader] @@ -201,11 +213,12 @@ entity: Required. The entity object to insert. Could be a dict format or entity partition_key: PartitionKey of the entity. row_key: RowKey of the entity. [return] +dict +filter=['etag'] [url] MERGE http://<account-name>.table.core.windows.net/<table-name>(PartitionKey=\'<partition-key>\',RowKey=\'<row-key>\') [requestheader] Content-Type=application/atom+xml;required:application/atom+xml|#this is required and has to be set to application/atom+xml -If-Match=* [requestbody] feed:entity;required:feed diff --git a/test/azuretest.pyproj b/test/azuretest.pyproj index 2fe4cb6bcb84..d787ba2083c6 100644 --- a/test/azuretest.pyproj +++ b/test/azuretest.pyproj @@ -6,7 +6,7 @@ <ProjectGuid>{c0742a2d-4862-40e4-8a28-036eecdbc614}</ProjectGuid> <ProjectHome> </ProjectHome> - <StartupFile>azuretest\test_tableservice.py</StartupFile> + <StartupFile>azuretest\test_servicebusservice.py</StartupFile> <WorkingDirectory>.</WorkingDirectory> <OutputPath>.</OutputPath> <Name>azuretest</Name> @@ -19,8 +19,13 @@ <ClusterRunEnvironment>localhost/1/Core/</ClusterRunEnvironment> <ClusterTargetPlatform>X86</ClusterTargetPlatform> <IsWindowsApplication>False</IsWindowsApplication> - <InterpreterId>2af0f10d-7135-4994-9156-5d01c9c11b7e</InterpreterId> + <InterpreterId>9a7a9026-48c1-4688-9d5d-e5699d47d074</InterpreterId> <InterpreterVersion>2.7</InterpreterVersion> + <SearchPath>C:\Users\a-huvalo\Documents\Visual Studio 2010\Projects\PTVS\Open_Source\Incubation\windowsazure\src\</SearchPath> + <SccProjectName>$/TCWCS/Python/Main/Open_Source/Incubation/windowsazure/test</SccProjectName> + <SccProvider>{4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}</SccProvider> + <SccAuxPath>http://tcvstf:8080/tfs/tc</SccAuxPath> + <SccLocalPath>.</SccLocalPath> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <DebugSymbols>true</DebugSymbols> @@ -34,14 +39,23 @@ <Folder Include="azuretest" /> </ItemGroup> <ItemGroup> + <Compile Include="azuretest\clean.py" /> + <Compile Include="azuretest\doctest_blobservice.py" /> + <Compile Include="azuretest\doctest_queueservice.py" /> + <Compile Include="azuretest\doctest_servicebusservicequeue.py" /> + <Compile Include="azuretest\doctest_servicebusservicetopic.py" /> + <Compile Include="azuretest\doctest_tableservice.py" /> <Compile Include="azuretest\test_blobservice.py" /> + <Compile Include="azuretest\test_cloudstorageaccount.py" /> <Compile Include="azuretest\test_queueservice.py" /> + <Compile Include="azuretest\test_sharedaccesssignature.py" /> <Compile Include="azuretest\test_tableservice.py" /> <Compile Include="azuretest\test_servicebusservice.py" /> <Compile Include="azuretest\util.py" /> <Compile Include="azuretest\__init__.py" /> </ItemGroup> <ItemGroup> + <Content Include="run.bash" /> <Content Include="run.bat" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" /> diff --git a/test/azuretest/clean.py b/test/azuretest/clean.py new file mode 100644 index 000000000000..76035675e512 --- /dev/null +++ b/test/azuretest/clean.py @@ -0,0 +1,78 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +from azure import * +from azure.storage import * +from azure.servicebus import * +from azuretest.util import * + +print('WARNING!!!') +print('') +print('This program cleans the storage account and the service namespace specified') +print('by the unit test credentials file (windowsazurecredentials.json) located in') +print('your home directory.') +print('') +print('You should not run this program while tests are running as this will') +print('interfere with the tests.') +print('') +print('The following will be deleted from the storage account:') +print(' - All containers') +print(' - All tables') +print(' - All queues') +print('') +print('The following will be deleted from the service namespace:') +print(' - All queues') +print(' - All topics') +print('') +print('Enter YES to proceed, or anything else to cancel') +print('') + +input = raw_input('>') +if input == 'YES': + print('Cleaning storage account...') + + bc = BlobService(credentials.getStorageServicesName(), + credentials.getStorageServicesKey()) + + ts = TableService(credentials.getStorageServicesName(), + credentials.getStorageServicesKey()) + + qs = QueueService(credentials.getStorageServicesName(), + credentials.getStorageServicesKey()) + + for container in bc.list_containers(): + bc.delete_container(container.name) + + for table in ts.query_tables(): + ts.delete_table(table.name) + + for queue in qs.list_queues(): + qs.delete_queue(queue.name) + + print('Cleaning service namespace...') + + sbs = ServiceBusService(credentials.getServiceBusNamespace(), + credentials.getServiceBusKey(), + 'owner') + + for queue in sbs.list_queues(): + sbs.delete_queue(queue.name) + + for topic in sbs.list_topics(): + sbs.delete_topic(topic.name) + + print('Done.') +else: + print('Canceled.') diff --git a/test/azuretest/doctest_blobservice.py b/test/azuretest/doctest_blobservice.py new file mode 100644 index 000000000000..ca1f29456c90 --- /dev/null +++ b/test/azuretest/doctest_blobservice.py @@ -0,0 +1,65 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +""" +How to: Create a Container +-------------------------- +>>> from azure.storage import * +>>> blob_service = BlobService(name, key) +>>> blob_service.create_container('mycontainer') +True + +>>> blob_service.create_container('mycontainer2', x_ms_blob_public_access='container') +True + +>>> blob_service.set_container_acl('mycontainer', x_ms_blob_public_access='container') + +How to: Upload a Blob into a Container +-------------------------------------- +>>> myblob = 'hello blob' +>>> blob_service.put_blob('mycontainer', 'myblob', myblob, x_ms_blob_type='BlockBlob') + +How to: List the Blobs in a Container +------------------------------------- +>>> blobs = blob_service.list_blobs('mycontainer') +>>> for blob in blobs: +... print(blob.name) +myblob + +How to: Download Blobs +---------------------- +>>> blob = blob_service.get_blob('mycontainer', 'myblob') +>>> print(blob) +hello blob + +How to: Delete a Blob +--------------------- +>>> blob_service.delete_blob('mycontainer', 'myblob') + +>>> blob_service.delete_container('mycontainer') +True + +>>> blob_service.delete_container('mycontainer2') +True + +""" +from azuretest.util import * + +name = credentials.getStorageServicesName() +key = credentials.getStorageServicesKey() + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test/azuretest/doctest_queueservice.py b/test/azuretest/doctest_queueservice.py new file mode 100644 index 000000000000..5c1cb4e8cb90 --- /dev/null +++ b/test/azuretest/doctest_queueservice.py @@ -0,0 +1,81 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +""" +How To: Create a Queue +---------------------- +>>> from azure.storage import * +>>> queue_service = QueueService(name, key) +>>> queue_service.create_queue('taskqueue') +True + +How To: Insert a Message into a Queue +------------------------------------- +>>> queue_service.put_message('taskqueue', 'Hello World') + +How To: Peek at the Next Message +-------------------------------- +>>> messages = queue_service.peek_messages('taskqueue') +>>> for message in messages: +... print(message.message_text) +... +Hello World + +How To: Dequeue the Next Message +-------------------------------- +>>> messages = queue_service.get_messages('taskqueue') +>>> for message in messages: +... print(message.message_text) +... queue_service.delete_message('taskqueue', message.message_id, message.pop_receipt) +Hello World + +How To: Change the Contents of a Queued Message +----------------------------------------------- +>>> queue_service.put_message('taskqueue', 'Hello World') +>>> messages = queue_service.get_messages('taskqueue') +>>> for message in messages: +... res = queue_service.update_message('taskqueue', message.message_id, 'Hello World Again', message.pop_receipt, 0) + +How To: Additional Options for Dequeuing Messages +------------------------------------------------- +>>> queue_service.put_message('taskqueue', 'Hello World') +>>> messages = queue_service.get_messages('taskqueue', numofmessages=16, visibilitytimeout=5*60) +>>> for message in messages: +... print(message.message_text) +... queue_service.delete_message('taskqueue', message.message_id, message.pop_receipt) +Hello World Again +Hello World + +How To: Get the Queue Length +---------------------------- +>>> queue_metadata = queue_service.get_queue_metadata('taskqueue') +>>> count = queue_metadata['x-ms-approximate-messages-count'] +>>> count +u'0' + +How To: Delete a Queue +---------------------- +>>> queue_service.delete_queue('taskqueue') +True + +""" +from azuretest.util import * + +name = credentials.getStorageServicesName() +key = credentials.getStorageServicesKey() + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test/azuretest/doctest_servicebusservicequeue.py b/test/azuretest/doctest_servicebusservicequeue.py new file mode 100644 index 000000000000..984170d68d90 --- /dev/null +++ b/test/azuretest/doctest_servicebusservicequeue.py @@ -0,0 +1,64 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +""" +How To: Create a Queue +---------------------- +>>> from azure.servicebus import * +>>> bus_service = ServiceBusService(ns, key, 'owner') +>>> bus_service.create_queue('taskqueue') +True + +>>> queue_options = Queue() +>>> queue_options.max_size_in_megabytes = '5120' +>>> queue_options.default_message_time_to_live = 'PT1M' +>>> bus_service.create_queue('taskqueue2', queue_options) +True + +How to Send Messages to a Queue +------------------------------- +>>> msg = Message('Test Message') +>>> bus_service.send_queue_message('taskqueue', msg) + +How to Receive Messages from a Queue +------------------------------------ +>>> msg = bus_service.receive_queue_message('taskqueue') +>>> print(msg.body) +Test Message + +>>> msg = Message('Test Message') +>>> bus_service.send_queue_message('taskqueue', msg) + +>>> msg = bus_service.receive_queue_message('taskqueue', peek_lock=True) +>>> print(msg.body) +Test Message +>>> msg.delete() + + +>>> bus_service.delete_queue('taskqueue') +True + +>>> bus_service.delete_queue('taskqueue2') +True + +""" +from azuretest.util import * + +ns = credentials.getServiceBusNamespace() +key = credentials.getServiceBusKey() + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test/azuretest/doctest_servicebusservicetopic.py b/test/azuretest/doctest_servicebusservicetopic.py new file mode 100644 index 000000000000..d6f502c51542 --- /dev/null +++ b/test/azuretest/doctest_servicebusservicetopic.py @@ -0,0 +1,95 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +""" +How to Create a Topic +--------------------- +>>> from azure.servicebus import * +>>> bus_service = ServiceBusService(ns, key, 'owner') +>>> bus_service.create_topic('mytopic') +True + +>>> topic_options = Topic() +>>> topic_options.max_size_in_megabytes = '5120' +>>> topic_options.default_message_time_to_live = 'PT1M' +>>> bus_service.create_topic('mytopic2', topic_options) +True + +How to Create Subscriptions +--------------------------- +>>> bus_service.create_subscription('mytopic', 'AllMessages') +True + +>>> bus_service.create_subscription('mytopic', 'HighMessages') +True + +>>> rule = Rule() +>>> rule.filter_type = 'SqlFilter' +>>> rule.filter_expression = 'messagenumber > 3' +>>> bus_service.create_rule('mytopic', 'HighMessages', 'HighMessageFilter', rule) +True + +>>> bus_service.delete_rule('mytopic', 'HighMessages', DEFAULT_RULE_NAME) +True + +>>> bus_service.create_subscription('mytopic', 'LowMessages') +True + +>>> rule = Rule() +>>> rule.filter_type = 'SqlFilter' +>>> rule.filter_expression = 'messagenumber <= 3' +>>> bus_service.create_rule('mytopic', 'LowMessages', 'LowMessageFilter', rule) +True + +>>> bus_service.delete_rule('mytopic', 'LowMessages', DEFAULT_RULE_NAME) +True + +How to Send Messages to a Topic +------------------------------- +>>> for i in range(5): +... msg = Message('Msg ' + str(i), custom_properties={'messagenumber':i}) +... bus_service.send_topic_message('mytopic', msg) + +How to Receive Messages from a Subscription +------------------------------------------- +>>> msg = bus_service.receive_subscription_message('mytopic', 'LowMessages') +>>> print(msg.body) +Msg 0 + +>>> msg = bus_service.receive_subscription_message('mytopic', 'LowMessages', peek_lock=True) +>>> print(msg.body) +Msg 1 +>>> msg.delete() + +How to Delete Topics and Subscriptions +-------------------------------------- +>>> bus_service.delete_subscription('mytopic', 'HighMessages') +True + +>>> bus_service.delete_queue('mytopic') +True + +>>> bus_service.delete_queue('mytopic2') +True + +""" +from azuretest.util import * + +ns = credentials.getServiceBusNamespace() +key = credentials.getServiceBusKey() + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test/azuretest/doctest_tableservice.py b/test/azuretest/doctest_tableservice.py new file mode 100644 index 000000000000..b93b0274ae74 --- /dev/null +++ b/test/azuretest/doctest_tableservice.py @@ -0,0 +1,116 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +""" +How To: Create a Table +---------------------- +>>> from azure.storage import * +>>> table_service = TableService(name, key) +>>> table_service.create_table('tasktable') +True + +How to Add an Entity to a Table +------------------------------- +>>> task = {'PartitionKey': 'tasksSeattle', 'RowKey': '1', 'description' : 'Take out the trash', 'priority' : 200} +>>> table_service.insert_entity('tasktable', task) + +>>> task = Entity() +>>> task.PartitionKey = 'tasksSeattle' +>>> task.RowKey = '2' +>>> task.description = 'Wash the car' +>>> task.priority = 100 +>>> table_service.insert_entity('tasktable', task) + +How to Update an Entity +----------------------- +>>> task = {'description' : 'Take out the garbage', 'priority' : 250} +>>> table_service.update_entity('tasktable', 'tasksSeattle', '1', task) + +>>> task = {'description' : 'Take out the garbage again', 'priority' : 250} +>>> table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '1', task) + +>>> task = {'description' : 'Buy detergent', 'priority' : 300} +>>> table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '3', task) + + +How to Change a Group of Entities +--------------------------------- +>>> task10 = {'PartitionKey': 'tasksSeattle', 'RowKey': '10', 'description' : 'Go grocery shopping', 'priority' : 400} +>>> task11 = {'PartitionKey': 'tasksSeattle', 'RowKey': '11', 'description' : 'Clean the bathroom', 'priority' : 100} +>>> table_service.begin_batch() +>>> table_service.insert_entity('tasktable', task10) +>>> table_service.insert_entity('tasktable', task11) +>>> table_service.commit_batch() + +How to Query for an Entity +-------------------------- +>>> task = table_service.get_entity('tasktable', 'tasksSeattle', '1') +>>> print(task.description) +Take out the garbage again +>>> print(task.priority) +250 + +>>> task = table_service.get_entity('tasktable', 'tasksSeattle', '10') +>>> print(task.description) +Go grocery shopping +>>> print(task.priority) +400 + +How to Query a Set of Entities +------------------------------ +>>> tasks = table_service.query_entities('tasktable', "PartitionKey eq 'tasksSeattle'") +>>> for task in tasks: +... print(task.description) +... print(task.priority) +Take out the garbage again +250 +Go grocery shopping +400 +Clean the bathroom +100 +Wash the car +100 +Buy detergent +300 + +How to Query a Subset of Entity Properties +------------------------------------------ +>>> tasks = table_service.query_entities('tasktable', "PartitionKey eq 'tasksSeattle'", 'description') +>>> for task in tasks: +... print(task.description) +Take out the garbage again +Go grocery shopping +Clean the bathroom +Wash the car +Buy detergent + +How to Delete an Entity +----------------------- +>>> table_service.delete_entity('tasktable', 'tasksSeattle', '1') + +How to Delete a Table +--------------------- +>>> table_service.delete_table('tasktable') +True + +""" +from azuretest.util import * + +name = credentials.getStorageServicesName() +key = credentials.getStorageServicesKey() + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test/azuretest/test_blobservice.py b/test/azuretest/test_blobservice.py index 0d37c9747edf..a04e5fca19c1 100644 --- a/test/azuretest/test_blobservice.py +++ b/test/azuretest/test_blobservice.py @@ -14,28 +14,27 @@ #-------------------------------------------------------------------------- from azure.storage.blobservice import * -from azure.storage import Metrics, BlockList +from azure.storage import Metrics +from azure.storage.storageclient import AZURE_STORAGE_ACCESS_KEY, AZURE_STORAGE_ACCOUNT, EMULATED, DEV_ACCOUNT_NAME, DEV_ACCOUNT_KEY from azure import WindowsAzureError from azuretest.util import * from azure.http import HTTPRequest, HTTPResponse import unittest -import time #------------------------------------------------------------------------------ -class BlobServiceTest(unittest.TestCase): +class BlobServiceTest(AzureTestCase): def setUp(self): self.bc = BlobService(account_name=credentials.getStorageServicesName(), account_key=credentials.getStorageServicesKey()) - # TODO: it may be overkill to use the machine name from - # getUniqueTestRunID, current time may be unique enough __uid = getUniqueTestRunID() container_base_name = u'mytestcontainer%s' % (__uid) self.container_name = getUniqueNameBasedOnCurrentTime(container_base_name) + self.additional_container_names = [] def tearDown(self): self.cleanup() @@ -46,26 +45,12 @@ def cleanup(self): self.bc.delete_container(self.container_name) except: pass - #--Helpers----------------------------------------------------------------- - - # TODO: move this function out of here so other tests can use them - # TODO: find out how to import/use safe_repr instead repr - def assertNamedItemInContainer(self, container, item_name, msg=None): - for item in container: - if item.name == item_name: - return - - standardMsg = '%s not found in %s' % (repr(item_name), repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) - - # TODO: move this function out of here so other tests can use them - # TODO: find out how to import/use safe_repr instead repr - def assertNamedItemNotInContainer(self, container, item_name, msg=None): - for item in container: - if item.name == item_name: - standardMsg = '%s unexpectedly found in %s' % (repr(item_name), repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) + for name in self.additional_container_names: + try: + self.bc.delete_container(name) + except: pass + #--Helpers----------------------------------------------------------------- def _create_container(self, container_name): self.bc.create_container(container_name, None, None, True) @@ -79,6 +64,92 @@ def _create_container_and_page_blob(self, container_name, blob_name, content_len resp = self.bc.put_blob(self.container_name, blob_name, '', 'PageBlob', x_ms_blob_content_length=str(content_length)) self.assertIsNone(resp) + #--Test cases for blob service -------------------------------------------- + def test_create_blob_service_missing_arguments(self): + # Arrange + if os.environ.has_key(AZURE_STORAGE_ACCOUNT): + del os.environ[AZURE_STORAGE_ACCOUNT] + if os.environ.has_key(AZURE_STORAGE_ACCESS_KEY): + del os.environ[AZURE_STORAGE_ACCESS_KEY] + if os.environ.has_key(EMULATED): + del os.environ[EMULATED] + + # Act + with self.assertRaises(WindowsAzureError): + bs = BlobService() + + # Assert + + def test_create_blob_service_env_variables(self): + # Arrange + os.environ[AZURE_STORAGE_ACCOUNT] = credentials.getStorageServicesName() + os.environ[AZURE_STORAGE_ACCESS_KEY] = credentials.getStorageServicesKey() + + # Act + bs = BlobService() + + if os.environ.has_key(AZURE_STORAGE_ACCOUNT): + del os.environ[AZURE_STORAGE_ACCOUNT] + if os.environ.has_key(AZURE_STORAGE_ACCESS_KEY): + del os.environ[AZURE_STORAGE_ACCESS_KEY] + + # Assert + self.assertIsNotNone(bs) + self.assertEquals(bs.account_name, credentials.getStorageServicesName()) + self.assertEquals(bs.account_key, credentials.getStorageServicesKey()) + self.assertEquals(bs.is_emulated, False) + + def test_create_blob_service_emulated_true(self): + # Arrange + os.environ[EMULATED] = 'true' + + # Act + bs = BlobService() + + if os.environ.has_key(EMULATED): + del os.environ[EMULATED] + + # Assert + self.assertIsNotNone(bs) + self.assertEquals(bs.account_name, DEV_ACCOUNT_NAME) + self.assertEquals(bs.account_key, DEV_ACCOUNT_KEY) + self.assertEquals(bs.is_emulated, True) + + def test_create_blob_service_emulated_false(self): + # Arrange + os.environ[EMULATED] = 'false' + + # Act + with self.assertRaises(WindowsAzureError): + bs = BlobService() + + if os.environ.has_key(EMULATED): + del os.environ[EMULATED] + + # Assert + + def test_create_blob_service_emulated_false_env_variables(self): + # Arrange + os.environ[EMULATED] = 'false' + os.environ[AZURE_STORAGE_ACCOUNT] = credentials.getStorageServicesName() + os.environ[AZURE_STORAGE_ACCESS_KEY] = credentials.getStorageServicesKey() + + # Act + bs = BlobService() + + if os.environ.has_key(EMULATED): + del os.environ[EMULATED] + if os.environ.has_key(AZURE_STORAGE_ACCOUNT): + del os.environ[AZURE_STORAGE_ACCOUNT] + if os.environ.has_key(AZURE_STORAGE_ACCESS_KEY): + del os.environ[AZURE_STORAGE_ACCESS_KEY] + + # Assert + self.assertIsNotNone(bs) + self.assertEquals(bs.account_name, credentials.getStorageServicesName()) + self.assertEquals(bs.account_key, credentials.getStorageServicesKey()) + self.assertEquals(bs.is_emulated, False) + #--Test cases for containers ----------------------------------------- def test_create_container_no_options(self): # Arrange @@ -98,6 +169,17 @@ def test_create_container_no_options_fail_on_exist(self): # Assert self.assertTrue(created) + def test_create_container_with_already_existing_container(self): + # Arrange + + # Act + created1 = self.bc.create_container(self.container_name) + created2 = self.bc.create_container(self.container_name) + + # Assert + self.assertTrue(created1) + self.assertFalse(created2) + def test_create_container_with_already_existing_container_fail_on_exist(self): # Arrange @@ -155,8 +237,63 @@ def test_list_containers_no_options(self): # Assert self.assertIsNotNone(containers) + self.assertGreaterEqual(len(containers), 1) + self.assertIsNotNone(containers[0]) self.assertNamedItemInContainer(containers, self.container_name) + def test_list_containers_with_prefix(self): + # Arrange + self.bc.create_container(self.container_name) + + # Act + containers = self.bc.list_containers(self.container_name) + + # Assert + self.assertIsNotNone(containers) + self.assertEqual(len(containers), 1) + self.assertIsNotNone(containers[0]) + self.assertEqual(containers[0].name, self.container_name) + self.assertIsNone(containers[0].metadata); + + def test_list_containers_with_include_metadata(self): + # Arrange + self.bc.create_container(self.container_name) + resp = self.bc.set_container_metadata(self.container_name, {'hello':'world', 'bar':'43'}) + + # Act + containers = self.bc.list_containers(self.container_name, None, None, 'metadata') + + # Assert + self.assertIsNotNone(containers) + self.assertGreaterEqual(len(containers), 1) + self.assertIsNotNone(containers[0]) + self.assertNamedItemInContainer(containers, self.container_name) + self.assertEqual(containers[0].metadata['hello'], 'world') + self.assertEqual(containers[0].metadata['bar'], '43') + + def test_list_containers_with_maxresults_and_marker(self): + # Arrange + self.additional_container_names = [self.container_name + 'a', + self.container_name + 'b', + self.container_name + 'c', + self.container_name + 'd'] + for name in self.additional_container_names: + self.bc.create_container(name) + + # Act + containers1 = self.bc.list_containers(self.container_name, None, 2) + containers2 = self.bc.list_containers(self.container_name, containers1.next_marker, 2) + + # Assert + self.assertIsNotNone(containers1) + self.assertEqual(len(containers1), 2) + self.assertNamedItemInContainer(containers1, self.container_name + 'a') + self.assertNamedItemInContainer(containers1, self.container_name + 'b') + self.assertIsNotNone(containers2) + self.assertEqual(len(containers2), 2) + self.assertNamedItemInContainer(containers2, self.container_name + 'c') + self.assertNamedItemInContainer(containers2, self.container_name + 'd') + def test_set_container_metadata(self): # Arrange self.bc.create_container(self.container_name) @@ -183,12 +320,19 @@ def test_set_container_metadata_with_non_existing_container(self): def test_get_container_metadata(self): # Arrange self.bc.create_container(self.container_name) + self.bc.set_container_acl(self.container_name, None, 'container') + self.bc.set_container_metadata(self.container_name, {'hello':'world','foo':'42'}) # Act md = self.bc.get_container_metadata(self.container_name) # Assert self.assertIsNotNone(md) + self.assertEquals(md['x-ms-meta-hello'], 'world') + self.assertEquals(md['x-ms-meta-foo'], '42') + # TODO: + # get_container_properties returns container lease information whereas get_container_metadata doesn't + # we should lease the container in the arrange section and verify that we do not receive that info def test_get_container_metadata_with_non_existing_container(self): # Arrange @@ -202,12 +346,19 @@ def test_get_container_metadata_with_non_existing_container(self): def test_get_container_properties(self): # Arrange self.bc.create_container(self.container_name) + self.bc.set_container_acl(self.container_name, None, 'container') + self.bc.set_container_metadata(self.container_name, {'hello':'world','foo':'42'}) # Act props = self.bc.get_container_properties(self.container_name) # Assert self.assertIsNotNone(props) + self.assertEquals(props['x-ms-meta-hello'], 'world') + self.assertEquals(props['x-ms-meta-foo'], '42') + # TODO: + # get_container_properties returns container lease information whereas get_container_metadata doesn't + # we should lease the container in the arrange section and verify that we receive that info def test_get_container_properties_with_non_existing_container(self): # Arrange @@ -229,6 +380,20 @@ def test_get_container_acl(self): self.assertIsNotNone(acl) self.assertEqual(len(acl.signed_identifiers), 0) + def test_get_container_acl_iter(self): + # Arrange + self.bc.create_container(self.container_name) + + # Act + acl = self.bc.get_container_acl(self.container_name) + for signed_identifier in acl: + pass + + # Assert + self.assertIsNotNone(acl) + self.assertEqual(len(acl.signed_identifiers), 0) + self.assertEqual(len(acl), 0) + def test_get_container_acl_with_non_existing_container(self): # Arrange @@ -274,6 +439,45 @@ def test_set_container_acl_with_public_access_blob(self): acl = self.bc.get_container_acl(self.container_name) self.assertIsNotNone(acl) + def test_set_container_acl_with_empty_signed_identifiers(self): + # Arrange + self.bc.create_container(self.container_name) + + # Act + identifiers = SignedIdentifiers() + + resp = self.bc.set_container_acl(self.container_name, identifiers) + + # Assert + self.assertIsNone(resp) + acl = self.bc.get_container_acl(self.container_name) + self.assertIsNotNone(acl) + self.assertEqual(len(acl.signed_identifiers), 0) + + def test_set_container_acl_with_signed_identifiers(self): + # Arrange + self.bc.create_container(self.container_name) + + # Act + si = SignedIdentifier() + si.id = 'testid' + si.access_policy.start = '2011-10-11' + si.access_policy.expiry = '2011-10-12' + si.access_policy.permission = 'r' + identifiers = SignedIdentifiers() + identifiers.signed_identifiers.append(si) + + resp = self.bc.set_container_acl(self.container_name, identifiers) + + # Assert + self.assertIsNone(resp) + acl = self.bc.get_container_acl(self.container_name) + self.assertIsNotNone(acl) + self.assertEqual(len(acl.signed_identifiers), 1) + self.assertEqual(len(acl), 1) + self.assertEqual(acl.signed_identifiers[0].id, 'testid') + self.assertEqual(acl[0].id, 'testid') + def test_set_container_acl_with_non_existing_container(self): # Arrange @@ -379,8 +583,8 @@ def test_list_blobs(self): # Arrange self._create_container(self.container_name) data = 'hello world' - resp = self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob') - resp = self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob') # Act blobs = self.bc.list_blobs(self.container_name) @@ -389,8 +593,170 @@ def test_list_blobs(self): # Assert self.assertIsNotNone(blobs) + self.assertGreaterEqual(len(blobs), 2) + self.assertIsNotNone(blobs[0]) self.assertNamedItemInContainer(blobs, 'blob1') self.assertNamedItemInContainer(blobs, 'blob2') + self.assertEqual(blobs[0].properties.content_length, 11) + self.assertEqual(blobs[1].properties.content_type, 'application/octet-stream Charset=UTF-8') + + def test_list_blobs_with_prefix(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'bloba1', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'bloba2', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blobb1', data, 'BlockBlob') + + # Act + blobs = self.bc.list_blobs(self.container_name, 'bloba') + + # Assert + self.assertIsNotNone(blobs) + self.assertEqual(len(blobs), 2) + self.assertNamedItemInContainer(blobs, 'bloba1') + self.assertNamedItemInContainer(blobs, 'bloba2') + + def test_list_blobs_with_maxresults(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'bloba1', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'bloba2', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'bloba3', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blobb1', data, 'BlockBlob') + + # Act + blobs = self.bc.list_blobs(self.container_name, None, None, 2) + + # Assert + self.assertIsNotNone(blobs) + self.assertEqual(len(blobs), 2) + self.assertNamedItemInContainer(blobs, 'bloba1') + self.assertNamedItemInContainer(blobs, 'bloba2') + + def test_list_blobs_with_maxresults_and_marker(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'bloba1', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'bloba2', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'bloba3', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blobb1', data, 'BlockBlob') + + # Act + blobs1 = self.bc.list_blobs(self.container_name, None, None, 2) + blobs2 = self.bc.list_blobs(self.container_name, None, blobs1.next_marker, 2) + + # Assert + self.assertEqual(len(blobs1), 2) + self.assertEqual(len(blobs2), 2) + self.assertNamedItemInContainer(blobs1, 'bloba1') + self.assertNamedItemInContainer(blobs1, 'bloba2') + self.assertNamedItemInContainer(blobs2, 'bloba3') + self.assertNamedItemInContainer(blobs2, 'blobb1') + + def test_list_blobs_with_include_snapshots(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob') + self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob') + self.bc.snapshot_blob(self.container_name, 'blob1') + + # Act + blobs = self.bc.list_blobs(self.container_name, include='snapshots') + + # Assert + self.assertEqual(len(blobs), 3) + self.assertEqual(blobs[0].name, 'blob1') + self.assertNotEqual(blobs[0].snapshot, '') + self.assertEqual(blobs[1].name, 'blob1') + self.assertEqual(blobs[1].snapshot, '') + self.assertEqual(blobs[2].name, 'blob2') + self.assertEqual(blobs[2].snapshot, '') + + def test_list_blobs_with_include_metadata(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob', x_ms_meta_name_values={'foo':'1','bar':'bob'}) + self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob', x_ms_meta_name_values={'foo':'2','bar':'car'}) + self.bc.snapshot_blob(self.container_name, 'blob1') + + # Act + blobs = self.bc.list_blobs(self.container_name, include='metadata') + + # Assert + self.assertEqual(len(blobs), 2) + self.assertEqual(blobs[0].name, 'blob1') + self.assertEqual(blobs[0].metadata['foo'], '1') + self.assertEqual(blobs[0].metadata['bar'], 'bob') + self.assertEqual(blobs[1].name, 'blob2') + self.assertEqual(blobs[1].metadata['foo'], '2') + self.assertEqual(blobs[1].metadata['bar'], 'car') + + def test_list_blobs_with_include_uncommittedblobs(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_block(self.container_name, 'blob1', 'AAA', '1') + self.bc.put_block(self.container_name, 'blob1', 'BBB', '2') + self.bc.put_block(self.container_name, 'blob1', 'CCC', '3') + self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob', x_ms_meta_name_values={'foo':'2','bar':'car'}) + + # Act + blobs = self.bc.list_blobs(self.container_name, include='uncommittedblobs') + + # Assert + self.assertEqual(len(blobs), 2) + self.assertEqual(blobs[0].name, 'blob1') + self.assertEqual(blobs[1].name, 'blob2') + + #def test_list_blobs_with_include_copy(self): + # # Arrange + # self._create_container(self.container_name) + # data = 'hello world' + # self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob', x_ms_meta_name_values={'status':'original'}) + # sourceblob = '/%s/%s/%s' % (credentials.getStorageServicesName(), + # self.container_name, + # 'blob1') + # self.bc.copy_blob(self.container_name, 'blob1copy', sourceblob, {'status':'copy'}) + + # # Act + # blobs = self.bc.list_blobs(self.container_name, include='copy') + + # # Assert + # self.assertEqual(len(blobs), 2) + # self.assertEqual(blobs[0].name, 'blob1') + # self.assertEqual(blobs[1].name, 'blob2') + # #TODO: check for metadata related to copy blob + + def test_list_blobs_with_include_multiple(self): + # Arrange + self._create_container(self.container_name) + data = 'hello world' + self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob', x_ms_meta_name_values={'foo':'1','bar':'bob'}) + self.bc.put_blob(self.container_name, 'blob2', data, 'BlockBlob', x_ms_meta_name_values={'foo':'2','bar':'car'}) + self.bc.snapshot_blob(self.container_name, 'blob1') + + # Act + blobs = self.bc.list_blobs(self.container_name, include='snapshots,metadata') + + # Assert + self.assertEqual(len(blobs), 3) + self.assertEqual(blobs[0].name, 'blob1') + self.assertNotEqual(blobs[0].snapshot, '') + self.assertEqual(blobs[0].metadata['foo'], '1') + self.assertEqual(blobs[0].metadata['bar'], 'bob') + self.assertEqual(blobs[1].name, 'blob1') + self.assertEqual(blobs[1].snapshot, '') + self.assertEqual(blobs[1].metadata['foo'], '1') + self.assertEqual(blobs[1].metadata['bar'], 'bob') + self.assertEqual(blobs[2].name, 'blob2') + self.assertEqual(blobs[2].snapshot, '') + self.assertEqual(blobs[2].metadata['foo'], '2') + self.assertEqual(blobs[2].metadata['bar'], 'car') def test_put_blob_block_blob(self): # Arrange @@ -413,6 +779,35 @@ def test_put_blob_page_blob(self): # Assert self.assertIsNone(resp) + def test_put_blob_with_lease_id(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + lease = self.bc.lease_blob(self.container_name, 'blob1', 'acquire') + lease_id = lease['x-ms-lease-id'] + + # Act + data = 'hello world again' + resp = self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob', x_ms_lease_id=lease_id) + + # Assert + self.assertIsNone(resp) + blob = self.bc.get_blob(self.container_name, 'blob1', x_ms_lease_id=lease_id) + self.assertEqual(blob, 'hello world again') + + def test_put_blob_with_metadata(self): + # Arrange + self._create_container(self.container_name) + + # Act + data = 'hello world' + resp = self.bc.put_blob(self.container_name, 'blob1', data, 'BlockBlob', x_ms_meta_name_values={'hello':'world','foo':'42'}) + + # Assert + self.assertIsNone(resp) + md = self.bc.get_blob_metadata(self.container_name, 'blob1') + self.assertEquals(md['x-ms-meta-hello'], 'world') + self.assertEquals(md['x-ms-meta-foo'], '42') + def test_get_blob_with_existing_blob(self): # Arrange self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') @@ -421,7 +816,84 @@ def test_get_blob_with_existing_blob(self): blob = self.bc.get_blob(self.container_name, 'blob1') # Assert - self.assertEqual(type(blob), str) + self.assertIsInstance(blob, BlobResult) + self.assertEquals(blob, 'hello world') + + def test_get_blob_with_snapshot(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + snapshot = self.bc.snapshot_blob(self.container_name, 'blob1') + + # Act + blob = self.bc.get_blob(self.container_name, 'blob1', snapshot['x-ms-snapshot']) + + # Assert + self.assertIsInstance(blob, BlobResult) + self.assertEquals(blob, 'hello world') + + def test_get_blob_with_snapshot_previous(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + snapshot = self.bc.snapshot_blob(self.container_name, 'blob1') + self.bc.put_blob(self.container_name, 'blob1', 'hello world again', 'BlockBlob') + + # Act + blob_previous = self.bc.get_blob(self.container_name, 'blob1', snapshot['x-ms-snapshot']) + blob_latest = self.bc.get_blob(self.container_name, 'blob1') + + # Assert + self.assertIsInstance(blob_previous, BlobResult) + self.assertIsInstance(blob_latest, BlobResult) + self.assertEquals(blob_previous, 'hello world') + self.assertEquals(blob_latest, 'hello world again') + + def test_get_blob_with_range(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + + # Act + blob = self.bc.get_blob(self.container_name, 'blob1', x_ms_range='bytes=0-5') + + # Assert + self.assertIsInstance(blob, BlobResult) + self.assertEquals(blob, 'hello ') + + def test_get_blob_with_range_and_get_content_md5(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + + # Act + blob = self.bc.get_blob(self.container_name, 'blob1', x_ms_range='bytes=0-5', x_ms_range_get_content_md5='true') + + # Assert + self.assertIsInstance(blob, BlobResult) + self.assertEquals(blob, 'hello ') + self.assertEquals(blob.properties['content-md5'], '+BSJN3e8wilf/wXwDlCNpg==') + + def test_get_blob_with_lease(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + lease = self.bc.lease_blob(self.container_name, 'blob1', 'acquire') + lease_id = lease['x-ms-lease-id'] + + # Act + blob = self.bc.get_blob(self.container_name, 'blob1', x_ms_lease_id=lease_id) + self.bc.lease_blob(self.container_name, 'blob1', 'release', lease_id) + + # Assert + self.assertIsInstance(blob, BlobResult) + self.assertEquals(blob, 'hello world') + + def test_get_blob_on_leased_blob_without_lease_id(self): + # Arrange + self._create_container_and_block_blob(self.container_name, 'blob1', 'hello world') + self.bc.lease_blob(self.container_name, 'blob1', 'acquire') + + # Act + blob = self.bc.get_blob(self.container_name, 'blob1') # get_blob is allowed without lease id + + # Assert + self.assertIsInstance(blob, BlobResult) self.assertEquals(blob, 'hello world') def test_get_blob_with_non_existing_container(self): @@ -453,7 +925,7 @@ def test_set_blob_properties_with_existing_blob(self): # Assert self.assertIsNone(resp) props = self.bc.get_blob_properties(self.container_name, 'blob1') - self.assertEquals(props['Content-Language'], 'spanish') + self.assertEquals(props['content-language'], 'spanish') def test_set_blob_properties_with_non_existing_container(self): # Arrange @@ -485,6 +957,7 @@ def test_get_blob_properties_with_existing_blob(self): self.assertIsNotNone(props) self.assertEquals(props['x-ms-blob-type'], 'BlockBlob') self.assertEquals(props['x-ms-lease-status'], 'unlocked') + self.assertEquals(props['content-length'], '11') def test_get_blob_properties_with_non_existing_container(self): # Arrange @@ -571,7 +1044,8 @@ def test_snapshot_blob(self): resp = self.bc.snapshot_blob(self.container_name, 'blob1') # Assert - self.assertIsNone(resp) + self.assertIsNotNone(resp) + self.assertIsNotNone(resp['x-ms-snapshot']) def test_lease_blob_acquire_and_release(self): # Arrange @@ -625,6 +1099,8 @@ def test_put_block_list(self): # Assert self.assertIsNone(resp) + blob = self.bc.get_blob(self.container_name, 'blob1') + self.assertEqual(blob, 'AAABBBCCC') def test_get_block_list_no_blocks(self): # Arrange @@ -724,6 +1200,23 @@ def test_get_page_ranges_2_pages(self): self.assertEquals(ranges.page_ranges[1].start, 1024) self.assertEquals(ranges.page_ranges[1].end, 1535) + def test_get_page_ranges_iter(self): + # Arrange + self._create_container_and_page_blob(self.container_name, 'blob1', 2048) + data = 'abcdefghijklmnop' * 32 + resp1 = self.bc.put_page(self.container_name, 'blob1', data, 'bytes=0-511', 'update') + resp2 = self.bc.put_page(self.container_name, 'blob1', data, 'bytes=1024-1535', 'update') + + # Act + ranges = self.bc.get_page_ranges(self.container_name, 'blob1') + for range in ranges: + pass + + # Assert + self.assertEquals(len(ranges), 2) + self.assertIsInstance(ranges[0], PageRange) + self.assertIsInstance(ranges[1], PageRange) + def test_with_filter(self): # Single filter called = [] diff --git a/test/azuretest/test_cloudstorageaccount.py b/test/azuretest/test_cloudstorageaccount.py new file mode 100644 index 000000000000..198a61c251a7 --- /dev/null +++ b/test/azuretest/test_cloudstorageaccount.py @@ -0,0 +1,77 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +from azure.storage import * +from azuretest.util import * + +import unittest + +#------------------------------------------------------------------------------ +class CloudStorageAccountTest(AzureTestCase): + + def setUp(self): + self.account = CloudStorageAccount(account_name=credentials.getStorageServicesName(), + account_key=credentials.getStorageServicesKey()) + + #--Test cases -------------------------------------------------------- + def test_create_blob_service(self): + # Arrange + + # Act + service = self.account.create_blob_service() + + # Assert + self.assertIsNotNone(service) + self.assertIsInstance(service, BlobService) + self.assertEqual(service.account_name, credentials.getStorageServicesName()) + self.assertEqual(service.account_key, credentials.getStorageServicesKey()) + + def test_create_blob_service_empty_credentials(self): + # Arrange + + # Act + bad_account = CloudStorageAccount('', '') + with self.assertRaises(WindowsAzureError): + service = bad_account.create_blob_service() + + # Assert + + def test_create_table_service(self): + # Arrange + + # Act + service = self.account.create_table_service() + + # Assert + self.assertIsNotNone(service) + self.assertIsInstance(service, TableService) + self.assertEqual(service.account_name, credentials.getStorageServicesName()) + self.assertEqual(service.account_key, credentials.getStorageServicesKey()) + + def test_create_queue_service(self): + # Arrange + + # Act + service = self.account.create_queue_service() + + # Assert + self.assertIsNotNone(service) + self.assertIsInstance(service, QueueService) + self.assertEqual(service.account_name, credentials.getStorageServicesName()) + self.assertEqual(service.account_key, credentials.getStorageServicesKey()) + +#------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/test/azuretest/test_queueservice.py b/test/azuretest/test_queueservice.py index a04f9c2160d8..a89cdbba2a1d 100644 --- a/test/azuretest/test_queueservice.py +++ b/test/azuretest/test_queueservice.py @@ -19,27 +19,25 @@ from azuretest.util import * import unittest -import time #------------------------------------------------------------------------------ TEST_QUEUE_PREFIX = 'mytestqueue' #------------------------------------------------------------------------------ -class QueueServiceTest(unittest.TestCase): +class QueueServiceTest(AzureTestCase): def setUp(self): self.queue_client = QueueService(account_name=credentials.getStorageServicesName(), account_key=credentials.getStorageServicesKey()) - # TODO: it may be overkill to use the machine name from - # getUniqueTestRunID, current time may be unique enough + __uid = getUniqueTestRunID() queue_base_name = u'%s' % (__uid) self.test_queues = [] self.creatable_queues = [] for i in range(10): - self.test_queues.append(TEST_QUEUE_PREFIX + getUniqueNameBasedOnCurrentTime(queue_base_name)) + self.test_queues.append(TEST_QUEUE_PREFIX + str(i) + getUniqueNameBasedOnCurrentTime(queue_base_name)) for i in range(4): - self.creatable_queues.append('mycreatablequeue' + getUniqueNameBasedOnCurrentTime(queue_base_name)) + self.creatable_queues.append('mycreatablequeue' + str(i) + getUniqueNameBasedOnCurrentTime(queue_base_name)) for queue_name in self.test_queues: self.queue_client.create_queue(queue_name) @@ -107,6 +105,24 @@ def test_create_queue(self): self.assertIsNotNone(result) self.assertEqual(result['x-ms-approximate-messages-count'], '0') + def test_create_queue_already_exist(self): + #Action + created1 = self.queue_client.create_queue(self.creatable_queues[0]) + created2 = self.queue_client.create_queue(self.creatable_queues[0]) + + #Asserts + self.assertTrue(created1) + self.assertFalse(created2) + + def test_create_queue_fail_on_exist(self): + #Action + created = self.queue_client.create_queue(self.creatable_queues[0], None, True) + with self.assertRaises(WindowsAzureError): + self.queue_client.create_queue(self.creatable_queues[0], None, True) + + #Asserts + self.assertTrue(created) + def test_create_queue_with_options(self): #Action self.queue_client.create_queue(self.creatable_queues[1], x_ms_meta_name_values = {'foo':'test', 'bar':'blah'}) @@ -118,9 +134,34 @@ def test_create_queue_with_options(self): self.assertEqual('test', result['x-ms-meta-foo']) self.assertEqual('blah', result['x-ms-meta-bar']) + def test_delete_queue_not_exist(self): + #Action + deleted = self.queue_client.delete_queue(self.creatable_queues[0]) + + #Asserts + self.assertFalse(deleted) + + def test_delete_queue_fail_not_exist_not_exist(self): + #Action + with self.assertRaises(WindowsAzureError): + self.queue_client.delete_queue(self.creatable_queues[0], True) + + #Asserts + + def test_delete_queue_fail_not_exist_already_exist(self): + #Action + created = self.queue_client.create_queue(self.creatable_queues[0]) + deleted = self.queue_client.delete_queue(self.creatable_queues[0], True) + + #Asserts + self.assertTrue(created) + self.assertTrue(deleted) + def test_list_queues(self): #Action queues = self.queue_client.list_queues() + for queue in queues: + pass #Asserts self.assertIsNotNone(queues) @@ -172,7 +213,7 @@ def test_put_message(self): self.queue_client.put_message(self.test_queues[0], 'message3') self.queue_client.put_message(self.test_queues[0], 'message4') - def test_get_messges(self): + def test_get_messages(self): #Action self.queue_client.put_message(self.test_queues[1], 'message1') self.queue_client.put_message(self.test_queues[1], 'message2') diff --git a/test/azuretest/test_servicebusservice.py b/test/azuretest/test_servicebusservice.py index 46edc29686ec..7ff352e11b08 100644 --- a/test/azuretest/test_servicebusservice.py +++ b/test/azuretest/test_servicebusservice.py @@ -1,15 +1,17 @@ -#------------------------------------------------------------------------------ -# Copyright (c) Microsoft Corporation. +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation # -# This source code is subject to terms and conditions of the Apache License, -# Version 2.0. A copy of the license can be found in the License.html file at -# the root of this distribution. If you cannot locate the Apache License, -# Version 2.0, please send an email to vspython@microsoft.com. By using this -# source code in any fashion, you are agreeing to be bound by the terms of the -# Apache License, Version 2.0. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 # -# You must not remove this notice, or any other, from this software. -#------------------------------------------------------------------------------ +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- from azure import * from azure.servicebus import * @@ -18,14 +20,12 @@ import unittest #------------------------------------------------------------------------------ -class ServiceBusTest(unittest.TestCase): +class ServiceBusTest(AzureTestCase): def setUp(self): self.sbs = ServiceBusService(credentials.getServiceBusNamespace(), credentials.getServiceBusKey(), 'owner') - # TODO: it may be overkill to use the machine name from - # getUniqueTestRunID, current time may be unique enough __uid = getUniqueTestRunID() queue_base_name = u'mytestqueue%s' % (__uid) @@ -48,25 +48,6 @@ def cleanup(self): except: pass #--Helpers----------------------------------------------------------------- - - # TODO: move this function out of here so other tests can use them - # TODO: find out how to import/use safe_repr instead repr - def assertNamedItemInContainer(self, container, item_name, msg=None): - for item in container: - if item.name == item_name: - return - - standardMsg = '%s not found in %s' % (repr(item_name), repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) - - # TODO: move this function out of here so other tests can use them - # TODO: find out how to import/use safe_repr instead repr - def assertNamedItemNotInContainer(self, container, item_name, msg=None): - for item in container: - if item.name == item_name: - standardMsg = '%s unexpectedly found in %s' % (repr(item_name), repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) - def _create_queue(self, queue_name): self.sbs.create_queue(queue_name, None, True) @@ -84,6 +65,44 @@ def _create_topic_and_subscription(self, topic_name, subscription_name): def _create_subscription(self, topic_name, subscription_name): self.sbs.create_subscription(topic_name, subscription_name, None, True) + #--Test cases for service bus service ------------------------------------- + def test_create_service_bus_missing_arguments(self): + # Arrange + if os.environ.has_key(AZURE_SERVICEBUS_NAMESPACE): + del os.environ[AZURE_SERVICEBUS_NAMESPACE] + if os.environ.has_key(AZURE_SERVICEBUS_ACCESS_KEY): + del os.environ[AZURE_SERVICEBUS_ACCESS_KEY] + if os.environ.has_key(AZURE_SERVICEBUS_ISSUER): + del os.environ[AZURE_SERVICEBUS_ISSUER] + + # Act + with self.assertRaises(WindowsAzureError): + sbs = ServiceBusService() + + # Assert + + def test_create_service_bus_env_variables(self): + # Arrange + os.environ[AZURE_SERVICEBUS_NAMESPACE] = credentials.getServiceBusNamespace() + os.environ[AZURE_SERVICEBUS_ACCESS_KEY] = credentials.getServiceBusKey() + os.environ[AZURE_SERVICEBUS_ISSUER] = 'owner' + + # Act + sbs = ServiceBusService() + + if os.environ.has_key(AZURE_SERVICEBUS_NAMESPACE): + del os.environ[AZURE_SERVICEBUS_NAMESPACE] + if os.environ.has_key(AZURE_SERVICEBUS_ACCESS_KEY): + del os.environ[AZURE_SERVICEBUS_ACCESS_KEY] + if os.environ.has_key(AZURE_SERVICEBUS_ISSUER): + del os.environ[AZURE_SERVICEBUS_ISSUER] + + # Assert + self.assertIsNotNone(sbs) + self.assertEquals(sbs.service_namespace, credentials.getServiceBusNamespace()) + self.assertEquals(sbs.account_key, credentials.getServiceBusKey()) + self.assertEquals(sbs.issuer, 'owner') + #--Test cases for queues -------------------------------------------------- def test_create_queue_no_options(self): # Arrange @@ -108,12 +127,33 @@ def test_create_queue_with_options(self): # Act queue_options = Queue() - queue_options.max_size_in_megabytes = 5120 queue_options.default_message_time_to_live = 'PT1M' + queue_options.duplicate_detection_history_time_window = 'PT5M' + queue_options.enable_batched_operations = False + queue_options.dead_lettering_on_message_expiration = False + queue_options.lock_duration = 'PT1M' + queue_options.max_delivery_count = 15 + queue_options.max_size_in_megabytes = 5120 + queue_options.message_count = 0 + queue_options.requires_duplicate_detection = False + queue_options.requires_session = False + queue_options.size_in_bytes = 0 created = self.sbs.create_queue(self.queue_name, queue_options) # Assert self.assertTrue(created) + queue = self.sbs.get_queue(self.queue_name) + self.assertEquals('PT1M', queue.default_message_time_to_live) + self.assertEquals('PT5M', queue.duplicate_detection_history_time_window) + self.assertEquals(False, queue.enable_batched_operations) + self.assertEquals(False, queue.dead_lettering_on_message_expiration) + self.assertEquals('PT1M', queue.lock_duration) + self.assertEquals(15, queue.max_delivery_count) + self.assertEquals(5120, queue.max_size_in_megabytes) + self.assertEquals(0, queue.message_count) + self.assertEquals(False, queue.requires_duplicate_detection) + self.assertEquals(False, queue.requires_session) + self.assertEquals(0, queue.size_in_bytes) def test_create_queue_with_already_existing_queue(self): # Arrange @@ -319,7 +359,14 @@ def test_send_queue_message_with_custom_message_properties(self): self._create_queue(self.queue_name) # Act - sent_msg = Message('message with properties', custom_properties={'hello':'world', 'foo':42}) + props = {'hello':'world', + 'foo':42, + 'active':True, + 'deceased':False, + 'large':8555111000, + 'floating':3.14, + 'dob':datetime(2011, 12, 14)} + sent_msg = Message('message with properties', custom_properties=props) self.sbs.send_queue_message(self.queue_name, sent_msg) received_msg = self.sbs.receive_queue_message(self.queue_name, True, 5) received_msg.delete() @@ -327,7 +374,12 @@ def test_send_queue_message_with_custom_message_properties(self): # Assert self.assertIsNotNone(received_msg) self.assertEquals(received_msg.custom_properties['hello'], 'world') - self.assertEquals(received_msg.custom_properties['foo'], '42') # TODO: note that the integer became a string + self.assertEquals(received_msg.custom_properties['foo'], 42) + self.assertEquals(received_msg.custom_properties['active'], True) + self.assertEquals(received_msg.custom_properties['deceased'], False) + self.assertEquals(received_msg.custom_properties['large'], 8555111000) + self.assertEquals(received_msg.custom_properties['floating'], 3.14) + self.assertEquals(received_msg.custom_properties['dob'], datetime(2011, 12, 14)) #--Test cases for topics/subscriptions ------------------------------------ def test_create_topic_no_options(self): @@ -353,12 +405,24 @@ def test_create_topic_with_options(self): # Act topic_options = Topic() - topic_options.max_size_in_megabytes = '5120' topic_options.default_message_time_to_live = 'PT1M' + topic_options.duplicate_detection_history_time_window = 'PT5M' + topic_options.enable_batched_operations = False + topic_options.max_size_in_megabytes = 5120 + topic_options.requires_duplicate_detection = False + topic_options.size_in_bytes = 0 + #TODO: MaximumNumberOfSubscriptions is not supported? created = self.sbs.create_topic(self.topic_name, topic_options) # Assert self.assertTrue(created) + topic = self.sbs.get_topic(self.topic_name) + self.assertEquals('PT1M', topic.default_message_time_to_live) + self.assertEquals('PT5M', topic.duplicate_detection_history_time_window) + self.assertEquals(False, topic.enable_batched_operations) + self.assertEquals(5120, topic.max_size_in_megabytes) + self.assertEquals(False, topic.requires_duplicate_detection) + self.assertEquals(0, topic.size_in_bytes) def test_create_topic_with_already_existing_topic(self): # Arrange @@ -382,6 +446,23 @@ def test_create_topic_with_already_existing_topic_fail_on_exist(self): # Assert self.assertTrue(created) + def test_topic_backwards_compatibility_warning(self): + # Arrange + topic_options = Topic() + topic_options.max_size_in_megabytes = 5120 + + # Act + val = topic_options.max_size_in_mega_bytes + + # Assert + self.assertEqual(val, 5120) + + # Act + topic_options.max_size_in_mega_bytes = 1024 + + # Assert + self.assertEqual(topic_options.max_size_in_megabytes, 1024) + def test_get_topic_with_existing_topic(self): # Arrange self._create_topic(self.topic_name) @@ -467,6 +548,35 @@ def test_create_subscription(self): # Assert self.assertTrue(created) + def test_create_subscription_with_options(self): + # Arrange + self._create_topic(self.topic_name) + + # Act + subscription_options = Subscription() + subscription_options.dead_lettering_on_filter_evaluation_exceptions = False + subscription_options.dead_lettering_on_message_expiration = False + subscription_options.default_message_time_to_live = 'PT15M' + subscription_options.enable_batched_operations = False + subscription_options.lock_duration = 'PT1M' + subscription_options.max_delivery_count = 15 + #message_count is read-only + subscription_options.message_count = 0 + subscription_options.requires_session = False + created = self.sbs.create_subscription(self.topic_name, 'MySubscription', subscription_options) + + # Assert + self.assertTrue(created) + subscription = self.sbs.get_subscription(self.topic_name, 'MySubscription') + self.assertEquals(False, subscription.dead_lettering_on_filter_evaluation_exceptions) + self.assertEquals(False, subscription.dead_lettering_on_message_expiration) + self.assertEquals('PT15M', subscription.default_message_time_to_live) + self.assertEquals(False, subscription.enable_batched_operations) + self.assertEquals('PT1M', subscription.lock_duration) + #self.assertEquals(15, subscription.max_delivery_count) #no idea why max_delivery_count is always 10 + self.assertEquals(0, subscription.message_count) + self.assertEquals(False, subscription.requires_session) + def test_create_subscription_fail_on_exist(self): # Arrange self._create_topic(self.topic_name) @@ -630,7 +740,7 @@ def test_create_rule_with_already_existing_rule_fail_on_exist(self): # Assert self.assertTrue(created) - def test_create_rule_with_options(self): + def test_create_rule_with_options_sql_filter(self): # Arrange self._create_topic_and_subscription(self.topic_name, 'MySubscription') @@ -643,6 +753,71 @@ def test_create_rule_with_options(self): # Assert self.assertTrue(created) + def test_create_rule_with_options_true_filter(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + + # Act + rule1 = Rule() + rule1.filter_type = 'TrueFilter' + rule1.filter_expression = '1=1' + created = self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', rule1) + + # Assert + self.assertTrue(created) + + def test_create_rule_with_options_false_filter(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + + # Act + rule1 = Rule() + rule1.filter_type = 'FalseFilter' + rule1.filter_expression = '1=0' + created = self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', rule1) + + # Assert + self.assertTrue(created) + + def test_create_rule_with_options_correlation_filter(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + + # Act + rule1 = Rule() + rule1.filter_type = 'CorrelationFilter' + rule1.filter_expression = 'myid' + created = self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', rule1) + + # Assert + self.assertTrue(created) + + def test_create_rule_with_options_empty_rule_action(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + + # Act + rule1 = Rule() + rule1.action_type = 'EmptyRuleAction' + rule1.action_expression = '' + created = self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', rule1) + + # Assert + self.assertTrue(created) + + def test_create_rule_with_options_sql_rule_action(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + + # Act + rule1 = Rule() + rule1.action_type = 'SqlRuleAction' + rule1.action_expression = "SET foo = 5" + created = self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', rule1) + + # Assert + self.assertTrue(created) + def test_list_rules(self): # Arrange self._create_topic_and_subscription(self.topic_name, 'MySubscription') @@ -675,6 +850,27 @@ def test_get_rule_with_non_existing_rule(self): # Assert + def test_get_rule_with_existing_rule_with_options(self): + # Arrange + self._create_topic_and_subscription(self.topic_name, 'MySubscription') + sent_rule = Rule() + sent_rule.filter_type = 'SqlFilter' + sent_rule.filter_expression = 'foo > 40' + sent_rule.action_type = 'SqlRuleAction' + sent_rule.action_expression = 'SET foo = 5' + self.sbs.create_rule(self.topic_name, 'MySubscription', 'MyRule1', sent_rule) + + # Act + received_rule = self.sbs.get_rule(self.topic_name, 'MySubscription', 'MyRule1') + + # Assert + self.assertIsNotNone(received_rule) + self.assertEquals(received_rule.name, 'MyRule1') + self.assertEquals(received_rule.filter_type, sent_rule.filter_type) + self.assertEquals(received_rule.filter_expression, sent_rule.filter_expression) + self.assertEquals(received_rule.action_type, sent_rule.action_type) + self.assertEquals(received_rule.action_expression, sent_rule.action_expression) + def test_delete_rule_with_existing_rule(self): # Arrange self._create_topic_and_subscription(self.topic_name, 'MySubscription') diff --git a/test/azuretest/test_sharedaccesssignature.py b/test/azuretest/test_sharedaccesssignature.py new file mode 100644 index 000000000000..c602d374bf3e --- /dev/null +++ b/test/azuretest/test_sharedaccesssignature.py @@ -0,0 +1,137 @@ +#------------------------------------------------------------------------- +# Copyright 2011 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +from azure import DEV_ACCOUNT_NAME, DEV_ACCOUNT_KEY +from azure.storage.sharedaccesssignature import (SharedAccessSignature, + SharedAccessPolicy, + Permission, + WebResource) +from azure.storage import AccessPolicy +from azuretest.util import AzureTestCase + +import unittest + +#------------------------------------------------------------------------------ +SIGNED_START = 'st' +SIGNED_EXPIRY = 'se' +SIGNED_RESOURCE = 'sr' +SIGNED_PERMISSION = 'sp' +SIGNED_IDENTIFIER = 'si' +SIGNED_SIGNATURE = 'sig' +RESOURCE_BLOB = 'blob' +RESOURCE_CONTAINER = 'container' +SIGNED_RESOURCE_TYPE = 'resource' +SHARED_ACCESS_PERMISSION = 'permission' + +#------------------------------------------------------------------------------ +class SharedAccessSignatureTest(AzureTestCase): + + def setUp(self): + self.sas = SharedAccessSignature(account_name=DEV_ACCOUNT_NAME, + account_key=DEV_ACCOUNT_KEY) + def tearDown(self): + return super(SharedAccessSignatureTest, self).tearDown() + + def test_generate_signature_container(self): + accss_plcy = AccessPolicy() + accss_plcy.start = '2011-10-11' + accss_plcy.expiry = '2011-10-12' + accss_plcy.permission = 'r' + signed_identifier = 'YWJjZGVmZw==' + sap = SharedAccessPolicy(accss_plcy, signed_identifier) + signature = self.sas._generate_signature('images', + RESOURCE_CONTAINER, + sap) + self.assertEqual(signature, + 'VdlALM4TYEYYNf94Bvt3dn48TsA01wk45ltwP3zeKp4=') + + def test_generate_signature_blob(self): + accss_plcy = AccessPolicy() + accss_plcy.start = '2011-10-11T11:03:40Z' + accss_plcy.expiry = '2011-10-12T11:53:40Z' + accss_plcy.permission = 'r' + sap = SharedAccessPolicy(accss_plcy) + + signature = self.sas._generate_signature('images/pic1.png', + RESOURCE_BLOB, + sap) + self.assertEqual(signature, + '7NIEip+VOrQ5ZV80pORPK1MOsJc62wwCNcbMvE+lQ0s=') + + def test_blob_signed_query_string(self): + accss_plcy = AccessPolicy() + accss_plcy.start = '2011-10-11' + accss_plcy.expiry = '2011-10-12' + accss_plcy.permission = 'w' + sap = SharedAccessPolicy(accss_plcy) + qry_str = self.sas.generate_signed_query_string('images/pic1.png', + RESOURCE_BLOB, + sap) + self.assertEqual(qry_str[SIGNED_START], '2011-10-11') + self.assertEqual(qry_str[SIGNED_EXPIRY], '2011-10-12') + self.assertEqual(qry_str[SIGNED_RESOURCE], RESOURCE_BLOB) + self.assertEqual(qry_str[SIGNED_PERMISSION], 'w') + self.assertEqual(qry_str[SIGNED_SIGNATURE], + 'k8uyTrn3pgLXuhwgZhxeAH6mZ/es9k2vqHPJEuIH4CE=') + + def test_container_signed_query_string(self): + accss_plcy = AccessPolicy() + accss_plcy.start = '2011-10-11' + accss_plcy.expiry = '2011-10-12' + accss_plcy.permission = 'r' + signed_identifier = 'YWJjZGVmZw==' + sap = SharedAccessPolicy(accss_plcy, signed_identifier) + qry_str = self.sas.generate_signed_query_string('images', + RESOURCE_CONTAINER, + sap) + self.assertEqual(qry_str[SIGNED_START], '2011-10-11') + self.assertEqual(qry_str[SIGNED_EXPIRY], '2011-10-12') + self.assertEqual(qry_str[SIGNED_RESOURCE], RESOURCE_CONTAINER) + self.assertEqual(qry_str[SIGNED_PERMISSION], 'r') + self.assertEqual(qry_str[SIGNED_IDENTIFIER], 'YWJjZGVmZw==') + self.assertEqual(qry_str[SIGNED_SIGNATURE], + 'VdlALM4TYEYYNf94Bvt3dn48TsA01wk45ltwP3zeKp4=') + + def test_sign_request(self): + accss_plcy = AccessPolicy() + accss_plcy.start = '2011-10-11' + accss_plcy.expiry = '2011-10-12' + accss_plcy.permission = 'r' + sap = SharedAccessPolicy(accss_plcy) + qry_str = self.sas.generate_signed_query_string('images/pic1.png', + RESOURCE_BLOB, + sap) + + permission = Permission() + permission.path = '/images/pic1.png' + permission.query_string = qry_str + self.sas.permission_set = [permission] + + web_rsrc = WebResource() + web_rsrc.properties[SIGNED_RESOURCE_TYPE] = RESOURCE_BLOB + web_rsrc.properties[SHARED_ACCESS_PERMISSION] = 'r' + web_rsrc.path = '/images/pic1.png?comp=metadata' + web_rsrc.request_url = '/images/pic1.png?comp=metadata' + + web_rsrc = self.sas.sign_request(web_rsrc) + + self.assertEqual(web_rsrc.request_url, + '/images/pic1.png?comp=metadata&' + + self.sas._convert_query_string(qry_str)) + +#------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() + \ No newline at end of file diff --git a/test/azuretest/test_tableservice.py b/test/azuretest/test_tableservice.py index 4d38a76936e2..009304cd27d8 100644 --- a/test/azuretest/test_tableservice.py +++ b/test/azuretest/test_tableservice.py @@ -24,76 +24,176 @@ STATUS_CREATED, STATUS_ACCEPTED, STATUS_NO_CONTENT, - getUniqueNameBasedOnCurrentTime) + getUniqueNameBasedOnCurrentTime, + AzureTestCase) import unittest import time from datetime import datetime #------------------------------------------------------------------------------ -__uid = getUniqueTestRunID() - -TABLE_TO_DELETE = 'mytesttabletodelete%s' % (__uid) -TABLE_NO_DELETE = 'mytesttablenodelete%s' % (__uid) -ENTITY_TO_DELETE = 'mytestentitytodelete%s' % (__uid) -ENTITY_NO_DELETE = 'mytestentitynodelete%s' % (__uid) -BATCH_TABLE = 'mytestbatchtable%s' % (__uid) -FILTER_TABLE = 'mytestfiltertable%s' % (__uid) + +MAX_RETRY = 60 #------------------------------------------------------------------------------ -class StorageTest(unittest.TestCase): - ''' - TODO: - - comprehensive, positive test cases for all table client methods - - comprehensive, negative test cases all table client methods - - missing coverage for begin_batch - - missing coverage for cancel_batch - - missing coverage for commit_batch - - get_table_service_properties busted - - set_table_service_properties busted - ''' +class StorageTest(AzureTestCase): def setUp(self): - self.tc = TableService(account_name=credentials.getStorageServicesName().encode('ascii', 'ignore'), - account_key=credentials.getStorageServicesKey().encode('ascii', 'ignore')) + self.tc = TableService(account_name=credentials.getStorageServicesName(), + account_key=credentials.getStorageServicesKey()) __uid = getUniqueTestRunID() - test_table_base_name = u'testtable%s' % (__uid) - self.test_table = getUniqueNameBasedOnCurrentTime(test_table_base_name) - self.tc.create_table(self.test_table) - - #time.sleep(10) + table_base_name = u'testtable%s' % (__uid) + self.table_name = getUniqueNameBasedOnCurrentTime(table_base_name) + self.additional_table_names = [] def tearDown(self): self.cleanup() return super(StorageTest, self).tearDown() def cleanup(self): - for cont in [TABLE_NO_DELETE, TABLE_TO_DELETE]: - try: self.tc.delete_table(cont) + try: + self.tc.delete_table(self.table_name) + except: pass + + for name in self.additional_table_names: + try: + self.tc.delete_table(name) except: pass - self.tc.delete_table(self.test_table) - def test_sanity(self): - self.sanity_create_table() - time.sleep(10) - self.sanity_query_tables() - - self.sanity_delete_table() - - self.sanity_insert_entity() - self.sanity_get_entity() - self.sanity_query_entities() - self.sanity_update_entity() - self.sanity_insert_or_merge_entity() - self.sanity_insert_or_replace_entity() - self.sanity_merge_entity() - self.sanity_delete_entity() - - self.sanity_begin_batch() - self.sanity_commit_batch() - self.sanity_cancel_batch() - - def test_sanity_get_set_table_service_properties(self): + #--Helpers----------------------------------------------------------------- + def _create_table(self, table_name): + ''' + Creates a table with the specified name. + ''' + self.tc.create_table(table_name, True) + + def _create_table_with_default_entities(self, table_name, entity_count): + ''' + Creates a table with the specified name and adds entities with the + default set of values. PartitionKey is set to 'MyPartition' and RowKey + is set to a unique counter value starting at 1 (as a string). + ''' + entities = [] + self._create_table(table_name) + for i in range(1, entity_count + 1): + entities.append(self.tc.insert_entity(table_name, self._create_default_entity_dict('MyPartition', str(i)))) + return entities + + def _create_default_entity_class(self, partition, row): + ''' + Creates a class-based entity with fixed values, using all + of the supported data types. + ''' + # TODO: Edm.Binary and null + entity = Entity() + entity.PartitionKey = partition + entity.RowKey = row + entity.age = 39 + entity.sex = 'male' + entity.married = True + entity.deceased = False + entity.optional = None + entity.ratio = 3.1 + entity.large = 9333111000 + entity.Birthday = datetime(1973,10,04) + entity.birthday = datetime(1970,10,04) + entity.binary = None + entity.other = EntityProperty('Edm.Int64', 20) + entity.clsid = EntityProperty('Edm.Guid', 'c9da6455-213d-42c9-9a79-3e9149a57833') + return entity + + def _create_default_entity_dict(self, partition, row): + ''' + Creates a dictionary-based entity with fixed values, using all + of the supported data types. + ''' + # TODO: Edm.Binary and null + return {'PartitionKey':partition, + 'RowKey':row, + 'age':39, + 'sex':'male', + 'married':True, + 'deceased':False, + 'optional':None, + 'ratio':3.1, + 'large':9333111000, + 'Birthday':datetime(1973,10,04), + 'birthday':datetime(1970,10,04), + 'binary':EntityProperty('Edm.Binary', None), + 'other':EntityProperty('Edm.Int64', 20), + 'clsid':EntityProperty('Edm.Guid', 'c9da6455-213d-42c9-9a79-3e9149a57833')} + + def _create_updated_entity_dict(self, partition, row): + ''' + Creates a dictionary-based entity with fixed values, with a + different set of values than the default entity. It + adds fields, changes field values, changes field types, + and removes fields when compared to the default entity. + ''' + return {'PartitionKey':partition, + 'RowKey':row, + 'age':'abc', + 'sex':'female', + 'sign':'aquarius', + 'birthday':datetime(1991,10,04)} + + def _assert_default_entity(self, entity): + ''' + Asserts that the entity passed in matches the default entity. + ''' + self.assertEquals(entity.age, 39) + self.assertEquals(entity.sex, 'male') + self.assertEquals(entity.married, True) + self.assertEquals(entity.deceased, False) + self.assertFalse(hasattr(entity, "aquarius")) + self.assertEquals(entity.ratio, 3.1) + self.assertEquals(entity.large, 9333111000) + self.assertEquals(entity.Birthday, datetime(1973,10,04)) + self.assertEquals(entity.birthday, datetime(1970,10,04)) + self.assertEquals(entity.other, 20) + self.assertIsInstance(entity.clsid, EntityProperty) + self.assertEquals(entity.clsid.type, 'Edm.Guid') + self.assertEquals(entity.clsid.value, 'c9da6455-213d-42c9-9a79-3e9149a57833') + + def _assert_updated_entity(self, entity): + ''' + Asserts that the entity passed in matches the updated entity. + ''' + self.assertEquals(entity.age, 'abc') + self.assertEquals(entity.sex, 'female') + self.assertFalse(hasattr(entity, "married")) + self.assertFalse(hasattr(entity, "deceased")) + self.assertEquals(entity.sign, 'aquarius') + self.assertFalse(hasattr(entity, "optional")) + self.assertFalse(hasattr(entity, "ratio")) + self.assertFalse(hasattr(entity, "large")) + self.assertFalse(hasattr(entity, "Birthday")) + self.assertEquals(entity.birthday, datetime(1991,10,04)) + self.assertFalse(hasattr(entity, "other")) + self.assertFalse(hasattr(entity, "clsid")) + + def _assert_merged_entity(self, entity): + ''' + Asserts that the entity passed in matches the default entity + merged with the updated entity. + ''' + self.assertEquals(entity.age, 'abc') + self.assertEquals(entity.sex, 'female') + self.assertEquals(entity.sign, 'aquarius') + self.assertEquals(entity.married, True) + self.assertEquals(entity.deceased, False) + self.assertEquals(entity.sign, 'aquarius') + self.assertEquals(entity.ratio, 3.1) + self.assertEquals(entity.large, 9333111000) + self.assertEquals(entity.Birthday, datetime(1973,10,04)) + self.assertEquals(entity.birthday, datetime(1991,10,04)) + self.assertEquals(entity.other, 20) + self.assertIsInstance(entity.clsid, EntityProperty) + self.assertEquals(entity.clsid.type, 'Edm.Guid') + self.assertEquals(entity.clsid.value, 'c9da6455-213d-42c9-9a79-3e9149a57833') + + #--Test cases for table service ------------------------------------------- + def test_get_set_table_service_properties(self): table_properties = self.tc.get_table_service_properties() self.tc.set_table_service_properties(table_properties) @@ -114,10 +214,16 @@ def test_sanity_get_set_table_service_properties(self): setattr(cur, last_attr, value) self.tc.set_table_service_properties(table_properties) - table_properties = self.tc.get_table_service_properties() - cur = table_properties - for component in path.split('.'): - cur = getattr(cur, component) + retry_count = 0 + while retry_count < MAX_RETRY: + table_properties = self.tc.get_table_service_properties() + cur = table_properties + for component in path.split('.'): + cur = getattr(cur, component) + if value == cur: + break + time.sleep(1) + retry_count += 1 self.assertEquals(value, cur) @@ -150,260 +256,501 @@ def test_table_service_set_both(self): self.assertEquals(5, table_properties.logging.retention_policy.days) + #--Test cases for tables -------------------------------------------------- + def test_create_table(self): + # Arrange - #--Helpers----------------------------------------------------------------- - def sanity_create_table(self): - resp = self.tc.create_table(TABLE_TO_DELETE) - self.assertTrue(resp) - #self.assertEqual(resp.cache_control, u'no-cache') - - resp = self.tc.create_table(TABLE_NO_DELETE) - self.assertTrue(resp) - #self.assertEqual(resp.cache_control, u'no-cache') - - def sanity_query_tables(self): - resp = self.tc.query_tables() - self.assertEqual(type(resp), list) - tableNames = [x.name for x in resp] - self.assertGreaterEqual(len(tableNames), 2) - self.assertIn(TABLE_NO_DELETE, tableNames) - self.assertIn(TABLE_TO_DELETE, tableNames) - - def sanity_delete_table(self): - resp = self.tc.delete_table(TABLE_TO_DELETE) - self.assertTrue(resp) - - def sanity_insert_entity(self): - resp = self.tc.insert_entity(TABLE_NO_DELETE, {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age':39, - 'sex':'male', - 'birthday':datetime(1973,10,04)}) - self.assertEquals(resp, None) + # Act + created = self.tc.create_table(self.table_name) - entity = Entity() - entity.PartitionKey = 'Lastname' - entity.RowKey = 'Firstname1' - entity.age = 39 - entity.Birthday = EntityProperty('Edm.Int64', 20) - - resp = self.tc.insert_entity(TABLE_NO_DELETE, entity) - self.assertEquals(resp, None) - - def sanity_get_entity(self): - ln = u'Lastname' - fn1 = u'Firstname1' - resp = self.tc.get_entity(TABLE_NO_DELETE, - ln, - fn1, - '') - self.assertEquals(resp.PartitionKey, ln) - self.assertEquals(resp.RowKey, fn1) - self.assertEquals(resp.age, 39) - self.assertEquals(resp.Birthday, 20) + # Assert + self.assertTrue(created) - def sanity_query_entities(self): - resp = self.tc.query_entities(TABLE_NO_DELETE, '', '') - self.assertEquals(len(resp), 2) - self.assertEquals(resp[0].birthday, datetime(1973, 10, 04)) - self.assertEquals(resp[1].Birthday, 20) - - def sanity_update_entity(self): - ln = u'Lastname' - fn = u'Firstname' - resp = self.tc.update_entity(TABLE_NO_DELETE, - ln, - fn, - {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age':21, - 'sex':'female', - 'birthday':datetime(1991,10,04)}) - self.assertEquals(resp, None) - - resp = self.tc.get_entity(TABLE_NO_DELETE, - ln, - fn, - '') - self.assertEquals(resp.PartitionKey, ln) - self.assertEquals(resp.RowKey, fn) - self.assertEquals(resp.age, 21) - self.assertEquals(resp.sex, u'female') - self.assertEquals(resp.birthday, datetime(1991, 10, 04)) - - def sanity_insert_or_merge_entity(self): - ln = u'Lastname' - fn = u'Firstname' - resp = self.tc.insert_or_merge_entity(TABLE_NO_DELETE, - ln, - fn, - {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age': u'abc', #changed type - 'sex':'male', #changed value - 'birthday':datetime(1991,10,04), - 'sign' : 'aquarius' #new - }) - self.assertEquals(resp, None) + def test_create_table_fail_on_exist(self): + # Arrange + + # Act + created = self.tc.create_table(self.table_name, True) + + # Assert + self.assertTrue(created) + + def test_create_table_with_already_existing_table(self): + # Arrange + + # Act + created1 = self.tc.create_table(self.table_name) + created2 = self.tc.create_table(self.table_name) + + # Assert + self.assertTrue(created1) + self.assertFalse(created2) + + def test_create_table_with_already_existing_table_fail_on_exist(self): + # Arrange + + # Act + created = self.tc.create_table(self.table_name) + with self.assertRaises(WindowsAzureError): + self.tc.create_table(self.table_name, True) + + # Assert + self.assertTrue(created) + + def test_query_tables(self): + # Arrange + self._create_table(self.table_name) + + # Act + tables = self.tc.query_tables() + for table in tables: + pass - resp = self.tc.get_entity(TABLE_NO_DELETE, - ln, - fn, - '') - self.assertEquals(resp.PartitionKey, ln) - self.assertEquals(resp.RowKey, fn) - self.assertEquals(resp.age, u'abc') - self.assertEquals(resp.sex, u'male') - self.assertEquals(resp.birthday, datetime(1991, 10, 4)) - self.assertEquals(resp.sign, u'aquarius') - - def sanity_insert_or_replace_entity(self): - ln = u'Lastname' - fn = u'Firstname' - resp = self.tc.insert_or_replace_entity(TABLE_NO_DELETE, - ln, - fn, - {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age':1, - 'sex':'male'}) - self.assertEquals(resp, None) - - resp = self.tc.get_entity(TABLE_NO_DELETE, - ln, - fn, - '') - self.assertEquals(resp.PartitionKey, ln) - self.assertEquals(resp.RowKey, fn) - self.assertEquals(resp.age, 1) - self.assertEquals(resp.sex, u'male') - self.assertFalse(hasattr(resp, "birthday")) - self.assertFalse(hasattr(resp, "sign")) - - def sanity_merge_entity(self): - ln = u'Lastname' - fn = u'Firstname' - resp = self.tc.merge_entity(TABLE_NO_DELETE, - ln, - fn, - {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'sex':'female', - 'fact': 'nice person'}) - self.assertEquals(resp, None) - - resp = self.tc.get_entity(TABLE_NO_DELETE, - ln, - fn, - '') - self.assertEquals(resp.PartitionKey, ln) - self.assertEquals(resp.RowKey, fn) - self.assertEquals(resp.age, 1) - self.assertEquals(resp.sex, u'female') - self.assertEquals(resp.fact, u'nice person') + # Assert + tableNames = [x.name for x in tables] + self.assertGreaterEqual(len(tableNames), 1) + self.assertGreaterEqual(len(tables), 1) + self.assertIn(self.table_name, tableNames) + + def test_query_tables_with_table_name(self): + # Arrange + self._create_table(self.table_name) + + # Act + tables = self.tc.query_tables(self.table_name) + for table in tables: + pass + + # Assert + self.assertEqual(len(tables), 1) + self.assertEqual(tables[0].name, self.table_name) + + def test_query_tables_with_table_name_no_tables(self): + # Arrange + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.query_tables(self.table_name) + + # Assert + + def test_query_tables_with_top(self): + # Arrange + self.additional_table_names = [self.table_name + suffix for suffix in 'abcd'] + for name in self.additional_table_names: + self.tc.create_table(name) + + # Act + tables = self.tc.query_tables(None, 3) + for table in tables: + pass + + # Assert + self.assertEqual(len(tables), 3) + + def test_query_tables_with_top_and_next_table_name(self): + # Arrange + self.additional_table_names = [self.table_name + suffix for suffix in 'abcd'] + for name in self.additional_table_names: + self.tc.create_table(name) + + # Act + tables_set1 = self.tc.query_tables(None, 3) + tables_set2 = self.tc.query_tables(None, 3, tables_set1.x_ms_continuation['NextTableName']) + + # Assert + self.assertEqual(len(tables_set1), 3) + self.assertGreaterEqual(len(tables_set2), 1) + self.assertLessEqual(len(tables_set2), 3) + + def test_delete_table_with_existing_table(self): + # Arrange + self._create_table(self.table_name) + + # Act + deleted = self.tc.delete_table(self.table_name) + + # Assert + self.assertTrue(deleted) + tables = self.tc.query_tables() + self.assertNamedItemNotInContainer(tables, self.table_name) + + def test_delete_table_with_existing_table_fail_not_exist(self): + # Arrange + self._create_table(self.table_name) + + # Act + deleted = self.tc.delete_table(self.table_name, True) + + # Assert + self.assertTrue(deleted) + tables = self.tc.query_tables() + self.assertNamedItemNotInContainer(tables, self.table_name) + + def test_delete_table_with_non_existing_table(self): + # Arrange + + # Act + deleted = self.tc.delete_table(self.table_name) + + # Assert + self.assertFalse(deleted) + + def test_delete_table_with_non_existing_table_fail_not_exist(self): + # Arrange + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.delete_table(self.table_name, True) + + # Assert + + #--Test cases for entities ------------------------------------------ + def test_insert_entity_dictionary(self): + # Arrange + self._create_table(self.table_name) + + # Act + dict = self._create_default_entity_dict('MyPartition', '1') + resp = self.tc.insert_entity(self.table_name, dict) + + # Assert + self.assertIsNotNone(resp) + + def test_insert_entity_class_instance(self): + # Arrange + self._create_table(self.table_name) + + # Act + entity = self._create_default_entity_class('MyPartition', '1') + resp = self.tc.insert_entity(self.table_name, entity) + + # Assert + self.assertIsNotNone(resp) + + def test_insert_entity_conflict(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.insert_entity(self.table_name, self._create_default_entity_dict('MyPartition', '1')) + + # Assert + + def test_get_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + resp = self.tc.get_entity(self.table_name, 'MyPartition', '1') + + # Assert + self.assertEquals(resp.PartitionKey, 'MyPartition') + self.assertEquals(resp.RowKey, '1') + self._assert_default_entity(resp) + + def test_get_entity_not_existing(self): + # Arrange + self._create_table(self.table_name) + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.get_entity(self.table_name, 'MyPartition', '1') + + # Assert + + def test_get_entity_with_select(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + resp = self.tc.get_entity(self.table_name, 'MyPartition', '1', 'age,sex') + + # Assert + self.assertEquals(resp.age, 39) + self.assertEquals(resp.sex, 'male') self.assertFalse(hasattr(resp, "birthday")) + self.assertFalse(hasattr(resp, "married")) + self.assertFalse(hasattr(resp, "deceased")) - def sanity_delete_entity(self): - ln = u'Lastname' - fn = u'Firstname' - resp = self.tc.delete_entity(TABLE_NO_DELETE, - ln, - fn) - self.assertEquals(resp, None) + def test_query_entities(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 2) - self.assertRaises(WindowsAzureError, - lambda: self.tc.get_entity(TABLE_NO_DELETE, ln, fn, '')) - - def test_batch_partition_key(self): - tn = BATCH_TABLE + 'pk' - self.tc.create_table(tn) - try: - self.tc.begin_batch() - self.tc.insert_entity(TABLE_NO_DELETE, {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age':39, - 'sex':'male', - 'birthday':datetime(1973,10,04)}) - - self.tc.insert_entity(TABLE_NO_DELETE, {'PartitionKey':'Lastname', - 'RowKey':'Firstname2', - 'age':39, - 'sex':'male', - 'birthday':datetime(1973,10,04)}) - - self.tc.commit_batch() - finally: - self.tc.delete_table(tn) - - def test_sanity_batch(self): - return - self.tc.create_table(BATCH_TABLE) - - #resp = self.tc.begin_batch() - #self.assertEquals(resp, None) - - resp = self.tc.insert_entity(BATCH_TABLE, {'PartitionKey':'Lastname', - 'RowKey':'Firstname', - 'age':39, - 'sex':'male', - 'birthday':datetime(1973,10,04)}) - - #resp = self.tc.insert_entity(BATCH_TABLE, {'PartitionKey':'Lastname', - # 'RowKey':'Firstname2', - # 'age':35, - # 'sex':'female', - # 'birthday':datetime(1977,12,5)}) - # - resp = self.tc.query_entities(BATCH_TABLE, '', '') - self.assertEquals(len(resp), 0) - - #self.tc.commit_batch() - return - resp = self.tc.query_entities(BATCH_TABLE, '', '') + # Act + resp = self.tc.query_entities(self.table_name) + + # Assert self.assertEquals(len(resp), 2) + for entity in resp: + self.assertEquals(entity.PartitionKey, 'MyPartition') + self._assert_default_entity(entity) + self.assertEquals(resp[0].RowKey, '1') + self.assertEquals(resp[1].RowKey, '2') - self.tc.delete_table(BATCH_TABLE) - - def sanity_begin_batch(self): - resp = self.tc.begin_batch() - self.assertEquals(resp, None) + def test_query_entities_with_filter(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 2) + self.tc.insert_entity(self.table_name, self._create_default_entity_dict('MyOtherPartition', '3')) + + # Act + resp = self.tc.query_entities(self.table_name, "PartitionKey eq 'MyPartition'") + + # Assert + self.assertEquals(len(resp), 2) + for entity in resp: + self.assertEquals(entity.PartitionKey, 'MyPartition') + self._assert_default_entity(entity) + + def test_query_entities_with_select(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 2) + + # Act + resp = self.tc.query_entities(self.table_name, None, 'age,sex') + + # Assert + self.assertEquals(len(resp), 2) + self.assertEquals(resp[0].age, 39) + self.assertEquals(resp[0].sex, 'male') + self.assertFalse(hasattr(resp[0], "birthday")) + self.assertFalse(hasattr(resp[0], "married")) + self.assertFalse(hasattr(resp[0], "deceased")) + + def test_query_entities_with_top(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 3) + + # Act + resp = self.tc.query_entities(self.table_name, None, None, 2) + + # Assert + self.assertEquals(len(resp), 2) + + def test_query_entities_with_top_and_next(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 5) + + # Act + resp1 = self.tc.query_entities(self.table_name, None, None, 2) + resp2 = self.tc.query_entities(self.table_name, None, None, 2, resp1.x_ms_continuation['NextPartitionKey'], resp1.x_ms_continuation['NextRowKey']) + resp3 = self.tc.query_entities(self.table_name, None, None, 2, resp2.x_ms_continuation['NextPartitionKey'], resp2.x_ms_continuation['NextRowKey']) + + # Assert + self.assertEquals(len(resp1), 2) + self.assertEquals(len(resp2), 2) + self.assertEquals(len(resp3), 1) + self.assertEquals(resp1[0].RowKey, '1') + self.assertEquals(resp1[1].RowKey, '2') + self.assertEquals(resp2[0].RowKey, '3') + self.assertEquals(resp2[1].RowKey, '4') + self.assertEquals(resp3[0].RowKey, '5') + + def test_update_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.update_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_updated_entity(received_entity) + + def test_update_entity_with_if_matches(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.update_entity(self.table_name, 'MyPartition', '1', sent_entity, if_match=entities[0].etag) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_updated_entity(received_entity) + + def test_update_entity_with_if_doesnt_match(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + with self.assertRaises(WindowsAzureError): + self.tc.update_entity(self.table_name, 'MyPartition', '1', sent_entity, if_match=u'W/"datetime\'2012-06-15T22%3A51%3A44.9662825Z\'"') + + # Assert + + def test_insert_or_merge_entity_with_existing_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.insert_or_merge_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_merged_entity(received_entity) + + def test_insert_or_merge_entity_with_non_existing_entity(self): + # Arrange + self._create_table(self.table_name) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.insert_or_merge_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_updated_entity(received_entity) + + def test_insert_or_replace_entity_with_existing_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.insert_or_replace_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_updated_entity(received_entity) + + def test_insert_or_replace_entity_with_non_existing_entity(self): + # Arrange + self._create_table(self.table_name) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.insert_or_replace_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_updated_entity(received_entity) + + def test_merge_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.merge_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_merged_entity(received_entity) + + def test_merge_entity_not_existing(self): + # Arrange + self._create_table(self.table_name) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + with self.assertRaises(WindowsAzureError): + self.tc.merge_entity(self.table_name, 'MyPartition', '1', sent_entity) + + # Assert + + def test_merge_entity_with_if_matches(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + resp = self.tc.merge_entity(self.table_name, 'MyPartition', '1', sent_entity, if_match=entities[0].etag) + + # Assert + self.assertIsNotNone(resp) + received_entity = self.tc.get_entity(self.table_name, 'MyPartition', '1') + self._assert_merged_entity(received_entity) + + def test_merge_entity_with_if_doesnt_match(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) + + # Act + sent_entity = self._create_updated_entity_dict('MyPartition','1') + with self.assertRaises(WindowsAzureError): + self.tc.merge_entity(self.table_name, 'MyPartition', '1', sent_entity, if_match=u'W/"datetime\'2012-06-15T22%3A51%3A44.9662825Z\'"') + + # Assert + + def test_delete_entity(self): + # Arrange + self._create_table_with_default_entities(self.table_name, 1) + + # Act + resp = self.tc.delete_entity(self.table_name, 'MyPartition', '1') + + # Assert + self.assertIsNone(resp) + with self.assertRaises(WindowsAzureError): + self.tc.get_entity(self.table_name, 'MyPartition', '1') + + def test_delete_entity_not_existing(self): + # Arrange + self._create_table(self.table_name) + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.delete_entity(self.table_name, 'MyPartition', '1') + + # Assert + + def test_delete_entity_with_if_matches(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) - def sanity_commit_batch(self): - resp = self.tc.commit_batch() - self.assertEquals(resp, None) + # Act + resp = self.tc.delete_entity(self.table_name, 'MyPartition', '1', if_match=entities[0].etag) - def sanity_cancel_batch(self): - resp = self.tc.cancel_batch() - self.assertEquals(resp, None) + # Assert + self.assertIsNone(resp) + with self.assertRaises(WindowsAzureError): + self.tc.get_entity(self.table_name, 'MyPartition', '1') - def test_query_tables_top(self): - table_id = getUniqueTestRunID() - for i in xrange(20): - self.tc.create_table(table_id + str(i)) + def test_delete_entity_with_if_doesnt_match(self): + # Arrange + entities = self._create_table_with_default_entities(self.table_name, 1) - res = self.tc.query_tables(top = 5) - self.assertEqual(len(res), 5) + # Act + with self.assertRaises(WindowsAzureError): + self.tc.delete_entity(self.table_name, 'MyPartition', '1', if_match=u'W/"datetime\'2012-06-15T22%3A51%3A44.9662825Z\'"') - def test_with_filter(self): - # Single filter + # Assert + + #--Test cases for batch --------------------------------------------- + def test_with_filter_single(self): called = [] + def my_filter(request, next): called.append(True) return next(request) tc = self.tc.with_filter(my_filter) - tc.create_table(FILTER_TABLE) + tc.create_table(self.table_name) self.assertTrue(called) del called[:] - tc.delete_table(FILTER_TABLE) + tc.delete_table(self.table_name) self.assertTrue(called) del called[:] - # Chained filters + def test_with_filter_chained(self): + called = [] + def filter_a(request, next): called.append('a') return next(request) @@ -413,14 +760,17 @@ def filter_b(request, next): return next(request) tc = self.tc.with_filter(filter_a).with_filter(filter_b) - tc.create_table(FILTER_TABLE + '0') + tc.create_table(self.table_name) self.assertEqual(called, ['b', 'a']) - tc.delete_table(FILTER_TABLE + '0') + tc.delete_table(self.table_name) def test_batch_insert(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_insert' @@ -431,15 +781,18 @@ def test_batch_insert(self): entity.test5 = datetime.utcnow() self.tc.begin_batch() - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) self.tc.commit_batch() - #Assert - result = self.tc.get_entity(self.test_table, '001', 'batch_insert') + # Assert + result = self.tc.get_entity(self.table_name, '001', 'batch_insert') self.assertIsNotNone(result) def test_batch_update(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_update' @@ -448,21 +801,24 @@ def test_batch_update(self): entity.test3 = 3 entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) - entity = self.tc.get_entity(self.test_table, '001', 'batch_update') + entity = self.tc.get_entity(self.table_name, '001', 'batch_update') self.assertEqual(3, entity.test3) entity.test2 = 'value1' self.tc.begin_batch() - self.tc.update_entity(self.test_table, '001', 'batch_update', entity) + self.tc.update_entity(self.table_name, '001', 'batch_update', entity) self.tc.commit_batch() - entity = self.tc.get_entity(self.test_table, '001', 'batch_update') + entity = self.tc.get_entity(self.table_name, '001', 'batch_update') - #Assert + # Assert self.assertEqual('value1', entity.test2) def test_batch_merge(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_merge' @@ -471,25 +827,28 @@ def test_batch_merge(self): entity.test3 = 3 entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) - entity = self.tc.get_entity(self.test_table, '001', 'batch_merge') + entity = self.tc.get_entity(self.table_name, '001', 'batch_merge') self.assertEqual(3, entity.test3) entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_merge' entity.test2 = 'value1' self.tc.begin_batch() - self.tc.merge_entity(self.test_table, '001', 'batch_merge', entity) + self.tc.merge_entity(self.table_name, '001', 'batch_merge', entity) self.tc.commit_batch() - entity = self.tc.get_entity(self.test_table, '001', 'batch_merge') + entity = self.tc.get_entity(self.table_name, '001', 'batch_merge') - #Assert + # Assert self.assertEqual('value1', entity.test2) self.assertEqual(1234567890, entity.test4) def test_batch_insert_replace(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_insert_replace' @@ -499,18 +858,21 @@ def test_batch_insert_replace(self): entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() self.tc.begin_batch() - self.tc.insert_or_replace_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.insert_or_replace_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) self.tc.commit_batch() - entity = self.tc.get_entity(self.test_table, '001', 'batch_insert_replace') + entity = self.tc.get_entity(self.table_name, '001', 'batch_insert_replace') - #Assert + # Assert self.assertIsNotNone(entity) self.assertEqual('value', entity.test2) self.assertEqual(1234567890, entity.test4) def test_batch_insert_merge(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_insert_merge' @@ -520,18 +882,21 @@ def test_batch_insert_merge(self): entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() self.tc.begin_batch() - self.tc.insert_or_merge_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.insert_or_merge_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) self.tc.commit_batch() - entity = self.tc.get_entity(self.test_table, '001', 'batch_insert_merge') + entity = self.tc.get_entity(self.table_name, '001', 'batch_insert_merge') - #Assert + # Assert self.assertIsNotNone(entity) self.assertEqual('value', entity.test2) self.assertEqual(1234567890, entity.test4) def test_batch_delete(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '001' entity.RowKey = 'batch_delete' @@ -540,16 +905,19 @@ def test_batch_delete(self): entity.test3 = 3 entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) - entity = self.tc.get_entity(self.test_table, '001', 'batch_delete') + entity = self.tc.get_entity(self.table_name, '001', 'batch_delete') #self.assertEqual(3, entity.test3) self.tc.begin_batch() - self.tc.delete_entity(self.test_table, '001', 'batch_delete') + self.tc.delete_entity(self.table_name, '001', 'batch_delete') self.tc.commit_batch() def test_batch_inserts(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = 'batch_inserts' entity.test = EntityProperty('Edm.Boolean', 'true') @@ -560,17 +928,20 @@ def test_batch_inserts(self): self.tc.begin_batch() for i in range(100): entity.RowKey = str(i) - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) self.tc.commit_batch() - entities = self.tc.query_entities(self.test_table, "PartitionKey eq 'batch_inserts'", '') + entities = self.tc.query_entities(self.table_name, "PartitionKey eq 'batch_inserts'", '') - #Assert + # Assert self.assertIsNotNone(entities); self.assertEqual(100, len(entities)) def test_batch_all_operations_together(self): - #Act + # Arrange + self._create_table(self.table_name) + + # Act entity = Entity() entity.PartitionKey = '003' entity.RowKey = 'batch_all_operations_together-1' @@ -579,79 +950,96 @@ def test_batch_all_operations_together(self): entity.test3 = 3 entity.test4 = EntityProperty('Edm.Int64', '1234567890') entity.test5 = datetime.utcnow() - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) entity.RowKey = 'batch_all_operations_together-2' - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) entity.RowKey = 'batch_all_operations_together-3' - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) entity.RowKey = 'batch_all_operations_together-4' - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) self.tc.begin_batch() entity.RowKey = 'batch_all_operations_together' - self.tc.insert_entity(self.test_table, entity) + self.tc.insert_entity(self.table_name, entity) entity.RowKey = 'batch_all_operations_together-1' - self.tc.delete_entity(self.test_table, entity.PartitionKey, entity.RowKey) + self.tc.delete_entity(self.table_name, entity.PartitionKey, entity.RowKey) entity.RowKey = 'batch_all_operations_together-2' entity.test3 = 10 - self.tc.update_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.update_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) entity.RowKey = 'batch_all_operations_together-3' entity.test3 = 100 - self.tc.merge_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.merge_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) entity.RowKey = 'batch_all_operations_together-4' entity.test3 = 10 - self.tc.insert_or_replace_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.insert_or_replace_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) entity.RowKey = 'batch_all_operations_together-5' - self.tc.insert_or_merge_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) + self.tc.insert_or_merge_entity(self.table_name, entity.PartitionKey, entity.RowKey, entity) self.tc.commit_batch() - #Assert - entities = self.tc.query_entities(self.test_table, "PartitionKey eq '003'", '') + # Assert + entities = self.tc.query_entities(self.table_name, "PartitionKey eq '003'", '') self.assertEqual(5, len(entities)) - def test_batch_negative(self): - #Act - entity = Entity() - entity.PartitionKey = '001' - entity.RowKey = 'batch_negative_1' - entity.test = 1 - - self.tc.insert_entity(self.test_table, entity) - entity.test = 2 - entity.RowKey = 'batch_negative_2' - self.tc.insert_entity(self.test_table, entity) - entity.test = 3 - entity.RowKey = 'batch_negative_3' - self.tc.insert_entity(self.test_table, entity) - entity.test = -2 - self.tc.update_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) - - try: + def test_batch_same_row_operations_fail(self): + # Arrange + self._create_table(self.table_name) + entity = self._create_default_entity_dict('001', 'batch_negative_1') + self.tc.insert_entity(self.table_name, entity) + + # Act + with self.assertRaises(WindowsAzureError): self.tc.begin_batch() - entity.RowKey = 'batch_negative_1' - self.tc.update_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) - self.tc.merge_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) - self.fail('Should raise WindowsAzueError exception') - self.tc.commit_batch() - except: - self.tc.cancel_batch() - pass - - try: + entity = self._create_updated_entity_dict('001', 'batch_negative_1') + self.tc.update_entity(self.table_name, entity['PartitionKey'], entity['RowKey'], entity) + + entity = self._create_default_entity_dict('001', 'batch_negative_1') + self.tc.merge_entity(self.table_name, entity['PartitionKey'], entity['RowKey'], entity) + + self.tc.cancel_batch() + + # Assert + + def test_batch_different_partition_operations_fail(self): + # Arrange + self._create_table(self.table_name) + entity = self._create_default_entity_dict('001', 'batch_negative_1') + self.tc.insert_entity(self.table_name, entity) + + # Act + with self.assertRaises(WindowsAzureError): self.tc.begin_batch() - entity.PartitionKey = '001' - entity.RowKey = 'batch_negative_1' - self.tc.update_entity(self.test_table, entity.PartitionKey, entity.RowKey, entity) - entity.PartitionKey = '002' - entity.RowKey = 'batch_negative_1' - self.tc.insert_entity(self.test_table, entity) - self.fail('Should raise WindowsAzueError exception') - self.tc.commit_batch() - except: - self.tc.cancel_batch() - pass - + + entity = self._create_updated_entity_dict('001', 'batch_negative_1') + self.tc.update_entity(self.table_name, entity['PartitionKey'], entity['RowKey'], entity) + + entity = self._create_default_entity_dict('002', 'batch_negative_1') + self.tc.insert_entity(self.table_name, entity) + + self.tc.cancel_batch() + + # Assert + + def test_batch_different_table_operations_fail(self): + # Arrange + other_table_name = self.table_name + 'other' + self.additional_table_names = [other_table_name] + self._create_table(self.table_name) + self._create_table(other_table_name) + + # Act + with self.assertRaises(WindowsAzureError): + self.tc.begin_batch() + + entity = self._create_default_entity_dict('001', 'batch_negative_1') + self.tc.insert_entity(self.table_name, entity) + + entity = self._create_default_entity_dict('001', 'batch_negative_2') + self.tc.insert_entity(other_table_name, entity) + + self.tc.cancel_batch() + + # Assert #------------------------------------------------------------------------------ if __name__ == '__main__': diff --git a/test/azuretest/util.py b/test/azuretest/util.py index 5a803bd297cc..6ea3461d7c0d 100644 --- a/test/azuretest/util.py +++ b/test/azuretest/util.py @@ -14,6 +14,7 @@ import json import os import time +import unittest from exceptions import EnvironmentError STATUS_OK = 200 @@ -60,9 +61,6 @@ def getStorageServicesKey(self): def getStorageServicesName(self): return self.ns[u'storageservicesname'] - def getHostServiceID(self): - return self.ns[u'hostserviceid'] - credentials = Credentials() def getUniqueTestRunID(): @@ -83,7 +81,8 @@ def getUniqueTestRunID(): for bad in ["-", "_", " ", "."]: ret_val = ret_val.replace(bad, "") ret_val = ret_val.lower().strip() - return ret_val + #only return the first 20 characters so the lenghth of queue, table name will be less than 64. It may not be unique but doesn't really matter for the tests. + return ret_val[:20] def getUniqueNameBasedOnCurrentTime(base_name): ''' @@ -96,3 +95,18 @@ def getUniqueNameBasedOnCurrentTime(base_name): cur_time = cur_time.replace(bad, "") cur_time = cur_time.lower().strip() return base_name + cur_time + +class AzureTestCase(unittest.TestCase): + def assertNamedItemInContainer(self, container, item_name, msg=None): + for item in container: + if item.name == item_name: + return + + standardMsg = '%s not found in %s' % (repr(item_name), repr(container)) + self.fail(self._formatMessage(msg, standardMsg)) + + def assertNamedItemNotInContainer(self, container, item_name, msg=None): + for item in container: + if item.name == item_name: + standardMsg = '%s unexpectedly found in %s' % (repr(item_name), repr(container)) + self.fail(self._formatMessage(msg, standardMsg)) From e6621f005cc7aa82265ebf6da62b98979b011009 Mon Sep 17 00:00:00 2001 From: unknown <weidongh@WEIDONGH-MAIN.redmond.corp.microsoft.com> Date: Thu, 23 Aug 2012 11:13:23 -0700 Subject: [PATCH 2/4] Fixed the encoding issue. --- src/azure/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/azure/__init__.py b/src/azure/__init__.py index bb0f4ad116c8..e23bd9069fc3 100644 --- a/src/azure/__init__.py +++ b/src/azure/__init__.py @@ -276,7 +276,7 @@ def _convert_response_to_feeds(response, convert_func): xml_entries = _get_children_from_path(xmldoc, 'entry') #in some cases, response contains only entry but no feed for xml_entry in xml_entries: new_node = _clone_node_with_namespaces(xml_entry, xmldoc) - feeds.append(convert_func(new_node.toxml())) + feeds.append(convert_func(new_node.toxml('utf-8'))) return feeds @@ -286,7 +286,7 @@ def _validate_not_none(param_name, param): def _fill_list_of(xmldoc, element_type): xmlelements = _get_child_nodes(xmldoc, element_type.__name__) - return [_parse_response_body(xmlelement.toxml(), element_type) for xmlelement in xmlelements] + return [_parse_response_body(xmlelement.toxml('utf-8'), element_type) for xmlelement in xmlelements] def _fill_dict(xmldoc, element_name): xmlelements = _get_child_nodes(xmldoc, element_name) @@ -312,7 +312,7 @@ def _fill_instance_child(xmldoc, element_name, return_type): def _fill_instance_element(element, return_type): """Converts a DOM element into the specified object""" - return _parse_response_body(element.toxml(), return_type) + return _parse_response_body(element.toxml('utf-8'), return_type) def _fill_data_minidom(xmldoc, element_name, data_member): From 02fb04cc3e4acd8a9cbac9a09c1c17ec73ad7685 Mon Sep 17 00:00:00 2001 From: unknown <weidongh@WEIDONGH-MAIN.redmond.corp.microsoft.com> Date: Wed, 29 Aug 2012 10:22:48 -0700 Subject: [PATCH 3/4] fix github issue #57. issue link: https://github.com/WindowsAzure/azure-sdk-for-python/issues/57 --- src/azure/__init__.pyc | Bin 0 -> 23665 bytes src/azure/http/__init__.pyc | Bin 0 -> 2637 bytes src/azure/http/batchclient.pyc | Bin 0 -> 9564 bytes src/azure/http/httpclient.pyc | Bin 0 -> 4116 bytes src/azure/http/winhttp.pyc | Bin 0 -> 14924 bytes src/azure/servicebus/__init__.pyc | Bin 0 -> 27765 bytes src/azure/servicebus/servicebusservice.pyc | Bin 0 -> 29634 bytes src/azure/storage/__init__.py | 3 +++ src/azure/storage/__init__.pyc | Bin 0 -> 35386 bytes src/azure/storage/blobservice.pyc | Bin 0 -> 35346 bytes src/azure/storage/cloudstorageaccount.pyc | Bin 0 -> 1896 bytes src/azure/storage/queueservice.pyc | Bin 0 -> 15162 bytes src/azure/storage/sharedaccesssignature.pyc | Bin 0 -> 7623 bytes src/azure/storage/storageclient.pyc | Bin 0 -> 3957 bytes src/azure/storage/tableservice.pyc | Bin 0 -> 16414 bytes test/azuretest/__init__.pyc | Bin 0 -> 169 bytes test/azuretest/test_blobservice.pyc | Bin 0 -> 43487 bytes test/azuretest/test_cloudstorageaccount.pyc | Bin 0 -> 2636 bytes test/azuretest/test_queueservice.pyc | Bin 0 -> 14070 bytes test/azuretest/test_servicebusservice.pyc | Bin 0 -> 35946 bytes test/azuretest/test_sharedaccesssignature.pyc | Bin 0 -> 5099 bytes test/azuretest/test_tableservice.py | 15 ++++++++++++--- test/azuretest/test_tableservice.pyc | Bin 0 -> 35036 bytes test/azuretest/util.pyc | Bin 0 -> 4928 bytes 24 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/azure/__init__.pyc create mode 100644 src/azure/http/__init__.pyc create mode 100644 src/azure/http/batchclient.pyc create mode 100644 src/azure/http/httpclient.pyc create mode 100644 src/azure/http/winhttp.pyc create mode 100644 src/azure/servicebus/__init__.pyc create mode 100644 src/azure/servicebus/servicebusservice.pyc create mode 100644 src/azure/storage/__init__.pyc create mode 100644 src/azure/storage/blobservice.pyc create mode 100644 src/azure/storage/cloudstorageaccount.pyc create mode 100644 src/azure/storage/queueservice.pyc create mode 100644 src/azure/storage/sharedaccesssignature.pyc create mode 100644 src/azure/storage/storageclient.pyc create mode 100644 src/azure/storage/tableservice.pyc create mode 100644 test/azuretest/__init__.pyc create mode 100644 test/azuretest/test_blobservice.pyc create mode 100644 test/azuretest/test_cloudstorageaccount.pyc create mode 100644 test/azuretest/test_queueservice.pyc create mode 100644 test/azuretest/test_servicebusservice.pyc create mode 100644 test/azuretest/test_sharedaccesssignature.pyc create mode 100644 test/azuretest/test_tableservice.pyc create mode 100644 test/azuretest/util.pyc diff --git a/src/azure/__init__.pyc b/src/azure/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1c41c3bd8d3d4c66a46380478180853decd495d GIT binary patch literal 23665 zcmdUXZERdudfu5KMTxY&ELoCiudQp^vM5^`O0p$;wG?fBN?egc`VJ{tv!ZW?b1%t} zhBM^7cSLg6N;b9IMUh?P6Zw&C(M7uGCTWl$MS!-O0!5QHY0)f-{AdgGN1FsicKcnR z3lwOJw$JmNduK);ZoI~h7nSB7o_p>&=brO^zwbHccKx>leY@f1`Lap=b>Z*ZxS||# zK7JWfHKu6uSyRoJjf^Q~Ooq?8Of_pZx=gXl-lJ}}DR!sr_L$<HG~Z*2J<4~R>Rz+4 z&lG#n1~vMOk7rL9f3GR-H$EO5Fn+Ho9yETRDIPNZ6Q+3B`1?)qN#h?d#UsW)Xo^RT zf5;S{GX7yxJZAhSP4T$#kC@^K;~zD}r;Y!VDfS!xm?=JE{Ntwhtnp8n;%AKiv?)Gk z{C-n>-uTa$;z{E_Yl@EXKVyn782>p_95DX#rud@qPnzOO#&=Bdl<{9M!OLbfWBdX0 zp)nsAbE|mT_%E7ZP^B+5OV1eplnKtL^yOyhE5<*amJT*cUo}3ed&YmIS#;L;ubSYT znxAc!=8S)iH^m|2=ae~b{2^s782`L77ma^Gnb(YeQJL3`|C%zFjQ_eamrVuu!0lyo z*?+_MZ{p8qjeiAyK4<)4{JCoU5p%hSXK$&+o5p`z8B`lp=86eWcg%bUDi}8YxC+s1 zLYWccPb%}4@u!q|+xXX%88!ZOWyXv@t<1RbKd;P$@oy+IY5W;wri?$U%r)cZmAP*G zIc27eKd;Q^jsK1^H;nHpGh_UM31$Vo1(pa=dE+nY@tpB*Dl>2VC1u_*{=3S!#=oUZ z!T3dG7L5M|Wfo0v)A+YF;U(plm48?H_msayHYp7L82G00fAB9qm_at)hr}<%L0s7g zY{_1fY*cC$zrJA$dQcEV<<e#l9Y;2|QmwD#%JneFZC7f3eLKq4f;c+CM_Y}c5q!k6 zxU^FJsAo|S-m8>@l}7YHpNG)rg^O?G&g1`uD;Lh=U-W3%g~ya#j1Qx&AKZǛ}( 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 literal 0 HcmV?d00001 diff --git a/src/azure/http/__init__.pyc b/src/azure/http/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50af404e2fc5f5b4dc55fa53a05c28ad20c9630c GIT binary patch literal 2637 zcmc&$(T*E66m>G&ba!bbibUZF`7xEUp$LhG6;!|ywY+3klk|aA#AtTL$qXdp!S)b} z`Ubzi_wWP!4L`s+_GGfGiUgImB=XJm9sBy;JLmW&`t$zr@AW4anP@)|em}>sUqj?V zTtfDQ>WO7f<bCn05WfiV&1GNYkx-Gh9(2|Nk>3&dp~wfF3G=&RHavp2@(&0{?b&>O zF)>D)?${ozUt-wzAQX<pX^=RkM^~4Th-bq-7kmUE=|E0?%2e%2UCC{sDruChb!C;b zE_IESna-7b@|pbj@nf0Y!7dKEIK!|*h?jlwQiudf&nu9TS71NzO2qTqgTLigqf)1= zOl76EJ_?_P+?KA8uE5!~%F1P_@-~W*+$d|)l^V%o*?zh}3zg=|z+08eE1kcX4i9jK zy9?3oas%igA9oCuTf;7Q*iN}|$kZG+TeV)sOfqIg<A{QGrW=Hfp`D#Bo?9Hf*s3zu z)v8#0rL$(EDrXl@OZTj~TBJWWMxEIF`;(<MC-n<g=xSk279K1L=juh0lvU}HWQ@m* zXE%Qrx}`xxM?HQ+Vqr;@Zd8)^bdqGF^JdK{lTMOcXGsz>>3zUnyQQdE3-JzyWswHG zLEqhjLU_e3oL&Q>4^aD9)p%JfD8SOa@ukrlyzYQsqkd?Vbz>>N2$tQEvPdn_<Po#f z>$TpN)k>z$newUu{!WkmqX3N40K99U*Gq5Oo$A-NfC`J-Nq}UF!tlf>*O&_MZLK4T zP*S-rt&?y&<jWh$AJcWC9?3c_jrHCM!r*`!SCR~W3*a9p7?{^_@s$)5pdjHK__2q# z2TdEOM}NnKn1t9bjNjsvZ*~u>+d|Y1yaE3n{Vo1uVmu}ZVqSu866U-+KEMbtKLpHK zkpOcK!q-6gZ#PihqB_2bYS~(FAy*bSvO9RZ8ri%gJ*En6UBDDIN#seV>7`PcgWBR6 z7gN52HFYj(&<3up9a=C446;pD5YSI2^O3wbpHV)CP%ayf$B(?jI(0>G*O*c+O}gT> z7(zm+3~=s$fPRCJ953+wt^cps(lIV5flfEP{8y%htHfuJkt-ZsvpdBEjVv^~RzZUe zmcCelez<+3oq{$V9-(=Yd-OAP5MoGld#drB`0j)fpy=Ml(m68E7w8)47>uXno1q`m zwPd?!>DRTO|B-_C5zdDU%y*ijL4O*G;Vb$+9*~VmJeggbPiK>4dY+t}Pv?{A-2Y?h t{_FUT<qNN`z5@?pQah&eeQmvVOZS`a^Ph&c{p4-t!vqHXhxZ;n_zRjnnu-7b literal 0 HcmV?d00001 diff --git a/src/azure/http/batchclient.pyc b/src/azure/http/batchclient.pyc new file mode 100644 index 0000000000000000000000000000000000000000..516d7f700669cafb454232ad6f46dc418eef8f09 GIT binary patch literal 9564 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 literal 0 HcmV?d00001 diff --git a/src/azure/http/httpclient.pyc b/src/azure/http/httpclient.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9fd35ab5ade6deda87f2120ff2f7a558b404374 GIT binary patch literal 4116 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 O!w&p^`+X1|hCc$A1lj5U literal 0 HcmV?d00001 diff --git a/src/azure/http/winhttp.pyc b/src/azure/http/winhttp.pyc new file mode 100644 index 0000000000000000000000000000000000000000..609090f4b356db2ebaf9b73ef3e56529bacc4ba5 GIT binary patch literal 14924 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 literal 0 HcmV?d00001 diff --git a/src/azure/servicebus/__init__.pyc b/src/azure/servicebus/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ebeadaaa8bf8e1b279bcb6500a8cebd2b4539b4 GIT binary patch literal 27765 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 Y&xY(fkUoje$?U=G{n`E52eSkJ555H5;Q#;t literal 0 HcmV?d00001 diff --git a/src/azure/servicebus/servicebusservice.pyc b/src/azure/servicebus/servicebusservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8aaf72247c134803dce22de5602b28cd7fa6232 GIT binary patch literal 29634 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 a(JNdk`S|K+3I89M0HC;8K2ZAZ&i?~jJM$+1 literal 0 HcmV?d00001 diff --git a/src/azure/storage/__init__.py b/src/azure/storage/__init__.py index 85767d895789..73eccc93b2f2 100644 --- a/src/azure/storage/__init__.py +++ b/src/azure/storage/__init__.py @@ -564,6 +564,9 @@ def convert_entity_to_xml(source): properties_str += ''.join([' m:type="', mtype, '"']) properties_str += ''.join(['>', xml_escape(value), '</d:', name, '>']) + if isinstance(properties_str, unicode): + properties_str = properties_str.encode(encoding='utf-8') + #generate the entity_body entity_body = entity_body.format(properties=properties_str) xmlstr = _create_entry(entity_body) diff --git a/src/azure/storage/__init__.pyc b/src/azure/storage/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab3450e21ce4f282a5dfc253f11b855df29db9c GIT binary patch literal 35386 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 P@a{#F)}c3=bs7I3^ij8Y literal 0 HcmV?d00001 diff --git a/src/azure/storage/blobservice.pyc b/src/azure/storage/blobservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ff8b90c73ddaf1103611b90c67e121cb297cc79 GIT binary patch literal 35346 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 literal 0 HcmV?d00001 diff --git a/src/azure/storage/cloudstorageaccount.pyc b/src/azure/storage/cloudstorageaccount.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9377bae33e3a51de258585089089fdb1c0071bd1 GIT binary patch literal 1896 zcmd5+O>fgc5FOk3AO%z;5CVk6ic=14j;KNiL5oxlC@Kydh%6arciXtNy}`R~71Ue% z`}i~b0GJuuq^O)gYH_@i+41c9y`47>zTaMZw|KTEp}7M5e}%*DqEUEzkOAZ#Og->u z?nCB79>6rH=K*9L$h$D@;=BW@52_320A~Q7rae$Sm<(^=Ug;0Kh8}wECYtTc%qF@# zPNlAcw=no2nPvJ?^nInPHtOzT+D>LFHF2g)4)kj&O;xzx@NZ*|-9n>*U?b|OPpIhj z;M|8P;`9k5f>r@Lh_u5_AHvD7M>~8&vsaqqRB0;`v7bnM<x=dMQpi##E-em(n`<#c zDjVVpq1+Hjp@btE!q)7pSQB`iq;8IzNR#KL5J`<%6iKdmNgFuQ%aITtajg|HDTKyl zx)hbw{3_n61wuG5MVi98vXYK7lEtDli!x2zF9brRrIs#Rj%0w8X!tmGaM=53PCYmU zh|%%c;S-y1RmMZgbX1!LVN8&@f^7gH4{1-=L1T5cACePx(F}3a#(qX`=Xu1;q7$7e zQyk2rH%3;uE}V^aQ}?!-MakEy)SFfvZQ?O+E|zX?ipZ9-eh}HZ=#eA^G?NC$2$M-? zahw*Zi{l6ATS5Zfz>}mq8U&Pyla3rx1~_E;hd!M7C{;=tGoKJWxWI*;gd~isW<^k0 za5^Tb#f`8YW7tx8;P2=$pH-=@jo!T#J#L(q-;;mjM@RENl<xvR{zkO?p04<f`3u>| zml`aN-5NfQ<J_n!qiLU~%1HF7Xk%08kb)tJJ{*vtB`a~VcO`unQdf~mEg|RyJ%7D3 z2nNBp216*_Lp0pnqo!>~q~%7++-mO8r4-gfn?nNqLk^#5o5M9HG}mzqT)!7}#a^x> M2uoj!J0AZ0pUe5^GXMYp literal 0 HcmV?d00001 diff --git a/src/azure/storage/queueservice.pyc b/src/azure/storage/queueservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bc7a6ae60aa61ba5be04baf39a26295a26968b0 GIT binary patch literal 15162 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 literal 0 HcmV?d00001 diff --git a/src/azure/storage/sharedaccesssignature.pyc b/src/azure/storage/sharedaccesssignature.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c1965233dc823238544c4e0278ac3f63b899f9f GIT binary patch literal 7623 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 literal 0 HcmV?d00001 diff --git a/src/azure/storage/storageclient.pyc b/src/azure/storage/storageclient.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da3edfb9ffdba8c6c538a28a27519d84c261fd7c GIT binary patch literal 3957 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 JvFzaEeGja!tylm6 literal 0 HcmV?d00001 diff --git a/src/azure/storage/tableservice.pyc b/src/azure/storage/tableservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eac7c6aa32c1bd0d987b132acd343132bf424cca GIT binary patch literal 16414 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 literal 0 HcmV?d00001 diff --git a/test/azuretest/__init__.pyc b/test/azuretest/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f84691758bd5dcf0d6779520f1185e44197d759 GIT binary patch literal 169 zcmZSn%**9dU>1<f00oRd+5w1*S%5?e14FO|NW@PANHCxg#X&$ZXRDad;?$zznDW%j zl>EH(j2M^v<kH;KyprM=_skNH(xjNgs?wrV-QtvN-L(87-Ga)JjQqTqlGNf7hzyt& fAD@|*SrQ+w2bAUj8f%lApHiBWY6r5s7>F4Fo31Ku literal 0 HcmV?d00001 diff --git a/test/azuretest/test_blobservice.pyc b/test/azuretest/test_blobservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a137316b4a167a74f36d468ef69dc4bd12d3cb89 GIT binary patch literal 43487 zcmeHw3zQsJde-gf)@WulqZz$Mk|j%HTe8QGu{4q;d;MBTBiYv49?Lb7Wy^AUTV1VD zOFiAAt{O|)*xBSLC!2&M8(>-TfUsEtfs=$oP6&Yn2xpU=WeLmk06Dyt0O3HgkZ|BE z1Ws7K@BgcA-Kwr`N#3Z(dk!A;^{u+Ms&4)N_do7`A65MCV<W%3eE3w=ME@1>|0DPX zKa0f2zk+EPbDFsU(<qpw0dsD^6nI=TjiOm9nR6wxw8orUW0nTZxk0nE)|^{wmWIr^ zA+1+3jbXDiV$O}|G48ld@3_V^M$OWgIX7mO)|+$dwS3St#?85L<F7Tf33IVv{2}w5 z#@saKt#cbpZKLsr&6NSu{uxsnH<vfDpwL8n2F=3s2wGkLI{uq3AQv)uM6+v=eYF<0 z>(yX-4a>G6IePAlccQ#-`Ze$9izmuQ=jKi<ER<h9@m9Dcukf`q^QXfhl$?0=%qvGv zpEw>);NbX)H+Urr%kxKHJrRy)PU3#rgbgS-TW|WUYr)Y^th8$<+U-_*dH`p`bx2-1 zefpGFySh>f!f@0c2g|KyP@9*#9&5BNEY#ZX)~mJCsAZYP*F1(_@C?{jGv*v<W=J!z z3JheXNd7TXBIB4@WBih2293W)GHXdg77da1%nV1g2kSs|o>^!75y^}if1PB;j6W)w z^~N8Q3|O~bG84uhm&^v^Pe=yL+aQ@u#@{HJ&Bos(nJvcOESX8;Z;{Ma<4;OvoAI|w zX1npXN#-8oZ<ovt<KH8hoyOlGnR|`DQ!=}Zf3IYA8-JH%ri{N^GWQvON;3Bw|31k) zVEp?fv&Z-kNM^6`_ekbJ<L{NsL&kqlGSkL?NHPx_e_Aq+82@3(JZk($B=eZ@AC=6E z@gI}S<Hnzn%s%5kE}8wt-zS+_<L{Tu0prg~=AiKpNahLSAC$}?<3Ayp!^S@(nJ0~Z zSTau;|4GSw#Q0B1=4s=9L^979|7poQYy4*<^PKUYmCW<Te@-$VHU9IGIb!^eO6I8X zk4Wa2@sCPo&iKb9bKLlIk~v}g<C1y7_$MUuqVZpl%uB|9Q8Fiu|B_@rX8e<qdD-|M zlgul|e_1lG8vhl^%p3nz$-HL#dC8nI{%ewX-T0>@;~D>T$t)P(lgw%3FG%K$@lQ+U z4db7Y%vs~VA(=Oge^xSY8UIbmoHPDgl6l+s=OlC9cni~SLx`%BCdiSYmYBmYSU?g& z!4#-aE)P)QK$w^>GJn$yyk|_gWWqH(d>_JBH18G6<ol>JXx_sG1;ZL^&7zSE<jX)= zm2lsA5%o&7+FEIb<z{86Cb}R#aiw-+g=%BzMo58gHN#51S!?eNria-mstrde$Z@q@ z^J~qpUTFm3B+3_S;X>GIR~BoL>Imlf6l%E6qL*toLMo&S)o`O$IMb{{B~jgYE6tO~ z!`<#_-sxB+sQIro=T_QnJoa=Q_g;@WwypY7_uy2;_v>N3)vPqi>C#}jh~kj+2x^Us z(zdemUVM7Fyi)hWO{qIyz@z2%(>QG;3C<xm_w@NQL9HE}zgDaJt>)sT^T%7&l_fMU zIR9cjd}-yv`3e>AOyFOcx!7vYEZ+z(wVLNiV=a*!lkx@VT-=K~_i<DsD1useW_c$w zRMV!gv9NJqcwl5;ydc<#@iWI7_aXuBFN^&u05c#jj&BY`;8_sUFfUjLX``x*TBW(N ztPfgQuC+bdG%-72t<pZ;y4I9SJo2`0@9pt*AHpvnlT2YmUzJed33=7C$lTZ(z3pXz zJcXrT3TK;ZO`%X|7R;O1_eq7KIsVQbipq`6&IJXnef3e+M*1dxXMKtaX{to>C=OzH z{aT|I))FXrn^EEs*J4wJK!PbsRsSeOq(6#ZKmjs^Vqt5cXi5VU$ZbZhN}BO!)k^{q z5=~4u-Z_MBDTzar|Mn2`iu?BRrt__4O){t3E473QLYcl%AS8#%+4ddA$$;-|3ROae zuWw245ge$L;Qfgh9*C~RF%;-~a9>bRGVhln_`Fw=dIApKbv~p*gwCj5q2dsE^6tke z#mf+K%PT6)s&NAdb$Bu$#l#;JxCo)-P8569T)eLw`IWFD#BJAt<^EA~3eWGLX1UVz zshX-+L_v{$!5|V-7%S{Z2+Y?O*?b9^E(8XpVXg*9U|2PnF1#b?4KCa)6(V}CF)qEy zzIhnLNG+X$X(7$UqrP5V3ZzLQm(aN7My<IRUYcg>5{7ttcu0W-&e8U;?d`??Go0`q zWQEw8BscR&{r+))CNG}@%XoEp+vicmGT@O!Ia-8&J1T%=3Tn!B!L)ZrXK?r&IxtDG zV7vW%TwKZ&!_C0e@5IGxq?p_tG%z73`!sq|uoySR8956XdHqch6xE{QIZ$R=fmobc z^WAzIo&~MXrAknS&*70N9_x5ywj(iKr5@A*k9EB<B#Dwyzai)!TOMJ{Xrd!kBSIRP z>he-O2<pwna;3efhW|Kf2kftzfsGK7=vSObc*S>~W3697qRhC7j96;O#Irml9$s{6 z5T`(HA+nyjJVfCkbLNxlgtc-L77t4CQd~S}c{fbek4r`Mjqu>|x}+8G7o37oDUi0L z3&todJms*P-BFJ+<VkKnbF)l}Oh^%BG`Z;=Kq6huiq(&y7!`UtdhW#46}XljT~Ci^ z#p$dE<=WCp0~W~_&*cSFaShNDsMtSbh}!6e48XnoZlztXTxit9wGZe?nSo7(O~v6D z8^y80cKlT-F%$#RY7W2PlStSR5K#u#pQS7-1XQ}w4G^cNeJH6!2v9zuMiU;RX8<0r zrE3>6QBMt<a3pgINEl7{$_C8?XrMjKyf7|dE6<B)3Nt<0UGGUI!Z9i&VVfrk`6(XW zha{0>@598a2vcRg=tVR$lHf7r6u1PgC0w%F_BB*Zaf#Fy%NA?LxT~hxQQ1lTsl0nR z%{!4Mr8*yRQNS%KFhll(C{1*uFksaPOK-iadW?m&EbsCzss`+4n1L~9#BoSLC-Q$6 z#VMKs`In*X@Dvq>H6jckVsdINPQ`X8qA}2|G=4k2ZooBfC|2|KiMUwJTXMBnxb_dn z#cQnw6{Q(#&~+kRP?T{aV;R!|C`uGaQ_}_Oss5}66`p&~;mxN-QD)ekXw@RB<mu9^ z_)%ecB6M`wRt+16@bKHjMmeP~!CDjSL;|Ex_7aUri<;G%B;OpbphBhy3Q(942%!6? zav5nw$7qQXV?V;9^QDd=0jee_-MbOTMSTE7<M5v(cRLU;g$KDLbRrt9a%-7!j^Ia7 zM?1`=Ek!F)R!i+eafT`&0shg6Kwn46V~vJG9?{)t@_1~JsB-TJat^eP@({oN(B*MF z=vH)r)~Pqjt!BA)y&i;r7FR@6+ND&YG+FGtgo6x~AmkBoGJulU3cE9jnMG$tz~;I{ zVgxhfJA%h(=uJEybzs;KjUx;p7h!Bxf-%v-f&Ni8E3^sXuGPa!<w^q)0sn^5l&-HW z|7o;6;0u`2mckYYsf8lD0wSPqBGZ+~)^OgZPN+ll2(M72h*hX9<!#o+9B?qp21sW- z5os^6ms2dIBeJ^aB{A~RdkY$;A^i)ujivZR;r;~HC6oxo=aI=!oWulhi!rzX-2}&= zDl`F7Rh^3TIJ&IhRu6?dwXB~OFC_!@Dbx@$OQZ%t-~=k=O0^+2OCquw6QTZqwS@Am zHu{Hl>4`W#ynUszaAJAoLZe<qbE~x=NZS7eG&3Un4gh_NLY<Aj`-JBc*az)RbMIrQ zmPcamWfb&}zB71Q52UB*%h&ocF32aXHE7>~Dj7`I<G|8kA2Ga=ISk(_Yxko|G_>c! z8-Q2c%^HGrj8tx?j6~gGJvWGR=!M1IUP69edZE`^?S}S8FVz~2793Awo;V;_zSwF7 z><?d`Sqf$_WKo%sDgirF$vM=@<>nF8iU(H`@RfNVMhO$IFDpiD!BQW+ln2<*?ot#t z_%~2Z2Qx|!ir9=HRxMV7pr-iDvBsy6WcUkHEP)9yDDDVf#~45X@%?dw0WdHSorL#` z=IX=dEU&fhjPexDn<_bnt5OBA$nEjXhggU8frgmNY}9<cfV7UEk@2vMd67Uy10F`g zqQKjQ%EBKR;8K6`MTw=iC9)ytK+H0f5i9WpILhUp3~Ng#n{)99oCcT~IY4LKQMiG3 zk`Lfh`X|fuk%h~dmn}D~EBafg5_O(86~_?(qq9C)*pT=FmdihYs=c@zF~a&_DKoW3 zhCIb=IUJQLE=Mhk=_**pGAF!d)yu;Y4uer#5Git*O_FDr?Y+TsjCMF)oN&~mbEACU z%VIhrG4LHXnFELYW7!m2Lcz?kOs!kHcCmi_f1pmlJ|==wMfz>z*FA|zvwD}}duxvM zP{p8otbIXm{zE4mVw>?Y_zVeHsanQtk+dRSn}{sJnR>B`EU!fW9L4~35ZEMx9ekvU zN@;aYcFlW?=y<1)s1iRYVtS#{_TIrcM-4~^JMHg?qQ;nQq6HE~Eufj=y@?!;LzoJe zx0pN6gb#4kI3eQo7b}n8k=?OUZ&n*Ce$Bqq0Cb{`JtCy}U~yN3n@t=SqPnC;x5#+{ zXB0W$#?~k|U~@&AE19i}0+DjTT)$7Qp^l%7jkyH4BX{-cGpg!E^+)$qNWry@Q4s+S zk4H6`f<(s`T{pp)0!%Cmg60Ay7z3g*viyRWq~&?1@fz`IC>a@Yac(Hb=^N_9(Nes2 zd?lV^PlE<LEgFeE@Ocd9!z-5bf}~YReMlNGBk|VF$jO+rqpmFIL{l|u*TeEsrF{iM z{Q|=CyhL;sL6{gCQDJh4^@W4k%<+N#X)s1Fx}$Qbavj5@D~&Lap-O$fjfCbDt}_E8 zm_jgu2+~Ahb8$yOLAn(~<y3N8b5z`CaFMb*HM1Z(r7RjSJycxEN&#cAKuBG0({`p< z0K`C9rM*o(m*;IJ>d7mkq29-l+=hDz{WVSX=3qncQsFt;DsO>_pn@U%tQtDabNFd; zw<BIV@E~D$zAk;3%#E#8#*3t!*jNL{N|kSr7D)A{A66GqRS0Nb%H?AeUJ&V{{&H+W zLUbKKPQnUe351*^>?%y03CXt}RMXyUGmeF&;x<o`qEy$W<P1|<-Th-Ii12T{W7iv3 ze1l#zv_<Qt$H1qo;9t=kMz;(|XU{Bl<sk}IIP~7YzA!7&pg4f_-;Nu^SE=6y>yEow zElF_Ct4C}Nxc53vdLEM7kPvpj2%L<BNZ=w3Lk2FUSW~#2ksIn`4Q8y8$fScTvG;j| z430zwqm6sS$%{H(C^9rM((z(vJtZ>RIz)zjB@Mudgz)nDTxk%}thzMh6Qq|kyiQ{M ze`&~(25$+>PQWkoaMJW$ZnrR#Fsx(dMq*5?P)MwVRr)x2gOlDwEp}@t=CJo)HkL`q z)shX42=*jNFX_0FD;>5^Pj!21TLB#s#pY7pQrxG9Q$!~mb|ChG38DEq5|iu4*ifhT zr0CO1)Fr4dHfw&lF7uQx)-hAp>4*0>3_8g+u^*nsA*=~qd5w2Qz3(bcNG!}!^#)Gd zE>*9u*QnSayFgd>X%FevWajN-`hUa3_d+z-aUw}-HKkdGtb$kB!GLl-thGPssDa`Z zbPr1C&qfn-$d9{XA_cdrr3UQ4M<+ofHk9uxen07yvW`S4<x?C8E^N46q_SQLm;ynb z&Fw8Y?nd5Vlh`Kd%UEsTAdoog^T3Cd_zwT^v!vk&S`^3I@`jHpw?#=1MZNCqAb!LI z*TL3^h;%L?;m%N=IL^6>H8J=fCdwWJX>z(c(4{@c>^|?3z1yf=Kgs?o-s78y?2q3O z**TQ=m%31#`okKxZ^uE7%0S@trp$MY%AhGkGq8Jzp*;mN`k10C^7@lD#3vEBR74IT z;_fz1!fBbvE)N&PcAZRo33Z3lf{{2NY6JPEI<bSdbsQ0I6*STlXhJW!sVyysH_Dw( z(=U>Zal~bKU>htWEu{D<j1pK@j-g^NRzg*QeOSSU{yZ{pILe5~f>D~sx=^tPJTK8$ z0su7;uo>YjWwJgAJdDPGkk~*J(H(OGu)qtPA!|<*LF4ff0~SosEy0q52oOowH!dJd z+_PGjAqkkS$V1f|p(K4;?3IoY(|I7_>%OS{1N&!ZXJ+@$%+96{4@gwE?Tj*P#D&?A z#01V|u_%KTShhBXvS_NpatreoqIG0pr5$2MIM(c5U#_=r$VejkX)<@c)%5TJM&K%S zD$C2Yrr#Uf$@&R-a!~i)=RH;d)3;JeooN0N(L9Cb()tb;h6|(eH(Z#o$li|Na5Vmf z%4P_^Is5_|9&#Jp6exarS4Vin8e}&}BHb6YvgCp@9ZB?zSXsJ((zjlX;Gy*eJA9R1 zeZk)(C8^<T+>n~UYJ+dw7mVZ|6qlGeNw0xGku9=jK6ly#JN+{8NCs;|9_j$R9bunu zh3+6b+pKDu0;>!D{63Gq&EUzRowMr=l?5_|F%`D`ZIa)0BcpYpDJFai?y8XOHJ-tV zpmx5DjF~%%R%S0p23NetTs}}pGOEfGKHSHGBTU|4@<)(3j`{cTTz`i-pT#5Zh|oIc zuGtE8&g0iyy3-g&bf=Wtj?jZR=%jmgMv{YL%8}Afs3z**IL<i{3(|@zwm-u#vv^Ps zGUay<2S9*GB}6lkDWw#uIsAhCNR%p(0^QM}KshZRVV{l=bDrW%C`FL1hT=Se=iV`q zGI&~-&@38$Ar>r>C>)_I>jrv2HabfKrmXHQT$fl}BMD87E}~dhj%jU-onSSBjDJzS z9rQ8UEAia)68=+3JXfNIWF!U^xVeeUhOafby2%&Zh8(w}{Yb5kb0Wg@l%)~_4&5pV z<oW(OjB=GZVqR8fwrkZ|{ar-#`W!@_Vgnew>+yP9$VJWyF(tYb8xy_2x1mlJ33vyY zTXIt!%MZv<0%yKXzg$PO{wQ)X<5@V?Xe}<nis-b(HX>iDb3VgL(v|rW%pF1EObD=C z@IK1|{Q9GUtV!%aceRcowu5M`g!iYJz`0D0a<)u(0WV;c^G(~!luk)(__SA|n{7k` zmU>DTzs8Yis<(Nk6EEaDjFYl;fO;J#gOkl5tTd}N?}u1IDSAcu;QcY=J>JC8^CWlw zh&+X-3AlTR<v!AN2o+6f95i*7!daT0M4_cA0c>OZAB3z9i1}Crsim#=qdZ4idVh+^ z>J!l-wFePXNPRk?C{;y7QA#a;qAG>~3#BMi?fZhTkq=>KF`$Pk6h=Rqiz8UqEt4K~ zx=cI5%Ax_oX|w}6jTQiheOSZY53XL;k%N>uap&YEy<(}tzHcl#GL6a^ve#oBu4nUf z79RW1>&#{B?*tPSNtl)lX$dxb!qm)I(CFyS2aKY~1nQ||&NWTRtoHy)M62=efXs}N z0i(JEUMOL*It;yA^ouK8Hnp!+4Qt^H_5`R^mZs(|RoYN9&z(8_!pu|CjCSZQ0^*2m z;Nc!Vfz6Pqlzfac%QtUIpZ2p86DoaGnh4IT;w}T>jb&$32sq*BdvNmyLO}2TDsp|E z<jdLWq7RbSe1TxyiSq{AiwqWa7Iw-INj$Z80<){~ri*?F7m(kY{viTby%`D3z#Ga3 zHvq{l4MYPiNW}?7fot5*fgXG#nWz#&QIE58OgaEax0I}^L<qFU2PBxnq6@Q@p%tC6 zM{g?+UEYtgfY!r_Bg*7Fs#*1jeuB9_hopZNf{tAV5vt3UW%}^jL<hyhq67F~zi1M; zs8aISdaKrc2M2veg+&aMRaeA7`tT3h=+-lm6P49V+2M8z;u~}*F7GEn1<_gFUqH@c zrE<{wi#S%8P}g*a$rMXJbXZ9*5fCM&SV<;oHi(x=wBErB5TkQ5ogR=y%%Qtw2rVk4 z50%y<w(QOj1JfIuS8$)9YecveQhG<%h9)S|voccQ=%ilQq6ncJi=7fntj9WA{<g8_ z{WO7eN2pum73Z1cO&|UV6j(rG=5VYMg9H6jS&y&{cG*KN44wJH-_~K@#K!F^+*h0w zEk+C1smUI=Te!3c(r71H4Ilxe$cWXWaVr#T2a$`LWE{-Fj(TNurLYTNavy~hPs>)D zv9;6MBiY)?>73f@w07dxX>FdiwFQNAc{(-VpCNwewRxXIBAudWiGgg46*Mc$!KGFh z)M-8H_!*B})zJ|!ESmU!KMOKW+8EBo*Gr^94Qql}E}N2wLKGHmg}Nq-eU11+CrC*| z_u1w?$QI@SI9`SkH#7L-1n)hlo~YBw;tl|p)7<sXLYI!m9Dc#ucMM$&&2c6#c5@xX zOkNDt4Php4snF5i0Kmk+M)iRN*2hYmbp2aE9KC|EE)ds^hbRh)xAA<?@-()U<>cW+ zK_*woj<ef4<Yhu{ru~lO89W``EVX402oe=RqVSTox55rX56H{Tld^>wr|8Q5Z`doS z!7X{|FU`udWnFsIy5M~rr&LH-sOw6rSd#R!JkNlV)7xPU*_}Aoaril2@#9R=vXEVT zv<iUVi&pgnd_0-?C)0S}U)W!W@xB9VkG96^kEk{*-v0mxWasU4Mc@Z;Zh1~$I>vvO zG7$==%wk++0-~@^WC$L?C}aZt+x00KvI-s>8&7mW{|4JvRxEGKNB<@l$D)L(BJ&X` zI6HdusQ1^%0+Q|6v18sZ#s_nAa{|hP0zuW-zkou)sP{|EeVhr=C_%54X0^4nR1dL7 zml)nGI?0p_Iz{70`zBVeNKZQtrmL%xZHy=B7^`a=tK{s9{}Pd!=@=FEN4mLFC;u17 z?(JeUrDMMdbh5e~)X9(nU^|NUB>ETzqMND~+tI12H{>Iqr*odc(_Nks6;XpH4tYwt zvgUw7m-7ssj-HXV5>ZjcN^F88<jbTZW|T^mwZG2X$C-SN2_;nJkD@0_F|AYZSgb9( zdr$PrGGeHL*VRb;6<+c4OlWjgR~T<?F0dxBzTBvNg+fSgO5G#ZT+md|V7ULcVrhGy zCvfSViDeQ$fCUi0T!-39xKj^y>!h0dQ7Plk>XxNc%uWc1eX0KSr?%l~Vx8m7ZRu7= zo5KD+DNN596fO>8jit~KCzEmCJQ|XwZlD@oBkZf#UV3cU6ING*fre4&kkJ%&Cg(lr zJFqw4J<8-UBoaNH-GAVTTac0MQZn|Jf?L@}I`o!;c2n09SgV`5f`EIJe0)!i6V2fl z&>eFjh*1D`>7uoE86qNxpga4Z5|+55lL&G~)8kOpIwhbkh%M0xg0yoF-iSfagxc-I z{j{GsP<UTm6&%9$sCz9=22r5g=?IkaWh&LHD|IZ_W&cbzKfxa4L2U-p;x^!n6W5=r zEMot8QGzn3O<ZNEjKv%}+V(K6NaRH0^1Pe&_x7+<bOf6e56Xzwt2+cU{v=^pxvT8e z5Z~V;xn<DVWB8pg(WGw+UoAvrB7WSi^@Pa;TQe{Ty)^<^+k+_UE{#l-aNfGRKa2wx zFgH2c-*f1wOZP4cF<3noVZwT<01kre8rcF+0I1<?hYRNrSBOljpoAkbJ@lX_-sJ~h z$4R8+8aBZLkrv~@?qwhwmpTL92?9=|`l=%!Hs<#d0Xh+vn)U#=zb)QChkA_|5QX6( z<MO|k!XN`3O$(uLyfala@faK)-$lH28eUo^y<bOl8LAcOJcgkVPnPN{wG&0$Un!eH zt3(l76o{1B`E~5GJW4`Sb3oKEl#v(wyNbd)CviprgS<tIo7(LvAXoA&kC+3ZZ=>j) zhz>cNuV53U8ash`deRf;&N9aPN4TG|gS=I{C>~yad16PH(maXZ<S^MWf(BCaZ7c4M z8A58T!EX+~;Mb6RqYUZj`ddXO^R8g(9A<%+PH{>Pf{CfF1a>w|j&nvDp(A0oV=+s7 zoU9e?VJCC=FCFcSObY+^fK-WeIv^lH6A*~$r8r=|Rqfq+YbB6fK;#U!;10t6X+}0V zM`~k)*cKimR5qfrKn24}y8#%6?;{ze*0GS`=*8_qCV~chpI*w+@rAl`QPiQhH0?@r zu@;a|7x>|w=l0JW5=T&7q25Z>VcTk{Qrjy?i><sBw|%!NbXP2~Y^il?SMHen5I}gW zHwOlKG9eK)xFoXoIfBpIJ0_DzFCr^p-akj9(j1W;+7foz6}+6mvE(1}p5YbbwsKAG z7|rmQL3uzbJ$h{6WAg`VPhG1wF7CVb=C$LEx%uVA=bp>e(K+hb`#f&qOcCp^dY1kb z`z|?rmSHrWk0-U@mEUpnH99m__)_{h>!bGaQK%g=of^t*+L{6!?8rbu)gMKv9mIv9 zm55FpokdmXWF0BxonUC8gT<TGzB)mgZ)m;0gQ7&+ig%7KjQ1s+mQk!Wz88d!NG@yt zE-KwZ^Zq?n`7)FKGP#Q|%eyd&6gi&S_1Fc?>S$Clb`HPb3X(g}s7@Ew>6g-!s*(kp zFy}eNrnE=O2lrspo$+9`)aVReB5m8SO^?uBzP)onqRg1xs^`!HzUIhRVSD1Ba`4A$ z*V~wD50RtO;moxs36!3>d%B2bVnlm2=GxPfNt3C^I&~l`UWgFkG)0^vxR;Alc92!0 zaNQ~Pii#E{==}OP{?VOSRR2z&^B@nUAIk2g2>fbLtc%l>TDn1R?)ykAz5*k7-)Lti z*HKF7oAsG>f}SX6y4M_eyR{#jm}GHAW7E@sJGFvOC5ajimMhJAa7iL2u{n+_<at)| z%|AQQJiBgT6NqE2pHuiG&O4ECI>a8khW+!5AH~x|EOOee<5Q`w?Pnd`A#<*_Y5a)d zK}U2Bzkt)qR6L?}I`_rm5t-By7r$z}76#YVAc;oy{w?m}{U(xJUGnc(x>~yA2|T<v z(NaP}{Ky9}KcA~sEZttfZF{Pfh>mHsa{F}bt!7Bk)lf5bhsLf5Oc9eJ`%^g@hqlK$ z65pDkWH0Y9@fYk^0hu7q1GG`BQ<8JkGl^57^|+&)ej&-{I0IRl?^uW*B++ZW$PDLj zOQ2f%=1x=_D?UQ>n1^tql_m#EYQ9`*b&-6pPS#J)&T3Ga7A}ctd;gw?GQ(4}4C$kt z^HowXIr=Y0!TdZ~%fUsBopFb6XREop>YfO}R$ZlZB~wZYtV;O;=|$YzRn)8KsgQ!J zszPp$c$B<fC*3kmOG<@&6z}3H<2zI#q6YAcE^0t+T1I030ji6{I$ibCBq@IV8AD=& z(oS+bc#tEi|1=>X!`xK@k8ez>&fypQAd=f9A!i4o4~<VRXq4t~)MJMxPO0V2u&L_; zQVnY;l+RVSkii=#u-08QJKN*Fj+Woa=AYuMr@4u(K|q3dt!hk0T_q`u&h!0NiQ65` z%;EM|$n97$KiqZfsQ+RkQRQgY14_2ecSy_~rKf)q^Z=eF66CZfhnim{HC6ps*;z%! z{kx<QpD!Ll|ETp)S8AoK9ohP|gkrXrNxR429Dc!fA<5S^Pzi99^vfTtfxbt<Tr8SN z8wXChm8xv)keY`5qVBz{hmUR`9nC0IC=27=@E?Z=y10K-Kl}Cu`cEb<^5tf$t>qiK z;5yMFvWjpV^>u+fuVgiyqOh0eC7>dDgj5jT$>>1PT4`5nA`IlEOm2}U;GjQ-<UT%@ zF<;x_93dd@;wcHmQ7jD{DR5)8s7sl$#;0(<eCG0OI#%1op%>25p=UI~r<YEmbz##O zio_d_hlp|wwhV{S#dZvKf7K1gs<bB>EqD-gjFYfKD2kovPTR~*!0i&0CRO9-9khnQ z=44WiY}#dSDSM3r#KmKZQ{&}RT;k&1zeIUwa6Fgx5(^jFLor0yr`++g=elH)xdZ*v zWe?!t!U~DK3Lo&{FPX9=qa0CS{~q!t8jZ#`1?~snEqBN=(Pf`Q<^yp@cN{<jGP}2w z=saa)6mRJioIGYi0qXoYR=3(v#ODJtGsjo*gqca$GtE}-e}Nj_?<4teFf+VXuhwK2 zmf%4$Q>WBmWCOv^-D!r}{_4f9484Am#)+Kamr9<A$1dc9u%x*%PGo8lvul(aiLhCg zTz$YW62BnAqB5o{o+uQe3}6qcSEly*nee5ou)D6KuJl>GFEHV#LT2Wu%;T?nWJ3QK zLE?&3+4=oXI5aPA!VVq9!rFMB4yppeQiSM>$lQStF?O7@YD2Ue<30IhT~}@3I)phf zL2}3}y81I_VZ8JS42-!<!==3$ow<|UzrdNe`Zw`zvf{$~Tg=I1?q6o^ZzB=60!uQE z9Xp2Q7rCQY<gqMavt*S|JZbkt+=}z4kqu4vcSw;z^EB(FjmOCUcp@V<6Tny^Co(!- z0}(F>_!Kg?jQ}j(2A^QXoWVmHF5W=2U}_Q$Xbe%rJbqLmaxm(^iuxHK6ks)%Eyxo~ zSt(O#H0o%gnP$JrOFTb{p>QXPXJD!{SB-d6tR^A7A7u?XDaYVF;#a-$3M<eTlvTB| zfw{AygyyJvC6E<1c708BGI3tSd6b&+y#7h~y?h;Kia_+j{4$(2{B<%t?tOBt_e8wC zHr+(aaQY9o&2R}fbP;QvDRSo`4-i3WEr<j+F^C}47>?E`F&l}Gh-1eRi<M;2hb<Tt z5IGA2NdZT<dp*^F$8T&UD>$YJmkh{M*B4PQgDtPba~4kC8XgWJNx<T*<st6bpB}}7 zcu*chIzj#|#7aDgOBF;1Vyuz)1Kf615tB9&u~mSTh^+#&M+#E{qZm`@dID3)3ZoHz zSCE)e=p>l31zZ@*rG(U2qL@AarpR;wmhN<uR$PiHL%@7f0BcVdU}e>0ld$6O0Otk@ ztl;aVfR*w-x=*5pnSsUF9NC$4-xaLW_~%Wmx=>#r-Gib>sT!cp?z8R_cA@ImE-qfG zU%t{<YPOc^Q>Y{p$?UwqS=~rsWf?mJMVkigL#1T6NJg6I3~*gZ#_>y*H1tp0NoZ^Q zWvz?0{gdRv5DM9~9l;h0RRB%4JG3JG5>DKiNHabRdOK4yDPMki#gNcjT<Q+e(*9J@ z?Q3gKHBDKM`&zGVP%`C72{EO$-%DDOY^0?_Nt{;y=@K%xOUW)#7jbt}bFhFkDk$hI zU>zP;tcUni2ifWvv7_vz=_%jKrDG&7qH|y!r-;}%1q^5Wp>;UzT#%SC>Hg?lrctLq z#w_LUIL)HN!^7Y+WKA3;;BH9Kyc#0S0(~cdmCv3#R56`82;CZVdAh9pBCDa5V4%QV z_`ZpgjPOG;eO7&81WnaRP8=TqK+bZt50|_q<||c#T^thoWlOk02(E#Bvo3dZH<swm z4>6?Jd5j?iTzKn1u=*5EW+m7gMTvaqO*JN00?y1HI(W!geg1V`j30Ir0dwkK2P@R2 zO2bpdeFG{cp!E1jNynSo#KZ5zt)v%#{nAx$OyZ2{S{w23Hlu3)aJiFhiv4gGmj@J< zpCc?e)sr?5+86p)!MPn<xbaW4F#&2p`ehuf9!U8;qY~mO_@2=kbM-sok9$Mt6}Zu) z4K@&d6?`#3(s9xC92THO=X{z3s**o6RDr$GPODvElz8FN>l?-ur)Z=(`#)KZm<JqL zqA0qpe-PS^=H)_&-%0v8;wSc@BK*kLk|yI>9<hR>FBRMi>MR=bJq3fF{HHKxgFsoq ze3xvw`rTlexX3Uj&_HySpvDFa&&y=&tzZ`ZaYY*XaXdX}zFT9N_}>B6UhCAR7VD_Q zXNr~LGmFv$9G0XBCAnCe05b-Y2LC~{VYV%6OlMn$*cOI|)|y3~IG$<{E{PlD)QswD zxIwTu1TxK6<32EtXzPO?0^x9f5J+d>$(xBg$qA}ZkJn!pp`>WMK-%%mg@VxnzUwn2 z=ka&;^0lKvneq<(4q3pn(L4;H@m^Pto3mFRGH0V|xDz@XvP~lR#R^Hmx^4xd-3rDS z2ua^$JY5(3hxnp7uu0LAV1{&;2zz{4FS0F9H4MfGSLkD|zeFbD`1m`|<q~F(5@u%( zVWQW)`cC2O)gy(N9=O{Eeo&4tfm<(3Q{?BT$tRBiD%o9G_oN-dq0BzLRIB*--kiv9 zxPpBMBpxe8E6sYf<=4Uz>vHzk6f-=!)C%-F9hhuzspZSL<w|%-?s9ddhEI2}8Y4-P zxzO@&c+@810!0(fD0lT{C<aNM*RJ8x=n8%WS}JS%<Sr2FB_KivURq78Tp${CERsf` ziXd0bpGMBy?G?~`m!%u!i}eOn%@^^m!6SSu6pSw68Y?`6s1g4*;WvuiNO#M(ohMLZ z7jhEd-d|<=<DW>=R-7P`piiQ)kQj0c^0M<@6*Yvf!cnEbL*TQ=lUnc?bEtOLsX$&R z3CfkPk_coviSR*Q%*Ul4!WX;nd+v*AAe>EAMi2)&W=>Nr)BKen-fouA{)p6gA7SnY z6FTI&zMlq2=Sj|xfifbpkGcIZ0~3IIWa`~UHACHEP@Na~Rlfcd3e3P@VdJ)qg?k6a z21)~)2l(Z|@zQu{2hL35c={b)O-Ph=pRlsTc+2IbmcP=dmCGLOwMW0t<1TQz3gKbq z#2-1t+|x{+W%4`|PVw=MF_~lXB9oVxyuxIj$r&bZGvOCRybDYqKE}Jkq`{=gq{XDo zBw)fNecm-D*O}a4@(Cv2%H-Rad=HcFW%B(@et^lRnfxG=Kgr}rnEYubKgQ(GGx;ed zKf~lNGx@7b{sxm@Ve+d?evQc&nf!ew|B%T)X7W#%{4*xM!Q@{s`BzN-HIskC<SR`6 z1C!rk@*kP}XC}YR<ad~SmC1i)@_S7F8<Vdw`JYVwH<SOv<o_}$5O70GxQ(|r!el*@ z2_{>ZY-Mr}lLJUZvn0t~#-ulbM&5&8Ktc`<46hq5;a419GdwsvKD=poVt8zL>oEUY z7yXUl{Cb?<igb8*L-boGN2A018z0_=v&;<-kKp<-Tsb<t1$8$f-Hg9I!}s9ah}?-~ z6H;S+bVYm}ujchk$D<nSksCw(4RZY`TDTz+iX}|UFPEn!+(c2Rd}5_tdprnRZMfKv zWANcZP;0-70bdzyNtMdR`|?SO)am%*YNL)do*pd;SF;)qGHX0hFSLtdmE}TN>LbHF za!6T!d?kbtBbD{mm%?z_qZF&XW)6M;_DF+aW?26yTYVZwb67ek-0=<q6=I<Ih6yqx ocbDNIq<vO3%<~gyo@_8V0xLX?-$-F{V6-^-b)$d(X|(YF0HELcd;kCd literal 0 HcmV?d00001 diff --git a/test/azuretest/test_cloudstorageaccount.pyc b/test/azuretest/test_cloudstorageaccount.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf4707b2c9731adcf0e96b2addbe9eb42c42356f GIT binary patch literal 2636 zcmdT_+iuf95S_J?LPAQpUnF=BNbL)P2ZXo<1PCd>rU<AaSx&qyZXLUL*PtSJD(`#} zAH@g2IcpbMQ6!!UMA`Ao&R%Bb%*=*g=eu7vuRWbg^9%94jbTS13I0klk>!R{H5W)0 z$VwndC?=FuB}q#@iEN9!T4{-COVXB&K*}d#0$HD<LghFskWqgQ=ceEA>nm`M<nqv+ z#b=NeRWfo#8Lyc;(`ixVZrND(!!$0vi(#*V7?Bm+E4-JMD9?nvgEKAKMh3Qc+g9d8 zkNR!wobntF3Ihz=2XWq2n6n<xTpU9_B)=`e2ayOz3hWQDc<6edacyIi$1~%O?3&mx zTmB|@5|jIQ<rhy&lbGD4ac12atXng#@qJ{<x9QZ_A<sR%uj;Yca)*B2SckHO32U-d zx+9+03An-a@pEfRJAP-<q{!D^kM9-JYKFV*_(AF(R+Dl3zADY4O*R%+i*j*u%e^l0 zu|w=@jps<BDIu~oM2-7PSk6dV<DPGxBSSkxolri|0eFUNfZ@$SDA(~<jO<4x6a)DH zQHi1uQgAKV4r;kg894-h*AII*_9!}D(cMvahzRbmPek-#5Dx>w9Xk_EvSJb;8Vs;o zfHJm_+#@?I+_1=vJGN`?QEpwFV<C^ai=7QJHQ0XR{Wn#dX*#JH1kLQ$^j8y}zE^a> zd9<2)4;~-FQseh)6fQz%yCBk92<O!?b-o6UPW-44R$N^nC^R6`00*E@ElNHg2Ua`f z@-dJXfZ^Foj|C$z#8w1@d7(+_>hbZ@acYrR$1(dN&6DDty~A9*UzSCw8FpW9+J}(h zBu=6x@id`2_*h=Xt-p(9WM-RgE811sm$2G0DG*)6_Ma(<Q?RHh2^UW?vr`kAjZM#k zc#xK<YqDOmT>c={{}L|eX|wN9b&l_G>k5?nCHcS5opwR-rZUy<pm;{z{|Ut&w{HCk zMW4OWu~kR@F^wX}h7?7!BB_v@k*28GBs8B&O|10=ke}u6xdVFdG#?lm;!|oa=(Ib% zPPfx*T$sga9!0fNtR(-sE;X;FJGwK&WL>IUn)z*2o;uDr?(jWu8PXuO#^0vdrtvC@ c@btgqwzu;}jmb?mU+;cbb%S1b=2}mE2l=3XG5`Po literal 0 HcmV?d00001 diff --git a/test/azuretest/test_queueservice.pyc b/test/azuretest/test_queueservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c233e20d4100b8f1f89215fb29159371e7c8f73 GIT binary patch literal 14070 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 PxIIxCwP!vu?u7L}_V}WX literal 0 HcmV?d00001 diff --git a/test/azuretest/test_servicebusservice.pyc b/test/azuretest/test_servicebusservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2060d53f9d524f4e1e8db01b737b0d95ec0481c GIT binary patch literal 35946 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 Y9JOK%4#C_RDlRLnd(r6M>Scxh1F(!V3IG5A literal 0 HcmV?d00001 diff --git a/test/azuretest/test_sharedaccesssignature.pyc b/test/azuretest/test_sharedaccesssignature.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46196e09396421bfedc3f76e4b6642ca4477e89c GIT binary patch literal 5099 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 literal 0 HcmV?d00001 diff --git a/test/azuretest/test_tableservice.py b/test/azuretest/test_tableservice.py index 009304cd27d8..3c29c15e2c06 100644 --- a/test/azuretest/test_tableservice.py +++ b/test/azuretest/test_tableservice.py @@ -1,4 +1,4 @@ -#------------------------------------------------------------------------- +#------------------------------------------------------------------------- # Copyright 2011 Microsoft Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,7 +17,6 @@ from azure.storage import EntityProperty, Entity, StorageServiceProperties from azure import WindowsAzureError - from azuretest.util import (credentials, getUniqueTestRunID, STATUS_OK, @@ -1039,8 +1038,18 @@ def test_batch_different_table_operations_fail(self): self.tc.cancel_batch() + def test_unicode_xml_encoding(self): + ''' regression test for github issue #57''' + # Act + self._create_table(self.table_name) + self.tc.insert_entity(self.table_name, {'PartitionKey': 'test', 'RowKey': 'test1', 'Description': u'ꀕ'}) + self.tc.insert_entity(self.table_name, {'PartitionKey': 'test', 'RowKey': 'test2', 'Description': 'ꀕ'}) + resp = self.tc.query_entities(self.table_name, "PartitionKey eq 'test'") # Assert - + self.assertEquals(len(resp), 2) + self.assertEquals(resp[0].Description, u'ꀕ') + self.assertEquals(resp[1].Description, u'ꀕ') + #------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/test/azuretest/test_tableservice.pyc b/test/azuretest/test_tableservice.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2f212de0166c48c23552aa50925cccc8cc04a9e GIT binary patch literal 35036 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 X$BIvvhAG#BLjya$;rRK(;llp~snC(< literal 0 HcmV?d00001 diff --git a/test/azuretest/util.pyc b/test/azuretest/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de3cdda44bbf7a4bcaad9e7a1260ea5cd2841f55 GIT binary patch literal 4928 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 CTai@& literal 0 HcmV?d00001 From d3d3a0eceb16d2d81795d7fc88e6fb92c6c563a5 Mon Sep 17 00:00:00 2001 From: unknown <weidongh@WEIDONGH-MAIN.redmond.corp.microsoft.com> Date: Wed, 29 Aug 2012 10:34:55 -0700 Subject: [PATCH 4/4] fix github issue #57. issue link: https://github.com/WindowsAzure/azure-sdk-for-python/issues/57 --- src/azure/__init__.pyc | Bin 23665 -> 0 bytes src/azure/http/__init__.pyc | Bin 2637 -> 0 bytes src/azure/http/batchclient.pyc | Bin 9564 -> 0 bytes src/azure/http/httpclient.pyc | Bin 4116 -> 0 bytes src/azure/http/winhttp.pyc | Bin 14924 -> 0 bytes src/azure/servicebus/__init__.pyc | Bin 27765 -> 0 bytes src/azure/servicebus/servicebusservice.pyc | Bin 29634 -> 0 bytes src/azure/storage/__init__.pyc | Bin 35386 -> 0 bytes src/azure/storage/blobservice.pyc | Bin 35346 -> 0 bytes src/azure/storage/cloudstorageaccount.pyc | Bin 1896 -> 0 bytes src/azure/storage/queueservice.pyc | Bin 15162 -> 0 bytes src/azure/storage/sharedaccesssignature.pyc | Bin 7623 -> 0 bytes src/azure/storage/storageclient.pyc | Bin 3957 -> 0 bytes src/azure/storage/tableservice.pyc | Bin 16414 -> 0 bytes test/azuretest/__init__.pyc | Bin 169 -> 0 bytes test/azuretest/test_blobservice.pyc | Bin 43487 -> 0 bytes test/azuretest/test_cloudstorageaccount.pyc | Bin 2636 -> 0 bytes test/azuretest/test_queueservice.pyc | Bin 14070 -> 0 bytes test/azuretest/test_servicebusservice.pyc | Bin 35946 -> 0 bytes test/azuretest/test_sharedaccesssignature.pyc | Bin 5099 -> 0 bytes test/azuretest/test_tableservice.pyc | Bin 35036 -> 0 bytes test/azuretest/util.pyc | Bin 4928 -> 0 bytes 22 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/azure/__init__.pyc delete mode 100644 src/azure/http/__init__.pyc delete mode 100644 src/azure/http/batchclient.pyc delete mode 100644 src/azure/http/httpclient.pyc delete mode 100644 src/azure/http/winhttp.pyc delete mode 100644 src/azure/servicebus/__init__.pyc delete mode 100644 src/azure/servicebus/servicebusservice.pyc delete mode 100644 src/azure/storage/__init__.pyc delete mode 100644 src/azure/storage/blobservice.pyc delete mode 100644 src/azure/storage/cloudstorageaccount.pyc delete mode 100644 src/azure/storage/queueservice.pyc delete mode 100644 src/azure/storage/sharedaccesssignature.pyc delete mode 100644 src/azure/storage/storageclient.pyc delete mode 100644 src/azure/storage/tableservice.pyc delete mode 100644 test/azuretest/__init__.pyc delete mode 100644 test/azuretest/test_blobservice.pyc delete mode 100644 test/azuretest/test_cloudstorageaccount.pyc delete mode 100644 test/azuretest/test_queueservice.pyc delete mode 100644 test/azuretest/test_servicebusservice.pyc delete mode 100644 test/azuretest/test_sharedaccesssignature.pyc delete mode 100644 test/azuretest/test_tableservice.pyc delete mode 100644 test/azuretest/util.pyc diff --git a/src/azure/__init__.pyc b/src/azure/__init__.pyc deleted file mode 100644 index f1c41c3bd8d3d4c66a46380478180853decd495d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23665 zcmdUXZERdudfu5KMTxY&ELoCiudQp^vM5^`O0p$;wG?fBN?egc`VJ{tv!ZW?b1%t} zhBM^7cSLg6N;b9IMUh?P6Zw&C(M7uGCTWl$MS!-O0!5QHY0)f-{AdgGN1FsicKcnR z3lwOJw$JmNduK);ZoI~h7nSB7o_p>&=brO^zwbHccKx>leY@f1`Lap=b>Z*ZxS||# zK7JWfHKu6uSyRoJjf^Q~Ooq?8Of_pZx=gXl-lJ}}DR!sr_L$<HG~Z*2J<4~R>Rz+4 z&lG#n1~vMOk7rL9f3GR-H$EO5Fn+Ho9yETRDIPNZ6Q+3B`1?)qN#h?d#UsW)Xo^RT zf5;S{GX7yxJZAhSP4T$#kC@^K;~zD}r;Y!VDfS!xm?=JE{Ntwhtnp8n;%AKiv?)Gk z{C-n>-uTa$;z{E_Yl@EXKVyn782>p_95DX#rud@qPnzOO#&=Bdl<{9M!OLbfWBdX0 zp)nsAbE|mT_%E7ZP^B+5OV1eplnKtL^yOyhE5<*amJT*cUo}3ed&YmIS#;L;ubSYT znxAc!=8S)iH^m|2=ae~b{2^s782`L77ma^Gnb(YeQJL3`|C%zFjQ_eamrVuu!0lyo z*?+_MZ{p8qjeiAyK4<)4{JCoU5p%hSXK$&+o5p`z8B`lp=86eWcg%bUDi}8YxC+s1 zLYWccPb%}4@u!q|+xXX%88!ZOWyXv@t<1RbKd;P$@oy+IY5W;wri?$U%r)cZmAP*G zIc27eKd;Q^jsK1^H;nHpGh_UM31$Vo1(pa=dE+nY@tpB*Dl>2VC1u_*{=3S!#=oUZ z!T3dG7L5M|Wfo0v)A+YF;U(plm48?H_msayHYp7L82G00fAB9qm_at)hr}<%L0s7g zY{_1fY*cC$zrJA$dQcEV<<e#l9Y;2|QmwD#%JneFZC7f3eLKq4f;c+CM_Y}c5q!k6 zxU^FJsAo|S-m8>@l}7YHpNG)rg^O?G&g1`uD;Lh=U-W3%g~ya#j1Qx&AKZǛ}( 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 diff --git a/src/azure/http/__init__.pyc b/src/azure/http/__init__.pyc deleted file mode 100644 index 50af404e2fc5f5b4dc55fa53a05c28ad20c9630c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2637 zcmc&$(T*E66m>G&ba!bbibUZF`7xEUp$LhG6;!|ywY+3klk|aA#AtTL$qXdp!S)b} z`Ubzi_wWP!4L`s+_GGfGiUgImB=XJm9sBy;JLmW&`t$zr@AW4anP@)|em}>sUqj?V zTtfDQ>WO7f<bCn05WfiV&1GNYkx-Gh9(2|Nk>3&dp~wfF3G=&RHavp2@(&0{?b&>O zF)>D)?${ozUt-wzAQX<pX^=RkM^~4Th-bq-7kmUE=|E0?%2e%2UCC{sDruChb!C;b zE_IESna-7b@|pbj@nf0Y!7dKEIK!|*h?jlwQiudf&nu9TS71NzO2qTqgTLigqf)1= zOl76EJ_?_P+?KA8uE5!~%F1P_@-~W*+$d|)l^V%o*?zh}3zg=|z+08eE1kcX4i9jK zy9?3oas%igA9oCuTf;7Q*iN}|$kZG+TeV)sOfqIg<A{QGrW=Hfp`D#Bo?9Hf*s3zu z)v8#0rL$(EDrXl@OZTj~TBJWWMxEIF`;(<MC-n<g=xSk279K1L=juh0lvU}HWQ@m* zXE%Qrx}`xxM?HQ+Vqr;@Zd8)^bdqGF^JdK{lTMOcXGsz>>3zUnyQQdE3-JzyWswHG zLEqhjLU_e3oL&Q>4^aD9)p%JfD8SOa@ukrlyzYQsqkd?Vbz>>N2$tQEvPdn_<Po#f z>$TpN)k>z$newUu{!WkmqX3N40K99U*Gq5Oo$A-NfC`J-Nq}UF!tlf>*O&_MZLK4T zP*S-rt&?y&<jWh$AJcWC9?3c_jrHCM!r*`!SCR~W3*a9p7?{^_@s$)5pdjHK__2q# z2TdEOM}NnKn1t9bjNjsvZ*~u>+d|Y1yaE3n{Vo1uVmu}ZVqSu866U-+KEMbtKLpHK zkpOcK!q-6gZ#PihqB_2bYS~(FAy*bSvO9RZ8ri%gJ*En6UBDDIN#seV>7`PcgWBR6 z7gN52HFYj(&<3up9a=C446;pD5YSI2^O3wbpHV)CP%ayf$B(?jI(0>G*O*c+O}gT> z7(zm+3~=s$fPRCJ953+wt^cps(lIV5flfEP{8y%htHfuJkt-ZsvpdBEjVv^~RzZUe zmcCelez<+3oq{$V9-(=Yd-OAP5MoGld#drB`0j)fpy=Ml(m68E7w8)47>uXno1q`m zwPd?!>DRTO|B-_C5zdDU%y*ijL4O*G;Vb$+9*~VmJeggbPiK>4dY+t}Pv?{A-2Y?h t{_FUT<qNN`z5@?pQah&eeQmvVOZS`a^Ph&c{p4-t!vqHXhxZ;n_zRjnnu-7b diff --git a/src/azure/http/batchclient.pyc b/src/azure/http/batchclient.pyc deleted file mode 100644 index 516d7f700669cafb454232ad6f46dc418eef8f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9564 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 diff --git a/src/azure/http/httpclient.pyc b/src/azure/http/httpclient.pyc deleted file mode 100644 index a9fd35ab5ade6deda87f2120ff2f7a558b404374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4116 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 O!w&p^`+X1|hCc$A1lj5U diff --git a/src/azure/http/winhttp.pyc b/src/azure/http/winhttp.pyc deleted file mode 100644 index 609090f4b356db2ebaf9b73ef3e56529bacc4ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14924 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 diff --git a/src/azure/servicebus/__init__.pyc b/src/azure/servicebus/__init__.pyc deleted file mode 100644 index 5ebeadaaa8bf8e1b279bcb6500a8cebd2b4539b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27765 zcmdU2Yiu0Xb-uHtC@%GWQI;$#BigcPOX5nhWZ4Qum?G&%EK&3<WyOqw$#Q2XF0~JG zXVwzaI7s3EO;e;mf&gs_q{xq?Ndpu?`lBg|rfJhAO`E1oS`;nXAOYGUD3BsQnil=n z^!v`4nVo%5l4FZ@MDFFCJNMjs=gzt3JLlYUS3N)7GVrzK$7hNr`qzWMPvH~n$r$6| z*D_^e=90W+=B&6pW9BlF&zN$Lsq~t;USmZx8_e8>xL%)`>yvzsDQ`5Djb?76*6TIp zepAVsxvXAqFy#SL*<|K6naXA}x7k#-n7J*cvenFOHI;2<ZkwrWH*?!fWrvyDVJbV# z+)h*3W#)F7%5F2a+f??Lxjo4k2F%=m@zDFA@zCjB<Mo@l`;3PU_n8u&YQOPN=YHdD zGX7?>fCt-bK5WdZ#=JClz<68Y(ydA91IF7Hmu^o=4;pVrT)HzUeVg%i#ihHGQrmcY zcrka#c!QD|GTvUvJZQZ8B=eB*_DSZj@%BsRVdLE|nIpzKAemv~Js_D!jCW8nj~ef7 zk~wNTTQbLtcSthFjW;Bj5#v25nVj(+lFSL?9hS^V<2@{yQ^q?YnaAX%4V&_5Q#oVi z&R}9KlOKKr>{0p|{!I^C$c7t{R7%y7SF312KMK4;=!d0>uO(TOJUcr(GgYtG>cg8z zwFAl3Qq`;7494HvsQYp&+}>6?SqKZ^78JV0x{oGZzZ%w8!#ymy?uUBmF4t?zemyMt zK{$Xrw<=}V4~m6lU)qz3#l=$DbE`EEb!^m0cYUc81f}YA#}8_adNCTwzP3sewdz8- zR19^TdvRCV4g7kkP%gc<5SD6Hw_2$9VRBFUtov1Wp<b)F%Y|?;yg#N}DAj||ZH~%) zxlnHS0jKVvNq?cxD2L>#V0Mai-k-l=I?q6H^zi<lX7<OH=uo@rfyEtK;_g#KcrS z?>;~El8mF{{&V^Kl_@9SJ6sII<#V~*&6_tzZay|rt6$HZI&tD;?wyw|=8KDdrEt7d z4Z=dT=!Y9n`-O(z@Dnky86_9+37$aWgPTPtP#oOx*D@c*3hy;eewe~0s3NhYb-P$D z1c6<w)$4w+T&sF`DRx+kZcgHr)=SHr=W}*6_DbMYM=GUay%y9K!jWRFlJl#_8$qsI zny(k?tGS!XVFhwnZgKJK6DQ7|eXPjQ^8*oQCh!TaBYB@?-iMcpOhz)e?2!yEdnJR* z4U)lSpJZ^kQ8KvfmkchmlELMGWN^7jGLS_E%ZF=bTGs#>yId>YaJ@!d7)ThqQn=*? zrT6-7sp?kz>xKE%5KMajb?g30qlCFZ{bleX*MsMWevxw`te#W|e6TbMN#!X!p{*b& zT=!irOE;{!<<iT3_>fd6cy8GbL-2C-x(hyztNOQ=OVP-VuwrMo?qVqjYxPxaRi``L ziMo6W&u1UFS*$gxVaO%rR}1rH-<>an;4#nTx|JsnWR=H{t&hy<iAN$W4D+Rhy+{JT zyx_1KXBU&*OehqbK_*;*&V5YSrNedPaOF9ij$wQ>3Eqj^#JOu%u!w_eH+@L3>h;BI zleJ=_0yz_0d!`gV+nB#5+;cqeZX92z)sHW)hKsf8wV+<q8`nVna;fOgH-c*}-dQPh z-4RscQjV`rAs=vPW=q!U{Fxr+3X3QxLtIw`nd??+UIWwRijZ|(uU15!6EIz?`p!XQ znvWy7d-_Zcg?0{~fRo#2_4V{voj)QjW^2o(Vj?aG5h5<$flQ0I=rvy3FXRItyVv;8 zA2P(DSD|zC8NbggZ8Tm_vjhT!(-tfvv8BJY1c=^zqXfw5Cr9iepNOACgq*|0&nH5> zrc~%dBg(=}wiZ54Sa_J7IuG2r9%`%umkSF{qpN^R)AToayGS|5*-2)|#sw4zJZ{;T zS0G+3vxLhGU$6zyyOe=+BqU6Wb`d;@>@38KT?oT^X}%Hq_F^Hh=Y79w7Z(fF>%K>H z=qfHpq#;>RHw*PD#9AQBh8H3-hB+*q$A^$>uA+OofI`ZE_5r&h?cR+$0pGvLY__&o z#dzwH>7z7E7%aszoaeSjk`*Wl#X3Eg^DqX%)gExTCNn+Uk3Y`anAl7XF&Sb)nI-Qf zQrcF9Hsq5B0zu6oOYWY&59dL2`#ifQmb41A&Dm{zA-Ou=m`^m1M50lny+A^W!xo9Q zmI4I12J@q-_q-p3cDn7gq*qIwH%f>-{uqQ9AA+BR$1dU`;j!1L2c=k4m_g9G6{Euu z^ym5Q+Q&kv3{}MS$-$~u`?rd|Xnui$xxl)BIft*yxJ&!aQQj5V*`z?xdI`oG=qjK| zV+NXnkvRqYHP^?wE`dieyhRSQa|saJMQl1yLK4;|=nCs|@vO=EV0Uo{w5a)PXDv3D zdv6qbpCNm5p!_84&3U~Yd#k?Rlh)IFK@!qnjhHfAg;hy4C}z@I%TUNg*JiDP=;Cft zE4qdr9n}(*MH%)u>N{Kk4rPdQ0!j15-&?UqA^bsn#NITKM*3D_%3~ND1!Tbahg{Bx z0(?m=n1mA(wQ>@*S~wB@rsNko2J%oPMXgi~lFq4Ks*?0fZIH}HTBK|-pekoaeMQ_F zE*3(&5kTW8Rqep9dUj-(<lu#19)^`&SS|%4cEI;qSXKiKHdw9@)+$HglXyG1;=DL8 z-VXhx4!Aqt2p5h&A<85L8JTqgpWp;Qy~(J`mQa|~=<I5bs?91cH>grBG-b4aOn;n# z8JaP{yM(u4*w&BHnS;!YK2!ezGfS{fE$U*gz=p-;Cb8wwH`?ko_r2O<UV%-EYc$zw z_M-TZ_Jka8Qfbdd#Apj6+Gt+Q#8hasUn%;{3Oa}BteqdTqRuzG_Rh0x3JwH3Y<`$3 z#B{I?X)Z`Xc909HBIQa*Oo`cmPNH1&0)yNzH7gNw^EFTHHW=k<k8`EZ*K0QbM=2*0 zON$NIz3}QZT~EDihT?&`dt?;4unOHMFZz$j5?J4`j?`O3sq3c4tHl&1?h1V_dd<cc z;LH%!t}eMA6qWtza1#O_Ly7YQlhaHdXL6Rw86+X=FV|EL#^00cDQrH9z5~iSlW9dl zTxI&K-rhcIv$f6IXYIDOTRW{?(Ulkxd}UmhvNAq`4A^c7&XC6>10zCsA0;e@@V3mp zD3>w&z_wQP1-aF0>J7<kh%=y-CAB2}oh5PZbhZGec6A%woKRbrvSiW^L8SD6<M>j7 zXOY;GKKv(sV3$IAChXFJ%~xd03$$s`+qF836})x5D&S`NrAz6E9d1Qqd3bqzxZS23 zm3eqI`FbzHNi+*CtWFP;cb&I0;foIG`GA`Rok!dfv9-K%hbELmaVE~fs9w6?*wf>X zIfS>w*%6XA+$qPo?6`0@=Et9za;GoPx-(N#&$|~dPdq<0>0X|8C#Nn>%}$9&OCW8X zI7*BKeV8v`oU)wBSC4{oPGo*zc;-r#zQ5PaGtM~Xz@b9cl{p&H%bl4cs<$R{I8*51 zF8SihG<oFB;R}6^FL&V!s)1aw#0ill{g5n?EcvRr_2noJpTw)iOuqZm<{H2Yzda^| zghARvIIF*l$P9@=aRFP;Vma<YEbPU_-Uan%tn7=a`h@C}?NkIkAgk1FBTToSG``f& zVKrO73fN03LK^WwvhjUh44ArQHEZ<BIHepzjoL}th+Jtz47=cY{LrafDBFuL&)^=V zr-j~SZlAyl8mm8X*@$55P(U;5aN(GJ*s~AM+lODW4?lbE@TGHy^Y$~BX2nN@eUuP7 z(D7L!C2gY%0<SX(j*4qsuuDW=iC*c@ujtlJ2^%%hrUWHc5Y|O8j0P!!0jd}DGl!@l zeg@Q8pvzmNTe)`AuQxGKB)Et!X(oC=(FG{9og-*uy@Z;W51!{n&+><SJaHNKW~~Fj z#v}MVnt7yWUr*K=x|4^+c?RUp^GvR`JcB&Vy)`aQqQhUtM_xB|cOd%%S^O*Vl~Kn{ zR^ad9LRTPmUa5(ml}o{NXoz5bybD$k-LRE!Q3~kWVs30S^<Oc!o{A_Z-#sJ?7wRe; z%c8LY<gs*aVC~MBnUxuX->Ym?yV=U6OC_>dw25esOROF&ai|c{a?u+3Vd|K&g=UZI zS}C<H7Os#;>$9N&0@(TJGgoGXwPr5oXN4OtO*zj@3DYW)28923fn4;f*Rf+r!e^$G z@Y$*HNtxARw1}u~cC4z`Zh*+%%XkC(8ue%=Q&pR2&|-vf&;ehb3|c&u5&ToG2GKC3 zDu*fl)i+>h;z*P!!U|rjdCm*y&2gB_Fd1VadhaZ9vc-hWv+LDZ=@tb%TGwiOUtvA9 z)n!x3z2UD)2iOH}Ksda}7T0s(??;DjW0^bVEu&UJ@Lk*$*No}eW)0&r2rZ{Sv#Vz) zBkPG1pV*DuD<C2XGbh};7bvqg+HHLpH6XOZM!jl>i@wddf>jG4$<5ZArEn3F9*QRH zSeh|co$(pFP%OgmhS7rZ^Ft1ugo5q5N5yS;xg{=lhtum6n9Q>tKI`Fadk?z#H+<Cp z+*73V=d2L#Cs@uAarw&pV8H{gFj2_t<xYg&0Lr6CK%a;oum3}+MI``$Eg(u^B)d`& zFhFr^4&Mj-y+IRH3<4Wn*%OO?@doVxnHpO*QehuJE>vqFCYNgb6n9ts;Bxi6py$IS zx@E+Sbw-gB-j?-W!saQP78s-OtlW?+O#_;$WnSqXA|G116jOrbE^Iw_-oK7U=*>=w z0FvU!lG?5gP<C+zHKkg$c5|Ixpo~P>$SnoYXuSWxcq8q8pIC)^dW7dWc?pL64DTAR zQs3cT{^3g%r46>6YG(DPB5iCR-WegKm#;o}ikUn_KNbiCGL6AVAL}uDqXK0TdOWnC zqbuPdH6776R600eMCW^@FR~b+ih*J1P=Q0lGWCBZE+Go3yjgrL8_m)dv$WMLZKH<= z5lIL~deySvZK2t@-7M{3Ihhb>1`~8A!;}Dg;8cs(yNtJ$h9H6yP$@3m!#?HyV01?= z_OkeuEW?;M756b*VQC);z3t`(EaT5wErmPC*eGPR{igl_$=okg`(;eMX5||e;taGM zrVmK|AUncCzS>K3xq8Ulu@2|gmRJiY*N2R^Q%1E5t|nX$8E-eQWiiSNRHb~BZ*Z8~ z3c+WQ*aJ5HIU?VvvqEBtx=K+Op}>gNk&02#ITeMvk59l(z&oaq+K_{cV<2FhOKPyT z3P>B}Qcr=TwThO>?O-DY8U?Tjci*fRmc`3+Uc6Ti%k?rsVQ$vy-gyC0Eenc>m(YTd zX4Jumz{BxieniJX<)B_GkBI0%M25y{#d~gHtyn8#s&xo~^Ae|yf+R;-|MH2EC%b7O zxNl0|VsZ@2O~loC@ufLF3Wpy=A`)s5{w2vsv=bjx7j>X&dLiKCIW<=2%|^Y9NS#wM zoRvlmA!979`^)75!j5{74^{&mdASfmtExBx^ArFu1L|Qw#FBUu@mq{=T1W8A{Hp_E zhK<IB)ZJXhqCwB9MxisjPYR4B<bB@Gr|z@6<wh7WgP0|_RD4z`%^DD>u^l2fKmkiV z0{{srk9elQcNTCh$_7Rs!h=XD1|J?3J<=e?&2y+v$qifuc$aJ&ZA5LW7f~j!DpRId zaUPY_H`EHiLM;p>%;PMvapFMqFfM(bP6GvM;IlI@P&_j_s9<@WV8HRv{eR&ToJL~$ zcSGM9fG==k?_ukpwa2;-`Gc8l@DUE8d<(An;PuH`domAY4rPv61DPUcj}Ot0&jdcf zH^Hz94lw3R5PonGZWZGIDP%R$K6C4(C<0;f-P6`Jr~n&9+CntLvKM@z`S30>IqiPf z;t<CWeMjl!j_PE@#CVx^(QeBvs0SebxZLV%y|qmY7=&z!gPb<d|FW7Q#36|M)&1lK z01HcjB;t!eucKF2UbcF%IBvkw|EaNH?5lqsw{Yj3E2|>#b^M!T0D~5ImnsXZq;JFc z!uZZu;FjiXFfTX-wgK8Du*fg+th!*~mX@ao;;M1cQ9kNb;1VX8RG+t?l>lO?nF4F^ zB0vEs?js^q?>B9C8EqHe1+e6Y=`IL9hQywbXwbw9!2nChcU@$y0$$6`C3kJ9n=;O@ z!&7TO1BUeX>mw?m6$uc`rM`wvd?=PnaAIg}@nYyEL31~t!%P#Ge6Rz959@_$u;AB^ z!^vA?jH3z!>0hJ(EdkN8MZ#(@%xxVjLKW5<>f=}_lo9^-ns=e5Mf2<&_a`~&UB@j( zpw63YB*wcYVg&Lb#86i2YzVEW?Ir@8qP+m9pd>2O#Zy4YF82Fd+&0+phtbEy{33&6 zHS(4cX*Pb;r}?OA2#RDStSyvlh0r;PoXA5#kC-*&RYmVUdAmss5rwj8at72gw#b{V z8@gn_xFCMkrnx966Wv}XaVcOGM@C0ozYXFpp!s0>vXGAQ(?gq)KiTNR2%{crKhhnU zok;mPXzj}Eg|Fsd=6<V)MhricrXodUk4y!r$bmSHRlsUDY9Yq6iUkz9jJ`&6X&qbr z^6J$M{25ePuUX+*Nrn@@`glywbAC8#qfbc=B$~=o!gQeVj6XmOig*}`um}Je8FOoo z1&suv3l;$E1rLI?7jEMJBcR;+C9x_X&>*ieC|x2tP;Z43OLmx13Qz!#K>Wcx0MAA0 zI`*enFKg<P=GKYGIH94yW)2XWA|g-#1_o$Hz$0a?{HnRSGHLL8_14X}cc|MWTZrw7 zbnpFfLj%&g%5?S)07LIz7bJsWu*vL0FA&HOx%FWy>K)P^s(sY;u(k4agWszwBk27x zE)~odkOIBKkimR$=!8);q|P)5ePByO|Fm@#(~y^q*We0Xh7Dzl%o8-lG}s9GyG=H- zYx7Ic)JAN3K*aMblzHlc*pja;*sMr@8*84E`=heQ&KuR>{E<l0ZVhuklN-nG?U6Aw zNrPb&%uBDdEnD<Q(!2L)h1KGUj8aJjsc0wXO6P~VcGE4IekdAPOc6-1eb5%hUiGn) zC~?IB!tzg^$l*6CfW?uERJ5Tn8NNOGw1iCArE~HCL;01mmcYe;1;Fr>xT-yho6X{} zORJIVef9j2cfK@tWHi@$Kk6W-?Zy3#OPot*e_Fm)Ux;|HoBf@#&)Y}FFHEf2r8cHr zj^^5CJ}!>lTzo07UN6L|kZTdmQALrNZEXnv>jUcE0Krq7qAhbF!8%e`M<#JQ&?tdy zCy*%G@lw?OWkz`9#joZZV;xEwhia*~W}wlJ$8oLGdD+Ls$qP3>@$A&4@zf~~$|lSk zV_*g71P|rh$g~`0Aw0@qk_n!05!-~PTm&&4nitNenM@<m@OhSjskwC$Wf4`b)(3c7 z8sJhw@P1H~&QRH15dLyxUWmYO7uA!S1!0C}6jKuu*Gb|#pU04<DcB!I#_ZUJpn?P9 zC>=y@&^m<APF!bUIP_VEdWNjs&28elgE)E^5=`NY0ODkK|4qU;aT<fA1#;6ECxcpT z136qap`4^@5J6A_%&3_U(x%S?>+<5bpLTv7mDHh2eNB1jw^+ue*3~^u6B>u7u$W-0 z*2)0jC{7x$v{x~li;AkBVEC8tLf67@065WlGy{I`K=Q*Gdc?%$P#6bb({_P{1|+=B zJWvavRRC|a0=HpQ8GbiG_h#kaG&HotA4d{F+!hjb5T@Jz4y8tu1cp~zFB(jhCNWkE z$(9ZhV0_!aj$6@Fz+>3fzUU4ukNlq2_Th|dBN1z~h2&##``bGz1N++s^CzwC@8}@e z+(GhFv0#&l-Pu7RI!Mcq9?rD9i(MTgP*~aqcDnWT?T$!RP8<AQh22_jWN=gq(fmvB zr%F5!xPgig{Hb6IsD@C4;8krZLNIZ`IQzx=h3SizDLPz66(KQfe*(^KDngJkO=Sp* zkgV%i6B1CCq*E7)g@GtVLKSI6FEE;{Lw89ump4EU8NF1vmB-1o=c*TYW^L@`3H%$) zwUx@aN25cImo%hv7M9*@?IKQ#jm^xSxip$v^R`l7MC8n5bZ8C~r$EtCq_v#ryxcSO zT4UMw9KYzJhhR+1Mragk+*aazV|lp-m2@&b^fnnEwTtO*Q$v~<8BqtpXs&(g$5fGZ zeuu*Ji%7&UZLcL3X!^0l(V5KVrQ~cNC3^fYox@d)CwkVrYJ*@@@TMLN?05yCEjJ6^ z#rRC%<!V$3ier2r@IhAUn44$yI3VBWRXKYp$55x_)ZYa?^mn;==8t@j=Rx$GoD-ao zV}jI^qVBYS2#{i{>0vp`heG3gi3yz(icq3r(Nq;LsU8p{YKh-fj|zT`mo!+ro)?sv zr2QyI1@+Ki4=<;X$myLZD(;0VQ&%)5?&-@{rYBX?qLSq>ra_Ot{5~(gLPCO*EJaZ& zOI3I}N}lQu>hXznEvjyM6nOoWsIOv>A0)aiA!D{uiRyzIwGCcY#%%I0%DVn-zu$h{ zNw)=2pF7_uMN9%K-)f4O4C>pQ&y=^JMN|1B+`NOP@*K}!bZ9E4ENUvE%XHCK21H+} z+?~Fnl|R!8c(>PAl;rPUi@u^H@HMCkb$d-kD?iq%9Nb=CQIa;;j`fukY=6jtpv7J@ z_E1}3dshm!vCY^H+k4tz`!^#01qD;^KX|<pvHPMOwS@_qUJKriJQs9X$lZJIvzTSv zaR>0f=}rr{UDiUNv6+)69zT2L<daWM&YpVq^b?oPjGR7u_6$z%=kKH%(3{f<kx)fW zola>Y33jThfJAEp=$LraoBBd0>NQ*Gyw`z<V>4$b@f3H4&Qz<|7fgY1<l6y?==r#* z<apc|cL6v>cUxa|om@MMB#tq9n&=tRv5eyD74ZEVdeNr6v^U{=1FOUNI+H(R@)u0L z#pK&ariU5Z$T+SD#Hmhn1#zjjCWupyNgeR-iq*51XP%po`1QNRYFU^qSS=;a-?F#w zGI^275hUy7;`ko=`WvFjBr;~ZpmWawxHE2t&z(4&;O=Yn@gG31?GBK1u=tw<zlYMp zicKFnXVPQa2oaq|Vfxe(e*q_TEfl`B+STVjZ^4)+Fvkvmb@nrc6`leFh~pN_{yy;$ zXf^c_AdjF_t@aV|$4ej*D<j$m<Iu|L9Y|OHQrsr?Nt0^o5lC12eruZpsmkgLNLS8^ zZ$BBprc`D11*9uK-dcHcs<L_k(v^!A)()N&7|Tc7nyRc`fOO>%*<wyAZ!_3bi1!t? z3oh>va~hD{#N`dLF#_1ez5;X#Oc>4SFQ)euesnurPIJea@SLu6?@>CRI<xkc1naaV z8d>QrMFJ&hB#ms%cKD2ollu2a3uptu4huFO*B$Henc6D7@d&)e>wk?vycd#fjh380 z#XaZGnGl)7N08k0Q#s!xouKz$GWS<VriaChMlOQzN15wpf{V>f54wK0$x-GwQU&e> z=9)G)Hzk^T7HUpYU^`87nth}f=bMSk|A?^+5MM@-G24jCYBSSX-V7f#({x@-(&=C( z*^od(O=S8hkO}^I4N$KCP$HC2vRhDQLd-(A8D%RP#$e>q$L4gexegDcWzK>UXu%sm z9VPoficAhz=v~y-ux9K{cMxL(TZzAtB8E3p`;^dBge!HBArw~0{yRmMjmZFBNuL9q z#E5lL;*&hXg#C6tC$^HcPuaYV2E4hG7`xa?Tul+f=u~2WThjB^PGZF0D)Hx1#IPlm z7+{CtZ0{sPbgz=(JtYH%OIyhRdnnwQB3t>PoH;@1E_qShLysaWxKe^2Bhk(2#JDW9 z9vRhLac+{+ti&IlOUEWTUBU<)_3PXn_Y1{EoJIA^9<S1iMjOX*c2eV8cCeGQYL_bX zc^0q}9@OlczFjO-t4DBwa(;6|p<Kq-v+1Ujd|4YcEzl$6N~C$Z{U~UPsHWfA7CEmu z(s{I{&G=pva`h=Z@8}w$OLxrQM1$1{_)4~Nh%JyO@w#oUXNi?ctjQScBu2MsLMFv@ zIIe952lRB_#^Mczl)S~->jb)h##M(^*rgsN^J{>*;8?eIZ-b3;K5%pmZ}3<klaX8V z_D=TJ?k*k+cuqx3`xZCyn7*#GBY7-(U9Dx>=^C6jHZ4Ia>PhBgLqmr+t(B@8bta%T zi=xyQ&k4M>Ig)8@=vPkt3mc)wI=xmT3U{3>NjVB0FXEO#=vsa|!A!=|&)_i}I>Kip z^_Thh`e<fA4apYZda4Du@C6T;GDIBzZj1vEdU8IaJ7j4oj!|%9dL>1JP$;PTXiLxy zF;XeW$))Nc(kWdpo2p0AJRtIxxlOGQiSNXSL^tkX16CUm%cKQUIRpSIjviuw2U0Xi z$Ff0*!w<~?HajLFqy4SYw|;#EueT`*U~e!&0ofD$YcNU&3NSn)B~0&H`U{=N={HvD zvt5<;Z6oU<=0A=H8g)SMRx)u^ymP|a1F6JoFf=9$c7oqaiem@}rcx27;v`l4oHrIo zE4j8p9x7;yyNW8d1Q?A4B7i4q6&#-^&6f}vyL!=o*)NZs!ZvD`VmY`m8pmd7lNy_p zgl5HIOq_GQ6%pyhSPV?9uVhTWXOQte&i9#!20p@Ej>!ooO`-M&xNJraF^+b<gc*f@ zEX>G#kwWqkg&5_v*+?OlwGLB&We&@!0lhkmnAhz*F#usD!7+(Ph|x1mz1xrVZk&&T zcV{9NG<U0aE7^NfWUYF4H;o%nCrZ{;;}+?nhnm;WyOsDSsXklvZpgr<Xo^e(XxvJ6 zG?r+c8aH%(Oig!<TZu7S5N4{bw`$ywc+Ean{8;;q<Q{@UBe^Ho_+7k{4!I{j*q=x6 zDd9bkeA2LrzV^X&k$s=QLygY9)iz^P_`Oa&l%9ZY+b#hWq^|oe!2#a6&8AE6fRNs< z#$ndDn~fBS3%t8Mm)EDFGWK9J6{`?wp}CeKRan~@0jlOEP^%(I(WQcShB;Db(1Pfi zZJQoVIs6Z(Ct;bwjq9pak^^Evti7u`2`$P5Hg1}fI@zvL9_=cJKLOIF9DaX>dKc8l z^RZZipt+428HqKx==Y1@4pU^1z-bM!i_ZfRSjq6UFe=cH!snr6cb33PoJe30Ljo(Y zdOlQ?c9+9Sd^i@RAcp5diN*7=h6Gl!`4kx>u#&0IL;Fn2;b@ZJ^HAbXrHJA4P~zM9 zJe2IaDKhvxl&sU|5%q@C%SyH-)0|tx<tZ70{@|X`q3%vWMnt?NCZ0?YBNk7I5&nnS z8tf$78k2#IPy+ykbZ<;1-vNUEd?5u;@6WJ9RNAMCISyw>07aWT=n7C0;`8$WloH+p zfRct4pxOtw7C^nwHB9gq#rg8)01<VT1j`cNj`%B*D8r=qbwVwnq1{K*#g%inE}wgX zp|8<XL+Ag`?G?H!$lb~wTKzs^ljT~=6q(ys0FZe*=+y}%)=(3a1*pk%axlGXOrdOT zh(Ac;7OD57OsDVQQXpH_=bHxE+PgybuMx6OV_dQEM7WM2JNEp<f8%ogO}s%gse164 zz$dtdM4>x6Y=G~AkaKnF$Kkg_=+{00?ez@x1-jWF(dpsW=xUr#5bqC<K|>4ZH-mZu z3PAL&D;Lp=omW4#&;MoyUlw2W%J70S(kePSmHuvr5&LQh?reVBS*2FTH{mS%#nJ-4 zps`p8_)U(V!b6lkiDX*8Ve_Ntz!_jNg+zjCqgc?1%hOL^d~Raa$?^tSCAu+<uT0dC z6HbO4`-$#cnSOry^3`eQb0}|qmk!U6xia|mGM~woEnhk$y}QxWeVL5FN9K1AamQ+B zMh8oIm)GNI7aBp78-5(64qlIOt}|IhA}6o7L4f}p$icO7=;wD{WkMzq&ToEogM9aa z%&&YQr9)?{tQC!~6(>YL%Q(~eGDK(QhM+@1AdZ^Jsi()UT%2{CD;E)>i~ldj;qrI5 z;2l}WH<|k~6F!K13B2<tbM$A+(P5{^+<TbRn0QQno5>fLe4fc4Gm))LM$S5a$K-oV z{)q|q1)U!-`Bx_Y&g4f-evBlf*wDvr9_mYdrAJig{3oh4SwV95^t;<|zyoqp|I?8% z&R0N5$NkIA@Rdl~v)#J5VRKI(zOfZQJ^0BC9vFOJaBwg?_*`~Zc0+a`dpvtA+mk(t Y&xY(fkUoje$?U=G{n`E52eSkJ555H5;Q#;t diff --git a/src/azure/servicebus/servicebusservice.pyc b/src/azure/servicebus/servicebusservice.pyc deleted file mode 100644 index a8aaf72247c134803dce22de5602b28cd7fa6232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29634 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 a(JNdk`S|K+3I89M0HC;8K2ZAZ&i?~jJM$+1 diff --git a/src/azure/storage/__init__.pyc b/src/azure/storage/__init__.pyc deleted file mode 100644 index 5ab3450e21ce4f282a5dfc253f11b855df29db9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35386 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 P@a{#F)}c3=bs7I3^ij8Y diff --git a/src/azure/storage/blobservice.pyc b/src/azure/storage/blobservice.pyc deleted file mode 100644 index 9ff8b90c73ddaf1103611b90c67e121cb297cc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35346 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 diff --git a/src/azure/storage/cloudstorageaccount.pyc b/src/azure/storage/cloudstorageaccount.pyc deleted file mode 100644 index 9377bae33e3a51de258585089089fdb1c0071bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmd5+O>fgc5FOk3AO%z;5CVk6ic=14j;KNiL5oxlC@Kydh%6arciXtNy}`R~71Ue% z`}i~b0GJuuq^O)gYH_@i+41c9y`47>zTaMZw|KTEp}7M5e}%*DqEUEzkOAZ#Og->u z?nCB79>6rH=K*9L$h$D@;=BW@52_320A~Q7rae$Sm<(^=Ug;0Kh8}wECYtTc%qF@# zPNlAcw=no2nPvJ?^nInPHtOzT+D>LFHF2g)4)kj&O;xzx@NZ*|-9n>*U?b|OPpIhj z;M|8P;`9k5f>r@Lh_u5_AHvD7M>~8&vsaqqRB0;`v7bnM<x=dMQpi##E-em(n`<#c zDjVVpq1+Hjp@btE!q)7pSQB`iq;8IzNR#KL5J`<%6iKdmNgFuQ%aITtajg|HDTKyl zx)hbw{3_n61wuG5MVi98vXYK7lEtDli!x2zF9brRrIs#Rj%0w8X!tmGaM=53PCYmU zh|%%c;S-y1RmMZgbX1!LVN8&@f^7gH4{1-=L1T5cACePx(F}3a#(qX`=Xu1;q7$7e zQyk2rH%3;uE}V^aQ}?!-MakEy)SFfvZQ?O+E|zX?ipZ9-eh}HZ=#eA^G?NC$2$M-? zahw*Zi{l6ATS5Zfz>}mq8U&Pyla3rx1~_E;hd!M7C{;=tGoKJWxWI*;gd~isW<^k0 za5^Tb#f`8YW7tx8;P2=$pH-=@jo!T#J#L(q-;;mjM@RENl<xvR{zkO?p04<f`3u>| zml`aN-5NfQ<J_n!qiLU~%1HF7Xk%08kb)tJJ{*vtB`a~VcO`unQdf~mEg|RyJ%7D3 z2nNBp216*_Lp0pnqo!>~q~%7++-mO8r4-gfn?nNqLk^#5o5M9HG}mzqT)!7}#a^x> M2uoj!J0AZ0pUe5^GXMYp diff --git a/src/azure/storage/queueservice.pyc b/src/azure/storage/queueservice.pyc deleted file mode 100644 index 5bc7a6ae60aa61ba5be04baf39a26295a26968b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15162 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 diff --git a/src/azure/storage/sharedaccesssignature.pyc b/src/azure/storage/sharedaccesssignature.pyc deleted file mode 100644 index 1c1965233dc823238544c4e0278ac3f63b899f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7623 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 diff --git a/src/azure/storage/storageclient.pyc b/src/azure/storage/storageclient.pyc deleted file mode 100644 index da3edfb9ffdba8c6c538a28a27519d84c261fd7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3957 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 JvFzaEeGja!tylm6 diff --git a/src/azure/storage/tableservice.pyc b/src/azure/storage/tableservice.pyc deleted file mode 100644 index eac7c6aa32c1bd0d987b132acd343132bf424cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16414 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 diff --git a/test/azuretest/__init__.pyc b/test/azuretest/__init__.pyc deleted file mode 100644 index 6f84691758bd5dcf0d6779520f1185e44197d759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZSn%**9dU>1<f00oRd+5w1*S%5?e14FO|NW@PANHCxg#X&$ZXRDad;?$zznDW%j zl>EH(j2M^v<kH;KyprM=_skNH(xjNgs?wrV-QtvN-L(87-Ga)JjQqTqlGNf7hzyt& fAD@|*SrQ+w2bAUj8f%lApHiBWY6r5s7>F4Fo31Ku diff --git a/test/azuretest/test_blobservice.pyc b/test/azuretest/test_blobservice.pyc deleted file mode 100644 index a137316b4a167a74f36d468ef69dc4bd12d3cb89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43487 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 diff --git a/test/azuretest/test_cloudstorageaccount.pyc b/test/azuretest/test_cloudstorageaccount.pyc deleted file mode 100644 index bf4707b2c9731adcf0e96b2addbe9eb42c42356f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 zcmdT_+iuf95S_J?LPAQpUnF=BNbL)P2ZXo<1PCd>rU<AaSx&qyZXLUL*PtSJD(`#} zAH@g2IcpbMQ6!!UMA`Ao&R%Bb%*=*g=eu7vuRWbg^9%94jbTS13I0klk>!R{H5W)0 z$VwndC?=FuB}q#@iEN9!T4{-COVXB&K*}d#0$HD<LghFskWqgQ=ceEA>nm`M<nqv+ z#b=NeRWfo#8Lyc;(`ixVZrND(!!$0vi(#*V7?Bm+E4-JMD9?nvgEKAKMh3Qc+g9d8 zkNR!wobntF3Ihz=2XWq2n6n<xTpU9_B)=`e2ayOz3hWQDc<6edacyIi$1~%O?3&mx zTmB|@5|jIQ<rhy&lbGD4ac12atXng#@qJ{<x9QZ_A<sR%uj;Yca)*B2SckHO32U-d zx+9+03An-a@pEfRJAP-<q{!D^kM9-JYKFV*_(AF(R+Dl3zADY4O*R%+i*j*u%e^l0 zu|w=@jps<BDIu~oM2-7PSk6dV<DPGxBSSkxolri|0eFUNfZ@$SDA(~<jO<4x6a)DH zQHi1uQgAKV4r;kg894-h*AII*_9!}D(cMvahzRbmPek-#5Dx>w9Xk_EvSJb;8Vs;o zfHJm_+#@?I+_1=vJGN`?QEpwFV<C^ai=7QJHQ0XR{Wn#dX*#JH1kLQ$^j8y}zE^a> zd9<2)4;~-FQseh)6fQz%yCBk92<O!?b-o6UPW-44R$N^nC^R6`00*E@ElNHg2Ua`f z@-dJXfZ^Foj|C$z#8w1@d7(+_>hbZ@acYrR$1(dN&6DDty~A9*UzSCw8FpW9+J}(h zBu=6x@id`2_*h=Xt-p(9WM-RgE811sm$2G0DG*)6_Ma(<Q?RHh2^UW?vr`kAjZM#k zc#xK<YqDOmT>c={{}L|eX|wN9b&l_G>k5?nCHcS5opwR-rZUy<pm;{z{|Ut&w{HCk zMW4OWu~kR@F^wX}h7?7!BB_v@k*28GBs8B&O|10=ke}u6xdVFdG#?lm;!|oa=(Ib% zPPfx*T$sga9!0fNtR(-sE;X;FJGwK&WL>IUn)z*2o;uDr?(jWu8PXuO#^0vdrtvC@ c@btgqwzu;}jmb?mU+;cbb%S1b=2}mE2l=3XG5`Po diff --git a/test/azuretest/test_queueservice.pyc b/test/azuretest/test_queueservice.pyc deleted file mode 100644 index 8c233e20d4100b8f1f89215fb29159371e7c8f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14070 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 PxIIxCwP!vu?u7L}_V}WX diff --git a/test/azuretest/test_servicebusservice.pyc b/test/azuretest/test_servicebusservice.pyc deleted file mode 100644 index a2060d53f9d524f4e1e8db01b737b0d95ec0481c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35946 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 Y9JOK%4#C_RDlRLnd(r6M>Scxh1F(!V3IG5A diff --git a/test/azuretest/test_sharedaccesssignature.pyc b/test/azuretest/test_sharedaccesssignature.pyc deleted file mode 100644 index 46196e09396421bfedc3f76e4b6642ca4477e89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5099 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 diff --git a/test/azuretest/test_tableservice.pyc b/test/azuretest/test_tableservice.pyc deleted file mode 100644 index d2f212de0166c48c23552aa50925cccc8cc04a9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35036 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 X$BIvvhAG#BLjya$;rRK(;llp~snC(< diff --git a/test/azuretest/util.pyc b/test/azuretest/util.pyc deleted file mode 100644 index de3cdda44bbf7a4bcaad9e7a1260ea5cd2841f55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4928 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 CTai@&