Statistics
| Branch: | Tag: | Revision:

root / pithos / api / tests.py @ 1627c8ff

History | View | Annotate | Download (70.2 kB)

1 ae75584f Sofia Papagiannaki
#coding=utf8
2 ae75584f Sofia Papagiannaki
3 4288ade0 Sofia Papagiannaki
# Copyright 2011 GRNET S.A. All rights reserved.
4 4288ade0 Sofia Papagiannaki
# 
5 4288ade0 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
6 4288ade0 Sofia Papagiannaki
# without modification, are permitted provided that the following
7 4288ade0 Sofia Papagiannaki
# conditions are met:
8 4288ade0 Sofia Papagiannaki
# 
9 4288ade0 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
10 4288ade0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
11 4288ade0 Sofia Papagiannaki
#      disclaimer.
12 4288ade0 Sofia Papagiannaki
# 
13 4288ade0 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
14 4288ade0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
15 4288ade0 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
16 4288ade0 Sofia Papagiannaki
#      provided with the distribution.
17 4288ade0 Sofia Papagiannaki
# 
18 4288ade0 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 4288ade0 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 4288ade0 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 4288ade0 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 4288ade0 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 4288ade0 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 4288ade0 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 4288ade0 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 4288ade0 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 4288ade0 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 4288ade0 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 4288ade0 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
30 4288ade0 Sofia Papagiannaki
# 
31 4288ade0 Sofia Papagiannaki
# The views and conclusions contained in the software and
32 4288ade0 Sofia Papagiannaki
# documentation are those of the authors and should not be
33 4288ade0 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
34 4288ade0 Sofia Papagiannaki
# or implied, of GRNET S.A.
35 4288ade0 Sofia Papagiannaki
36 25c3841c Sofia Papagiannaki
from pithos.lib.client import Pithos_Client, Fault
37 b09c9aaa Sofia Papagiannaki
from xml.dom import minidom
38 25c3841c Sofia Papagiannaki
from StringIO import StringIO
39 e7b51248 Sofia Papagiannaki
import json
40 7812e1f9 Sofia Papagiannaki
import unittest
41 f0eacc2c Sofia Papagiannaki
import time as _time
42 b09c9aaa Sofia Papagiannaki
import types
43 b09c9aaa Sofia Papagiannaki
import hashlib
44 b09c9aaa Sofia Papagiannaki
import os
45 b09c9aaa Sofia Papagiannaki
import mimetypes
46 b09c9aaa Sofia Papagiannaki
import random
47 b09c9aaa Sofia Papagiannaki
import datetime
48 d1e43d6f Sofia Papagiannaki
import string
49 23028d31 Sofia Papagiannaki
import re
50 23028d31 Sofia Papagiannaki
51 b09c9aaa Sofia Papagiannaki
DATE_FORMATS = ["%a %b %d %H:%M:%S %Y",
52 b09c9aaa Sofia Papagiannaki
                "%A, %d-%b-%y %H:%M:%S GMT",
53 b09c9aaa Sofia Papagiannaki
                "%a, %d %b %Y %H:%M:%S GMT"]
54 b09c9aaa Sofia Papagiannaki
55 23028d31 Sofia Papagiannaki
DEFAULT_HOST = 'pithos.dev.grnet.gr'
56 23028d31 Sofia Papagiannaki
#DEFAULT_HOST = '127.0.0.1:8000'
57 23028d31 Sofia Papagiannaki
DEFAULT_API = 'v1'
58 f0eacc2c Sofia Papagiannaki
DEFAULT_USER = 'test'
59 f0eacc2c Sofia Papagiannaki
DEFAULT_AUTH = '0000'
60 b09c9aaa Sofia Papagiannaki
61 ae75584f Sofia Papagiannaki
OTHER_ACCOUNTS = {
62 ae75584f Sofia Papagiannaki
    '0001': 'verigak',
63 ae75584f Sofia Papagiannaki
    '0002': 'chazapis',
64 ae75584f Sofia Papagiannaki
    '0003': 'gtsouk',
65 ae75584f Sofia Papagiannaki
    '0004': 'papagian',
66 ae75584f Sofia Papagiannaki
    '0005': 'louridas',
67 ae75584f Sofia Papagiannaki
    '0006': 'chstath',
68 ae75584f Sofia Papagiannaki
    '0007': 'pkanavos',
69 e7b51248 Sofia Papagiannaki
    '0008': 'mvasilak',
70 e7b51248 Sofia Papagiannaki
    '0009': 'κούκης'}
71 ae75584f Sofia Papagiannaki
72 23028d31 Sofia Papagiannaki
class BaseTestCase(unittest.TestCase):
73 b09c9aaa Sofia Papagiannaki
    #TODO unauthorized request
74 b09c9aaa Sofia Papagiannaki
    def setUp(self):
75 f0eacc2c Sofia Papagiannaki
        self.client = Pithos_Client(DEFAULT_HOST,
76 f0eacc2c Sofia Papagiannaki
                                    DEFAULT_AUTH,
77 f0eacc2c Sofia Papagiannaki
                                    DEFAULT_USER,
78 f0eacc2c Sofia Papagiannaki
                                    DEFAULT_API)
79 f0eacc2c Sofia Papagiannaki
        self.invalid_client = Pithos_Client(DEFAULT_HOST,
80 f0eacc2c Sofia Papagiannaki
                                                  DEFAULT_AUTH,
81 f0eacc2c Sofia Papagiannaki
                                                  'invalid',
82 f0eacc2c Sofia Papagiannaki
                                                  DEFAULT_API)
83 f0eacc2c Sofia Papagiannaki
        #self.headers = {
84 f0eacc2c Sofia Papagiannaki
        #    'account': ('x-account-container-count',
85 f0eacc2c Sofia Papagiannaki
        #                'x-account-bytes-used',
86 f0eacc2c Sofia Papagiannaki
        #                'last-modified',
87 f0eacc2c Sofia Papagiannaki
        #                'content-length',
88 f0eacc2c Sofia Papagiannaki
        #                'date',
89 f0eacc2c Sofia Papagiannaki
        #                'content_type',
90 f0eacc2c Sofia Papagiannaki
        #                'server',),
91 f0eacc2c Sofia Papagiannaki
        #    'object': ('etag',
92 f0eacc2c Sofia Papagiannaki
        #               'content-length',
93 f0eacc2c Sofia Papagiannaki
        #               'content_type',
94 f0eacc2c Sofia Papagiannaki
        #               'content-encoding',
95 f0eacc2c Sofia Papagiannaki
        #               'last-modified',
96 f0eacc2c Sofia Papagiannaki
        #               'date',
97 f0eacc2c Sofia Papagiannaki
        #               'x-object-manifest',
98 f0eacc2c Sofia Papagiannaki
        #               'content-range',
99 f0eacc2c Sofia Papagiannaki
        #               'x-object-modified-by',
100 f0eacc2c Sofia Papagiannaki
        #               'x-object-version',
101 f0eacc2c Sofia Papagiannaki
        #               'x-object-version-timestamp',
102 f0eacc2c Sofia Papagiannaki
        #               'server',),
103 f0eacc2c Sofia Papagiannaki
        #    'container': ('x-container-object-count',
104 f0eacc2c Sofia Papagiannaki
        #                  'x-container-bytes-used',
105 f0eacc2c Sofia Papagiannaki
        #                  'content_type',
106 f0eacc2c Sofia Papagiannaki
        #                  'last-modified',
107 f0eacc2c Sofia Papagiannaki
        #                  'content-length',
108 f0eacc2c Sofia Papagiannaki
        #                  'date',
109 f0eacc2c Sofia Papagiannaki
        #                  'x-container-block-size',
110 f0eacc2c Sofia Papagiannaki
        #                  'x-container-block-hash',
111 f0eacc2c Sofia Papagiannaki
        #                  'x-container-policy-quota',
112 f0eacc2c Sofia Papagiannaki
        #                  'x-container-policy-versioning',
113 f0eacc2c Sofia Papagiannaki
        #                  'server',
114 f0eacc2c Sofia Papagiannaki
        #                  'x-container-object-meta',
115 f0eacc2c Sofia Papagiannaki
        #                  'x-container-policy-versioning',
116 f0eacc2c Sofia Papagiannaki
        #                  'server',)}
117 f0eacc2c Sofia Papagiannaki
        #
118 f0eacc2c Sofia Papagiannaki
        #self.contentTypes = {'xml':'application/xml',
119 f0eacc2c Sofia Papagiannaki
        #                     'json':'application/json',
120 f0eacc2c Sofia Papagiannaki
        #                     '':'text/plain'}
121 b09c9aaa Sofia Papagiannaki
        self.extended = {
122 b09c9aaa Sofia Papagiannaki
            'container':(
123 b09c9aaa Sofia Papagiannaki
                'name',
124 b09c9aaa Sofia Papagiannaki
                'count',
125 b09c9aaa Sofia Papagiannaki
                'bytes',
126 ae75584f Sofia Papagiannaki
                'last_modified',
127 ae75584f Sofia Papagiannaki
                'x_container_policy_quota',
128 ae75584f Sofia Papagiannaki
                'x_container_policy_versioning',),
129 b09c9aaa Sofia Papagiannaki
            'object':(
130 b09c9aaa Sofia Papagiannaki
                'name',
131 b09c9aaa Sofia Papagiannaki
                'hash',
132 b09c9aaa Sofia Papagiannaki
                'bytes',
133 b09c9aaa Sofia Papagiannaki
                'content_type',
134 b09c9aaa Sofia Papagiannaki
                'content_encoding',
135 b09c9aaa Sofia Papagiannaki
                'last_modified',)}
136 b09c9aaa Sofia Papagiannaki
        self.return_codes = (400, 401, 404, 503,)
137 25c3841c Sofia Papagiannaki
    
138 25c3841c Sofia Papagiannaki
    def tearDown(self):
139 25c3841c Sofia Papagiannaki
        for c in self.client.list_containers():
140 ae75584f Sofia Papagiannaki
            while True:
141 ae75584f Sofia Papagiannaki
                #list objects returns at most 10000 objects
142 ae75584f Sofia Papagiannaki
                #so repeat until there are no more objects
143 ae75584f Sofia Papagiannaki
                objects = self.client.list_objects(c)
144 ae75584f Sofia Papagiannaki
                if not objects:
145 ae75584f Sofia Papagiannaki
                    break
146 ae75584f Sofia Papagiannaki
                for o in objects:
147 ae75584f Sofia Papagiannaki
                    self.client.delete_object(c, o)
148 25c3841c Sofia Papagiannaki
            self.client.delete_container(c)
149 25c3841c Sofia Papagiannaki
    
150 23028d31 Sofia Papagiannaki
    def assert_status(self, status, codes):
151 b09c9aaa Sofia Papagiannaki
        l = [elem for elem in self.return_codes]
152 b09c9aaa Sofia Papagiannaki
        if type(codes) == types.ListType:
153 b09c9aaa Sofia Papagiannaki
            l.extend(codes)
154 b09c9aaa Sofia Papagiannaki
        else:
155 b09c9aaa Sofia Papagiannaki
            l.append(codes)
156 23028d31 Sofia Papagiannaki
        self.assertTrue(status in l)
157 23028d31 Sofia Papagiannaki
    
158 f0eacc2c Sofia Papagiannaki
    #def assert_headers(self, headers, type, **exp_meta):
159 f0eacc2c Sofia Papagiannaki
    #    prefix = 'x-%s-meta-' %type
160 f0eacc2c Sofia Papagiannaki
    #    system_headers = [h for h in headers if not h.startswith(prefix)]
161 f0eacc2c Sofia Papagiannaki
    #    for k,v in headers.items():
162 f0eacc2c Sofia Papagiannaki
    #        if k in system_headers:
163 f0eacc2c Sofia Papagiannaki
    #            self.assertTrue(k in headers[type])
164 f0eacc2c Sofia Papagiannaki
    #        elif exp_meta:
165 f0eacc2c Sofia Papagiannaki
    #            k = k.split(prefix)[-1]
166 f0eacc2c Sofia Papagiannaki
    #            self.assertEqual(v, exp_meta[k])
167 f0eacc2c Sofia Papagiannaki
    
168 ae75584f Sofia Papagiannaki
    def assert_extended(self, data, format, type, size=10000):
169 f0eacc2c Sofia Papagiannaki
        if format == 'xml':
170 f0eacc2c Sofia Papagiannaki
            self._assert_xml(data, type, size)
171 f0eacc2c Sofia Papagiannaki
        elif format == 'json':
172 f0eacc2c Sofia Papagiannaki
            self._assert_json(data, type, size)
173 f0eacc2c Sofia Papagiannaki
    
174 f0eacc2c Sofia Papagiannaki
    def _assert_json(self, data, type, size):
175 f0eacc2c Sofia Papagiannaki
        convert = lambda s: s.lower()
176 f0eacc2c Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
177 f0eacc2c Sofia Papagiannaki
        self.assertTrue(len(data) <= size)
178 f0eacc2c Sofia Papagiannaki
        for item in info:
179 f0eacc2c Sofia Papagiannaki
            for i in data:
180 f0eacc2c Sofia Papagiannaki
                if 'subdir' in i.keys():
181 f0eacc2c Sofia Papagiannaki
                    continue
182 f0eacc2c Sofia Papagiannaki
                self.assertTrue(item in i.keys())
183 f0eacc2c Sofia Papagiannaki
    
184 f0eacc2c Sofia Papagiannaki
    def _assert_xml(self, data, type, size):
185 f0eacc2c Sofia Papagiannaki
        convert = lambda s: s.lower()
186 f0eacc2c Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
187 f0eacc2c Sofia Papagiannaki
        try:
188 f0eacc2c Sofia Papagiannaki
            info.remove('content_encoding')
189 f0eacc2c Sofia Papagiannaki
        except ValueError:
190 f0eacc2c Sofia Papagiannaki
            pass
191 f0eacc2c Sofia Papagiannaki
        xml = data
192 f0eacc2c Sofia Papagiannaki
        entities = xml.getElementsByTagName(type)
193 f0eacc2c Sofia Papagiannaki
        self.assertTrue(len(entities) <= size)
194 f0eacc2c Sofia Papagiannaki
        for e in entities:
195 f0eacc2c Sofia Papagiannaki
            for item in info:
196 ae75584f Sofia Papagiannaki
                self.assertTrue(e.getElementsByTagName(item))
197 23028d31 Sofia Papagiannaki
    
198 23028d31 Sofia Papagiannaki
    def assert_raises_fault(self, status, callableObj, *args, **kwargs):
199 23028d31 Sofia Papagiannaki
        """
200 23028d31 Sofia Papagiannaki
        asserts that a Fault with a specific status is raised
201 23028d31 Sofia Papagiannaki
        when callableObj is called with the specific arguments
202 23028d31 Sofia Papagiannaki
        """
203 23028d31 Sofia Papagiannaki
        try:
204 ae75584f Sofia Papagiannaki
            r = callableObj(*args, **kwargs)
205 23028d31 Sofia Papagiannaki
            self.fail('Should never reach here')
206 23028d31 Sofia Papagiannaki
        except Fault, f:
207 23028d31 Sofia Papagiannaki
            self.failUnless(f.status == status)
208 23028d31 Sofia Papagiannaki
    
209 e7b51248 Sofia Papagiannaki
    def assert_not_raises_fault(self, status, callableObj, *args, **kwargs):
210 e7b51248 Sofia Papagiannaki
        """
211 e7b51248 Sofia Papagiannaki
        asserts that a Fault with a specific status is not raised
212 e7b51248 Sofia Papagiannaki
        when callableObj is called with the specific arguments
213 e7b51248 Sofia Papagiannaki
        """
214 e7b51248 Sofia Papagiannaki
        try:
215 e7b51248 Sofia Papagiannaki
            r = callableObj(*args, **kwargs)
216 e7b51248 Sofia Papagiannaki
        except Fault, f:
217 e7b51248 Sofia Papagiannaki
            self.failIf(f.status == status)
218 e7b51248 Sofia Papagiannaki
    
219 25c3841c Sofia Papagiannaki
    def assert_container_exists(self, container):
220 25c3841c Sofia Papagiannaki
        """
221 25c3841c Sofia Papagiannaki
        asserts the existence of a container
222 25c3841c Sofia Papagiannaki
        """
223 25c3841c Sofia Papagiannaki
        try:
224 25c3841c Sofia Papagiannaki
            self.client.retrieve_container_metadata(container)
225 25c3841c Sofia Papagiannaki
        except Fault, f:
226 25c3841c Sofia Papagiannaki
            self.failIf(f.status == 404)
227 25c3841c Sofia Papagiannaki
    
228 e7b51248 Sofia Papagiannaki
    def assert_container_not_exists(self, container):
229 e7b51248 Sofia Papagiannaki
        """
230 e7b51248 Sofia Papagiannaki
        asserts there is no such a container
231 e7b51248 Sofia Papagiannaki
        """
232 e7b51248 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_container_metadata,
233 e7b51248 Sofia Papagiannaki
                                 container)
234 e7b51248 Sofia Papagiannaki
    
235 23028d31 Sofia Papagiannaki
    def assert_object_exists(self, container, object):
236 23028d31 Sofia Papagiannaki
        """
237 23028d31 Sofia Papagiannaki
        asserts the existence of an object
238 23028d31 Sofia Papagiannaki
        """
239 23028d31 Sofia Papagiannaki
        try:
240 23028d31 Sofia Papagiannaki
            self.client.retrieve_object_metadata(container, object)
241 23028d31 Sofia Papagiannaki
        except Fault, f:
242 23028d31 Sofia Papagiannaki
            self.failIf(f.status == 404)
243 23028d31 Sofia Papagiannaki
    
244 23028d31 Sofia Papagiannaki
    def assert_object_not_exists(self, container, object):
245 23028d31 Sofia Papagiannaki
        """
246 23028d31 Sofia Papagiannaki
        asserts there is no such an object
247 23028d31 Sofia Papagiannaki
        """
248 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object_metadata,
249 23028d31 Sofia Papagiannaki
                                 container, object)
250 25c3841c Sofia Papagiannaki
    
251 23028d31 Sofia Papagiannaki
    def upload_random_data(self, container, name, length=1024, type=None,
252 23028d31 Sofia Papagiannaki
                           enc=None, **meta):
253 33ffca25 Sofia Papagiannaki
        data = get_random_data(length)
254 23028d31 Sofia Papagiannaki
        return self.upload_data(container, name, data, type, enc, **meta)
255 25c3841c Sofia Papagiannaki
    
256 23028d31 Sofia Papagiannaki
    def upload_data(self, container, name, data, type=None, enc=None, etag=None,
257 23028d31 Sofia Papagiannaki
                    **meta):
258 b09c9aaa Sofia Papagiannaki
        obj = {}
259 b09c9aaa Sofia Papagiannaki
        obj['name'] = name
260 b09c9aaa Sofia Papagiannaki
        try:
261 b09c9aaa Sofia Papagiannaki
            obj['data'] = data
262 d1e43d6f Sofia Papagiannaki
            obj['hash'] = compute_md5_hash(obj['data'])
263 33ffca25 Sofia Papagiannaki
            
264 25c3841c Sofia Papagiannaki
            args = {}
265 25c3841c Sofia Papagiannaki
            args['etag'] = etag if etag else obj['hash']
266 25c3841c Sofia Papagiannaki
            
267 ae75584f Sofia Papagiannaki
            try:
268 ae75584f Sofia Papagiannaki
                guess = mimetypes.guess_type(name)
269 ae75584f Sofia Papagiannaki
                type = type if type else guess[0]
270 ae75584f Sofia Papagiannaki
                enc = enc if enc else guess[1]
271 ae75584f Sofia Papagiannaki
            except:
272 ae75584f Sofia Papagiannaki
                pass
273 25c3841c Sofia Papagiannaki
            args['content_type'] = type if type else 'plain/text'
274 25c3841c Sofia Papagiannaki
            args['content_encoding'] = enc if enc else None
275 25c3841c Sofia Papagiannaki
            
276 25c3841c Sofia Papagiannaki
            obj['meta'] = args
277 23028d31 Sofia Papagiannaki
            
278 23028d31 Sofia Papagiannaki
            path = '/%s/%s' % (container, name)
279 25c3841c Sofia Papagiannaki
            self.client.create_object(container, name, StringIO(obj['data']),
280 25c3841c Sofia Papagiannaki
                                      meta, **args)
281 25c3841c Sofia Papagiannaki
            
282 25c3841c Sofia Papagiannaki
            return obj
283 b09c9aaa Sofia Papagiannaki
        except IOError:
284 b09c9aaa Sofia Papagiannaki
            return
285 b09c9aaa Sofia Papagiannaki
286 d1e43d6f Sofia Papagiannaki
class AccountHead(BaseTestCase):
287 d1e43d6f Sofia Papagiannaki
    def setUp(self):
288 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
289 d1e43d6f Sofia Papagiannaki
        self.account = 'test'
290 d1e43d6f Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
291 d1e43d6f Sofia Papagiannaki
        for item in self.containers:
292 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
293 7812e1f9 Sofia Papagiannaki
        
294 7812e1f9 Sofia Papagiannaki
                #keep track of initial account groups
295 7812e1f9 Sofia Papagiannaki
        self.initial_groups = self.client.retrieve_account_groups()
296 7812e1f9 Sofia Papagiannaki
        
297 7812e1f9 Sofia Papagiannaki
        #keep track of initial account meta
298 7812e1f9 Sofia Papagiannaki
        self.initial_meta = self.client.retrieve_account_metadata(restricted=True)
299 7812e1f9 Sofia Papagiannaki
        
300 7812e1f9 Sofia Papagiannaki
        meta = {'foo':'bar'}
301 7812e1f9 Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
302 7812e1f9 Sofia Papagiannaki
        self.updated_meta = self.initial_meta.update(meta)
303 25c3841c Sofia Papagiannaki
    
304 f0eacc2c Sofia Papagiannaki
    def tearDown(self):
305 7812e1f9 Sofia Papagiannaki
        #delete additionally created meta
306 7812e1f9 Sofia Papagiannaki
        l = []
307 7812e1f9 Sofia Papagiannaki
        for m in self.client.retrieve_account_metadata(restricted=True):
308 7812e1f9 Sofia Papagiannaki
            if m not in self.initial_meta:
309 7812e1f9 Sofia Papagiannaki
                l.append(m)
310 7812e1f9 Sofia Papagiannaki
        self.client.delete_account_metadata(l)
311 7812e1f9 Sofia Papagiannaki
        
312 7812e1f9 Sofia Papagiannaki
        #delete additionally created groups
313 7812e1f9 Sofia Papagiannaki
        l = []
314 7812e1f9 Sofia Papagiannaki
        for g in self.client.retrieve_account_groups():
315 7812e1f9 Sofia Papagiannaki
            if g not in self.initial_groups:
316 7812e1f9 Sofia Papagiannaki
                l.append(g)
317 7812e1f9 Sofia Papagiannaki
        self.client.unset_account_groups(l)
318 7812e1f9 Sofia Papagiannaki
        
319 f0eacc2c Sofia Papagiannaki
        BaseTestCase.tearDown(self)
320 f0eacc2c Sofia Papagiannaki
    
321 d1e43d6f Sofia Papagiannaki
    def test_get_account_meta(self):
322 25c3841c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata()
323 23028d31 Sofia Papagiannaki
        
324 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
325 33ffca25 Sofia Papagiannaki
        l = str(len(containers))
326 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['x-account-container-count'], l)
327 d1e43d6f Sofia Papagiannaki
        size = 0
328 d1e43d6f Sofia Papagiannaki
        for c in containers:
329 25c3841c Sofia Papagiannaki
            m = self.client.retrieve_container_metadata(c)
330 25c3841c Sofia Papagiannaki
            size = size + int(m['x-container-bytes-used'])
331 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['x-account-bytes-used'], str(size))
332 25c3841c Sofia Papagiannaki
    
333 f0eacc2c Sofia Papagiannaki
    def test_get_account_401(self):
334 f0eacc2c Sofia Papagiannaki
        self.assert_raises_fault(401,
335 f0eacc2c Sofia Papagiannaki
                                 self.invalid_client.retrieve_account_metadata)
336 f0eacc2c Sofia Papagiannaki
    
337 f0eacc2c Sofia Papagiannaki
    def test_get_account_meta_until(self):
338 f0eacc2c Sofia Papagiannaki
        t = datetime.datetime.utcnow()
339 f0eacc2c Sofia Papagiannaki
        past = t - datetime.timedelta(minutes=-15)
340 f0eacc2c Sofia Papagiannaki
        past = int(_time.mktime(past.timetuple()))
341 f0eacc2c Sofia Papagiannaki
        
342 7812e1f9 Sofia Papagiannaki
        meta = {'premium':True}
343 f0eacc2c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
344 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True,
345 f0eacc2c Sofia Papagiannaki
                                                     until=past)
346 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' not in meta)
347 f0eacc2c Sofia Papagiannaki
        
348 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True)
349 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' in meta)
350 f0eacc2c Sofia Papagiannaki
    
351 f0eacc2c Sofia Papagiannaki
    def test_get_account_meta_until_invalid_date(self):
352 7812e1f9 Sofia Papagiannaki
        meta = {'premium':True}
353 f0eacc2c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
354 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True,
355 f0eacc2c Sofia Papagiannaki
                                                     until='kshfksfh')
356 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' in meta)
357 ae75584f Sofia Papagiannaki
    
358 d1e43d6f Sofia Papagiannaki
class AccountGet(BaseTestCase):
359 b09c9aaa Sofia Papagiannaki
    def setUp(self):
360 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
361 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
362 b09c9aaa Sofia Papagiannaki
        #create some containers
363 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
364 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
365 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
366 25c3841c Sofia Papagiannaki
    
367 b09c9aaa Sofia Papagiannaki
    def test_list(self):
368 b09c9aaa Sofia Papagiannaki
        #list containers
369 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
370 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers, containers)
371 25c3841c Sofia Papagiannaki
    
372 f0eacc2c Sofia Papagiannaki
    def test_list_401(self):
373 f0eacc2c Sofia Papagiannaki
        self.assert_raises_fault(401, self.invalid_client.list_containers)
374 25c3841c Sofia Papagiannaki
    
375 b09c9aaa Sofia Papagiannaki
    def test_list_with_limit(self):
376 b09c9aaa Sofia Papagiannaki
        limit = 2
377 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=limit)
378 b09c9aaa Sofia Papagiannaki
        self.assertEquals(len(containers), limit)
379 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers[:2], containers)
380 25c3841c Sofia Papagiannaki
    
381 b09c9aaa Sofia Papagiannaki
    def test_list_with_marker(self):
382 33ffca25 Sofia Papagiannaki
        l = 2
383 33ffca25 Sofia Papagiannaki
        m = 'bananas'
384 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m)
385 33ffca25 Sofia Papagiannaki
        i = self.containers.index(m) + 1
386 33ffca25 Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+l)], containers)
387 b09c9aaa Sofia Papagiannaki
        
388 33ffca25 Sofia Papagiannaki
        m = 'oranges'
389 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m)
390 33ffca25 Sofia Papagiannaki
        i = self.containers.index(m) + 1
391 33ffca25 Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+l)], containers)
392 25c3841c Sofia Papagiannaki
    
393 b09c9aaa Sofia Papagiannaki
    def test_list_json_with_marker(self):
394 33ffca25 Sofia Papagiannaki
        l = 2
395 33ffca25 Sofia Papagiannaki
        m = 'bananas'
396 f0eacc2c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m, format='json')
397 f0eacc2c Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', l)
398 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'kiwis')
399 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[1]['name'], 'oranges')
400 25c3841c Sofia Papagiannaki
    
401 f0eacc2c Sofia Papagiannaki
    def test_list_xml_with_marker(self):
402 f0eacc2c Sofia Papagiannaki
        l = 2
403 f0eacc2c Sofia Papagiannaki
        m = 'oranges'
404 f0eacc2c Sofia Papagiannaki
        xml = self.client.list_containers(limit=l, marker=m, format='xml')
405 ae75584f Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', l)
406 f0eacc2c Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
407 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(nodes), 1)
408 f0eacc2c Sofia Papagiannaki
        self.assertEqual(nodes[0].childNodes[0].data, 'pears')
409 25c3841c Sofia Papagiannaki
    
410 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
411 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
412 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
413 d1e43d6f Sofia Papagiannaki
        
414 d1e43d6f Sofia Papagiannaki
        #add a new container
415 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
416 25c3841c Sofia Papagiannaki
        
417 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
418 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
419 25c3841c Sofia Papagiannaki
            try:
420 25c3841c Sofia Papagiannaki
                c = self.client.list_containers(if_modified_since=past)
421 25c3841c Sofia Papagiannaki
                self.assertEqual(len(c), len(self.containers) + 1)
422 25c3841c Sofia Papagiannaki
            except Fault, f:
423 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304) #fail if not modified
424 25c3841c Sofia Papagiannaki
    
425 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
426 25c3841c Sofia Papagiannaki
        c = self.client.list_containers(if_modified_since='')
427 25c3841c Sofia Papagiannaki
        self.assertEqual(len(c), len(self.containers))
428 25c3841c Sofia Papagiannaki
    
429 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
430 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
431 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
432 d1e43d6f Sofia Papagiannaki
        
433 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
434 25c3841c Sofia Papagiannaki
            args = {'if_modified_since':'%s' %since.strftime(f)}
435 25c3841c Sofia Papagiannaki
            
436 d1e43d6f Sofia Papagiannaki
            #assert not modified
437 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.list_containers, **args)
438 25c3841c Sofia Papagiannaki
    
439 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
440 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
441 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
442 d1e43d6f Sofia Papagiannaki
        
443 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
444 25c3841c Sofia Papagiannaki
            c = self.client.list_containers(if_unmodified_since=since.strftime(f))
445 d1e43d6f Sofia Papagiannaki
            
446 d1e43d6f Sofia Papagiannaki
            #assert success
447 25c3841c Sofia Papagiannaki
            self.assertEqual(self.containers, c)
448 25c3841c Sofia Papagiannaki
    
449 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
450 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
451 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
452 d1e43d6f Sofia Papagiannaki
        
453 d1e43d6f Sofia Papagiannaki
        #add a new container
454 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
455 d1e43d6f Sofia Papagiannaki
        
456 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
457 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
458 d1e43d6f Sofia Papagiannaki
            
459 25c3841c Sofia Papagiannaki
            args = {'if_unmodified_since':'%s' %past}
460 25c3841c Sofia Papagiannaki
            
461 23028d31 Sofia Papagiannaki
            #assert precondition failed
462 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.list_containers, **args)
463 25c3841c Sofia Papagiannaki
    
464 d1e43d6f Sofia Papagiannaki
class AccountPost(BaseTestCase):
465 b09c9aaa Sofia Papagiannaki
    def setUp(self):
466 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
467 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
468 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
469 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
470 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
471 cd6ada1d Sofia Papagiannaki
        
472 cd6ada1d Sofia Papagiannaki
        #keep track of initial account groups
473 cd6ada1d Sofia Papagiannaki
        self.initial_groups = self.client.retrieve_account_groups()
474 cd6ada1d Sofia Papagiannaki
        
475 cd6ada1d Sofia Papagiannaki
        #keep track of initial account meta
476 cd6ada1d Sofia Papagiannaki
        self.initial_meta = self.client.retrieve_account_metadata(restricted=True)
477 cd6ada1d Sofia Papagiannaki
        
478 cd6ada1d Sofia Papagiannaki
        meta = {'foo':'bar'}
479 25c3841c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
480 cd6ada1d Sofia Papagiannaki
        self.updated_meta = self.initial_meta.update(meta)
481 23028d31 Sofia Papagiannaki
    
482 cd6ada1d Sofia Papagiannaki
    def tearDown(self):
483 cd6ada1d Sofia Papagiannaki
        #delete additionally created meta
484 cd6ada1d Sofia Papagiannaki
        l = []
485 cd6ada1d Sofia Papagiannaki
        for m in self.client.retrieve_account_metadata(restricted=True):
486 cd6ada1d Sofia Papagiannaki
            if m not in self.initial_meta:
487 cd6ada1d Sofia Papagiannaki
                l.append(m)
488 cd6ada1d Sofia Papagiannaki
        self.client.delete_account_metadata(l)
489 cd6ada1d Sofia Papagiannaki
        
490 cd6ada1d Sofia Papagiannaki
        #delete additionally created groups
491 cd6ada1d Sofia Papagiannaki
        l = []
492 cd6ada1d Sofia Papagiannaki
        for g in self.client.retrieve_account_groups():
493 cd6ada1d Sofia Papagiannaki
            if g not in self.initial_groups:
494 cd6ada1d Sofia Papagiannaki
                l.append(g)
495 cd6ada1d Sofia Papagiannaki
        self.client.unset_account_groups(l)
496 cd6ada1d Sofia Papagiannaki
        
497 cd6ada1d Sofia Papagiannaki
        BaseTestCase.tearDown(self)
498 cd6ada1d Sofia Papagiannaki
    
499 cd6ada1d Sofia Papagiannaki
    def test_update_meta(self):
500 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
501 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
502 cd6ada1d Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
503 cd6ada1d Sofia Papagiannaki
            
504 cd6ada1d Sofia Papagiannaki
            meta.update(self.initial_meta)
505 cd6ada1d Sofia Papagiannaki
            self.assertEqual(meta,
506 cd6ada1d Sofia Papagiannaki
                             self.client.retrieve_account_metadata(
507 cd6ada1d Sofia Papagiannaki
                                restricted=True))
508 cd6ada1d Sofia Papagiannaki
        
509 f0eacc2c Sofia Papagiannaki
    def test_invalid_account_update_meta(self):
510 cd6ada1d Sofia Papagiannaki
        meta = {'test':'test', 'tost':'tost'}
511 f0eacc2c Sofia Papagiannaki
        self.assert_raises_fault(401,
512 f0eacc2c Sofia Papagiannaki
                                 self.invalid_client.update_account_metadata,
513 f0eacc2c Sofia Papagiannaki
                                 **meta)
514 cd6ada1d Sofia Papagiannaki
    
515 cd6ada1d Sofia Papagiannaki
    def test_reset_meta(self):
516 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
517 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
518 cd6ada1d Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
519 cd6ada1d Sofia Papagiannaki
            
520 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test33'}
521 cd6ada1d Sofia Papagiannaki
            self.client.reset_account_metadata(**meta)
522 cd6ada1d Sofia Papagiannaki
            
523 cd6ada1d Sofia Papagiannaki
            self.assertEqual(meta, self.client.retrieve_account_metadata(restricted=True))
524 cd6ada1d Sofia Papagiannaki
    
525 7812e1f9 Sofia Papagiannaki
    def test_delete_meta(self):
526 7812e1f9 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
527 7812e1f9 Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
528 7812e1f9 Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
529 7812e1f9 Sofia Papagiannaki
            
530 7812e1f9 Sofia Papagiannaki
            self.client.delete_account_metadata(meta.keys())
531 7812e1f9 Sofia Papagiannaki
            
532 7812e1f9 Sofia Papagiannaki
            account_meta = self.client.retrieve_account_metadata(restricted=True)
533 7812e1f9 Sofia Papagiannaki
            for m in meta:
534 7812e1f9 Sofia Papagiannaki
                self.assertTrue(m not in account_meta.keys())
535 cd6ada1d Sofia Papagiannaki
    
536 cd6ada1d Sofia Papagiannaki
    def test_set_account_groups(self):
537 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
538 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis'}
539 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
540 cd6ada1d Sofia Papagiannaki
            
541 cd6ada1d Sofia Papagiannaki
            self.assertEqual(groups, self.client.retrieve_account_groups())
542 cd6ada1d Sofia Papagiannaki
            
543 cd6ada1d Sofia Papagiannaki
            more_groups = {'clientsdev':'pkanavos,mvasilak'}
544 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**more_groups)
545 cd6ada1d Sofia Papagiannaki
            
546 cd6ada1d Sofia Papagiannaki
            groups.update(more_groups)
547 e7b51248 Sofia Papagiannaki
            self.assertEqual(set(groups['pithosdev']),
548 e7b51248 Sofia Papagiannaki
                             set(self.client.retrieve_account_groups()['pithosdev']))
549 cd6ada1d Sofia Papagiannaki
    
550 cd6ada1d Sofia Papagiannaki
    def test_reset_account_groups(self):
551 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
552 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis',
553 cd6ada1d Sofia Papagiannaki
                      'clientsdev':'pkanavos,mvasilak'}
554 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
555 cd6ada1d Sofia Papagiannaki
            
556 cd6ada1d Sofia Papagiannaki
            self.assertEqual(groups, self.client.retrieve_account_groups())
557 cd6ada1d Sofia Papagiannaki
            
558 e7b51248 Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis,papagian'}
559 cd6ada1d Sofia Papagiannaki
            self.client.reset_account_groups(**groups)
560 cd6ada1d Sofia Papagiannaki
            
561 e7b51248 Sofia Papagiannaki
            print '#', groups, self.client.retrieve_account_groups()
562 e7b51248 Sofia Papagiannaki
            self.assertEqual(groups['pithosdev'].split(','),
563 e7b51248 Sofia Papagiannaki
                             self.client.retrieve_account_groups()['pithosdev'].split(','))
564 cd6ada1d Sofia Papagiannaki
    
565 cd6ada1d Sofia Papagiannaki
    def test_delete_account_groups(self):
566 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
567 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis',
568 cd6ada1d Sofia Papagiannaki
                      'clientsdev':'pkanavos,mvasilak'}
569 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
570 cd6ada1d Sofia Papagiannaki
            
571 cd6ada1d Sofia Papagiannaki
            self.client.unset_account_groups(groups.keys())
572 cd6ada1d Sofia Papagiannaki
            
573 cd6ada1d Sofia Papagiannaki
            self.assertEqual({}, self.client.retrieve_account_groups())
574 cd6ada1d Sofia Papagiannaki
    
575 d1e43d6f Sofia Papagiannaki
class ContainerHead(BaseTestCase):
576 d1e43d6f Sofia Papagiannaki
    def setUp(self):
577 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
578 d1e43d6f Sofia Papagiannaki
        self.account = 'test'
579 d1e43d6f Sofia Papagiannaki
        self.container = 'apples'
580 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
581 25c3841c Sofia Papagiannaki
    
582 d1e43d6f Sofia Papagiannaki
    def test_get_meta(self):
583 23028d31 Sofia Papagiannaki
        meta = {'trash':'true'}
584 d1e43d6f Sofia Papagiannaki
        t1 = datetime.datetime.utcnow()
585 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.container, o_names[0], **meta)
586 d1e43d6f Sofia Papagiannaki
        if o:
587 25c3841c Sofia Papagiannaki
            headers = self.client.retrieve_container_metadata(self.container)
588 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['x-container-object-count'], '1')
589 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['x-container-bytes-used'], str(len(o['data'])))
590 23028d31 Sofia Papagiannaki
            t2 = datetime.datetime.strptime(headers['last-modified'], DATE_FORMATS[2])
591 d1e43d6f Sofia Papagiannaki
            delta = (t2 - t1)
592 d1e43d6f Sofia Papagiannaki
            threashold = datetime.timedelta(seconds=1) 
593 d1e43d6f Sofia Papagiannaki
            self.assertTrue(delta < threashold)
594 23028d31 Sofia Papagiannaki
            self.assertTrue(headers['x-container-object-meta'])
595 23028d31 Sofia Papagiannaki
            self.assertTrue('Trash' in headers['x-container-object-meta'])
596 d1e43d6f Sofia Papagiannaki
597 d1e43d6f Sofia Papagiannaki
class ContainerGet(BaseTestCase):
598 b09c9aaa Sofia Papagiannaki
    def setUp(self):
599 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
600 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
601 b09c9aaa Sofia Papagiannaki
        self.container = ['pears', 'apples']
602 b09c9aaa Sofia Papagiannaki
        for c in self.container:
603 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
604 b09c9aaa Sofia Papagiannaki
        self.obj = []
605 b09c9aaa Sofia Papagiannaki
        for o in o_names[:8]:
606 23028d31 Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.container[0], o))
607 b09c9aaa Sofia Papagiannaki
        for o in o_names[8:]:
608 23028d31 Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.container[1], o))
609 25c3841c Sofia Papagiannaki
    
610 b09c9aaa Sofia Papagiannaki
    def test_list_objects(self):
611 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[0])
612 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
613 b09c9aaa Sofia Papagiannaki
        l.sort()
614 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l)
615 25c3841c Sofia Papagiannaki
    
616 ae75584f Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
617 ae75584f Sofia Papagiannaki
        self.client.create_container('test')
618 ae75584f Sofia Papagiannaki
        self.upload_random_data('test', '/objectname')
619 ae75584f Sofia Papagiannaki
        
620 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test')
621 ae75584f Sofia Papagiannaki
        self.assertEqual(objects, ['/objectname'])
622 ae75584f Sofia Papagiannaki
        
623 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test', format='json')
624 ae75584f Sofia Papagiannaki
        self.assertEqual(objects[0]['name'], '/objectname')
625 ae75584f Sofia Papagiannaki
        
626 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test', format='xml')
627 ae75584f Sofia Papagiannaki
        self.assert_extended(objects, 'xml', 'object')
628 ae75584f Sofia Papagiannaki
        node_name = objects.getElementsByTagName('name')[0]
629 ae75584f Sofia Papagiannaki
        self.assertEqual(node_name.firstChild.data, '/objectname')
630 ae75584f Sofia Papagiannaki
        
631 ae75584f Sofia Papagiannaki
        #objects = self.client.list_objects('test', prefix='/')
632 ae75584f Sofia Papagiannaki
        #self.assertEqual(objects, ['/objectname'])
633 ae75584f Sofia Papagiannaki
        #
634 ae75584f Sofia Papagiannaki
        #objects = self.client.list_objects('test', path='/')
635 ae75584f Sofia Papagiannaki
        #self.assertEqual(objects, ['/objectname'])
636 ae75584f Sofia Papagiannaki
        #
637 ae75584f Sofia Papagiannaki
        #objects = self.client.list_objects('test', prefix='/', delimiter='n')
638 ae75584f Sofia Papagiannaki
        #self.assertEqual(objects, ['/object'])
639 ae75584f Sofia Papagiannaki
640 b09c9aaa Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
641 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[0], limit=2)
642 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
643 b09c9aaa Sofia Papagiannaki
        l.sort()
644 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l[:2])
645 b09c9aaa Sofia Papagiannaki
        
646 b09c9aaa Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
647 b09c9aaa Sofia Papagiannaki
                   'moms_birthday.jpg']
648 b09c9aaa Sofia Papagiannaki
        limit = 4
649 b09c9aaa Sofia Papagiannaki
        for m in markers:
650 25c3841c Sofia Papagiannaki
            objects = self.client.list_objects(self.container[0], limit=limit,
651 25c3841c Sofia Papagiannaki
                                               marker=m)
652 b09c9aaa Sofia Papagiannaki
            l = [elem['name'] for elem in self.obj[:8]]
653 b09c9aaa Sofia Papagiannaki
            l.sort()
654 b09c9aaa Sofia Papagiannaki
            start = l.index(m) + 1
655 b09c9aaa Sofia Papagiannaki
            end = start + limit
656 b09c9aaa Sofia Papagiannaki
            end = len(l) >= end and end or len(l)
657 b09c9aaa Sofia Papagiannaki
            self.assertEqual(objects, l[start:end])
658 25c3841c Sofia Papagiannaki
    
659 ae75584f Sofia Papagiannaki
    #takes too long
660 e7b51248 Sofia Papagiannaki
    def _test_list_limit_exceeds(self):
661 e7b51248 Sofia Papagiannaki
        self.client.create_container('pithos')
662 e7b51248 Sofia Papagiannaki
        
663 e7b51248 Sofia Papagiannaki
        for i in range(10001):
664 e7b51248 Sofia Papagiannaki
            self.client.create_zero_length_object('pithos', i)
665 e7b51248 Sofia Papagiannaki
        
666 e7b51248 Sofia Papagiannaki
        self.assertEqual(10000, len(self.client.list_objects('pithos')))
667 ae75584f Sofia Papagiannaki
    
668 ae75584f Sofia Papagiannaki
    def test_list_empty_params(self):
669 ae75584f Sofia Papagiannaki
        objects = self.client.get('/%s' % self.container[0])[2]
670 ae75584f Sofia Papagiannaki
        if objects:
671 ae75584f Sofia Papagiannaki
            objects = objects.strip().split('\n')
672 ae75584f Sofia Papagiannaki
        self.assertEqual(objects,
673 ae75584f Sofia Papagiannaki
                         self.client.list_objects(self.container[0]))
674 ae75584f Sofia Papagiannaki
    
675 b09c9aaa Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
676 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], prefix='photos',
677 25c3841c Sofia Papagiannaki
                                           delimiter='/')
678 33ffca25 Sofia Papagiannaki
        self.assertEquals(['photos/animals/', 'photos/me.jpg',
679 33ffca25 Sofia Papagiannaki
                           'photos/plants/'], objects)
680 b09c9aaa Sofia Papagiannaki
        
681 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1],
682 25c3841c Sofia Papagiannaki
                                           prefix='photos/animals',
683 25c3841c Sofia Papagiannaki
                                           delimiter='/')
684 33ffca25 Sofia Papagiannaki
        l = ['photos/animals/cats/', 'photos/animals/dogs/']
685 23028d31 Sofia Papagiannaki
        self.assertEquals(l, objects)
686 b09c9aaa Sofia Papagiannaki
        
687 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], path='photos')
688 b09c9aaa Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
689 25c3841c Sofia Papagiannaki
    
690 b09c9aaa Sofia Papagiannaki
    def test_extended_list_json(self):
691 f0eacc2c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], format='json',
692 25c3841c Sofia Papagiannaki
                                           limit=2, prefix='photos/animals',
693 25c3841c Sofia Papagiannaki
                                           delimiter='/')
694 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
695 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
696 25c3841c Sofia Papagiannaki
    
697 f0eacc2c Sofia Papagiannaki
    def test_extended_list_xml(self):
698 f0eacc2c Sofia Papagiannaki
        xml = self.client.list_objects(self.container[1], format='xml', limit=4,
699 f0eacc2c Sofia Papagiannaki
                                       prefix='photos', delimiter='/')
700 ae75584f Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
701 f0eacc2c Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
702 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
703 f0eacc2c Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
704 f0eacc2c Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
705 f0eacc2c Sofia Papagiannaki
        
706 f0eacc2c Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
707 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
708 f0eacc2c Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
709 25c3841c Sofia Papagiannaki
    
710 3364a52a Sofia Papagiannaki
    def test_list_meta_double_matching(self):
711 23028d31 Sofia Papagiannaki
        meta = {'quality':'aaa', 'stock':'true'}
712 23028d31 Sofia Papagiannaki
        self.client.update_object_metadata(self.container[0],
713 23028d31 Sofia Papagiannaki
                                           self.obj[0]['name'], **meta)
714 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,Stock')
715 3364a52a Sofia Papagiannaki
        self.assertEqual(len(obj), 1)
716 3364a52a Sofia Papagiannaki
        self.assertTrue(obj, self.obj[0]['name'])
717 25c3841c Sofia Papagiannaki
    
718 b09c9aaa Sofia Papagiannaki
    def test_list_using_meta(self):
719 23028d31 Sofia Papagiannaki
        meta = {'quality':'aaa'}
720 b09c9aaa Sofia Papagiannaki
        for o in self.obj[:2]:
721 23028d31 Sofia Papagiannaki
            self.client.update_object_metadata(self.container[0], o['name'],
722 23028d31 Sofia Papagiannaki
                                               **meta)
723 23028d31 Sofia Papagiannaki
        meta = {'stock':'true'}
724 b09c9aaa Sofia Papagiannaki
        for o in self.obj[3:5]:
725 23028d31 Sofia Papagiannaki
            self.client.update_object_metadata(self.container[0], o['name'],
726 23028d31 Sofia Papagiannaki
                                               **meta)
727 23028d31 Sofia Papagiannaki
        
728 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality')
729 25c3841c Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
730 25c3841c Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
731 b09c9aaa Sofia Papagiannaki
        
732 b09c9aaa Sofia Papagiannaki
        # test case insensitive
733 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='quality')
734 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
735 86dacd7f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
736 b09c9aaa Sofia Papagiannaki
        
737 b09c9aaa Sofia Papagiannaki
        # test multiple matches
738 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,Stock')
739 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 4)
740 86dacd7f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:4]])
741 b09c9aaa Sofia Papagiannaki
        
742 b09c9aaa Sofia Papagiannaki
        # test non 1-1 multiple match
743 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,aaaa')
744 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
745 d1e43d6f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
746 25c3841c Sofia Papagiannaki
    
747 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
748 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
749 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
750 d1e43d6f Sofia Papagiannaki
        
751 23028d31 Sofia Papagiannaki
        #add a new object
752 23028d31 Sofia Papagiannaki
        self.upload_random_data(self.container[0], o_names[0])
753 25c3841c Sofia Papagiannaki
        
754 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
755 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
756 25c3841c Sofia Papagiannaki
            try:
757 25c3841c Sofia Papagiannaki
                o = self.client.list_objects(self.container[0],
758 25c3841c Sofia Papagiannaki
                                            if_modified_since=past)
759 25c3841c Sofia Papagiannaki
                self.assertEqual(o,
760 25c3841c Sofia Papagiannaki
                                 self.client.list_objects(self.container[0]))
761 25c3841c Sofia Papagiannaki
            except Fault, f:
762 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304) #fail if not modified
763 25c3841c Sofia Papagiannaki
    
764 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
765 23028d31 Sofia Papagiannaki
        headers = {'if-modified-since':''}
766 25c3841c Sofia Papagiannaki
        o = self.client.list_objects(self.container[0], if_modified_since='')
767 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.client.list_objects(self.container[0]))
768 25c3841c Sofia Papagiannaki
    
769 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
770 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
771 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
772 d1e43d6f Sofia Papagiannaki
        
773 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
774 25c3841c Sofia Papagiannaki
            args = {'if_modified_since':'%s' %since.strftime(f)}
775 25c3841c Sofia Papagiannaki
            
776 d1e43d6f Sofia Papagiannaki
            #assert not modified
777 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.list_objects,
778 25c3841c Sofia Papagiannaki
                                     self.container[0], **args)
779 23028d31 Sofia Papagiannaki
    
780 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
781 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
782 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
783 d1e43d6f Sofia Papagiannaki
        
784 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
785 25c3841c Sofia Papagiannaki
            obj = self.client.list_objects(self.container[0],
786 25c3841c Sofia Papagiannaki
                                           if_unmodified_since=since.strftime(f))
787 23028d31 Sofia Papagiannaki
            
788 25c3841c Sofia Papagiannaki
            #assert unmodified
789 25c3841c Sofia Papagiannaki
            self.assertEqual(obj, self.client.list_objects(self.container[0]))
790 25c3841c Sofia Papagiannaki
    
791 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
792 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
793 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
794 d1e43d6f Sofia Papagiannaki
        
795 d1e43d6f Sofia Papagiannaki
        #add a new container
796 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
797 25c3841c Sofia Papagiannaki
        
798 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
799 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
800 d1e43d6f Sofia Papagiannaki
            
801 25c3841c Sofia Papagiannaki
            args = {'if_unmodified_since':'%s' %past}
802 25c3841c Sofia Papagiannaki
            
803 23028d31 Sofia Papagiannaki
            #assert precondition failed
804 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.list_objects,
805 25c3841c Sofia Papagiannaki
                                     self.container[0], **args)
806 d1e43d6f Sofia Papagiannaki
807 d1e43d6f Sofia Papagiannaki
class ContainerPut(BaseTestCase):
808 b09c9aaa Sofia Papagiannaki
    def setUp(self):
809 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
810 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
811 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
812 25c3841c Sofia Papagiannaki
    
813 b09c9aaa Sofia Papagiannaki
    def test_create(self):
814 25c3841c Sofia Papagiannaki
        self.client.create_container(self.containers[0])
815 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
816 23028d31 Sofia Papagiannaki
        self.assertTrue(self.containers[0] in containers)
817 25c3841c Sofia Papagiannaki
        self.assert_container_exists(self.containers[0])
818 25c3841c Sofia Papagiannaki
    
819 b09c9aaa Sofia Papagiannaki
    def test_create_twice(self):
820 25c3841c Sofia Papagiannaki
        self.client.create_container(self.containers[0])
821 25c3841c Sofia Papagiannaki
        self.assertTrue(not self.client.create_container(self.containers[0]))
822 25c3841c Sofia Papagiannaki
    
823 d1e43d6f Sofia Papagiannaki
class ContainerPost(BaseTestCase):
824 d1e43d6f Sofia Papagiannaki
    def setUp(self):
825 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
826 d1e43d6f Sofia Papagiannaki
        self.account = 'test'
827 d1e43d6f Sofia Papagiannaki
        self.container = 'apples'
828 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
829 25c3841c Sofia Papagiannaki
    
830 d1e43d6f Sofia Papagiannaki
    def test_update_meta(self):
831 23028d31 Sofia Papagiannaki
        meta = {'test':'test33',
832 23028d31 Sofia Papagiannaki
                'tost':'tost22'}
833 23028d31 Sofia Papagiannaki
        self.client.update_container_metadata(self.container, **meta)
834 25c3841c Sofia Papagiannaki
        headers = self.client.retrieve_container_metadata(self.container)
835 d1e43d6f Sofia Papagiannaki
        for k,v in meta.items():
836 23028d31 Sofia Papagiannaki
            k = 'x-container-meta-%s' % k
837 23028d31 Sofia Papagiannaki
            self.assertTrue(headers[k])
838 23028d31 Sofia Papagiannaki
            self.assertEqual(headers[k], v)
839 d1e43d6f Sofia Papagiannaki
840 d1e43d6f Sofia Papagiannaki
class ContainerDelete(BaseTestCase):
841 b09c9aaa Sofia Papagiannaki
    def setUp(self):
842 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
843 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
844 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
845 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
846 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
847 23028d31 Sofia Papagiannaki
        self.upload_random_data(self.containers[1], o_names[0])
848 25c3841c Sofia Papagiannaki
    
849 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
850 23028d31 Sofia Papagiannaki
        status = self.client.delete_container(self.containers[0])[0]
851 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 204)
852 25c3841c Sofia Papagiannaki
    
853 b09c9aaa Sofia Papagiannaki
    def test_delete_non_empty(self):
854 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(409, self.client.delete_container,
855 23028d31 Sofia Papagiannaki
                                 self.containers[1])
856 25c3841c Sofia Papagiannaki
    
857 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
858 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.delete_container, 'c3')
859 b09c9aaa Sofia Papagiannaki
860 d1e43d6f Sofia Papagiannaki
class ObjectHead(BaseTestCase):
861 d1e43d6f Sofia Papagiannaki
    pass
862 d1e43d6f Sofia Papagiannaki
863 d1e43d6f Sofia Papagiannaki
class ObjectGet(BaseTestCase):
864 b09c9aaa Sofia Papagiannaki
    def setUp(self):
865 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
866 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
867 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
868 b09c9aaa Sofia Papagiannaki
        #create some containers
869 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
870 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
871 b09c9aaa Sofia Papagiannaki
        
872 b09c9aaa Sofia Papagiannaki
        #upload a file
873 23028d31 Sofia Papagiannaki
        names = ('obj1', 'obj2')
874 b09c9aaa Sofia Papagiannaki
        self.objects = []
875 23028d31 Sofia Papagiannaki
        for n in names:
876 23028d31 Sofia Papagiannaki
            self.objects.append(self.upload_random_data(self.containers[1], n))
877 25c3841c Sofia Papagiannaki
    
878 b09c9aaa Sofia Papagiannaki
    def test_get(self):
879 b09c9aaa Sofia Papagiannaki
        #perform get
880 25c3841c Sofia Papagiannaki
        o = self.client.retrieve_object(self.containers[1],
881 25c3841c Sofia Papagiannaki
                                        self.objects[0]['name'],
882 25c3841c Sofia Papagiannaki
                                        self.objects[0]['meta'])
883 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.objects[0]['data'])
884 25c3841c Sofia Papagiannaki
    
885 b09c9aaa Sofia Papagiannaki
    def test_get_invalid(self):
886 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object,
887 25c3841c Sofia Papagiannaki
                                 self.containers[0], self.objects[0]['name'])
888 25c3841c Sofia Papagiannaki
    
889 b09c9aaa Sofia Papagiannaki
    def test_get_partial(self):
890 b09c9aaa Sofia Papagiannaki
        #perform get with range
891 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
892 25c3841c Sofia Papagiannaki
                                                            self.objects[0]['name'],
893 25c3841c Sofia Papagiannaki
                                                            range='bytes=0-499')
894 b09c9aaa Sofia Papagiannaki
        
895 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
896 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
897 b09c9aaa Sofia Papagiannaki
        
898 33ffca25 Sofia Papagiannaki
        #assert content-type
899 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
900 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
901 33ffca25 Sofia Papagiannaki
        
902 b09c9aaa Sofia Papagiannaki
        #assert content length
903 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
904 b09c9aaa Sofia Papagiannaki
        
905 b09c9aaa Sofia Papagiannaki
        #assert content
906 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'][:500], data)
907 25c3841c Sofia Papagiannaki
    
908 b09c9aaa Sofia Papagiannaki
    def test_get_final_500(self):
909 b09c9aaa Sofia Papagiannaki
        #perform get with range
910 23028d31 Sofia Papagiannaki
        headers = {'range':'bytes=-500'}
911 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
912 25c3841c Sofia Papagiannaki
                                                            self.objects[0]['name'],
913 25c3841c Sofia Papagiannaki
                                                            range='bytes=-500')
914 b09c9aaa Sofia Papagiannaki
        
915 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
916 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
917 b09c9aaa Sofia Papagiannaki
        
918 33ffca25 Sofia Papagiannaki
        #assert content-type
919 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
920 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
921 33ffca25 Sofia Papagiannaki
        
922 b09c9aaa Sofia Papagiannaki
        #assert content length
923 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
924 b09c9aaa Sofia Papagiannaki
        
925 b09c9aaa Sofia Papagiannaki
        #assert content
926 23028d31 Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], data)
927 25c3841c Sofia Papagiannaki
    
928 b09c9aaa Sofia Papagiannaki
    def test_get_rest(self):
929 b09c9aaa Sofia Papagiannaki
        #perform get with range
930 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) - 500
931 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
932 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
933 25c3841c Sofia Papagiannaki
                                                range='bytes=%s-' %offset)
934 b09c9aaa Sofia Papagiannaki
        
935 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
936 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
937 b09c9aaa Sofia Papagiannaki
        
938 33ffca25 Sofia Papagiannaki
        #assert content-type
939 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
940 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
941 33ffca25 Sofia Papagiannaki
        
942 b09c9aaa Sofia Papagiannaki
        #assert content length
943 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
944 b09c9aaa Sofia Papagiannaki
        
945 b09c9aaa Sofia Papagiannaki
        #assert content
946 23028d31 Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], data)
947 25c3841c Sofia Papagiannaki
    
948 b09c9aaa Sofia Papagiannaki
    def test_get_range_not_satisfiable(self):
949 b09c9aaa Sofia Papagiannaki
        #perform get with range
950 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) + 1
951 b09c9aaa Sofia Papagiannaki
        
952 23028d31 Sofia Papagiannaki
        #assert range not satisfiable
953 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(416, self.client.retrieve_object,
954 25c3841c Sofia Papagiannaki
                                 self.containers[1], self.objects[0]['name'],
955 25c3841c Sofia Papagiannaki
                                 range='bytes=0-%s' %offset)
956 25c3841c Sofia Papagiannaki
    
957 b09c9aaa Sofia Papagiannaki
    def test_multiple_range(self):
958 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
959 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '1000-']
960 25c3841c Sofia Papagiannaki
        bytes = 'bytes=%s' % ','.join(ranges)
961 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
962 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
963 25c3841c Sofia Papagiannaki
                                                           range=bytes)
964 b09c9aaa Sofia Papagiannaki
        
965 b09c9aaa Sofia Papagiannaki
        # assert partial content
966 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
967 b09c9aaa Sofia Papagiannaki
        
968 b09c9aaa Sofia Papagiannaki
        # assert Content-Type of the reply will be multipart/byteranges
969 23028d31 Sofia Papagiannaki
        self.assertTrue(headers['content-type'])
970 23028d31 Sofia Papagiannaki
        content_type_parts = headers['content-type'].split()
971 b09c9aaa Sofia Papagiannaki
        self.assertEqual(content_type_parts[0], ('multipart/byteranges;'))
972 b09c9aaa Sofia Papagiannaki
        
973 b09c9aaa Sofia Papagiannaki
        boundary = '--%s' %content_type_parts[1].split('=')[-1:][0]
974 23028d31 Sofia Papagiannaki
        cparts = data.split(boundary)[1:-1]
975 b09c9aaa Sofia Papagiannaki
        
976 b09c9aaa Sofia Papagiannaki
        # assert content parts are exactly 2
977 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(cparts), len(ranges))
978 b09c9aaa Sofia Papagiannaki
        
979 b09c9aaa Sofia Papagiannaki
        # for each content part assert headers
980 b09c9aaa Sofia Papagiannaki
        i = 0
981 b09c9aaa Sofia Papagiannaki
        for cpart in cparts:
982 b09c9aaa Sofia Papagiannaki
            content = cpart.split('\r\n')
983 b09c9aaa Sofia Papagiannaki
            headers = content[1:3]
984 b09c9aaa Sofia Papagiannaki
            content_range = headers[0].split(': ')
985 b09c9aaa Sofia Papagiannaki
            self.assertEqual(content_range[0], 'Content-Range')
986 b09c9aaa Sofia Papagiannaki
            
987 b09c9aaa Sofia Papagiannaki
            r = ranges[i].split('-')
988 b09c9aaa Sofia Papagiannaki
            if not r[0] and not r[1]:
989 b09c9aaa Sofia Papagiannaki
                pass
990 b09c9aaa Sofia Papagiannaki
            elif not r[0]:
991 b09c9aaa Sofia Papagiannaki
                start = len(self.objects[0]['data']) - int(r[1])
992 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
993 b09c9aaa Sofia Papagiannaki
            elif not r[1]:
994 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
995 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
996 b09c9aaa Sofia Papagiannaki
            else:
997 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
998 b09c9aaa Sofia Papagiannaki
                end = int(r[1]) + 1
999 b09c9aaa Sofia Papagiannaki
            fdata = self.objects[0]['data'][start:end]
1000 b09c9aaa Sofia Papagiannaki
            sdata = '\r\n'.join(content[4:-1])
1001 b09c9aaa Sofia Papagiannaki
            self.assertEqual(len(fdata), len(sdata))
1002 b09c9aaa Sofia Papagiannaki
            self.assertEquals(fdata, sdata)
1003 b09c9aaa Sofia Papagiannaki
            i+=1
1004 25c3841c Sofia Papagiannaki
    
1005 b09c9aaa Sofia Papagiannaki
    def test_multiple_range_not_satisfiable(self):
1006 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
1007 b09c9aaa Sofia Papagiannaki
        out_of_range = len(self.objects[0]['data']) + 1
1008 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '%d-' %out_of_range]
1009 25c3841c Sofia Papagiannaki
        bytes = 'bytes=%s' % ','.join(ranges)
1010 b09c9aaa Sofia Papagiannaki
        
1011 b09c9aaa Sofia Papagiannaki
        # assert partial content
1012 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(416, self.client.retrieve_object,
1013 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1014 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'], range=bytes)
1015 25c3841c Sofia Papagiannaki
    
1016 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match(self):
1017 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
1018 25c3841c Sofia Papagiannaki
        etag = self.objects[0]['hash']
1019 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1020 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1021 25c3841c Sofia Papagiannaki
                                                           if_match=etag)
1022 b09c9aaa Sofia Papagiannaki
        #assert get success
1023 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1024 b09c9aaa Sofia Papagiannaki
        
1025 33ffca25 Sofia Papagiannaki
        #assert content-type
1026 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1027 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1028 33ffca25 Sofia Papagiannaki
        
1029 b09c9aaa Sofia Papagiannaki
        #assert response content
1030 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1031 25c3841c Sofia Papagiannaki
    
1032 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match_star(self):
1033 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match *
1034 23028d31 Sofia Papagiannaki
        headers = {'if-match':'*'}
1035 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1036 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
1037 23028d31 Sofia Papagiannaki
                                                **headers)
1038 b09c9aaa Sofia Papagiannaki
        #assert get success
1039 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1040 b09c9aaa Sofia Papagiannaki
        
1041 33ffca25 Sofia Papagiannaki
        #assert content-type
1042 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1043 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1044 33ffca25 Sofia Papagiannaki
        
1045 b09c9aaa Sofia Papagiannaki
        #assert response content
1046 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1047 25c3841c Sofia Papagiannaki
    
1048 b09c9aaa Sofia Papagiannaki
    def test_get_with_multiple_if_match(self):
1049 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
1050 b09c9aaa Sofia Papagiannaki
        etags = [i['hash'] for i in self.objects if i]
1051 b09c9aaa Sofia Papagiannaki
        etags = ','.join('"%s"' % etag for etag in etags)
1052 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1053 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1054 25c3841c Sofia Papagiannaki
                                                           if_match=etags)
1055 b09c9aaa Sofia Papagiannaki
        #assert get success
1056 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1057 b09c9aaa Sofia Papagiannaki
        
1058 33ffca25 Sofia Papagiannaki
        #assert content-type
1059 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1060 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1061 33ffca25 Sofia Papagiannaki
        
1062 33ffca25 Sofia Papagiannaki
        #assert content-type
1063 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1064 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1065 33ffca25 Sofia Papagiannaki
        
1066 b09c9aaa Sofia Papagiannaki
        #assert response content
1067 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1068 25c3841c Sofia Papagiannaki
    
1069 b09c9aaa Sofia Papagiannaki
    def test_if_match_precondition_failed(self):
1070 23028d31 Sofia Papagiannaki
        #assert precondition failed
1071 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(412, self.client.retrieve_object,
1072 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1073 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'], if_match='123')
1074 25c3841c Sofia Papagiannaki
    
1075 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
1076 d1e43d6f Sofia Papagiannaki
        #perform get with If-None-Match
1077 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1078 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1079 25c3841c Sofia Papagiannaki
                                                           if_none_match='123')
1080 b09c9aaa Sofia Papagiannaki
        
1081 b09c9aaa Sofia Papagiannaki
        #assert get success
1082 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1083 33ffca25 Sofia Papagiannaki
        
1084 33ffca25 Sofia Papagiannaki
        #assert content-type
1085 25c3841c Sofia Papagiannaki
        self.assertEqual(headers['content_type'],
1086 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1087 25c3841c Sofia Papagiannaki
    
1088 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
1089 25c3841c Sofia Papagiannaki
        #perform get with If-None-Match * and assert not modified
1090 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(304, self.client.retrieve_object,
1091 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1092 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'],
1093 25c3841c Sofia Papagiannaki
                                 if_none_match='*')
1094 25c3841c Sofia Papagiannaki
    
1095 b09c9aaa Sofia Papagiannaki
    def test_if_none_match_not_modified(self):
1096 25c3841c Sofia Papagiannaki
        #perform get with If-None-Match and assert not modified
1097 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(304, self.client.retrieve_object,
1098 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1099 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'],
1100 25c3841c Sofia Papagiannaki
                                 if_none_match=self.objects[0]['hash'])
1101 25c3841c Sofia Papagiannaki
        
1102 25c3841c Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[1],
1103 25c3841c Sofia Papagiannaki
                                                    self.objects[0]['name'])
1104 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['etag'], self.objects[0]['hash'])
1105 25c3841c Sofia Papagiannaki
    
1106 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
1107 b09c9aaa Sofia Papagiannaki
        t = datetime.datetime.utcnow()
1108 b09c9aaa Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
1109 b09c9aaa Sofia Papagiannaki
        
1110 b09c9aaa Sofia Papagiannaki
        #modify the object
1111 23028d31 Sofia Papagiannaki
        self.upload_data(self.containers[1],
1112 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['name'],
1113 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['data'][:200])
1114 b09c9aaa Sofia Papagiannaki
        
1115 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
1116 b09c9aaa Sofia Papagiannaki
            past = t2.strftime(f)
1117 b09c9aaa Sofia Papagiannaki
            
1118 23028d31 Sofia Papagiannaki
            headers = {'if-modified-since':'%s' %past}
1119 25c3841c Sofia Papagiannaki
            try:
1120 25c3841c Sofia Papagiannaki
                o = self.client.retrieve_object(self.containers[1],
1121 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
1122 25c3841c Sofia Papagiannaki
                                                if_modified_since=past)
1123 25c3841c Sofia Papagiannaki
                self.assertEqual(o,
1124 25c3841c Sofia Papagiannaki
                                 self.client.retrieve_object(self.containers[1],
1125 25c3841c Sofia Papagiannaki
                                                             self.objects[0]['name']))
1126 25c3841c Sofia Papagiannaki
            except Fault, f:
1127 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304)
1128 25c3841c Sofia Papagiannaki
    
1129 25c3841c Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
1130 25c3841c Sofia Papagiannaki
        o = self.client.retrieve_object(self.containers[1],
1131 25c3841c Sofia Papagiannaki
                                        self.objects[0]['name'],
1132 25c3841c Sofia Papagiannaki
                                        if_modified_since='')
1133 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.client.retrieve_object(self.containers[1],
1134 25c3841c Sofia Papagiannaki
                                                        self.objects[0]['name']))
1135 25c3841c Sofia Papagiannaki
            
1136 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
1137 b09c9aaa Sofia Papagiannaki
        now = datetime.datetime.utcnow()
1138 b09c9aaa Sofia Papagiannaki
        since = now + datetime.timedelta(1)
1139 b09c9aaa Sofia Papagiannaki
        
1140 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
1141 b09c9aaa Sofia Papagiannaki
            #assert not modified
1142 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.retrieve_object,
1143 25c3841c Sofia Papagiannaki
                                     self.containers[1], self.objects[0]['name'],
1144 25c3841c Sofia Papagiannaki
                                     if_modified_since=since.strftime(f))
1145 25c3841c Sofia Papagiannaki
    
1146 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
1147 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
1148 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
1149 d1e43d6f Sofia Papagiannaki
        
1150 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
1151 25c3841c Sofia Papagiannaki
            t = since.strftime(f)
1152 25c3841c Sofia Papagiannaki
            status, headers, data = self.client.request_object(self.containers[1],
1153 25c3841c Sofia Papagiannaki
                                                               self.objects[0]['name'],
1154 25c3841c Sofia Papagiannaki
                                                               if_unmodified_since=t)
1155 d1e43d6f Sofia Papagiannaki
            #assert success
1156 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 200)
1157 23028d31 Sofia Papagiannaki
            self.assertEqual(self.objects[0]['data'], data)
1158 33ffca25 Sofia Papagiannaki
            
1159 33ffca25 Sofia Papagiannaki
            #assert content-type
1160 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['content-type'],
1161 25c3841c Sofia Papagiannaki
                             self.objects[0]['meta']['content_type'])
1162 25c3841c Sofia Papagiannaki
    
1163 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
1164 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
1165 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
1166 d1e43d6f Sofia Papagiannaki
        
1167 d1e43d6f Sofia Papagiannaki
        #modify the object
1168 23028d31 Sofia Papagiannaki
        self.upload_data(self.containers[1],
1169 d1e43d6f Sofia Papagiannaki
                           self.objects[0]['name'],
1170 d1e43d6f Sofia Papagiannaki
                           self.objects[0]['data'][:200])
1171 d1e43d6f Sofia Papagiannaki
        
1172 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
1173 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
1174 23028d31 Sofia Papagiannaki
            #assert precondition failed
1175 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.retrieve_object,
1176 25c3841c Sofia Papagiannaki
                                     self.containers[1], self.objects[0]['name'],
1177 25c3841c Sofia Papagiannaki
                                     if_unmodified_since=past)
1178 25c3841c Sofia Papagiannaki
    
1179 d1e43d6f Sofia Papagiannaki
    def test_hashes(self):
1180 33ffca25 Sofia Papagiannaki
        l = 8388609
1181 33ffca25 Sofia Papagiannaki
        fname = 'largefile'
1182 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.containers[1], fname, l)
1183 d1e43d6f Sofia Papagiannaki
        if o:
1184 f0eacc2c Sofia Papagiannaki
            data = self.client.retrieve_object(self.containers[1], fname,
1185 f0eacc2c Sofia Papagiannaki
                                               format='json')
1186 23028d31 Sofia Papagiannaki
            body = json.loads(data)
1187 33ffca25 Sofia Papagiannaki
            hashes = body['hashes']
1188 33ffca25 Sofia Papagiannaki
            block_size = body['block_size']
1189 33ffca25 Sofia Papagiannaki
            block_hash = body['block_hash']
1190 33ffca25 Sofia Papagiannaki
            block_num = l/block_size == 0 and l/block_size or l/block_size + 1
1191 33ffca25 Sofia Papagiannaki
            self.assertTrue(len(hashes), block_num)
1192 d1e43d6f Sofia Papagiannaki
            i = 0
1193 d1e43d6f Sofia Papagiannaki
            for h in hashes:
1194 d1e43d6f Sofia Papagiannaki
                start = i * block_size
1195 d1e43d6f Sofia Papagiannaki
                end = (i + 1) * block_size
1196 33ffca25 Sofia Papagiannaki
                hash = compute_block_hash(o['data'][start:end], block_hash)
1197 33ffca25 Sofia Papagiannaki
                self.assertEqual(h, hash)
1198 d1e43d6f Sofia Papagiannaki
                i += 1
1199 d1e43d6f Sofia Papagiannaki
1200 d1e43d6f Sofia Papagiannaki
class ObjectPut(BaseTestCase):
1201 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1202 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1203 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1204 b09c9aaa Sofia Papagiannaki
        self.container = 'c1'
1205 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
1206 23028d31 Sofia Papagiannaki
    
1207 b09c9aaa Sofia Papagiannaki
    def test_upload(self):
1208 23028d31 Sofia Papagiannaki
        name = o_names[0]
1209 23028d31 Sofia Papagiannaki
        meta = {'test':'test1'}
1210 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.container, name, **meta)
1211 23028d31 Sofia Papagiannaki
        
1212 23028d31 Sofia Papagiannaki
        headers = self.client.retrieve_object_metadata(self.container,
1213 23028d31 Sofia Papagiannaki
                                                       name,
1214 23028d31 Sofia Papagiannaki
                                                       restricted=True)
1215 23028d31 Sofia Papagiannaki
        self.assertTrue('test' in headers.keys())
1216 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['test'], meta['test'])
1217 b09c9aaa Sofia Papagiannaki
        
1218 b09c9aaa Sofia Papagiannaki
        #assert uploaded content
1219 25c3841c Sofia Papagiannaki
        status, h, data = self.client.request_object(self.container, name)
1220 25c3841c Sofia Papagiannaki
        self.assertEqual(len(o['data']), int(h['content-length']))
1221 25c3841c Sofia Papagiannaki
        self.assertEqual(o['data'], data)
1222 25c3841c Sofia Papagiannaki
        
1223 25c3841c Sofia Papagiannaki
        #assert content-type
1224 25c3841c Sofia Papagiannaki
        self.assertEqual(h['content-type'], o['meta']['content_type'])
1225 25c3841c Sofia Papagiannaki
    
1226 e7b51248 Sofia Papagiannaki
    def _test_maximum_upload_size_exceeds(self):
1227 ae75584f Sofia Papagiannaki
        name = o_names[0]
1228 ae75584f Sofia Papagiannaki
        meta = {'test':'test1'}
1229 ae75584f Sofia Papagiannaki
        #upload 100MB
1230 ae75584f Sofia Papagiannaki
        length=1024*1024*100
1231 ae75584f Sofia Papagiannaki
        self.assert_raises_fault(400, self.upload_random_data, self.container,
1232 ae75584f Sofia Papagiannaki
                                 name, length, **meta)
1233 e7b51248 Sofia Papagiannaki
    
1234 7812e1f9 Sofia Papagiannaki
    def test_upload_with_name_containing_slash(self):
1235 7812e1f9 Sofia Papagiannaki
        name = '/%s' % o_names[0]
1236 7812e1f9 Sofia Papagiannaki
        meta = {'test':'test1'}
1237 7812e1f9 Sofia Papagiannaki
        o = self.upload_random_data(self.container, name, **meta)
1238 7812e1f9 Sofia Papagiannaki
        
1239 7812e1f9 Sofia Papagiannaki
        self.assertEqual(o['data'],
1240 7812e1f9 Sofia Papagiannaki
                         self.client.retrieve_object(self.container, name))
1241 7812e1f9 Sofia Papagiannaki
        
1242 7812e1f9 Sofia Papagiannaki
        self.assertTrue(name in self.client.list_objects(self.container))
1243 7812e1f9 Sofia Papagiannaki
    
1244 7812e1f9 Sofia Papagiannaki
    def test_create_directory_marker(self):
1245 7812e1f9 Sofia Papagiannaki
        self.client.create_directory_marker(self.container, 'foo')
1246 7812e1f9 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.container, 'foo')
1247 7812e1f9 Sofia Papagiannaki
        self.assertEqual(meta['content-length'], '0')
1248 7812e1f9 Sofia Papagiannaki
        self.assertEqual(meta['content-type'], 'application/directory')
1249 7812e1f9 Sofia Papagiannaki
1250 b09c9aaa Sofia Papagiannaki
    def test_upload_unprocessable_entity(self):
1251 23028d31 Sofia Papagiannaki
        meta={'etag':'123', 'test':'test1'}
1252 23028d31 Sofia Papagiannaki
        
1253 23028d31 Sofia Papagiannaki
        #assert unprocessable entity
1254 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(422, self.upload_random_data, self.container,
1255 23028d31 Sofia Papagiannaki
                                 o_names[0], **meta)
1256 25c3841c Sofia Papagiannaki
    
1257 f0eacc2c Sofia Papagiannaki
    def test_chunked_transfer(self):
1258 25c3841c Sofia Papagiannaki
        data = get_random_data()
1259 25c3841c Sofia Papagiannaki
        objname = 'object'
1260 25c3841c Sofia Papagiannaki
        self.client.create_object_using_chunks(self.container, objname,
1261 25c3841c Sofia Papagiannaki
                                               StringIO(data))
1262 23028d31 Sofia Papagiannaki
        
1263 25c3841c Sofia Papagiannaki
        uploaded_data = self.client.retrieve_object(self.container, objname)
1264 25c3841c Sofia Papagiannaki
        self.assertEqual(data, uploaded_data)
1265 ae75584f Sofia Papagiannaki
    
1266 ae75584f Sofia Papagiannaki
    def test_manifestation(self):
1267 ae75584f Sofia Papagiannaki
        prefix = 'myobject/'
1268 ae75584f Sofia Papagiannaki
        data = ''
1269 ae75584f Sofia Papagiannaki
        for i in range(5):
1270 ae75584f Sofia Papagiannaki
            part = '%s%d' %(prefix, i)
1271 ae75584f Sofia Papagiannaki
            o = self.upload_random_data(self.container, part)
1272 ae75584f Sofia Papagiannaki
            data += o['data']
1273 ae75584f Sofia Papagiannaki
        
1274 ae75584f Sofia Papagiannaki
        manifest = '%s/%s' %(self.container, prefix)
1275 ae75584f Sofia Papagiannaki
        self.client.create_manifestation(self.container, 'large-object',
1276 ae75584f Sofia Papagiannaki
                                         manifest)
1277 ae75584f Sofia Papagiannaki
        
1278 ae75584f Sofia Papagiannaki
        self.assert_object_exists(self.container, 'large-object')
1279 ae75584f Sofia Papagiannaki
        self.assertEqual(data, self.client.retrieve_object(self.container,
1280 ae75584f Sofia Papagiannaki
                                                           'large-object'))
1281 ae75584f Sofia Papagiannaki
        
1282 ae75584f Sofia Papagiannaki
        #wrong manifestation
1283 ae75584f Sofia Papagiannaki
        self.client.create_manifestation(self.container, 'large-object',
1284 ae75584f Sofia Papagiannaki
                                         'invalid')
1285 ae75584f Sofia Papagiannaki
        
1286 d1e43d6f Sofia Papagiannaki
class ObjectCopy(BaseTestCase):
1287 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1288 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1289 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1290 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1291 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1292 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1293 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1294 25c3841c Sofia Papagiannaki
    
1295 ae75584f Sofia Papagiannaki
    def tearDown(self):
1296 ae75584f Sofia Papagiannaki
        pass
1297 ae75584f Sofia Papagiannaki
    
1298 b09c9aaa Sofia Papagiannaki
    def test_copy(self):
1299 23028d31 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_object_metadata,
1300 33ffca25 Sofia Papagiannaki
                             self.containers[0], self.obj['name']):
1301 b09c9aaa Sofia Papagiannaki
            #perform copy
1302 23028d31 Sofia Papagiannaki
            meta = {'test':'testcopy'}
1303 23028d31 Sofia Papagiannaki
            status = self.client.copy_object(self.containers[0],
1304 23028d31 Sofia Papagiannaki
                                              self.obj['name'],
1305 23028d31 Sofia Papagiannaki
                                              self.containers[0],
1306 23028d31 Sofia Papagiannaki
                                              'testcopy',
1307 7812e1f9 Sofia Papagiannaki
                                              meta)[0]
1308 23028d31 Sofia Papagiannaki
            
1309 b09c9aaa Sofia Papagiannaki
            #assert copy success
1310 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 201)
1311 b09c9aaa Sofia Papagiannaki
            
1312 b09c9aaa Sofia Papagiannaki
            #assert access the new object
1313 23028d31 Sofia Papagiannaki
            headers = self.client.retrieve_object_metadata(self.containers[0],
1314 23028d31 Sofia Papagiannaki
                                                           'testcopy')
1315 23028d31 Sofia Papagiannaki
            self.assertTrue('x-object-meta-test' in headers.keys())
1316 23028d31 Sofia Papagiannaki
            self.assertTrue(headers['x-object-meta-test'], 'testcopy')
1317 b09c9aaa Sofia Papagiannaki
            
1318 b09c9aaa Sofia Papagiannaki
            #assert etag is the same
1319 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['etag'], self.obj['hash'])
1320 b09c9aaa Sofia Papagiannaki
            
1321 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1322 23028d31 Sofia Papagiannaki
            self.assert_object_exists(self.containers[0], self.obj['name'])
1323 25c3841c Sofia Papagiannaki
    
1324 b09c9aaa Sofia Papagiannaki
    def test_copy_from_different_container(self):
1325 23028d31 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_object_metadata,
1326 23028d31 Sofia Papagiannaki
                             self.containers[0], self.obj['name']):
1327 23028d31 Sofia Papagiannaki
            meta = {'test':'testcopy'}
1328 23028d31 Sofia Papagiannaki
            status = self.client.copy_object(self.containers[0],
1329 23028d31 Sofia Papagiannaki
                                             self.obj['name'],
1330 23028d31 Sofia Papagiannaki
                                             self.containers[1],
1331 23028d31 Sofia Papagiannaki
                                             'testcopy',
1332 7812e1f9 Sofia Papagiannaki
                                             meta)[0]
1333 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 201)
1334 b09c9aaa Sofia Papagiannaki
            
1335 b09c9aaa Sofia Papagiannaki
            # assert updated metadata
1336 23028d31 Sofia Papagiannaki
            meta = self.client.retrieve_object_metadata(self.containers[1],
1337 23028d31 Sofia Papagiannaki
                                                           'testcopy',
1338 23028d31 Sofia Papagiannaki
                                                           restricted=True)
1339 23028d31 Sofia Papagiannaki
            self.assertTrue('test' in meta.keys())
1340 23028d31 Sofia Papagiannaki
            self.assertTrue(meta['test'], 'testcopy')
1341 b09c9aaa Sofia Papagiannaki
            
1342 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1343 23028d31 Sofia Papagiannaki
            self.assert_object_exists(self.containers[0], self.obj['name'])
1344 25c3841c Sofia Papagiannaki
    
1345 b09c9aaa Sofia Papagiannaki
    def test_copy_invalid(self):
1346 b09c9aaa Sofia Papagiannaki
        #copy from invalid object
1347 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1348 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.copy_object, self.containers[0],
1349 7812e1f9 Sofia Papagiannaki
                                 'test.py', self.containers[1], 'testcopy', meta)
1350 b09c9aaa Sofia Papagiannaki
        
1351 b09c9aaa Sofia Papagiannaki
        #copy from invalid container
1352 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1353 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.copy_object, self.containers[1],
1354 23028d31 Sofia Papagiannaki
                                 self.obj['name'], self.containers[1],
1355 7812e1f9 Sofia Papagiannaki
                                 'testcopy', meta)
1356 b09c9aaa Sofia Papagiannaki
1357 7812e1f9 Sofia Papagiannaki
class ObjectMove(BaseTestCase):
1358 7812e1f9 Sofia Papagiannaki
    def setUp(self):
1359 7812e1f9 Sofia Papagiannaki
        BaseTestCase.setUp(self)
1360 7812e1f9 Sofia Papagiannaki
        self.account = 'test'
1361 7812e1f9 Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1362 7812e1f9 Sofia Papagiannaki
        for c in self.containers:
1363 7812e1f9 Sofia Papagiannaki
            self.client.create_container(c)
1364 7812e1f9 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1365 7812e1f9 Sofia Papagiannaki
    
1366 b09c9aaa Sofia Papagiannaki
    def test_move(self):
1367 b09c9aaa Sofia Papagiannaki
        #perform move
1368 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1369 f7667baf Antony Chazapis
        src_path = '/'.join(('/', self.containers[0], self.obj['name']))
1370 23028d31 Sofia Papagiannaki
        status = self.client.move_object(self.containers[0], self.obj['name'],
1371 23028d31 Sofia Papagiannaki
                                         self.containers[0], 'testcopy',
1372 7812e1f9 Sofia Papagiannaki
                                         meta)[0]
1373 23028d31 Sofia Papagiannaki
        
1374 b09c9aaa Sofia Papagiannaki
        #assert successful move
1375 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 201)
1376 b09c9aaa Sofia Papagiannaki
        
1377 b09c9aaa Sofia Papagiannaki
        #assert updated metadata
1378 23028d31 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[0],
1379 23028d31 Sofia Papagiannaki
                                                    'testcopy',
1380 23028d31 Sofia Papagiannaki
                                                    restricted=True)
1381 23028d31 Sofia Papagiannaki
        self.assertTrue('test' in meta.keys())
1382 23028d31 Sofia Papagiannaki
        self.assertTrue(meta['test'], 'testcopy')
1383 b09c9aaa Sofia Papagiannaki
        
1384 b09c9aaa Sofia Papagiannaki
        #assert src object no more exists
1385 23028d31 Sofia Papagiannaki
        self.assert_object_not_exists(self.containers[0], self.obj['name'])
1386 b09c9aaa Sofia Papagiannaki
1387 d1e43d6f Sofia Papagiannaki
class ObjectPost(BaseTestCase):
1388 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1389 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1390 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1391 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1392 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1393 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1394 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1395 25c3841c Sofia Papagiannaki
    
1396 33ffca25 Sofia Papagiannaki
    def test_update_meta(self):
1397 b09c9aaa Sofia Papagiannaki
        #perform update metadata
1398 23028d31 Sofia Papagiannaki
        more = {'foo':'foo', 'bar':'bar'}
1399 23028d31 Sofia Papagiannaki
        status = self.client.update_object_metadata(self.containers[0],
1400 23028d31 Sofia Papagiannaki
                                                    self.obj['name'],
1401 23028d31 Sofia Papagiannaki
                                                    **more)[0]
1402 b09c9aaa Sofia Papagiannaki
        #assert request accepted
1403 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 202)
1404 b09c9aaa Sofia Papagiannaki
        
1405 b09c9aaa Sofia Papagiannaki
        #assert old metadata are still there
1406 23028d31 Sofia Papagiannaki
        headers = self.client.retrieve_object_metadata(self.containers[0],
1407 23028d31 Sofia Papagiannaki
                                                       self.obj['name'],
1408 23028d31 Sofia Papagiannaki
                                                       restricted=True)
1409 b09c9aaa Sofia Papagiannaki
        #assert new metadata have been updated
1410 b09c9aaa Sofia Papagiannaki
        for k,v in more.items():
1411 23028d31 Sofia Papagiannaki
            self.assertTrue(k in headers.keys())
1412 23028d31 Sofia Papagiannaki
            self.assertTrue(headers[k], v)
1413 25c3841c Sofia Papagiannaki
    
1414 33ffca25 Sofia Papagiannaki
    def test_update_object(self,
1415 33ffca25 Sofia Papagiannaki
                           first_byte_pos=0,
1416 33ffca25 Sofia Papagiannaki
                           last_byte_pos=499,
1417 33ffca25 Sofia Papagiannaki
                           instance_length = True,
1418 33ffca25 Sofia Papagiannaki
                           content_length = 500):
1419 33ffca25 Sofia Papagiannaki
        l = len(self.obj['data'])
1420 23028d31 Sofia Papagiannaki
        length = l if instance_length else '*'
1421 bd8a3026 Sofia Papagiannaki
        range = 'bytes %d-%d/%s' %(first_byte_pos,
1422 33ffca25 Sofia Papagiannaki
                                       last_byte_pos,
1423 bd8a3026 Sofia Papagiannaki
                                       length)
1424 33ffca25 Sofia Papagiannaki
        partial = last_byte_pos - first_byte_pos + 1
1425 33ffca25 Sofia Papagiannaki
        data = get_random_data(partial)
1426 25c3841c Sofia Papagiannaki
        args = {'content_type':'application/octet-stream',
1427 25c3841c Sofia Papagiannaki
                'content_range':'%s' %range}
1428 33ffca25 Sofia Papagiannaki
        if content_length:
1429 25c3841c Sofia Papagiannaki
            args['content_length'] = content_length
1430 cd6ada1d Sofia Papagiannaki
        
1431 25c3841c Sofia Papagiannaki
        status = self.client.update_object(self.containers[0], self.obj['name'],
1432 25c3841c Sofia Papagiannaki
                                  StringIO(data), **args)[0]
1433 33ffca25 Sofia Papagiannaki
        
1434 33ffca25 Sofia Papagiannaki
        if partial < 0 or (instance_length and l <= last_byte_pos):
1435 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 202)    
1436 33ffca25 Sofia Papagiannaki
        else:
1437 25c3841c Sofia Papagiannaki
            self.assertEqual(status, 204)           
1438 33ffca25 Sofia Papagiannaki
            #check modified object
1439 25c3841c Sofia Papagiannaki
            content = self.client.retrieve_object(self.containers[0],
1440 25c3841c Sofia Papagiannaki
                                              self.obj['name'])
1441 23028d31 Sofia Papagiannaki
            self.assertEqual(content[0:partial], data)
1442 23028d31 Sofia Papagiannaki
            self.assertEqual(content[partial:l], self.obj['data'][partial:l])
1443 25c3841c Sofia Papagiannaki
    
1444 33ffca25 Sofia Papagiannaki
    def test_update_object_no_content_length(self):
1445 33ffca25 Sofia Papagiannaki
        self.test_update_object(content_length = None)
1446 25c3841c Sofia Papagiannaki
    
1447 25c3841c Sofia Papagiannaki
    def test_update_object_invalid_content_length(self):
1448 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1449 25c3841c Sofia Papagiannaki
                                    self.containers[0], self.obj['name']):
1450 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(400, self.test_update_object,
1451 25c3841c Sofia Papagiannaki
                                     content_length = 1000)
1452 25c3841c Sofia Papagiannaki
    
1453 33ffca25 Sofia Papagiannaki
    def test_update_object_invalid_range(self):
1454 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1455 25c3841c Sofia Papagiannaki
                                    self.containers[0], self.obj['name']):
1456 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True)
1457 33ffca25 Sofia Papagiannaki
    
1458 33ffca25 Sofia Papagiannaki
    def test_update_object_invalid_range_and_length(self):
1459 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1460 25c3841c Sofia Papagiannaki
                                    self.containers[0], self.obj['name']):
1461 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True,
1462 cd6ada1d Sofia Papagiannaki
                                     -1)
1463 33ffca25 Sofia Papagiannaki
    
1464 33ffca25 Sofia Papagiannaki
    def test_update_object_invalid_range_with_no_content_length(self):
1465 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1466 25c3841c Sofia Papagiannaki
                                    self.containers[0], self.obj['name']):
1467 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True,
1468 cd6ada1d Sofia Papagiannaki
                                     content_length = None)
1469 33ffca25 Sofia Papagiannaki
    
1470 33ffca25 Sofia Papagiannaki
    def test_update_object_out_of_limits(self):    
1471 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1472 25c3841c Sofia Papagiannaki
                                    self.containers[0], self.obj['name']):
1473 33ffca25 Sofia Papagiannaki
            l = len(self.obj['data'])
1474 23028d31 Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 0, l+1, True)
1475 25c3841c Sofia Papagiannaki
    
1476 33ffca25 Sofia Papagiannaki
    def test_append(self):
1477 33ffca25 Sofia Papagiannaki
        data = get_random_data(500)
1478 25c3841c Sofia Papagiannaki
        headers = {}
1479 25c3841c Sofia Papagiannaki
        self.client.update_object(self.containers[0], self.obj['name'],
1480 25c3841c Sofia Papagiannaki
                                  StringIO(data), content_length=500,
1481 25c3841c Sofia Papagiannaki
                                  content_type='application/octet-stream')
1482 33ffca25 Sofia Papagiannaki
        
1483 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1484 25c3841c Sofia Papagiannaki
                                              self.obj['name'])
1485 23028d31 Sofia Papagiannaki
        self.assertEqual(len(content), len(self.obj['data']) + 500)
1486 23028d31 Sofia Papagiannaki
        self.assertEqual(content[:-500], self.obj['data'])
1487 25c3841c Sofia Papagiannaki
    
1488 bd8a3026 Sofia Papagiannaki
    def test_update_with_chunked_transfer(self):
1489 25c3841c Sofia Papagiannaki
        data = get_random_data(500)
1490 25c3841c Sofia Papagiannaki
        dl = len(data)
1491 bd8a3026 Sofia Papagiannaki
        fl = len(self.obj['data'])
1492 bd8a3026 Sofia Papagiannaki
        
1493 25c3841c Sofia Papagiannaki
        self.client.update_object_using_chunks(self.containers[0],
1494 25c3841c Sofia Papagiannaki
                                               self.obj['name'], StringIO(data),
1495 25c3841c Sofia Papagiannaki
                                               offset=0,
1496 25c3841c Sofia Papagiannaki
                                               content_type='application/octet-stream')
1497 bd8a3026 Sofia Papagiannaki
        
1498 bd8a3026 Sofia Papagiannaki
        #check modified object
1499 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1500 25c3841c Sofia Papagiannaki
                                              self.obj['name'])
1501 25c3841c Sofia Papagiannaki
        self.assertEqual(content[0:dl], data)
1502 25c3841c Sofia Papagiannaki
        self.assertEqual(content[dl:fl], self.obj['data'][dl:fl])
1503 33ffca25 Sofia Papagiannaki
1504 d1e43d6f Sofia Papagiannaki
class ObjectDelete(BaseTestCase):
1505 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1506 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1507 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1508 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1509 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1510 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1511 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1512 25c3841c Sofia Papagiannaki
    
1513 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
1514 b09c9aaa Sofia Papagiannaki
        #perform delete object
1515 23028d31 Sofia Papagiannaki
        self.client.delete_object(self.containers[0], self.obj['name'])[0]
1516 25c3841c Sofia Papagiannaki
    
1517 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
1518 23028d31 Sofia Papagiannaki
        #assert item not found
1519 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.delete_object, self.containers[1],
1520 23028d31 Sofia Papagiannaki
                                 self.obj['name'])
1521 b09c9aaa Sofia Papagiannaki
1522 ae75584f Sofia Papagiannaki
class ListSharing(BaseTestCase):
1523 ae75584f Sofia Papagiannaki
    def setUp(self):
1524 ae75584f Sofia Papagiannaki
        BaseTestCase.setUp(self)
1525 ae75584f Sofia Papagiannaki
        self.client.create_container('c')
1526 ae75584f Sofia Papagiannaki
        for i in range(2):
1527 ae75584f Sofia Papagiannaki
            self.upload_random_data('c', 'o%s' %i)
1528 ae75584f Sofia Papagiannaki
        accounts = OTHER_ACCOUNTS.copy()
1529 ae75584f Sofia Papagiannaki
        self.o1_sharing_with = accounts.popitem()
1530 ae75584f Sofia Papagiannaki
        self.o1_sharing = [self.o1_sharing_with[1]]
1531 ae75584f Sofia Papagiannaki
        self.client.share_object('c', 'o1', self.o1_sharing, read=True)
1532 ae75584f Sofia Papagiannaki
        
1533 ae75584f Sofia Papagiannaki
        l = []
1534 ae75584f Sofia Papagiannaki
        for i in range(2):
1535 ae75584f Sofia Papagiannaki
            l.append(accounts.popitem())
1536 ae75584f Sofia Papagiannaki
        #self.client.set_account_groups({'pithos-dev':'chazapis,verigak,papagian'})
1537 ae75584f Sofia Papagiannaki
        #self.o2_sharing = 'write=%s' % 
1538 ae75584f Sofia Papagiannaki
        #self.client.share_object('c', 'o2', self.o2_sharing)
1539 ae75584f Sofia Papagiannaki
    
1540 ae75584f Sofia Papagiannaki
    def test_listing(self):
1541 ae75584f Sofia Papagiannaki
        self.other = Pithos_Client(DEFAULT_HOST,
1542 ae75584f Sofia Papagiannaki
                              self.o1_sharing_with[0],
1543 ae75584f Sofia Papagiannaki
                              self.o1_sharing_with[1],
1544 ae75584f Sofia Papagiannaki
                              DEFAULT_API)
1545 ae75584f Sofia Papagiannaki
        self.assertTrue('test' in self.other.list_shared_by_others())
1546 ae75584f Sofia Papagiannaki
1547 ae75584f Sofia Papagiannaki
class TestGreek(BaseTestCase):
1548 e7b51248 Sofia Papagiannaki
    def setUp(self):
1549 e7b51248 Sofia Papagiannaki
        BaseTestCase.setUp(self)
1550 e7b51248 Sofia Papagiannaki
        #keep track of initial account groups
1551 e7b51248 Sofia Papagiannaki
        self.initial_groups = self.client.retrieve_account_groups()
1552 e7b51248 Sofia Papagiannaki
        
1553 e7b51248 Sofia Papagiannaki
        #keep track of initial account meta
1554 e7b51248 Sofia Papagiannaki
        self.initial_meta = self.client.retrieve_account_metadata(restricted=True)
1555 e7b51248 Sofia Papagiannaki
    
1556 ae75584f Sofia Papagiannaki
    def tearDown(self):
1557 e7b51248 Sofia Papagiannaki
        #delete additionally created meta
1558 e7b51248 Sofia Papagiannaki
        l = []
1559 e7b51248 Sofia Papagiannaki
        for m in self.client.retrieve_account_metadata(restricted=True):
1560 e7b51248 Sofia Papagiannaki
            if m not in self.initial_meta:
1561 e7b51248 Sofia Papagiannaki
                l.append(m)
1562 e7b51248 Sofia Papagiannaki
        self.client.delete_account_metadata(l)
1563 e7b51248 Sofia Papagiannaki
        
1564 e7b51248 Sofia Papagiannaki
        #delete additionally created groups
1565 e7b51248 Sofia Papagiannaki
        l = []
1566 e7b51248 Sofia Papagiannaki
        for g in self.client.retrieve_account_groups():
1567 e7b51248 Sofia Papagiannaki
            if g not in self.initial_groups:
1568 e7b51248 Sofia Papagiannaki
                l.append(g)
1569 e7b51248 Sofia Papagiannaki
        self.client.unset_account_groups(l)
1570 e7b51248 Sofia Papagiannaki
        
1571 e7b51248 Sofia Papagiannaki
        BaseTestCase.tearDown(self)
1572 ae75584f Sofia Papagiannaki
    
1573 ae75584f Sofia Papagiannaki
    def test_create_container(self):
1574 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1575 ae75584f Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1576 e7b51248 Sofia Papagiannaki
        
1577 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' in self.client.list_containers())
1578 ae75584f Sofia Papagiannaki
    
1579 ae75584f Sofia Papagiannaki
    def test_create_object(self):
1580 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1581 ae75584f Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1582 ae75584f Sofia Papagiannaki
        
1583 ae75584f Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1584 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in self.client.list_objects('φάκελος'))
1585 ae75584f Sofia Papagiannaki
    
1586 ae75584f Sofia Papagiannaki
    def test_copy_object(self):
1587 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1588 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1589 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1590 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1591 ae75584f Sofia Papagiannaki
        
1592 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1593 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1594 ae75584f Sofia Papagiannaki
        
1595 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1596 e7b51248 Sofia Papagiannaki
        self.client.copy_object(src_container, src_object, dest_container,
1597 e7b51248 Sofia Papagiannaki
                                dest_object)
1598 e7b51248 Sofia Papagiannaki
        
1599 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(src_container, src_object)
1600 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1601 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1602 ae75584f Sofia Papagiannaki
    
1603 ae75584f Sofia Papagiannaki
    def test_move_object(self):
1604 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1605 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1606 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1607 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1608 ae75584f Sofia Papagiannaki
        
1609 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1610 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1611 ae75584f Sofia Papagiannaki
        
1612 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1613 e7b51248 Sofia Papagiannaki
        self.client.move_object(src_container, src_object, dest_container,
1614 e7b51248 Sofia Papagiannaki
                                dest_object)
1615 e7b51248 Sofia Papagiannaki
        
1616 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists(src_container, src_object)
1617 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1618 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1619 ae75584f Sofia Papagiannaki
    
1620 ae75584f Sofia Papagiannaki
    def test_delete_object(self):
1621 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1622 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1623 e7b51248 Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1624 ae75584f Sofia Papagiannaki
    
1625 e7b51248 Sofia Papagiannaki
        self.client.delete_object('φάκελος', 'αντικείμενο')
1626 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists('φάκελος', 'αντικείμενο')
1627 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' not in self.client.list_objects('φάκελος'))
1628 ae75584f Sofia Papagiannaki
    
1629 e7b51248 Sofia Papagiannaki
    def test_delete_container(self):
1630 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1631 e7b51248 Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1632 e7b51248 Sofia Papagiannaki
        
1633 e7b51248 Sofia Papagiannaki
        self.client.delete_container('φάκελος')
1634 e7b51248 Sofia Papagiannaki
        self.assert_container_not_exists('φάκελος')
1635 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' not in self.client.list_containers())
1636 e7b51248 Sofia Papagiannaki
1637 ae75584f Sofia Papagiannaki
    def test_account_meta(self):
1638 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1639 e7b51248 Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
1640 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True)
1641 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1642 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1643 ae75584f Sofia Papagiannaki
    
1644 ae75584f Sofia Papagiannaki
    def test_container_meta(self):
1645 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1646 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος', **meta)
1647 e7b51248 Sofia Papagiannaki
        
1648 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('φάκελος', restricted=True)
1649 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1650 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1651 ae75584f Sofia Papagiannaki
    
1652 e7b51248 Sofia Papagiannaki
    def test_object_meta(self):
1653 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1654 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1655 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο', **meta)
1656 e7b51248 Sofia Papagiannaki
        
1657 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('φάκελος', 'αντικείμενο',
1658 e7b51248 Sofia Papagiannaki
                                                    restricted=True)
1659 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1660 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')    
1661 ae75584f Sofia Papagiannaki
    
1662 ae75584f Sofia Papagiannaki
    def test_list_meta_filtering(self):
1663 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1664 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1665 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο1', **meta)
1666 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο2')
1667 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο3')
1668 e7b51248 Sofia Papagiannaki
        
1669 e7b51248 Sofia Papagiannaki
        meta = {'ποσότητα':'μεγάλη'}
1670 e7b51248 Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1671 e7b51248 Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα, ποσότητα')
1672 e7b51248 Sofia Papagiannaki
        self.assertTrue('ο1' in objects)
1673 e7b51248 Sofia Papagiannaki
        self.assertTrue('ο2' in objects)
1674 e7b51248 Sofia Papagiannaki
        self.assertTrue('ο3' not in objects)
1675 ae75584f Sofia Papagiannaki
    
1676 ae75584f Sofia Papagiannaki
    def test_groups(self):
1677 e7b51248 Sofia Papagiannaki
        #create a group
1678 e7b51248 Sofia Papagiannaki
        groups = {'σεφς':'chazapis,κούκης'}
1679 e7b51248 Sofia Papagiannaki
        self.client.set_account_groups(**groups)
1680 e7b51248 Sofia Papagiannaki
        groups.update(self.initial_groups)
1681 e7b51248 Sofia Papagiannaki
        self.assertEqual(groups['σεφς'],
1682 e7b51248 Sofia Papagiannaki
                         self.client.retrieve_account_groups()['σεφς'])
1683 e7b51248 Sofia Papagiannaki
        
1684 ae75584f Sofia Papagiannaki
    
1685 ae75584f Sofia Papagiannaki
    def test_permissions(self):
1686 ae75584f Sofia Papagiannaki
        pass
1687 ae75584f Sofia Papagiannaki
    
1688 23028d31 Sofia Papagiannaki
class AssertMappingInvariant(object):
1689 b09c9aaa Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
1690 b09c9aaa Sofia Papagiannaki
        self.callable = callable
1691 b09c9aaa Sofia Papagiannaki
        self.args = args
1692 b09c9aaa Sofia Papagiannaki
        self.kwargs = kwargs
1693 25c3841c Sofia Papagiannaki
    
1694 b09c9aaa Sofia Papagiannaki
    def __enter__(self):
1695 23028d31 Sofia Papagiannaki
        self.map = self.callable(*self.args, **self.kwargs)
1696 23028d31 Sofia Papagiannaki
        return self.map
1697 25c3841c Sofia Papagiannaki
    
1698 b09c9aaa Sofia Papagiannaki
    def __exit__(self, type, value, tb):
1699 23028d31 Sofia Papagiannaki
        map = self.callable(*self.args, **self.kwargs)
1700 23028d31 Sofia Papagiannaki
        for k in self.map.keys():
1701 cd6ada1d Sofia Papagiannaki
            if is_date(self.map[k]):
1702 23028d31 Sofia Papagiannaki
                continue
1703 23028d31 Sofia Papagiannaki
            assert map[k] == self.map[k]
1704 b09c9aaa Sofia Papagiannaki
1705 33ffca25 Sofia Papagiannaki
class AssertContentInvariant(object):
1706 33ffca25 Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
1707 33ffca25 Sofia Papagiannaki
        self.callable = callable
1708 33ffca25 Sofia Papagiannaki
        self.args = args
1709 33ffca25 Sofia Papagiannaki
        self.kwargs = kwargs
1710 25c3841c Sofia Papagiannaki
    
1711 33ffca25 Sofia Papagiannaki
    def __enter__(self):
1712 23028d31 Sofia Papagiannaki
        self.content = self.callable(*self.args, **self.kwargs)[2]
1713 33ffca25 Sofia Papagiannaki
        return self.content
1714 25c3841c Sofia Papagiannaki
    
1715 33ffca25 Sofia Papagiannaki
    def __exit__(self, type, value, tb):
1716 23028d31 Sofia Papagiannaki
        content = self.callable(*self.args, **self.kwargs)[2]
1717 33ffca25 Sofia Papagiannaki
        assert self.content == content
1718 33ffca25 Sofia Papagiannaki
1719 b09c9aaa Sofia Papagiannaki
def get_content_splitted(response):
1720 b09c9aaa Sofia Papagiannaki
    if response:
1721 b09c9aaa Sofia Papagiannaki
        return response.content.split('\n')
1722 b09c9aaa Sofia Papagiannaki
1723 d1e43d6f Sofia Papagiannaki
def compute_md5_hash(data):
1724 b09c9aaa Sofia Papagiannaki
    md5 = hashlib.md5()
1725 b09c9aaa Sofia Papagiannaki
    offset = 0
1726 b09c9aaa Sofia Papagiannaki
    md5.update(data)
1727 b09c9aaa Sofia Papagiannaki
    return md5.hexdigest().lower()
1728 b09c9aaa Sofia Papagiannaki
1729 33ffca25 Sofia Papagiannaki
def compute_block_hash(data, algorithm):
1730 33ffca25 Sofia Papagiannaki
    h = hashlib.new(algorithm)
1731 d1e43d6f Sofia Papagiannaki
    h.update(data.rstrip('\x00'))
1732 d1e43d6f Sofia Papagiannaki
    return h.hexdigest()
1733 d1e43d6f Sofia Papagiannaki
1734 bd8a3026 Sofia Papagiannaki
def get_random_data(length=500):
1735 33ffca25 Sofia Papagiannaki
    char_set = string.ascii_uppercase + string.digits
1736 33ffca25 Sofia Papagiannaki
    return ''.join(random.choice(char_set) for x in range(length))
1737 33ffca25 Sofia Papagiannaki
1738 23028d31 Sofia Papagiannaki
def is_date(date):
1739 23028d31 Sofia Papagiannaki
    MONTHS = 'jan feb mar apr may jun jul aug sep oct nov dec'.split()
1740 23028d31 Sofia Papagiannaki
    __D = r'(?P<day>\d{2})'
1741 23028d31 Sofia Papagiannaki
    __D2 = r'(?P<day>[ \d]\d)'
1742 23028d31 Sofia Papagiannaki
    __M = r'(?P<mon>\w{3})'
1743 23028d31 Sofia Papagiannaki
    __Y = r'(?P<year>\d{4})'
1744 23028d31 Sofia Papagiannaki
    __Y2 = r'(?P<year>\d{2})'
1745 23028d31 Sofia Papagiannaki
    __T = r'(?P<hour>\d{2}):(?P<min>\d{2}):(?P<sec>\d{2})'
1746 23028d31 Sofia Papagiannaki
    RFC1123_DATE = re.compile(r'^\w{3}, %s %s %s %s GMT$' % (__D, __M, __Y, __T))
1747 23028d31 Sofia Papagiannaki
    RFC850_DATE = re.compile(r'^\w{6,9}, %s-%s-%s %s GMT$' % (__D, __M, __Y2, __T))
1748 23028d31 Sofia Papagiannaki
    ASCTIME_DATE = re.compile(r'^\w{3} %s %s %s %s$' % (__M, __D2, __T, __Y))
1749 23028d31 Sofia Papagiannaki
    for regex in RFC1123_DATE, RFC850_DATE, ASCTIME_DATE:
1750 23028d31 Sofia Papagiannaki
        m = regex.match(date)
1751 23028d31 Sofia Papagiannaki
        if m is not None:
1752 23028d31 Sofia Papagiannaki
            return True
1753 23028d31 Sofia Papagiannaki
    return False
1754 23028d31 Sofia Papagiannaki
1755 b09c9aaa Sofia Papagiannaki
o_names = ['kate.jpg',
1756 b09c9aaa Sofia Papagiannaki
           'kate_beckinsale.jpg',
1757 b09c9aaa Sofia Papagiannaki
           'How To Win Friends And Influence People.pdf',
1758 b09c9aaa Sofia Papagiannaki
           'moms_birthday.jpg',
1759 b09c9aaa Sofia Papagiannaki
           'poodle_strut.mov',
1760 b09c9aaa Sofia Papagiannaki
           'Disturbed - Down With The Sickness.mp3',
1761 b09c9aaa Sofia Papagiannaki
           'army_of_darkness.avi',
1762 b09c9aaa Sofia Papagiannaki
           'the_mad.avi',
1763 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/poodle.jpg',
1764 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/terrier.jpg',
1765 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/persian.jpg',
1766 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/siamese.jpg',
1767 b09c9aaa Sofia Papagiannaki
           'photos/plants/fern.jpg',
1768 b09c9aaa Sofia Papagiannaki
           'photos/plants/rose.jpg',
1769 0a425890 Antony Chazapis
           'photos/me.jpg']
1770 23028d31 Sofia Papagiannaki
1771 23028d31 Sofia Papagiannaki
if __name__ == "__main__":
1772 f7667baf Antony Chazapis
    unittest.main()