Statistics
| Branch: | Tag: | Revision:

root / pithos / tools / pithos-test @ 93abb8b2

History | View | Annotate | Download (92.8 kB)

1 952f4da1 Sofia Papagiannaki
#!/usr/bin/env python
2 ae75584f Sofia Papagiannaki
#coding=utf8
3 ae75584f Sofia Papagiannaki
4 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
5 4288ade0 Sofia Papagiannaki
# 
6 4288ade0 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
7 4288ade0 Sofia Papagiannaki
# without modification, are permitted provided that the following
8 4288ade0 Sofia Papagiannaki
# conditions are met:
9 4288ade0 Sofia Papagiannaki
# 
10 4288ade0 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
11 4288ade0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
12 4288ade0 Sofia Papagiannaki
#      disclaimer.
13 4288ade0 Sofia Papagiannaki
# 
14 4288ade0 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
15 4288ade0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
16 4288ade0 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
17 4288ade0 Sofia Papagiannaki
#      provided with the distribution.
18 4288ade0 Sofia Papagiannaki
# 
19 4288ade0 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 4288ade0 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 4288ade0 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 4288ade0 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 4288ade0 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 4288ade0 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 4288ade0 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 4288ade0 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 4288ade0 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 4288ade0 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 4288ade0 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 4288ade0 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
31 4288ade0 Sofia Papagiannaki
# 
32 4288ade0 Sofia Papagiannaki
# The views and conclusions contained in the software and
33 4288ade0 Sofia Papagiannaki
# documentation are those of the authors and should not be
34 4288ade0 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
35 4288ade0 Sofia Papagiannaki
# or implied, of GRNET S.A.
36 4288ade0 Sofia Papagiannaki
37 5a96180b Antony Chazapis
from pithos.lib.client import Pithos_Client, Fault
38 43cc6f76 Sofia Papagiannaki
from pithos.lib.util import get_user, get_auth, get_url
39 5a96180b Antony Chazapis
40 b09c9aaa Sofia Papagiannaki
from xml.dom import minidom
41 25c3841c Sofia Papagiannaki
from StringIO import StringIO
42 35390ded Sofia Papagiannaki
from hashlib import new as newhasher
43 35390ded Sofia Papagiannaki
from binascii import hexlify
44 96738a78 Sofia Papagiannaki
from httplib import HTTPConnection
45 96738a78 Sofia Papagiannaki
from urlparse import urlparse
46 b5dc1bda Sofia Papagiannaki
47 e7b51248 Sofia Papagiannaki
import json
48 7812e1f9 Sofia Papagiannaki
import unittest
49 f0eacc2c Sofia Papagiannaki
import time as _time
50 b09c9aaa Sofia Papagiannaki
import types
51 b09c9aaa Sofia Papagiannaki
import hashlib
52 b09c9aaa Sofia Papagiannaki
import mimetypes
53 b09c9aaa Sofia Papagiannaki
import random
54 b09c9aaa Sofia Papagiannaki
import datetime
55 d1e43d6f Sofia Papagiannaki
import string
56 23028d31 Sofia Papagiannaki
import re
57 23028d31 Sofia Papagiannaki
58 b09c9aaa Sofia Papagiannaki
DATE_FORMATS = ["%a %b %d %H:%M:%S %Y",
59 b09c9aaa Sofia Papagiannaki
                "%A, %d-%b-%y %H:%M:%S GMT",
60 b09c9aaa Sofia Papagiannaki
                "%a, %d %b %Y %H:%M:%S GMT"]
61 b09c9aaa Sofia Papagiannaki
62 ae75584f Sofia Papagiannaki
OTHER_ACCOUNTS = {
63 ae75584f Sofia Papagiannaki
    '0001': 'verigak',
64 ae75584f Sofia Papagiannaki
    '0002': 'chazapis',
65 ae75584f Sofia Papagiannaki
    '0003': 'gtsouk',
66 ae75584f Sofia Papagiannaki
    '0004': 'papagian',
67 ae75584f Sofia Papagiannaki
    '0005': 'louridas',
68 ae75584f Sofia Papagiannaki
    '0006': 'chstath',
69 ae75584f Sofia Papagiannaki
    '0007': 'pkanavos',
70 e7b51248 Sofia Papagiannaki
    '0008': 'mvasilak',
71 95e92490 Sofia Papagiannaki
    '0009': 'διογένης'}
72 ae75584f Sofia Papagiannaki
73 23028d31 Sofia Papagiannaki
class BaseTestCase(unittest.TestCase):
74 b09c9aaa Sofia Papagiannaki
    #TODO unauthorized request
75 b09c9aaa Sofia Papagiannaki
    def setUp(self):
76 43cc6f76 Sofia Papagiannaki
        self.client = Pithos_Client(get_url(), get_auth(), get_user())
77 96bfb229 Sofia Papagiannaki
        self._clean_account()
78 43cc6f76 Sofia Papagiannaki
        self.invalid_client = Pithos_Client(get_url(), get_auth(), 'invalid')
79 68229c3e Sofia Papagiannaki
        
80 68229c3e Sofia Papagiannaki
        #keep track of initial account groups
81 68229c3e Sofia Papagiannaki
        self.initial_groups = self.client.retrieve_account_groups()
82 68229c3e Sofia Papagiannaki
        
83 68229c3e Sofia Papagiannaki
        #keep track of initial account meta
84 68229c3e Sofia Papagiannaki
        self.initial_meta = self.client.retrieve_account_metadata(restricted=True)
85 68229c3e Sofia Papagiannaki
        
86 b09c9aaa Sofia Papagiannaki
        self.extended = {
87 b09c9aaa Sofia Papagiannaki
            'container':(
88 b09c9aaa Sofia Papagiannaki
                'name',
89 b09c9aaa Sofia Papagiannaki
                'count',
90 b09c9aaa Sofia Papagiannaki
                'bytes',
91 ae75584f Sofia Papagiannaki
                'last_modified',
92 ce9e59cf Sofia Papagiannaki
                'x_container_policy'),
93 b09c9aaa Sofia Papagiannaki
            'object':(
94 b09c9aaa Sofia Papagiannaki
                'name',
95 b09c9aaa Sofia Papagiannaki
                'hash',
96 b09c9aaa Sofia Papagiannaki
                'bytes',
97 b09c9aaa Sofia Papagiannaki
                'content_type',
98 b09c9aaa Sofia Papagiannaki
                'content_encoding',
99 b09c9aaa Sofia Papagiannaki
                'last_modified',)}
100 297513ba Antony Chazapis
        self.return_codes = (400, 401, 403, 404, 503,)
101 25c3841c Sofia Papagiannaki
    
102 25c3841c Sofia Papagiannaki
    def tearDown(self):
103 68229c3e Sofia Papagiannaki
        #delete additionally created meta
104 68229c3e Sofia Papagiannaki
        l = []
105 68229c3e Sofia Papagiannaki
        for m in self.client.retrieve_account_metadata(restricted=True):
106 68229c3e Sofia Papagiannaki
            if m not in self.initial_meta:
107 68229c3e Sofia Papagiannaki
                l.append(m)
108 68229c3e Sofia Papagiannaki
        self.client.delete_account_metadata(l)
109 68229c3e Sofia Papagiannaki
        
110 68229c3e Sofia Papagiannaki
        #delete additionally created groups
111 68229c3e Sofia Papagiannaki
        l = []
112 68229c3e Sofia Papagiannaki
        for g in self.client.retrieve_account_groups():
113 68229c3e Sofia Papagiannaki
            if g not in self.initial_groups:
114 68229c3e Sofia Papagiannaki
                l.append(g)
115 68229c3e Sofia Papagiannaki
        self.client.unset_account_groups(l)
116 96bfb229 Sofia Papagiannaki
        self._clean_account()
117 96bfb229 Sofia Papagiannaki
    
118 96bfb229 Sofia Papagiannaki
    def _clean_account(self):
119 25c3841c Sofia Papagiannaki
        for c in self.client.list_containers():
120 ae75584f Sofia Papagiannaki
            while True:
121 ae75584f Sofia Papagiannaki
                #list objects returns at most 10000 objects
122 ae75584f Sofia Papagiannaki
                #so repeat until there are no more objects
123 ae75584f Sofia Papagiannaki
                objects = self.client.list_objects(c)
124 ae75584f Sofia Papagiannaki
                if not objects:
125 ae75584f Sofia Papagiannaki
                    break
126 ae75584f Sofia Papagiannaki
                for o in objects:
127 ae75584f Sofia Papagiannaki
                    self.client.delete_object(c, o)
128 25c3841c Sofia Papagiannaki
            self.client.delete_container(c)
129 25c3841c Sofia Papagiannaki
    
130 23028d31 Sofia Papagiannaki
    def assert_status(self, status, codes):
131 b09c9aaa Sofia Papagiannaki
        l = [elem for elem in self.return_codes]
132 b09c9aaa Sofia Papagiannaki
        if type(codes) == types.ListType:
133 b09c9aaa Sofia Papagiannaki
            l.extend(codes)
134 b09c9aaa Sofia Papagiannaki
        else:
135 b09c9aaa Sofia Papagiannaki
            l.append(codes)
136 23028d31 Sofia Papagiannaki
        self.assertTrue(status in l)
137 23028d31 Sofia Papagiannaki
    
138 ae75584f Sofia Papagiannaki
    def assert_extended(self, data, format, type, size=10000):
139 f0eacc2c Sofia Papagiannaki
        if format == 'xml':
140 f0eacc2c Sofia Papagiannaki
            self._assert_xml(data, type, size)
141 f0eacc2c Sofia Papagiannaki
        elif format == 'json':
142 f0eacc2c Sofia Papagiannaki
            self._assert_json(data, type, size)
143 f0eacc2c Sofia Papagiannaki
    
144 f0eacc2c Sofia Papagiannaki
    def _assert_json(self, data, type, size):
145 f0eacc2c Sofia Papagiannaki
        convert = lambda s: s.lower()
146 f0eacc2c Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
147 f0eacc2c Sofia Papagiannaki
        self.assertTrue(len(data) <= size)
148 f0eacc2c Sofia Papagiannaki
        for item in info:
149 f0eacc2c Sofia Papagiannaki
            for i in data:
150 f0eacc2c Sofia Papagiannaki
                if 'subdir' in i.keys():
151 f0eacc2c Sofia Papagiannaki
                    continue
152 f0eacc2c Sofia Papagiannaki
                self.assertTrue(item in i.keys())
153 f0eacc2c Sofia Papagiannaki
    
154 f0eacc2c Sofia Papagiannaki
    def _assert_xml(self, data, type, size):
155 f0eacc2c Sofia Papagiannaki
        convert = lambda s: s.lower()
156 f0eacc2c Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
157 f0eacc2c Sofia Papagiannaki
        try:
158 f0eacc2c Sofia Papagiannaki
            info.remove('content_encoding')
159 f0eacc2c Sofia Papagiannaki
        except ValueError:
160 f0eacc2c Sofia Papagiannaki
            pass
161 f0eacc2c Sofia Papagiannaki
        xml = data
162 f0eacc2c Sofia Papagiannaki
        entities = xml.getElementsByTagName(type)
163 f0eacc2c Sofia Papagiannaki
        self.assertTrue(len(entities) <= size)
164 f0eacc2c Sofia Papagiannaki
        for e in entities:
165 f0eacc2c Sofia Papagiannaki
            for item in info:
166 ae75584f Sofia Papagiannaki
                self.assertTrue(e.getElementsByTagName(item))
167 23028d31 Sofia Papagiannaki
    
168 23028d31 Sofia Papagiannaki
    def assert_raises_fault(self, status, callableObj, *args, **kwargs):
169 23028d31 Sofia Papagiannaki
        """
170 23028d31 Sofia Papagiannaki
        asserts that a Fault with a specific status is raised
171 23028d31 Sofia Papagiannaki
        when callableObj is called with the specific arguments
172 23028d31 Sofia Papagiannaki
        """
173 23028d31 Sofia Papagiannaki
        try:
174 ae75584f Sofia Papagiannaki
            r = callableObj(*args, **kwargs)
175 23028d31 Sofia Papagiannaki
            self.fail('Should never reach here')
176 23028d31 Sofia Papagiannaki
        except Fault, f:
177 0538cac6 Sofia Papagiannaki
            if type(status) == types.ListType:
178 0538cac6 Sofia Papagiannaki
                self.failUnless(f.status in status)
179 0538cac6 Sofia Papagiannaki
            else:
180 0538cac6 Sofia Papagiannaki
                self.failUnless(f.status == status)
181 23028d31 Sofia Papagiannaki
    
182 e7b51248 Sofia Papagiannaki
    def assert_not_raises_fault(self, status, callableObj, *args, **kwargs):
183 e7b51248 Sofia Papagiannaki
        """
184 e7b51248 Sofia Papagiannaki
        asserts that a Fault with a specific status is not raised
185 e7b51248 Sofia Papagiannaki
        when callableObj is called with the specific arguments
186 e7b51248 Sofia Papagiannaki
        """
187 e7b51248 Sofia Papagiannaki
        try:
188 e7b51248 Sofia Papagiannaki
            r = callableObj(*args, **kwargs)
189 e7b51248 Sofia Papagiannaki
        except Fault, f:
190 95e92490 Sofia Papagiannaki
            self.failIfEqual(f.status, status)
191 e7b51248 Sofia Papagiannaki
    
192 25c3841c Sofia Papagiannaki
    def assert_container_exists(self, container):
193 25c3841c Sofia Papagiannaki
        """
194 25c3841c Sofia Papagiannaki
        asserts the existence of a container
195 25c3841c Sofia Papagiannaki
        """
196 25c3841c Sofia Papagiannaki
        try:
197 25c3841c Sofia Papagiannaki
            self.client.retrieve_container_metadata(container)
198 25c3841c Sofia Papagiannaki
        except Fault, f:
199 25c3841c Sofia Papagiannaki
            self.failIf(f.status == 404)
200 25c3841c Sofia Papagiannaki
    
201 e7b51248 Sofia Papagiannaki
    def assert_container_not_exists(self, container):
202 e7b51248 Sofia Papagiannaki
        """
203 e7b51248 Sofia Papagiannaki
        asserts there is no such a container
204 e7b51248 Sofia Papagiannaki
        """
205 e7b51248 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_container_metadata,
206 e7b51248 Sofia Papagiannaki
                                 container)
207 e7b51248 Sofia Papagiannaki
    
208 23028d31 Sofia Papagiannaki
    def assert_object_exists(self, container, object):
209 23028d31 Sofia Papagiannaki
        """
210 23028d31 Sofia Papagiannaki
        asserts the existence of an object
211 23028d31 Sofia Papagiannaki
        """
212 23028d31 Sofia Papagiannaki
        try:
213 23028d31 Sofia Papagiannaki
            self.client.retrieve_object_metadata(container, object)
214 23028d31 Sofia Papagiannaki
        except Fault, f:
215 23028d31 Sofia Papagiannaki
            self.failIf(f.status == 404)
216 23028d31 Sofia Papagiannaki
    
217 23028d31 Sofia Papagiannaki
    def assert_object_not_exists(self, container, object):
218 23028d31 Sofia Papagiannaki
        """
219 23028d31 Sofia Papagiannaki
        asserts there is no such an object
220 23028d31 Sofia Papagiannaki
        """
221 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object_metadata,
222 23028d31 Sofia Papagiannaki
                                 container, object)
223 25c3841c Sofia Papagiannaki
    
224 8d964102 Sofia Papagiannaki
    def assert_versionlist_structure(self, versionlist):
225 8d964102 Sofia Papagiannaki
        self.assertTrue(type(versionlist) == types.ListType)
226 8d964102 Sofia Papagiannaki
        for elem in versionlist:
227 8d964102 Sofia Papagiannaki
            self.assertTrue(type(elem) == types.ListType)
228 8d964102 Sofia Papagiannaki
            self.assertEqual(len(elem), 2)
229 8d964102 Sofia Papagiannaki
    
230 23028d31 Sofia Papagiannaki
    def upload_random_data(self, container, name, length=1024, type=None,
231 23028d31 Sofia Papagiannaki
                           enc=None, **meta):
232 33ffca25 Sofia Papagiannaki
        data = get_random_data(length)
233 23028d31 Sofia Papagiannaki
        return self.upload_data(container, name, data, type, enc, **meta)
234 25c3841c Sofia Papagiannaki
    
235 23028d31 Sofia Papagiannaki
    def upload_data(self, container, name, data, type=None, enc=None, etag=None,
236 23028d31 Sofia Papagiannaki
                    **meta):
237 b09c9aaa Sofia Papagiannaki
        obj = {}
238 b09c9aaa Sofia Papagiannaki
        obj['name'] = name
239 b09c9aaa Sofia Papagiannaki
        try:
240 b09c9aaa Sofia Papagiannaki
            obj['data'] = data
241 d1e43d6f Sofia Papagiannaki
            obj['hash'] = compute_md5_hash(obj['data'])
242 33ffca25 Sofia Papagiannaki
            
243 25c3841c Sofia Papagiannaki
            args = {}
244 25c3841c Sofia Papagiannaki
            args['etag'] = etag if etag else obj['hash']
245 25c3841c Sofia Papagiannaki
            
246 ae75584f Sofia Papagiannaki
            try:
247 ae75584f Sofia Papagiannaki
                guess = mimetypes.guess_type(name)
248 ae75584f Sofia Papagiannaki
                type = type if type else guess[0]
249 ae75584f Sofia Papagiannaki
                enc = enc if enc else guess[1]
250 ae75584f Sofia Papagiannaki
            except:
251 ae75584f Sofia Papagiannaki
                pass
252 25c3841c Sofia Papagiannaki
            args['content_type'] = type if type else 'plain/text'
253 25c3841c Sofia Papagiannaki
            args['content_encoding'] = enc if enc else None
254 25c3841c Sofia Papagiannaki
            
255 25c3841c Sofia Papagiannaki
            obj['meta'] = args
256 23028d31 Sofia Papagiannaki
            
257 23028d31 Sofia Papagiannaki
            path = '/%s/%s' % (container, name)
258 ad7e4bea Sofia Papagiannaki
            self.client.create_object(container, name, f=StringIO(obj['data']),
259 ad7e4bea Sofia Papagiannaki
                                      meta=meta, **args)
260 25c3841c Sofia Papagiannaki
            
261 25c3841c Sofia Papagiannaki
            return obj
262 b09c9aaa Sofia Papagiannaki
        except IOError:
263 b09c9aaa Sofia Papagiannaki
            return
264 b09c9aaa Sofia Papagiannaki
265 d1e43d6f Sofia Papagiannaki
class AccountHead(BaseTestCase):
266 d1e43d6f Sofia Papagiannaki
    def setUp(self):
267 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
268 d1e43d6f Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
269 d1e43d6f Sofia Papagiannaki
        for item in self.containers:
270 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
271 7812e1f9 Sofia Papagiannaki
        
272 7812e1f9 Sofia Papagiannaki
        meta = {'foo':'bar'}
273 7812e1f9 Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
274 68229c3e Sofia Papagiannaki
        #self.updated_meta = self.initial_meta.update(meta)
275 f0eacc2c Sofia Papagiannaki
    
276 d1e43d6f Sofia Papagiannaki
    def test_get_account_meta(self):
277 25c3841c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata()
278 23028d31 Sofia Papagiannaki
        
279 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
280 33ffca25 Sofia Papagiannaki
        l = str(len(containers))
281 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['x-account-container-count'], l)
282 d1e43d6f Sofia Papagiannaki
        size = 0
283 d1e43d6f Sofia Papagiannaki
        for c in containers:
284 25c3841c Sofia Papagiannaki
            m = self.client.retrieve_container_metadata(c)
285 25c3841c Sofia Papagiannaki
            size = size + int(m['x-container-bytes-used'])
286 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['x-account-bytes-used'], str(size))
287 25c3841c Sofia Papagiannaki
    
288 297513ba Antony Chazapis
    def test_get_account_403(self):
289 297513ba Antony Chazapis
        self.assert_raises_fault(403,
290 f0eacc2c Sofia Papagiannaki
                                 self.invalid_client.retrieve_account_metadata)
291 f0eacc2c Sofia Papagiannaki
    
292 f0eacc2c Sofia Papagiannaki
    def test_get_account_meta_until(self):
293 f0eacc2c Sofia Papagiannaki
        t = datetime.datetime.utcnow()
294 f0eacc2c Sofia Papagiannaki
        past = t - datetime.timedelta(minutes=-15)
295 f0eacc2c Sofia Papagiannaki
        past = int(_time.mktime(past.timetuple()))
296 f0eacc2c Sofia Papagiannaki
        
297 7812e1f9 Sofia Papagiannaki
        meta = {'premium':True}
298 f0eacc2c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
299 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True,
300 f0eacc2c Sofia Papagiannaki
                                                     until=past)
301 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' not in meta)
302 f0eacc2c Sofia Papagiannaki
        
303 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True)
304 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' in meta)
305 f0eacc2c Sofia Papagiannaki
    
306 f0eacc2c Sofia Papagiannaki
    def test_get_account_meta_until_invalid_date(self):
307 7812e1f9 Sofia Papagiannaki
        meta = {'premium':True}
308 f0eacc2c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
309 f0eacc2c Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True,
310 f0eacc2c Sofia Papagiannaki
                                                     until='kshfksfh')
311 7812e1f9 Sofia Papagiannaki
        self.assertTrue('premium' in meta)
312 ae75584f Sofia Papagiannaki
    
313 d1e43d6f Sofia Papagiannaki
class AccountGet(BaseTestCase):
314 b09c9aaa Sofia Papagiannaki
    def setUp(self):
315 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
316 b09c9aaa Sofia Papagiannaki
        #create some containers
317 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
318 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
319 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
320 25c3841c Sofia Papagiannaki
    
321 b09c9aaa Sofia Papagiannaki
    def test_list(self):
322 b09c9aaa Sofia Papagiannaki
        #list containers
323 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
324 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers, containers)
325 25c3841c Sofia Papagiannaki
    
326 297513ba Antony Chazapis
    def test_list_403(self):
327 297513ba Antony Chazapis
        self.assert_raises_fault(403, self.invalid_client.list_containers)
328 25c3841c Sofia Papagiannaki
    
329 b09c9aaa Sofia Papagiannaki
    def test_list_with_limit(self):
330 b09c9aaa Sofia Papagiannaki
        limit = 2
331 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=limit)
332 b09c9aaa Sofia Papagiannaki
        self.assertEquals(len(containers), limit)
333 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers[:2], containers)
334 25c3841c Sofia Papagiannaki
    
335 b09c9aaa Sofia Papagiannaki
    def test_list_with_marker(self):
336 33ffca25 Sofia Papagiannaki
        l = 2
337 33ffca25 Sofia Papagiannaki
        m = 'bananas'
338 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m)
339 33ffca25 Sofia Papagiannaki
        i = self.containers.index(m) + 1
340 33ffca25 Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+l)], containers)
341 b09c9aaa Sofia Papagiannaki
        
342 33ffca25 Sofia Papagiannaki
        m = 'oranges'
343 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m)
344 33ffca25 Sofia Papagiannaki
        i = self.containers.index(m) + 1
345 33ffca25 Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+l)], containers)
346 25c3841c Sofia Papagiannaki
    
347 b09c9aaa Sofia Papagiannaki
    def test_list_json_with_marker(self):
348 33ffca25 Sofia Papagiannaki
        l = 2
349 33ffca25 Sofia Papagiannaki
        m = 'bananas'
350 f0eacc2c Sofia Papagiannaki
        containers = self.client.list_containers(limit=l, marker=m, format='json')
351 f0eacc2c Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', l)
352 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'kiwis')
353 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[1]['name'], 'oranges')
354 25c3841c Sofia Papagiannaki
    
355 f0eacc2c Sofia Papagiannaki
    def test_list_xml_with_marker(self):
356 f0eacc2c Sofia Papagiannaki
        l = 2
357 f0eacc2c Sofia Papagiannaki
        m = 'oranges'
358 f0eacc2c Sofia Papagiannaki
        xml = self.client.list_containers(limit=l, marker=m, format='xml')
359 ae75584f Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', l)
360 f0eacc2c Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
361 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(nodes), 1)
362 f0eacc2c Sofia Papagiannaki
        self.assertEqual(nodes[0].childNodes[0].data, 'pears')
363 25c3841c Sofia Papagiannaki
    
364 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
365 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
366 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
367 d1e43d6f Sofia Papagiannaki
        
368 d1e43d6f Sofia Papagiannaki
        #add a new container
369 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
370 25c3841c Sofia Papagiannaki
        
371 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
372 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
373 25c3841c Sofia Papagiannaki
            try:
374 25c3841c Sofia Papagiannaki
                c = self.client.list_containers(if_modified_since=past)
375 25c3841c Sofia Papagiannaki
                self.assertEqual(len(c), len(self.containers) + 1)
376 25c3841c Sofia Papagiannaki
            except Fault, f:
377 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304) #fail if not modified
378 25c3841c Sofia Papagiannaki
    
379 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
380 25c3841c Sofia Papagiannaki
        c = self.client.list_containers(if_modified_since='')
381 25c3841c Sofia Papagiannaki
        self.assertEqual(len(c), len(self.containers))
382 25c3841c Sofia Papagiannaki
    
383 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
384 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
385 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
386 d1e43d6f Sofia Papagiannaki
        
387 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
388 25c3841c Sofia Papagiannaki
            args = {'if_modified_since':'%s' %since.strftime(f)}
389 25c3841c Sofia Papagiannaki
            
390 d1e43d6f Sofia Papagiannaki
            #assert not modified
391 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.list_containers, **args)
392 25c3841c Sofia Papagiannaki
    
393 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
394 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
395 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
396 d1e43d6f Sofia Papagiannaki
        
397 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
398 25c3841c Sofia Papagiannaki
            c = self.client.list_containers(if_unmodified_since=since.strftime(f))
399 d1e43d6f Sofia Papagiannaki
            
400 d1e43d6f Sofia Papagiannaki
            #assert success
401 25c3841c Sofia Papagiannaki
            self.assertEqual(self.containers, c)
402 25c3841c Sofia Papagiannaki
    
403 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
404 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
405 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
406 d1e43d6f Sofia Papagiannaki
        
407 d1e43d6f Sofia Papagiannaki
        #add a new container
408 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
409 d1e43d6f Sofia Papagiannaki
        
410 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
411 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
412 d1e43d6f Sofia Papagiannaki
            
413 25c3841c Sofia Papagiannaki
            args = {'if_unmodified_since':'%s' %past}
414 25c3841c Sofia Papagiannaki
            
415 23028d31 Sofia Papagiannaki
            #assert precondition failed
416 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.list_containers, **args)
417 25c3841c Sofia Papagiannaki
    
418 d1e43d6f Sofia Papagiannaki
class AccountPost(BaseTestCase):
419 b09c9aaa Sofia Papagiannaki
    def setUp(self):
420 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
421 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
422 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
423 25c3841c Sofia Papagiannaki
            self.client.create_container(item)
424 cd6ada1d Sofia Papagiannaki
        
425 cd6ada1d Sofia Papagiannaki
        meta = {'foo':'bar'}
426 25c3841c Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
427 5893eeef Sofia Papagiannaki
        self.updated_meta = self.initial_meta.update(meta)
428 cd6ada1d Sofia Papagiannaki
    
429 cd6ada1d Sofia Papagiannaki
    def test_update_meta(self):
430 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
431 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
432 cd6ada1d Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
433 cd6ada1d Sofia Papagiannaki
            
434 cd6ada1d Sofia Papagiannaki
            meta.update(self.initial_meta)
435 cd6ada1d Sofia Papagiannaki
            self.assertEqual(meta,
436 cd6ada1d Sofia Papagiannaki
                             self.client.retrieve_account_metadata(
437 cd6ada1d Sofia Papagiannaki
                                restricted=True))
438 cd6ada1d Sofia Papagiannaki
        
439 f0eacc2c Sofia Papagiannaki
    def test_invalid_account_update_meta(self):
440 cd6ada1d Sofia Papagiannaki
        meta = {'test':'test', 'tost':'tost'}
441 297513ba Antony Chazapis
        self.assert_raises_fault(403,
442 f0eacc2c Sofia Papagiannaki
                                 self.invalid_client.update_account_metadata,
443 f0eacc2c Sofia Papagiannaki
                                 **meta)
444 cd6ada1d Sofia Papagiannaki
    
445 cd6ada1d Sofia Papagiannaki
    def test_reset_meta(self):
446 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
447 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
448 cd6ada1d Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
449 cd6ada1d Sofia Papagiannaki
            
450 cd6ada1d Sofia Papagiannaki
            meta = {'test':'test33'}
451 cd6ada1d Sofia Papagiannaki
            self.client.reset_account_metadata(**meta)
452 cd6ada1d Sofia Papagiannaki
            
453 cd6ada1d Sofia Papagiannaki
            self.assertEqual(meta, self.client.retrieve_account_metadata(restricted=True))
454 cd6ada1d Sofia Papagiannaki
    
455 7812e1f9 Sofia Papagiannaki
    def test_delete_meta(self):
456 7812e1f9 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_groups):
457 7812e1f9 Sofia Papagiannaki
            meta = {'test':'test', 'tost':'tost'}
458 7812e1f9 Sofia Papagiannaki
            self.client.update_account_metadata(**meta)
459 7812e1f9 Sofia Papagiannaki
            
460 7812e1f9 Sofia Papagiannaki
            self.client.delete_account_metadata(meta.keys())
461 7812e1f9 Sofia Papagiannaki
            
462 7812e1f9 Sofia Papagiannaki
            account_meta = self.client.retrieve_account_metadata(restricted=True)
463 7812e1f9 Sofia Papagiannaki
            for m in meta:
464 7812e1f9 Sofia Papagiannaki
                self.assertTrue(m not in account_meta.keys())
465 cd6ada1d Sofia Papagiannaki
    
466 cd6ada1d Sofia Papagiannaki
    def test_set_account_groups(self):
467 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
468 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis'}
469 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
470 cd6ada1d Sofia Papagiannaki
            
471 62f915a1 Antony Chazapis
            self.assertEqual(set(groups['pithosdev']),
472 62f915a1 Antony Chazapis
                             set(self.client.retrieve_account_groups()['pithosdev']))
473 cd6ada1d Sofia Papagiannaki
            
474 cd6ada1d Sofia Papagiannaki
            more_groups = {'clientsdev':'pkanavos,mvasilak'}
475 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**more_groups)
476 cd6ada1d Sofia Papagiannaki
            
477 cd6ada1d Sofia Papagiannaki
            groups.update(more_groups)
478 62f915a1 Antony Chazapis
            self.assertEqual(set(groups['clientsdev']),
479 62f915a1 Antony Chazapis
                             set(self.client.retrieve_account_groups()['clientsdev']))
480 cd6ada1d Sofia Papagiannaki
    
481 cd6ada1d Sofia Papagiannaki
    def test_reset_account_groups(self):
482 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
483 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis',
484 cd6ada1d Sofia Papagiannaki
                      'clientsdev':'pkanavos,mvasilak'}
485 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
486 cd6ada1d Sofia Papagiannaki
            
487 62f915a1 Antony Chazapis
            self.assertEqual(set(groups['pithosdev'].split(',')),
488 62f915a1 Antony Chazapis
                             set(self.client.retrieve_account_groups()['pithosdev'].split(',')))
489 62f915a1 Antony Chazapis
            self.assertEqual(set(groups['clientsdev'].split(',')),
490 62f915a1 Antony Chazapis
                             set(self.client.retrieve_account_groups()['clientsdev'].split(',')))
491 cd6ada1d Sofia Papagiannaki
            
492 e7b51248 Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis,papagian'}
493 cd6ada1d Sofia Papagiannaki
            self.client.reset_account_groups(**groups)
494 cd6ada1d Sofia Papagiannaki
            
495 62f915a1 Antony Chazapis
            self.assertEqual(set(groups['pithosdev'].split(',')),
496 62f915a1 Antony Chazapis
                             set(self.client.retrieve_account_groups()['pithosdev'].split(',')))
497 cd6ada1d Sofia Papagiannaki
    
498 cd6ada1d Sofia Papagiannaki
    def test_delete_account_groups(self):
499 cd6ada1d Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_account_metadata):
500 cd6ada1d Sofia Papagiannaki
            groups = {'pithosdev':'verigak,gtsouk,chazapis',
501 cd6ada1d Sofia Papagiannaki
                      'clientsdev':'pkanavos,mvasilak'}
502 cd6ada1d Sofia Papagiannaki
            self.client.set_account_groups(**groups)
503 cd6ada1d Sofia Papagiannaki
            
504 cd6ada1d Sofia Papagiannaki
            self.client.unset_account_groups(groups.keys())
505 cd6ada1d Sofia Papagiannaki
            
506 cd6ada1d Sofia Papagiannaki
            self.assertEqual({}, self.client.retrieve_account_groups())
507 cd6ada1d Sofia Papagiannaki
    
508 d1e43d6f Sofia Papagiannaki
class ContainerHead(BaseTestCase):
509 d1e43d6f Sofia Papagiannaki
    def setUp(self):
510 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
511 d1e43d6f Sofia Papagiannaki
        self.container = 'apples'
512 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
513 25c3841c Sofia Papagiannaki
    
514 d1e43d6f Sofia Papagiannaki
    def test_get_meta(self):
515 23028d31 Sofia Papagiannaki
        meta = {'trash':'true'}
516 d1e43d6f Sofia Papagiannaki
        t1 = datetime.datetime.utcnow()
517 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.container, o_names[0], **meta)
518 d1e43d6f Sofia Papagiannaki
        if o:
519 25c3841c Sofia Papagiannaki
            headers = self.client.retrieve_container_metadata(self.container)
520 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['x-container-object-count'], '1')
521 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['x-container-bytes-used'], str(len(o['data'])))
522 23028d31 Sofia Papagiannaki
            t2 = datetime.datetime.strptime(headers['last-modified'], DATE_FORMATS[2])
523 d1e43d6f Sofia Papagiannaki
            delta = (t2 - t1)
524 d1e43d6f Sofia Papagiannaki
            threashold = datetime.timedelta(seconds=1) 
525 d1e43d6f Sofia Papagiannaki
            self.assertTrue(delta < threashold)
526 23028d31 Sofia Papagiannaki
            self.assertTrue(headers['x-container-object-meta'])
527 23028d31 Sofia Papagiannaki
            self.assertTrue('Trash' in headers['x-container-object-meta'])
528 d1e43d6f Sofia Papagiannaki
529 d1e43d6f Sofia Papagiannaki
class ContainerGet(BaseTestCase):
530 b09c9aaa Sofia Papagiannaki
    def setUp(self):
531 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
532 b09c9aaa Sofia Papagiannaki
        self.container = ['pears', 'apples']
533 b09c9aaa Sofia Papagiannaki
        for c in self.container:
534 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
535 b09c9aaa Sofia Papagiannaki
        self.obj = []
536 b09c9aaa Sofia Papagiannaki
        for o in o_names[:8]:
537 23028d31 Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.container[0], o))
538 b09c9aaa Sofia Papagiannaki
        for o in o_names[8:]:
539 23028d31 Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.container[1], o))
540 25c3841c Sofia Papagiannaki
    
541 b09c9aaa Sofia Papagiannaki
    def test_list_objects(self):
542 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[0])
543 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
544 b09c9aaa Sofia Papagiannaki
        l.sort()
545 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l)
546 25c3841c Sofia Papagiannaki
    
547 ae75584f Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
548 ae75584f Sofia Papagiannaki
        self.client.create_container('test')
549 ae75584f Sofia Papagiannaki
        self.upload_random_data('test', '/objectname')
550 ae75584f Sofia Papagiannaki
        
551 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test')
552 ae75584f Sofia Papagiannaki
        self.assertEqual(objects, ['/objectname'])
553 ae75584f Sofia Papagiannaki
        
554 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test', format='json')
555 ae75584f Sofia Papagiannaki
        self.assertEqual(objects[0]['name'], '/objectname')
556 ae75584f Sofia Papagiannaki
        
557 ae75584f Sofia Papagiannaki
        objects = self.client.list_objects('test', format='xml')
558 ae75584f Sofia Papagiannaki
        self.assert_extended(objects, 'xml', 'object')
559 ae75584f Sofia Papagiannaki
        node_name = objects.getElementsByTagName('name')[0]
560 ae75584f Sofia Papagiannaki
        self.assertEqual(node_name.firstChild.data, '/objectname')
561 ae75584f Sofia Papagiannaki
562 b09c9aaa Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
563 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[0], limit=2)
564 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
565 b09c9aaa Sofia Papagiannaki
        l.sort()
566 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l[:2])
567 b09c9aaa Sofia Papagiannaki
        
568 b09c9aaa Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
569 b09c9aaa Sofia Papagiannaki
                   'moms_birthday.jpg']
570 b09c9aaa Sofia Papagiannaki
        limit = 4
571 b09c9aaa Sofia Papagiannaki
        for m in markers:
572 25c3841c Sofia Papagiannaki
            objects = self.client.list_objects(self.container[0], limit=limit,
573 25c3841c Sofia Papagiannaki
                                               marker=m)
574 b09c9aaa Sofia Papagiannaki
            l = [elem['name'] for elem in self.obj[:8]]
575 b09c9aaa Sofia Papagiannaki
            l.sort()
576 b09c9aaa Sofia Papagiannaki
            start = l.index(m) + 1
577 b09c9aaa Sofia Papagiannaki
            end = start + limit
578 af6d3b5d Antony Chazapis
            end = end if len(l) >= end else len(l)
579 b09c9aaa Sofia Papagiannaki
            self.assertEqual(objects, l[start:end])
580 25c3841c Sofia Papagiannaki
    
581 ae75584f Sofia Papagiannaki
    #takes too long
582 9ac5299c Antony Chazapis
    def _test_list_limit_exceeds(self):
583 e7b51248 Sofia Papagiannaki
        self.client.create_container('pithos')
584 e7b51248 Sofia Papagiannaki
        
585 e7b51248 Sofia Papagiannaki
        for i in range(10001):
586 e7b51248 Sofia Papagiannaki
            self.client.create_zero_length_object('pithos', i)
587 e7b51248 Sofia Papagiannaki
        
588 e7b51248 Sofia Papagiannaki
        self.assertEqual(10000, len(self.client.list_objects('pithos')))
589 ae75584f Sofia Papagiannaki
    
590 ae75584f Sofia Papagiannaki
    def test_list_empty_params(self):
591 a5149fd0 Sofia Papagiannaki
        objects = self.client.get('/%s/%s' % (get_user(), self.container[0]))[2]
592 ae75584f Sofia Papagiannaki
        if objects:
593 ae75584f Sofia Papagiannaki
            objects = objects.strip().split('\n')
594 ae75584f Sofia Papagiannaki
        self.assertEqual(objects,
595 ae75584f Sofia Papagiannaki
                         self.client.list_objects(self.container[0]))
596 ae75584f Sofia Papagiannaki
    
597 b09c9aaa Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
598 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], prefix='photos',
599 25c3841c Sofia Papagiannaki
                                           delimiter='/')
600 33ffca25 Sofia Papagiannaki
        self.assertEquals(['photos/animals/', 'photos/me.jpg',
601 33ffca25 Sofia Papagiannaki
                           'photos/plants/'], objects)
602 b09c9aaa Sofia Papagiannaki
        
603 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1],
604 25c3841c Sofia Papagiannaki
                                           prefix='photos/animals',
605 25c3841c Sofia Papagiannaki
                                           delimiter='/')
606 33ffca25 Sofia Papagiannaki
        l = ['photos/animals/cats/', 'photos/animals/dogs/']
607 23028d31 Sofia Papagiannaki
        self.assertEquals(l, objects)
608 b09c9aaa Sofia Papagiannaki
        
609 25c3841c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], path='photos')
610 b09c9aaa Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
611 25c3841c Sofia Papagiannaki
    
612 b09c9aaa Sofia Papagiannaki
    def test_extended_list_json(self):
613 f0eacc2c Sofia Papagiannaki
        objects = self.client.list_objects(self.container[1], format='json',
614 25c3841c Sofia Papagiannaki
                                           limit=2, prefix='photos/animals',
615 25c3841c Sofia Papagiannaki
                                           delimiter='/')
616 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
617 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
618 25c3841c Sofia Papagiannaki
    
619 f0eacc2c Sofia Papagiannaki
    def test_extended_list_xml(self):
620 f0eacc2c Sofia Papagiannaki
        xml = self.client.list_objects(self.container[1], format='xml', limit=4,
621 f0eacc2c Sofia Papagiannaki
                                       prefix='photos', delimiter='/')
622 ae75584f Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
623 f0eacc2c Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
624 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
625 f0eacc2c Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
626 f0eacc2c Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
627 f0eacc2c Sofia Papagiannaki
        
628 f0eacc2c Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
629 f0eacc2c Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
630 f0eacc2c Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
631 25c3841c Sofia Papagiannaki
    
632 3364a52a Sofia Papagiannaki
    def test_list_meta_double_matching(self):
633 23028d31 Sofia Papagiannaki
        meta = {'quality':'aaa', 'stock':'true'}
634 23028d31 Sofia Papagiannaki
        self.client.update_object_metadata(self.container[0],
635 23028d31 Sofia Papagiannaki
                                           self.obj[0]['name'], **meta)
636 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,Stock')
637 3364a52a Sofia Papagiannaki
        self.assertEqual(len(obj), 1)
638 3364a52a Sofia Papagiannaki
        self.assertTrue(obj, self.obj[0]['name'])
639 25c3841c Sofia Papagiannaki
    
640 b09c9aaa Sofia Papagiannaki
    def test_list_using_meta(self):
641 23028d31 Sofia Papagiannaki
        meta = {'quality':'aaa'}
642 b09c9aaa Sofia Papagiannaki
        for o in self.obj[:2]:
643 23028d31 Sofia Papagiannaki
            self.client.update_object_metadata(self.container[0], o['name'],
644 23028d31 Sofia Papagiannaki
                                               **meta)
645 23028d31 Sofia Papagiannaki
        meta = {'stock':'true'}
646 b09c9aaa Sofia Papagiannaki
        for o in self.obj[3:5]:
647 23028d31 Sofia Papagiannaki
            self.client.update_object_metadata(self.container[0], o['name'],
648 23028d31 Sofia Papagiannaki
                                               **meta)
649 23028d31 Sofia Papagiannaki
        
650 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality')
651 25c3841c Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
652 25c3841c Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
653 b09c9aaa Sofia Papagiannaki
        
654 b09c9aaa Sofia Papagiannaki
        # test case insensitive
655 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='quality')
656 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
657 86dacd7f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
658 b09c9aaa Sofia Papagiannaki
        
659 b09c9aaa Sofia Papagiannaki
        # test multiple matches
660 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,Stock')
661 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 4)
662 86dacd7f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:4]])
663 b09c9aaa Sofia Papagiannaki
        
664 b09c9aaa Sofia Papagiannaki
        # test non 1-1 multiple match
665 25c3841c Sofia Papagiannaki
        obj = self.client.list_objects(self.container[0], meta='Quality,aaaa')
666 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
667 d1e43d6f Sofia Papagiannaki
        self.assertTrue(obj, [o['name'] for o in self.obj[:2]])
668 25c3841c Sofia Papagiannaki
    
669 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
670 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
671 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
672 d1e43d6f Sofia Papagiannaki
        
673 23028d31 Sofia Papagiannaki
        #add a new object
674 23028d31 Sofia Papagiannaki
        self.upload_random_data(self.container[0], o_names[0])
675 25c3841c Sofia Papagiannaki
        
676 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
677 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
678 25c3841c Sofia Papagiannaki
            try:
679 25c3841c Sofia Papagiannaki
                o = self.client.list_objects(self.container[0],
680 25c3841c Sofia Papagiannaki
                                            if_modified_since=past)
681 25c3841c Sofia Papagiannaki
                self.assertEqual(o,
682 25c3841c Sofia Papagiannaki
                                 self.client.list_objects(self.container[0]))
683 25c3841c Sofia Papagiannaki
            except Fault, f:
684 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304) #fail if not modified
685 25c3841c Sofia Papagiannaki
    
686 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
687 23028d31 Sofia Papagiannaki
        headers = {'if-modified-since':''}
688 25c3841c Sofia Papagiannaki
        o = self.client.list_objects(self.container[0], if_modified_since='')
689 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.client.list_objects(self.container[0]))
690 25c3841c Sofia Papagiannaki
    
691 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
692 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
693 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
694 d1e43d6f Sofia Papagiannaki
        
695 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
696 25c3841c Sofia Papagiannaki
            args = {'if_modified_since':'%s' %since.strftime(f)}
697 25c3841c Sofia Papagiannaki
            
698 d1e43d6f Sofia Papagiannaki
            #assert not modified
699 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.list_objects,
700 25c3841c Sofia Papagiannaki
                                     self.container[0], **args)
701 23028d31 Sofia Papagiannaki
    
702 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
703 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
704 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
705 d1e43d6f Sofia Papagiannaki
        
706 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
707 25c3841c Sofia Papagiannaki
            obj = self.client.list_objects(self.container[0],
708 25c3841c Sofia Papagiannaki
                                           if_unmodified_since=since.strftime(f))
709 23028d31 Sofia Papagiannaki
            
710 25c3841c Sofia Papagiannaki
            #assert unmodified
711 25c3841c Sofia Papagiannaki
            self.assertEqual(obj, self.client.list_objects(self.container[0]))
712 25c3841c Sofia Papagiannaki
    
713 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
714 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
715 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
716 d1e43d6f Sofia Papagiannaki
        
717 d1e43d6f Sofia Papagiannaki
        #add a new container
718 25c3841c Sofia Papagiannaki
        self.client.create_container('dummy')
719 25c3841c Sofia Papagiannaki
        
720 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
721 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
722 d1e43d6f Sofia Papagiannaki
            
723 25c3841c Sofia Papagiannaki
            args = {'if_unmodified_since':'%s' %past}
724 25c3841c Sofia Papagiannaki
            
725 23028d31 Sofia Papagiannaki
            #assert precondition failed
726 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.list_objects,
727 25c3841c Sofia Papagiannaki
                                     self.container[0], **args)
728 d1e43d6f Sofia Papagiannaki
729 d1e43d6f Sofia Papagiannaki
class ContainerPut(BaseTestCase):
730 b09c9aaa Sofia Papagiannaki
    def setUp(self):
731 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
732 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
733 25c3841c Sofia Papagiannaki
    
734 b09c9aaa Sofia Papagiannaki
    def test_create(self):
735 25c3841c Sofia Papagiannaki
        self.client.create_container(self.containers[0])
736 25c3841c Sofia Papagiannaki
        containers = self.client.list_containers()
737 23028d31 Sofia Papagiannaki
        self.assertTrue(self.containers[0] in containers)
738 25c3841c Sofia Papagiannaki
        self.assert_container_exists(self.containers[0])
739 25c3841c Sofia Papagiannaki
    
740 b09c9aaa Sofia Papagiannaki
    def test_create_twice(self):
741 25c3841c Sofia Papagiannaki
        self.client.create_container(self.containers[0])
742 25c3841c Sofia Papagiannaki
        self.assertTrue(not self.client.create_container(self.containers[0]))
743 25c3841c Sofia Papagiannaki
    
744 81ed48a5 Sofia Papagiannaki
    def test_quota(self):
745 81ed48a5 Sofia Papagiannaki
        self.client.create_container(self.containers[0])
746 81ed48a5 Sofia Papagiannaki
        
747 81ed48a5 Sofia Papagiannaki
        policy = {'quota':100}
748 81ed48a5 Sofia Papagiannaki
        self.client.set_container_policies('c1', **policy)
749 81ed48a5 Sofia Papagiannaki
        
750 81ed48a5 Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('c1')
751 81ed48a5 Sofia Papagiannaki
        self.assertTrue('x-container-policy-quota' in meta)
752 81ed48a5 Sofia Papagiannaki
        self.assertEqual(meta['x-container-policy-quota'], '100')
753 81ed48a5 Sofia Papagiannaki
        
754 81ed48a5 Sofia Papagiannaki
        args = ['c1', 'o1']
755 81ed48a5 Sofia Papagiannaki
        kwargs = {'length':101}
756 81ed48a5 Sofia Papagiannaki
        self.assert_raises_fault(413, self.upload_random_data, *args, **kwargs)
757 531252f0 Sofia Papagiannaki
        
758 531252f0 Sofia Papagiannaki
        #reset quota
759 531252f0 Sofia Papagiannaki
        policy = {'quota':0}
760 531252f0 Sofia Papagiannaki
        self.client.set_container_policies('c1', **policy)
761 81ed48a5 Sofia Papagiannaki
    
762 d1e43d6f Sofia Papagiannaki
class ContainerPost(BaseTestCase):
763 d1e43d6f Sofia Papagiannaki
    def setUp(self):
764 d1e43d6f Sofia Papagiannaki
        BaseTestCase.setUp(self)
765 d1e43d6f Sofia Papagiannaki
        self.container = 'apples'
766 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
767 25c3841c Sofia Papagiannaki
    
768 d1e43d6f Sofia Papagiannaki
    def test_update_meta(self):
769 23028d31 Sofia Papagiannaki
        meta = {'test':'test33',
770 23028d31 Sofia Papagiannaki
                'tost':'tost22'}
771 23028d31 Sofia Papagiannaki
        self.client.update_container_metadata(self.container, **meta)
772 25c3841c Sofia Papagiannaki
        headers = self.client.retrieve_container_metadata(self.container)
773 d1e43d6f Sofia Papagiannaki
        for k,v in meta.items():
774 23028d31 Sofia Papagiannaki
            k = 'x-container-meta-%s' % k
775 23028d31 Sofia Papagiannaki
            self.assertTrue(headers[k])
776 23028d31 Sofia Papagiannaki
            self.assertEqual(headers[k], v)
777 d1e43d6f Sofia Papagiannaki
778 d1e43d6f Sofia Papagiannaki
class ContainerDelete(BaseTestCase):
779 b09c9aaa Sofia Papagiannaki
    def setUp(self):
780 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
781 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
782 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
783 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
784 25c3841c Sofia Papagiannaki
    
785 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
786 23028d31 Sofia Papagiannaki
        status = self.client.delete_container(self.containers[0])[0]
787 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 204)
788 25c3841c Sofia Papagiannaki
    
789 b09c9aaa Sofia Papagiannaki
    def test_delete_non_empty(self):
790 81ed48a5 Sofia Papagiannaki
        self.upload_random_data(self.containers[1], o_names[0])
791 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(409, self.client.delete_container,
792 23028d31 Sofia Papagiannaki
                                 self.containers[1])
793 25c3841c Sofia Papagiannaki
    
794 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
795 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.delete_container, 'c3')
796 b09c9aaa Sofia Papagiannaki
797 d1e43d6f Sofia Papagiannaki
class ObjectGet(BaseTestCase):
798 b09c9aaa Sofia Papagiannaki
    def setUp(self):
799 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
800 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
801 b09c9aaa Sofia Papagiannaki
        #create some containers
802 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
803 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
804 b09c9aaa Sofia Papagiannaki
        
805 b09c9aaa Sofia Papagiannaki
        #upload a file
806 23028d31 Sofia Papagiannaki
        names = ('obj1', 'obj2')
807 b09c9aaa Sofia Papagiannaki
        self.objects = []
808 23028d31 Sofia Papagiannaki
        for n in names:
809 23028d31 Sofia Papagiannaki
            self.objects.append(self.upload_random_data(self.containers[1], n))
810 25c3841c Sofia Papagiannaki
    
811 8d964102 Sofia Papagiannaki
    def test_versions(self):
812 8d964102 Sofia Papagiannaki
        c = self.containers[1]
813 8d964102 Sofia Papagiannaki
        o = self.objects[0]
814 8d964102 Sofia Papagiannaki
        b = self.client.retrieve_object_versionlist(c, o['name'])['versions']
815 8d964102 Sofia Papagiannaki
        self.assert_versionlist_structure(b)
816 8d964102 Sofia Papagiannaki
        
817 8d964102 Sofia Papagiannaki
        #update meta
818 8d964102 Sofia Papagiannaki
        meta = {'quality':'AAA', 'stock':True}
819 8d964102 Sofia Papagiannaki
        self.client.update_object_metadata(c, o['name'], **meta)
820 8d964102 Sofia Papagiannaki
        
821 8d964102 Sofia Papagiannaki
        a = self.client.retrieve_object_versionlist(c, o['name'])['versions']
822 8d964102 Sofia Papagiannaki
        self.assert_versionlist_structure(a)
823 8d964102 Sofia Papagiannaki
        self.assertEqual(len(b)+1, len(a))
824 8d964102 Sofia Papagiannaki
        self.assertEqual(b, a[:-1])
825 8d964102 Sofia Papagiannaki
        
826 8d964102 Sofia Papagiannaki
        #get exact previous version metadata
827 8d964102 Sofia Papagiannaki
        v = a[-2][0]
828 8d964102 Sofia Papagiannaki
        v_meta = self.client.retrieve_object_metadata(c, o['name'],
829 8d964102 Sofia Papagiannaki
                                                      restricted=True,
830 8d964102 Sofia Papagiannaki
                                                      version=v)
831 8d964102 Sofia Papagiannaki
        for k in meta.keys():
832 8d964102 Sofia Papagiannaki
            self.assertTrue(k not in v_meta)
833 8d964102 Sofia Papagiannaki
        
834 8d964102 Sofia Papagiannaki
        #update obejct
835 8d964102 Sofia Papagiannaki
        data = get_random_data()
836 8d964102 Sofia Papagiannaki
        self.client.update_object(c, o['name'], StringIO(data))
837 8d964102 Sofia Papagiannaki
        
838 8d964102 Sofia Papagiannaki
        aa = self.client.retrieve_object_versionlist(c, o['name'])['versions']
839 8d964102 Sofia Papagiannaki
        self.assert_versionlist_structure(aa)
840 8d964102 Sofia Papagiannaki
        self.assertEqual(len(a)+1, len(aa))
841 8d964102 Sofia Papagiannaki
        self.assertEqual(a, aa[:-1])
842 8d964102 Sofia Papagiannaki
        
843 8d964102 Sofia Papagiannaki
        #get exact previous version
844 8d964102 Sofia Papagiannaki
        v = aa[-3][0]
845 8d964102 Sofia Papagiannaki
        v_data = self.client.retrieve_object_version(c, o['name'], version=v)
846 8d964102 Sofia Papagiannaki
        self.assertEqual(o['data'], v_data)
847 8d964102 Sofia Papagiannaki
        self.assertEqual(self.client.retrieve_object(c, o['name']),
848 8d964102 Sofia Papagiannaki
                         '%s%s' %(v_data, data))
849 8d964102 Sofia Papagiannaki
    
850 b09c9aaa Sofia Papagiannaki
    def test_get(self):
851 b09c9aaa Sofia Papagiannaki
        #perform get
852 25c3841c Sofia Papagiannaki
        o = self.client.retrieve_object(self.containers[1],
853 25c3841c Sofia Papagiannaki
                                        self.objects[0]['name'],
854 25c3841c Sofia Papagiannaki
                                        self.objects[0]['meta'])
855 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.objects[0]['data'])
856 25c3841c Sofia Papagiannaki
    
857 e414f54d Sofia Papagiannaki
    def test_objects_with_trailing_spaces(self):
858 e414f54d Sofia Papagiannaki
        self.client.create_container('test')
859 e414f54d Sofia Papagiannaki
        #create 'a' object
860 e414f54d Sofia Papagiannaki
        self.upload_random_data('test', 'a')
861 e414f54d Sofia Papagiannaki
        #look for 'a ' object
862 e414f54d Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object,
863 e414f54d Sofia Papagiannaki
                                 'test', 'a ')
864 e414f54d Sofia Papagiannaki
        
865 e414f54d Sofia Papagiannaki
        #delete 'a' object
866 e414f54d Sofia Papagiannaki
        self.client.delete_object('test', 'a')
867 e414f54d Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object,
868 e414f54d Sofia Papagiannaki
                                 'test', 'a')
869 e414f54d Sofia Papagiannaki
        
870 e414f54d Sofia Papagiannaki
        #create 'a ' object
871 e414f54d Sofia Papagiannaki
        self.upload_random_data('test', 'a ')
872 e414f54d Sofia Papagiannaki
        #look for 'a' object
873 e414f54d Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object,
874 e414f54d Sofia Papagiannaki
                                 'test', 'a')
875 e414f54d Sofia Papagiannaki
    
876 b09c9aaa Sofia Papagiannaki
    def test_get_invalid(self):
877 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object,
878 25c3841c Sofia Papagiannaki
                                 self.containers[0], self.objects[0]['name'])
879 25c3841c Sofia Papagiannaki
    
880 b09c9aaa Sofia Papagiannaki
    def test_get_partial(self):
881 b09c9aaa Sofia Papagiannaki
        #perform get with range
882 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
883 25c3841c Sofia Papagiannaki
                                                            self.objects[0]['name'],
884 25c3841c Sofia Papagiannaki
                                                            range='bytes=0-499')
885 b09c9aaa Sofia Papagiannaki
        
886 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
887 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
888 b09c9aaa Sofia Papagiannaki
        
889 33ffca25 Sofia Papagiannaki
        #assert content-type
890 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
891 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
892 33ffca25 Sofia Papagiannaki
        
893 b09c9aaa Sofia Papagiannaki
        #assert content length
894 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
895 b09c9aaa Sofia Papagiannaki
        
896 b09c9aaa Sofia Papagiannaki
        #assert content
897 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'][:500], data)
898 25c3841c Sofia Papagiannaki
    
899 b09c9aaa Sofia Papagiannaki
    def test_get_final_500(self):
900 b09c9aaa Sofia Papagiannaki
        #perform get with range
901 23028d31 Sofia Papagiannaki
        headers = {'range':'bytes=-500'}
902 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
903 25c3841c Sofia Papagiannaki
                                                            self.objects[0]['name'],
904 25c3841c Sofia Papagiannaki
                                                            range='bytes=-500')
905 b09c9aaa Sofia Papagiannaki
        
906 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
907 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
908 b09c9aaa Sofia Papagiannaki
        
909 33ffca25 Sofia Papagiannaki
        #assert content-type
910 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
911 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
912 33ffca25 Sofia Papagiannaki
        
913 b09c9aaa Sofia Papagiannaki
        #assert content length
914 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
915 b09c9aaa Sofia Papagiannaki
        
916 b09c9aaa Sofia Papagiannaki
        #assert content
917 23028d31 Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], data)
918 25c3841c Sofia Papagiannaki
    
919 b09c9aaa Sofia Papagiannaki
    def test_get_rest(self):
920 b09c9aaa Sofia Papagiannaki
        #perform get with range
921 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) - 500
922 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
923 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
924 25c3841c Sofia Papagiannaki
                                                range='bytes=%s-' %offset)
925 b09c9aaa Sofia Papagiannaki
        
926 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
927 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
928 b09c9aaa Sofia Papagiannaki
        
929 33ffca25 Sofia Papagiannaki
        #assert content-type
930 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
931 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
932 33ffca25 Sofia Papagiannaki
        
933 b09c9aaa Sofia Papagiannaki
        #assert content length
934 23028d31 Sofia Papagiannaki
        self.assertEqual(int(headers['content-length']), 500)
935 b09c9aaa Sofia Papagiannaki
        
936 b09c9aaa Sofia Papagiannaki
        #assert content
937 23028d31 Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], data)
938 25c3841c Sofia Papagiannaki
    
939 b09c9aaa Sofia Papagiannaki
    def test_get_range_not_satisfiable(self):
940 b09c9aaa Sofia Papagiannaki
        #perform get with range
941 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) + 1
942 b09c9aaa Sofia Papagiannaki
        
943 23028d31 Sofia Papagiannaki
        #assert range not satisfiable
944 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(416, self.client.retrieve_object,
945 25c3841c Sofia Papagiannaki
                                 self.containers[1], self.objects[0]['name'],
946 25c3841c Sofia Papagiannaki
                                 range='bytes=0-%s' %offset)
947 25c3841c Sofia Papagiannaki
    
948 b09c9aaa Sofia Papagiannaki
    def test_multiple_range(self):
949 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
950 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '1000-']
951 25c3841c Sofia Papagiannaki
        bytes = 'bytes=%s' % ','.join(ranges)
952 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
953 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
954 25c3841c Sofia Papagiannaki
                                                           range=bytes)
955 b09c9aaa Sofia Papagiannaki
        
956 b09c9aaa Sofia Papagiannaki
        # assert partial content
957 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 206)
958 b09c9aaa Sofia Papagiannaki
        
959 b09c9aaa Sofia Papagiannaki
        # assert Content-Type of the reply will be multipart/byteranges
960 23028d31 Sofia Papagiannaki
        self.assertTrue(headers['content-type'])
961 23028d31 Sofia Papagiannaki
        content_type_parts = headers['content-type'].split()
962 b09c9aaa Sofia Papagiannaki
        self.assertEqual(content_type_parts[0], ('multipart/byteranges;'))
963 b09c9aaa Sofia Papagiannaki
        
964 b09c9aaa Sofia Papagiannaki
        boundary = '--%s' %content_type_parts[1].split('=')[-1:][0]
965 23028d31 Sofia Papagiannaki
        cparts = data.split(boundary)[1:-1]
966 b09c9aaa Sofia Papagiannaki
        
967 b09c9aaa Sofia Papagiannaki
        # assert content parts are exactly 2
968 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(cparts), len(ranges))
969 b09c9aaa Sofia Papagiannaki
        
970 b09c9aaa Sofia Papagiannaki
        # for each content part assert headers
971 b09c9aaa Sofia Papagiannaki
        i = 0
972 b09c9aaa Sofia Papagiannaki
        for cpart in cparts:
973 b09c9aaa Sofia Papagiannaki
            content = cpart.split('\r\n')
974 b09c9aaa Sofia Papagiannaki
            headers = content[1:3]
975 b09c9aaa Sofia Papagiannaki
            content_range = headers[0].split(': ')
976 b09c9aaa Sofia Papagiannaki
            self.assertEqual(content_range[0], 'Content-Range')
977 b09c9aaa Sofia Papagiannaki
            
978 b09c9aaa Sofia Papagiannaki
            r = ranges[i].split('-')
979 b09c9aaa Sofia Papagiannaki
            if not r[0] and not r[1]:
980 b09c9aaa Sofia Papagiannaki
                pass
981 b09c9aaa Sofia Papagiannaki
            elif not r[0]:
982 b09c9aaa Sofia Papagiannaki
                start = len(self.objects[0]['data']) - int(r[1])
983 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
984 b09c9aaa Sofia Papagiannaki
            elif not r[1]:
985 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
986 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
987 b09c9aaa Sofia Papagiannaki
            else:
988 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
989 b09c9aaa Sofia Papagiannaki
                end = int(r[1]) + 1
990 b09c9aaa Sofia Papagiannaki
            fdata = self.objects[0]['data'][start:end]
991 b09c9aaa Sofia Papagiannaki
            sdata = '\r\n'.join(content[4:-1])
992 b09c9aaa Sofia Papagiannaki
            self.assertEqual(len(fdata), len(sdata))
993 b09c9aaa Sofia Papagiannaki
            self.assertEquals(fdata, sdata)
994 b09c9aaa Sofia Papagiannaki
            i+=1
995 25c3841c Sofia Papagiannaki
    
996 b09c9aaa Sofia Papagiannaki
    def test_multiple_range_not_satisfiable(self):
997 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
998 b09c9aaa Sofia Papagiannaki
        out_of_range = len(self.objects[0]['data']) + 1
999 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '%d-' %out_of_range]
1000 25c3841c Sofia Papagiannaki
        bytes = 'bytes=%s' % ','.join(ranges)
1001 b09c9aaa Sofia Papagiannaki
        
1002 b09c9aaa Sofia Papagiannaki
        # assert partial content
1003 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(416, self.client.retrieve_object,
1004 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1005 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'], range=bytes)
1006 25c3841c Sofia Papagiannaki
    
1007 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match(self):
1008 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
1009 25c3841c Sofia Papagiannaki
        etag = self.objects[0]['hash']
1010 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1011 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1012 25c3841c Sofia Papagiannaki
                                                           if_match=etag)
1013 b09c9aaa Sofia Papagiannaki
        #assert get success
1014 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1015 b09c9aaa Sofia Papagiannaki
        
1016 33ffca25 Sofia Papagiannaki
        #assert content-type
1017 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1018 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1019 33ffca25 Sofia Papagiannaki
        
1020 b09c9aaa Sofia Papagiannaki
        #assert response content
1021 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1022 25c3841c Sofia Papagiannaki
    
1023 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match_star(self):
1024 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match *
1025 23028d31 Sofia Papagiannaki
        headers = {'if-match':'*'}
1026 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1027 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
1028 23028d31 Sofia Papagiannaki
                                                **headers)
1029 b09c9aaa Sofia Papagiannaki
        #assert get success
1030 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1031 b09c9aaa Sofia Papagiannaki
        
1032 33ffca25 Sofia Papagiannaki
        #assert content-type
1033 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1034 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1035 33ffca25 Sofia Papagiannaki
        
1036 b09c9aaa Sofia Papagiannaki
        #assert response content
1037 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1038 25c3841c Sofia Papagiannaki
    
1039 b09c9aaa Sofia Papagiannaki
    def test_get_with_multiple_if_match(self):
1040 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
1041 b09c9aaa Sofia Papagiannaki
        etags = [i['hash'] for i in self.objects if i]
1042 b09c9aaa Sofia Papagiannaki
        etags = ','.join('"%s"' % etag for etag in etags)
1043 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1044 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1045 25c3841c Sofia Papagiannaki
                                                           if_match=etags)
1046 b09c9aaa Sofia Papagiannaki
        #assert get success
1047 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1048 b09c9aaa Sofia Papagiannaki
        
1049 33ffca25 Sofia Papagiannaki
        #assert content-type
1050 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1051 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1052 33ffca25 Sofia Papagiannaki
        
1053 33ffca25 Sofia Papagiannaki
        #assert content-type
1054 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['content-type'],
1055 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1056 33ffca25 Sofia Papagiannaki
        
1057 b09c9aaa Sofia Papagiannaki
        #assert response content
1058 23028d31 Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'], data)
1059 25c3841c Sofia Papagiannaki
    
1060 b09c9aaa Sofia Papagiannaki
    def test_if_match_precondition_failed(self):
1061 23028d31 Sofia Papagiannaki
        #assert precondition failed
1062 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(412, self.client.retrieve_object,
1063 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1064 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'], if_match='123')
1065 25c3841c Sofia Papagiannaki
    
1066 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
1067 d1e43d6f Sofia Papagiannaki
        #perform get with If-None-Match
1068 25c3841c Sofia Papagiannaki
        status, headers, data = self.client.request_object(self.containers[1],
1069 25c3841c Sofia Papagiannaki
                                                           self.objects[0]['name'],
1070 25c3841c Sofia Papagiannaki
                                                           if_none_match='123')
1071 b09c9aaa Sofia Papagiannaki
        
1072 b09c9aaa Sofia Papagiannaki
        #assert get success
1073 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 200)
1074 33ffca25 Sofia Papagiannaki
        
1075 33ffca25 Sofia Papagiannaki
        #assert content-type
1076 25c3841c Sofia Papagiannaki
        self.assertEqual(headers['content_type'],
1077 25c3841c Sofia Papagiannaki
                         self.objects[0]['meta']['content_type'])
1078 25c3841c Sofia Papagiannaki
    
1079 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
1080 25c3841c Sofia Papagiannaki
        #perform get with If-None-Match * and assert not modified
1081 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(304, self.client.retrieve_object,
1082 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1083 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'],
1084 25c3841c Sofia Papagiannaki
                                 if_none_match='*')
1085 25c3841c Sofia Papagiannaki
    
1086 b09c9aaa Sofia Papagiannaki
    def test_if_none_match_not_modified(self):
1087 25c3841c Sofia Papagiannaki
        #perform get with If-None-Match and assert not modified
1088 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(304, self.client.retrieve_object,
1089 25c3841c Sofia Papagiannaki
                                 self.containers[1],
1090 25c3841c Sofia Papagiannaki
                                 self.objects[0]['name'],
1091 25c3841c Sofia Papagiannaki
                                 if_none_match=self.objects[0]['hash'])
1092 25c3841c Sofia Papagiannaki
        
1093 25c3841c Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[1],
1094 25c3841c Sofia Papagiannaki
                                                    self.objects[0]['name'])
1095 25c3841c Sofia Papagiannaki
        self.assertEqual(meta['etag'], self.objects[0]['hash'])
1096 25c3841c Sofia Papagiannaki
    
1097 d1e43d6f Sofia Papagiannaki
    def test_if_modified_since(self):
1098 b09c9aaa Sofia Papagiannaki
        t = datetime.datetime.utcnow()
1099 b09c9aaa Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
1100 b09c9aaa Sofia Papagiannaki
        
1101 b09c9aaa Sofia Papagiannaki
        #modify the object
1102 23028d31 Sofia Papagiannaki
        self.upload_data(self.containers[1],
1103 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['name'],
1104 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['data'][:200])
1105 b09c9aaa Sofia Papagiannaki
        
1106 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
1107 b09c9aaa Sofia Papagiannaki
            past = t2.strftime(f)
1108 b09c9aaa Sofia Papagiannaki
            
1109 23028d31 Sofia Papagiannaki
            headers = {'if-modified-since':'%s' %past}
1110 25c3841c Sofia Papagiannaki
            try:
1111 25c3841c Sofia Papagiannaki
                o = self.client.retrieve_object(self.containers[1],
1112 23028d31 Sofia Papagiannaki
                                                self.objects[0]['name'],
1113 25c3841c Sofia Papagiannaki
                                                if_modified_since=past)
1114 25c3841c Sofia Papagiannaki
                self.assertEqual(o,
1115 25c3841c Sofia Papagiannaki
                                 self.client.retrieve_object(self.containers[1],
1116 25c3841c Sofia Papagiannaki
                                                             self.objects[0]['name']))
1117 25c3841c Sofia Papagiannaki
            except Fault, f:
1118 25c3841c Sofia Papagiannaki
                self.failIf(f.status == 304)
1119 25c3841c Sofia Papagiannaki
    
1120 25c3841c Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
1121 25c3841c Sofia Papagiannaki
        o = self.client.retrieve_object(self.containers[1],
1122 25c3841c Sofia Papagiannaki
                                        self.objects[0]['name'],
1123 25c3841c Sofia Papagiannaki
                                        if_modified_since='')
1124 25c3841c Sofia Papagiannaki
        self.assertEqual(o, self.client.retrieve_object(self.containers[1],
1125 25c3841c Sofia Papagiannaki
                                                        self.objects[0]['name']))
1126 25c3841c Sofia Papagiannaki
            
1127 d1e43d6f Sofia Papagiannaki
    def test_if_not_modified_since(self):
1128 b09c9aaa Sofia Papagiannaki
        now = datetime.datetime.utcnow()
1129 b09c9aaa Sofia Papagiannaki
        since = now + datetime.timedelta(1)
1130 b09c9aaa Sofia Papagiannaki
        
1131 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
1132 b09c9aaa Sofia Papagiannaki
            #assert not modified
1133 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(304, self.client.retrieve_object,
1134 25c3841c Sofia Papagiannaki
                                     self.containers[1], self.objects[0]['name'],
1135 25c3841c Sofia Papagiannaki
                                     if_modified_since=since.strftime(f))
1136 25c3841c Sofia Papagiannaki
    
1137 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since(self):
1138 d1e43d6f Sofia Papagiannaki
        now = datetime.datetime.utcnow()
1139 d1e43d6f Sofia Papagiannaki
        since = now + datetime.timedelta(1)
1140 d1e43d6f Sofia Papagiannaki
        
1141 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
1142 25c3841c Sofia Papagiannaki
            t = since.strftime(f)
1143 25c3841c Sofia Papagiannaki
            status, headers, data = self.client.request_object(self.containers[1],
1144 25c3841c Sofia Papagiannaki
                                                               self.objects[0]['name'],
1145 25c3841c Sofia Papagiannaki
                                                               if_unmodified_since=t)
1146 d1e43d6f Sofia Papagiannaki
            #assert success
1147 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 200)
1148 23028d31 Sofia Papagiannaki
            self.assertEqual(self.objects[0]['data'], data)
1149 33ffca25 Sofia Papagiannaki
            
1150 33ffca25 Sofia Papagiannaki
            #assert content-type
1151 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['content-type'],
1152 25c3841c Sofia Papagiannaki
                             self.objects[0]['meta']['content_type'])
1153 25c3841c Sofia Papagiannaki
    
1154 d1e43d6f Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
1155 d1e43d6f Sofia Papagiannaki
        t = datetime.datetime.utcnow()
1156 d1e43d6f Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
1157 d1e43d6f Sofia Papagiannaki
        
1158 d1e43d6f Sofia Papagiannaki
        #modify the object
1159 23028d31 Sofia Papagiannaki
        self.upload_data(self.containers[1],
1160 d1e43d6f Sofia Papagiannaki
                           self.objects[0]['name'],
1161 d1e43d6f Sofia Papagiannaki
                           self.objects[0]['data'][:200])
1162 d1e43d6f Sofia Papagiannaki
        
1163 d1e43d6f Sofia Papagiannaki
        for f in DATE_FORMATS:
1164 d1e43d6f Sofia Papagiannaki
            past = t2.strftime(f)
1165 23028d31 Sofia Papagiannaki
            #assert precondition failed
1166 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(412, self.client.retrieve_object,
1167 25c3841c Sofia Papagiannaki
                                     self.containers[1], self.objects[0]['name'],
1168 25c3841c Sofia Papagiannaki
                                     if_unmodified_since=past)
1169 25c3841c Sofia Papagiannaki
    
1170 d1e43d6f Sofia Papagiannaki
    def test_hashes(self):
1171 33ffca25 Sofia Papagiannaki
        l = 8388609
1172 33ffca25 Sofia Papagiannaki
        fname = 'largefile'
1173 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.containers[1], fname, l)
1174 d1e43d6f Sofia Papagiannaki
        if o:
1175 3078108a Sofia Papagiannaki
            body = self.client.retrieve_object(self.containers[1], fname,
1176 f0eacc2c Sofia Papagiannaki
                                               format='json')
1177 33ffca25 Sofia Papagiannaki
            hashes = body['hashes']
1178 33ffca25 Sofia Papagiannaki
            block_size = body['block_size']
1179 33ffca25 Sofia Papagiannaki
            block_hash = body['block_hash']
1180 af6d3b5d Antony Chazapis
            block_num = l/block_size if l/block_size == 0 else l/block_size + 1
1181 33ffca25 Sofia Papagiannaki
            self.assertTrue(len(hashes), block_num)
1182 d1e43d6f Sofia Papagiannaki
            i = 0
1183 d1e43d6f Sofia Papagiannaki
            for h in hashes:
1184 d1e43d6f Sofia Papagiannaki
                start = i * block_size
1185 d1e43d6f Sofia Papagiannaki
                end = (i + 1) * block_size
1186 33ffca25 Sofia Papagiannaki
                hash = compute_block_hash(o['data'][start:end], block_hash)
1187 33ffca25 Sofia Papagiannaki
                self.assertEqual(h, hash)
1188 d1e43d6f Sofia Papagiannaki
                i += 1
1189 d1e43d6f Sofia Papagiannaki
1190 d1e43d6f Sofia Papagiannaki
class ObjectPut(BaseTestCase):
1191 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1192 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1193 b09c9aaa Sofia Papagiannaki
        self.container = 'c1'
1194 25c3841c Sofia Papagiannaki
        self.client.create_container(self.container)
1195 23028d31 Sofia Papagiannaki
    
1196 b09c9aaa Sofia Papagiannaki
    def test_upload(self):
1197 23028d31 Sofia Papagiannaki
        name = o_names[0]
1198 23028d31 Sofia Papagiannaki
        meta = {'test':'test1'}
1199 23028d31 Sofia Papagiannaki
        o = self.upload_random_data(self.container, name, **meta)
1200 23028d31 Sofia Papagiannaki
        
1201 23028d31 Sofia Papagiannaki
        headers = self.client.retrieve_object_metadata(self.container,
1202 23028d31 Sofia Papagiannaki
                                                       name,
1203 23028d31 Sofia Papagiannaki
                                                       restricted=True)
1204 23028d31 Sofia Papagiannaki
        self.assertTrue('test' in headers.keys())
1205 23028d31 Sofia Papagiannaki
        self.assertEqual(headers['test'], meta['test'])
1206 b09c9aaa Sofia Papagiannaki
        
1207 b09c9aaa Sofia Papagiannaki
        #assert uploaded content
1208 25c3841c Sofia Papagiannaki
        status, h, data = self.client.request_object(self.container, name)
1209 25c3841c Sofia Papagiannaki
        self.assertEqual(len(o['data']), int(h['content-length']))
1210 25c3841c Sofia Papagiannaki
        self.assertEqual(o['data'], data)
1211 25c3841c Sofia Papagiannaki
        
1212 25c3841c Sofia Papagiannaki
        #assert content-type
1213 25c3841c Sofia Papagiannaki
        self.assertEqual(h['content-type'], o['meta']['content_type'])
1214 25c3841c Sofia Papagiannaki
    
1215 e7b51248 Sofia Papagiannaki
    def _test_maximum_upload_size_exceeds(self):
1216 ae75584f Sofia Papagiannaki
        name = o_names[0]
1217 ae75584f Sofia Papagiannaki
        meta = {'test':'test1'}
1218 ae75584f Sofia Papagiannaki
        #upload 100MB
1219 ae75584f Sofia Papagiannaki
        length=1024*1024*100
1220 ae75584f Sofia Papagiannaki
        self.assert_raises_fault(400, self.upload_random_data, self.container,
1221 ae75584f Sofia Papagiannaki
                                 name, length, **meta)
1222 e7b51248 Sofia Papagiannaki
    
1223 7812e1f9 Sofia Papagiannaki
    def test_upload_with_name_containing_slash(self):
1224 7812e1f9 Sofia Papagiannaki
        name = '/%s' % o_names[0]
1225 7812e1f9 Sofia Papagiannaki
        meta = {'test':'test1'}
1226 7812e1f9 Sofia Papagiannaki
        o = self.upload_random_data(self.container, name, **meta)
1227 7812e1f9 Sofia Papagiannaki
        
1228 7812e1f9 Sofia Papagiannaki
        self.assertEqual(o['data'],
1229 7812e1f9 Sofia Papagiannaki
                         self.client.retrieve_object(self.container, name))
1230 7812e1f9 Sofia Papagiannaki
        
1231 7812e1f9 Sofia Papagiannaki
        self.assertTrue(name in self.client.list_objects(self.container))
1232 7812e1f9 Sofia Papagiannaki
    
1233 7812e1f9 Sofia Papagiannaki
    def test_create_directory_marker(self):
1234 7812e1f9 Sofia Papagiannaki
        self.client.create_directory_marker(self.container, 'foo')
1235 7812e1f9 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.container, 'foo')
1236 7812e1f9 Sofia Papagiannaki
        self.assertEqual(meta['content-length'], '0')
1237 7812e1f9 Sofia Papagiannaki
        self.assertEqual(meta['content-type'], 'application/directory')
1238 7812e1f9 Sofia Papagiannaki
1239 b09c9aaa Sofia Papagiannaki
    def test_upload_unprocessable_entity(self):
1240 23028d31 Sofia Papagiannaki
        meta={'etag':'123', 'test':'test1'}
1241 23028d31 Sofia Papagiannaki
        
1242 23028d31 Sofia Papagiannaki
        #assert unprocessable entity
1243 25c3841c Sofia Papagiannaki
        self.assert_raises_fault(422, self.upload_random_data, self.container,
1244 23028d31 Sofia Papagiannaki
                                 o_names[0], **meta)
1245 25c3841c Sofia Papagiannaki
    
1246 f0eacc2c Sofia Papagiannaki
    def test_chunked_transfer(self):
1247 25c3841c Sofia Papagiannaki
        data = get_random_data()
1248 25c3841c Sofia Papagiannaki
        objname = 'object'
1249 25c3841c Sofia Papagiannaki
        self.client.create_object_using_chunks(self.container, objname,
1250 25c3841c Sofia Papagiannaki
                                               StringIO(data))
1251 23028d31 Sofia Papagiannaki
        
1252 25c3841c Sofia Papagiannaki
        uploaded_data = self.client.retrieve_object(self.container, objname)
1253 25c3841c Sofia Papagiannaki
        self.assertEqual(data, uploaded_data)
1254 ae75584f Sofia Papagiannaki
    
1255 ae75584f Sofia Papagiannaki
    def test_manifestation(self):
1256 ae75584f Sofia Papagiannaki
        prefix = 'myobject/'
1257 ae75584f Sofia Papagiannaki
        data = ''
1258 ae75584f Sofia Papagiannaki
        for i in range(5):
1259 ae75584f Sofia Papagiannaki
            part = '%s%d' %(prefix, i)
1260 ae75584f Sofia Papagiannaki
            o = self.upload_random_data(self.container, part)
1261 ae75584f Sofia Papagiannaki
            data += o['data']
1262 ae75584f Sofia Papagiannaki
        
1263 ae75584f Sofia Papagiannaki
        manifest = '%s/%s' %(self.container, prefix)
1264 95e92490 Sofia Papagiannaki
        self.client.create_manifestation(self.container, 'large-object', manifest)
1265 ae75584f Sofia Papagiannaki
        
1266 ae75584f Sofia Papagiannaki
        self.assert_object_exists(self.container, 'large-object')
1267 ae75584f Sofia Papagiannaki
        self.assertEqual(data, self.client.retrieve_object(self.container,
1268 ae75584f Sofia Papagiannaki
                                                           'large-object'))
1269 ae75584f Sofia Papagiannaki
        
1270 ae75584f Sofia Papagiannaki
        #wrong manifestation
1271 ae75584f Sofia Papagiannaki
        self.client.create_manifestation(self.container, 'large-object',
1272 95e92490 Sofia Papagiannaki
                                         '%s/invalid' % self.container)
1273 95e92490 Sofia Papagiannaki
        self.assertEqual('', self.client.retrieve_object(self.container,
1274 95e92490 Sofia Papagiannaki
                                                         'large-object'))
1275 95e92490 Sofia Papagiannaki
    
1276 3078108a Sofia Papagiannaki
    def test_create_zero_length_object(self):
1277 3078108a Sofia Papagiannaki
        c = self.container
1278 3078108a Sofia Papagiannaki
        o = 'object'
1279 3078108a Sofia Papagiannaki
        zero = self.client.create_zero_length_object(c, o)
1280 3078108a Sofia Papagiannaki
        zero_meta = self.client.retrieve_object_metadata(c, o)
1281 fd9f505c Antony Chazapis
        zero_hash = self.client.retrieve_object_hashmap(c, o)["hashes"]
1282 3078108a Sofia Papagiannaki
        zero_data = self.client.retrieve_object(c, o)
1283 3078108a Sofia Papagiannaki
        
1284 3078108a Sofia Papagiannaki
        self.assertEqual(int(zero_meta['content-length']), 0)
1285 35390ded Sofia Papagiannaki
        hasher = newhasher('sha256')
1286 35390ded Sofia Papagiannaki
        hasher.update("")
1287 35390ded Sofia Papagiannaki
        emptyhash = hasher.digest()
1288 35390ded Sofia Papagiannaki
        self.assertEqual(zero_hash, [hexlify(emptyhash)])
1289 3078108a Sofia Papagiannaki
        self.assertEqual(zero_data, '')
1290 ad7e4bea Sofia Papagiannaki
    
1291 ad7e4bea Sofia Papagiannaki
    def test_create_object_by_hashmap(self):
1292 ad7e4bea Sofia Papagiannaki
        c = self.container
1293 ad7e4bea Sofia Papagiannaki
        o = 'object'
1294 ad7e4bea Sofia Papagiannaki
        self.upload_random_data(c, o)
1295 ad7e4bea Sofia Papagiannaki
        hashmap = self.client.retrieve_object(c, o, format='json')
1296 ad7e4bea Sofia Papagiannaki
        o2 = 'object-copy'
1297 ad7e4bea Sofia Papagiannaki
        self.client.create_object_by_hashmap(c, o2, hashmap)
1298 ad7e4bea Sofia Papagiannaki
        self.assertEqual(self.client.retrieve_object(c, o),
1299 ad7e4bea Sofia Papagiannaki
                         self.client.retrieve_object(c, o))
1300 3078108a Sofia Papagiannaki
1301 d1e43d6f Sofia Papagiannaki
class ObjectCopy(BaseTestCase):
1302 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1303 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1304 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1305 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1306 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1307 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1308 70516d86 Sofia Papagiannaki
        
1309 b09c9aaa Sofia Papagiannaki
    def test_copy(self):
1310 23028d31 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_object_metadata,
1311 33ffca25 Sofia Papagiannaki
                             self.containers[0], self.obj['name']):
1312 b09c9aaa Sofia Papagiannaki
            #perform copy
1313 23028d31 Sofia Papagiannaki
            meta = {'test':'testcopy'}
1314 23028d31 Sofia Papagiannaki
            status = self.client.copy_object(self.containers[0],
1315 23028d31 Sofia Papagiannaki
                                              self.obj['name'],
1316 23028d31 Sofia Papagiannaki
                                              self.containers[0],
1317 23028d31 Sofia Papagiannaki
                                              'testcopy',
1318 7812e1f9 Sofia Papagiannaki
                                              meta)[0]
1319 23028d31 Sofia Papagiannaki
            
1320 b09c9aaa Sofia Papagiannaki
            #assert copy success
1321 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 201)
1322 b09c9aaa Sofia Papagiannaki
            
1323 b09c9aaa Sofia Papagiannaki
            #assert access the new object
1324 23028d31 Sofia Papagiannaki
            headers = self.client.retrieve_object_metadata(self.containers[0],
1325 23028d31 Sofia Papagiannaki
                                                           'testcopy')
1326 23028d31 Sofia Papagiannaki
            self.assertTrue('x-object-meta-test' in headers.keys())
1327 23028d31 Sofia Papagiannaki
            self.assertTrue(headers['x-object-meta-test'], 'testcopy')
1328 b09c9aaa Sofia Papagiannaki
            
1329 b09c9aaa Sofia Papagiannaki
            #assert etag is the same
1330 23028d31 Sofia Papagiannaki
            self.assertEqual(headers['etag'], self.obj['hash'])
1331 b09c9aaa Sofia Papagiannaki
            
1332 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1333 23028d31 Sofia Papagiannaki
            self.assert_object_exists(self.containers[0], self.obj['name'])
1334 25c3841c Sofia Papagiannaki
    
1335 b09c9aaa Sofia Papagiannaki
    def test_copy_from_different_container(self):
1336 23028d31 Sofia Papagiannaki
        with AssertMappingInvariant(self.client.retrieve_object_metadata,
1337 23028d31 Sofia Papagiannaki
                             self.containers[0], self.obj['name']):
1338 23028d31 Sofia Papagiannaki
            meta = {'test':'testcopy'}
1339 23028d31 Sofia Papagiannaki
            status = self.client.copy_object(self.containers[0],
1340 23028d31 Sofia Papagiannaki
                                             self.obj['name'],
1341 23028d31 Sofia Papagiannaki
                                             self.containers[1],
1342 23028d31 Sofia Papagiannaki
                                             'testcopy',
1343 7812e1f9 Sofia Papagiannaki
                                             meta)[0]
1344 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 201)
1345 b09c9aaa Sofia Papagiannaki
            
1346 b09c9aaa Sofia Papagiannaki
            # assert updated metadata
1347 23028d31 Sofia Papagiannaki
            meta = self.client.retrieve_object_metadata(self.containers[1],
1348 23028d31 Sofia Papagiannaki
                                                           'testcopy',
1349 23028d31 Sofia Papagiannaki
                                                           restricted=True)
1350 23028d31 Sofia Papagiannaki
            self.assertTrue('test' in meta.keys())
1351 23028d31 Sofia Papagiannaki
            self.assertTrue(meta['test'], 'testcopy')
1352 b09c9aaa Sofia Papagiannaki
            
1353 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1354 23028d31 Sofia Papagiannaki
            self.assert_object_exists(self.containers[0], self.obj['name'])
1355 25c3841c Sofia Papagiannaki
    
1356 b09c9aaa Sofia Papagiannaki
    def test_copy_invalid(self):
1357 b09c9aaa Sofia Papagiannaki
        #copy from invalid object
1358 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1359 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.copy_object, self.containers[0],
1360 7812e1f9 Sofia Papagiannaki
                                 'test.py', self.containers[1], 'testcopy', meta)
1361 b09c9aaa Sofia Papagiannaki
        
1362 b09c9aaa Sofia Papagiannaki
        #copy from invalid container
1363 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1364 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.copy_object, self.containers[1],
1365 23028d31 Sofia Papagiannaki
                                 self.obj['name'], self.containers[1],
1366 7812e1f9 Sofia Papagiannaki
                                 'testcopy', meta)
1367 b09c9aaa Sofia Papagiannaki
1368 7812e1f9 Sofia Papagiannaki
class ObjectMove(BaseTestCase):
1369 7812e1f9 Sofia Papagiannaki
    def setUp(self):
1370 7812e1f9 Sofia Papagiannaki
        BaseTestCase.setUp(self)
1371 7812e1f9 Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1372 7812e1f9 Sofia Papagiannaki
        for c in self.containers:
1373 7812e1f9 Sofia Papagiannaki
            self.client.create_container(c)
1374 7812e1f9 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1375 7812e1f9 Sofia Papagiannaki
    
1376 b09c9aaa Sofia Papagiannaki
    def test_move(self):
1377 95e0d8ee Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[0],
1378 95e0d8ee Sofia Papagiannaki
                                                    self.obj['name'])
1379 95e0d8ee Sofia Papagiannaki
        self.assertTrue('x-object-uuid' in meta)
1380 95e0d8ee Sofia Papagiannaki
        uuid = meta['x-object-uuid']
1381 95e0d8ee Sofia Papagiannaki
        
1382 b09c9aaa Sofia Papagiannaki
        #perform move
1383 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1384 f7667baf Antony Chazapis
        src_path = '/'.join(('/', self.containers[0], self.obj['name']))
1385 23028d31 Sofia Papagiannaki
        status = self.client.move_object(self.containers[0], self.obj['name'],
1386 23028d31 Sofia Papagiannaki
                                         self.containers[0], 'testcopy',
1387 7812e1f9 Sofia Papagiannaki
                                         meta)[0]
1388 23028d31 Sofia Papagiannaki
        
1389 b09c9aaa Sofia Papagiannaki
        #assert successful move
1390 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 201)
1391 b09c9aaa Sofia Papagiannaki
        
1392 b09c9aaa Sofia Papagiannaki
        #assert updated metadata
1393 23028d31 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[0],
1394 95e0d8ee Sofia Papagiannaki
                                                    'testcopy')
1395 95e0d8ee Sofia Papagiannaki
        self.assertTrue('x-object-meta-test' in meta.keys())
1396 95e0d8ee Sofia Papagiannaki
        self.assertTrue(meta['x-object-meta-test'], 'testcopy')
1397 95e0d8ee Sofia Papagiannaki
        
1398 95e0d8ee Sofia Papagiannaki
        #assert same uuid
1399 95e0d8ee Sofia Papagiannaki
        self.assertTrue(meta['x-object-uuid'], uuid)
1400 b09c9aaa Sofia Papagiannaki
        
1401 b09c9aaa Sofia Papagiannaki
        #assert src object no more exists
1402 23028d31 Sofia Papagiannaki
        self.assert_object_not_exists(self.containers[0], self.obj['name'])
1403 b09c9aaa Sofia Papagiannaki
1404 d1e43d6f Sofia Papagiannaki
class ObjectPost(BaseTestCase):
1405 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1406 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1407 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1408 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1409 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1410 3078108a Sofia Papagiannaki
        self.obj = []
1411 3078108a Sofia Papagiannaki
        for i in range(2):
1412 3078108a Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.containers[0], o_names[i]))
1413 25c3841c Sofia Papagiannaki
    
1414 33ffca25 Sofia Papagiannaki
    def test_update_meta(self):
1415 95e0d8ee Sofia Papagiannaki
        with AssertUUidInvariant(self.client.retrieve_object_metadata,
1416 95e0d8ee Sofia Papagiannaki
                                 self.containers[0],
1417 95e0d8ee Sofia Papagiannaki
                                 self.obj[0]['name']):
1418 95e0d8ee Sofia Papagiannaki
            #perform update metadata
1419 62bf8157 Antony Chazapis
            more = {'foo': 'foo', 'bar': 'bar', 'f' * 114: 'b' * 256}
1420 95e0d8ee Sofia Papagiannaki
            status = self.client.update_object_metadata(self.containers[0],
1421 95e0d8ee Sofia Papagiannaki
                                                        self.obj[0]['name'],
1422 95e0d8ee Sofia Papagiannaki
                                                        **more)[0]
1423 95e0d8ee Sofia Papagiannaki
            #assert request accepted
1424 95e0d8ee Sofia Papagiannaki
            self.assertEqual(status, 202)
1425 95e0d8ee Sofia Papagiannaki
            
1426 95e0d8ee Sofia Papagiannaki
            #assert old metadata are still there
1427 95e0d8ee Sofia Papagiannaki
            headers = self.client.retrieve_object_metadata(self.containers[0],
1428 95e0d8ee Sofia Papagiannaki
                                                           self.obj[0]['name'],
1429 95e0d8ee Sofia Papagiannaki
                                                           restricted=True)
1430 95e0d8ee Sofia Papagiannaki
            #assert new metadata have been updated
1431 95e0d8ee Sofia Papagiannaki
            for k,v in more.items():
1432 95e0d8ee Sofia Papagiannaki
                self.assertTrue(k in headers.keys())
1433 95e0d8ee Sofia Papagiannaki
                self.assertTrue(headers[k], v)
1434 62bf8157 Antony Chazapis
            
1435 62bf8157 Antony Chazapis
            #out of limits
1436 62bf8157 Antony Chazapis
            more = {'f' * 114: 'b' * 257}
1437 62bf8157 Antony Chazapis
            self.assert_raises_fault(400, self.client.update_object_metadata,
1438 62bf8157 Antony Chazapis
                                                        self.containers[0],
1439 62bf8157 Antony Chazapis
                                                        self.obj[0]['name'],
1440 62bf8157 Antony Chazapis
                                                        **more)
1441 25c3841c Sofia Papagiannaki
    
1442 33ffca25 Sofia Papagiannaki
    def test_update_object(self,
1443 33ffca25 Sofia Papagiannaki
                           first_byte_pos=0,
1444 33ffca25 Sofia Papagiannaki
                           last_byte_pos=499,
1445 33ffca25 Sofia Papagiannaki
                           instance_length = True,
1446 33ffca25 Sofia Papagiannaki
                           content_length = 500):
1447 95e0d8ee Sofia Papagiannaki
        with AssertUUidInvariant(self.client.retrieve_object_metadata,
1448 95e0d8ee Sofia Papagiannaki
                                 self.containers[0],
1449 95e0d8ee Sofia Papagiannaki
                                 self.obj[0]['name']):
1450 95e0d8ee Sofia Papagiannaki
            l = len(self.obj[0]['data'])
1451 95e0d8ee Sofia Papagiannaki
            range = 'bytes %d-%d/%s' %(first_byte_pos,
1452 95e0d8ee Sofia Papagiannaki
                                           last_byte_pos,
1453 95e0d8ee Sofia Papagiannaki
                                            l if instance_length else '*')
1454 95e0d8ee Sofia Papagiannaki
            partial = last_byte_pos - first_byte_pos + 1
1455 95e0d8ee Sofia Papagiannaki
            length = first_byte_pos + partial
1456 95e0d8ee Sofia Papagiannaki
            data = get_random_data(partial)
1457 95e0d8ee Sofia Papagiannaki
            args = {'content_type':'application/octet-stream',
1458 95e0d8ee Sofia Papagiannaki
                    'content_range':'%s' %range}
1459 95e0d8ee Sofia Papagiannaki
            if content_length:
1460 95e0d8ee Sofia Papagiannaki
                args['content_length'] = content_length
1461 95e0d8ee Sofia Papagiannaki
            
1462 5a8dc30c Sofia Papagiannaki
            r = self.client.update_object(self.containers[0], self.obj[0]['name'],
1463 5a8dc30c Sofia Papagiannaki
                                      StringIO(data), **args)
1464 5a8dc30c Sofia Papagiannaki
            status = r[0]
1465 5a8dc30c Sofia Papagiannaki
            etag = r[1]['etag']
1466 95e0d8ee Sofia Papagiannaki
            if partial < 0 or (instance_length and l <= last_byte_pos):
1467 95e0d8ee Sofia Papagiannaki
                self.assertEqual(status, 202)    
1468 95e0d8ee Sofia Papagiannaki
            else:
1469 95e0d8ee Sofia Papagiannaki
                self.assertEqual(status, 204)           
1470 95e0d8ee Sofia Papagiannaki
                #check modified object
1471 95e0d8ee Sofia Papagiannaki
                content = self.client.retrieve_object(self.containers[0],
1472 95e0d8ee Sofia Papagiannaki
                                                  self.obj[0]['name'])
1473 95e0d8ee Sofia Papagiannaki
                self.assertEqual(content[:first_byte_pos], self.obj[0]['data'][:first_byte_pos])
1474 95e0d8ee Sofia Papagiannaki
                self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1475 95e0d8ee Sofia Papagiannaki
                self.assertEqual(content[last_byte_pos+1:], self.obj[0]['data'][last_byte_pos+1:])
1476 5a8dc30c Sofia Papagiannaki
                self.assertEqual(etag, compute_md5_hash(content))
1477 3078108a Sofia Papagiannaki
    
1478 3078108a Sofia Papagiannaki
    def test_update_object_lt_blocksize(self):
1479 3078108a Sofia Papagiannaki
        self.test_update_object(10, 20, content_length=None)
1480 3078108a Sofia Papagiannaki
    
1481 3078108a Sofia Papagiannaki
    def test_update_object_gt_blocksize(self):
1482 3078108a Sofia Papagiannaki
        o = self.upload_random_data(self.containers[0], o_names[1],
1483 3078108a Sofia Papagiannaki
                                length=4*1024*1024+5)
1484 3078108a Sofia Papagiannaki
        c = self.containers[0]
1485 3078108a Sofia Papagiannaki
        o_name = o['name']
1486 3078108a Sofia Papagiannaki
        o_data = o['data']
1487 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024+1
1488 3078108a Sofia Papagiannaki
        last_byte_pos = 4*1024*1024+4
1489 3078108a Sofia Papagiannaki
        l = last_byte_pos - first_byte_pos + 1
1490 3078108a Sofia Papagiannaki
        data = get_random_data(l)
1491 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1492 3078108a Sofia Papagiannaki
        self.client.update_object(c, o_name, StringIO(data), content_range=range)
1493 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, o_name)
1494 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], o_data[:first_byte_pos])
1495 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1496 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], o_data[last_byte_pos+1:])    
1497 3078108a Sofia Papagiannaki
    
1498 3078108a Sofia Papagiannaki
    def test_update_object_divided_by_blocksize(self):
1499 3078108a Sofia Papagiannaki
        o = self.upload_random_data(self.containers[0], o_names[1],
1500 3078108a Sofia Papagiannaki
                                length=4*1024*1024+5)
1501 3078108a Sofia Papagiannaki
        c = self.containers[0]
1502 3078108a Sofia Papagiannaki
        o_name = o['name']
1503 3078108a Sofia Papagiannaki
        o_data = o['data']
1504 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024
1505 3078108a Sofia Papagiannaki
        last_byte_pos = 5*1024*1024
1506 3078108a Sofia Papagiannaki
        l = last_byte_pos - first_byte_pos + 1
1507 3078108a Sofia Papagiannaki
        data = get_random_data(l)
1508 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1509 3078108a Sofia Papagiannaki
        self.client.update_object(c, o_name, StringIO(data), content_range=range)
1510 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, o_name)
1511 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], o_data[:first_byte_pos])
1512 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1513 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], o_data[last_byte_pos+1:])    
1514 25c3841c Sofia Papagiannaki
    
1515 33ffca25 Sofia Papagiannaki
    def test_update_object_no_content_length(self):
1516 33ffca25 Sofia Papagiannaki
        self.test_update_object(content_length = None)
1517 25c3841c Sofia Papagiannaki
    
1518 25c3841c Sofia Papagiannaki
    def test_update_object_invalid_content_length(self):
1519 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1520 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1521 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(400, self.test_update_object,
1522 25c3841c Sofia Papagiannaki
                                     content_length = 1000)
1523 25c3841c Sofia Papagiannaki
    
1524 68229c3e Sofia Papagiannaki
    def _test_update_object_invalid_range(self):
1525 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1526 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1527 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True)
1528 33ffca25 Sofia Papagiannaki
    
1529 68229c3e Sofia Papagiannaki
    def _test_update_object_invalid_range_and_length(self):
1530 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1531 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1532 0538cac6 Sofia Papagiannaki
            self.assert_raises_fault([400, 416], self.test_update_object, 499, 0, True,
1533 cd6ada1d Sofia Papagiannaki
                                     -1)
1534 33ffca25 Sofia Papagiannaki
    
1535 33ffca25 Sofia Papagiannaki
    def test_update_object_invalid_range_with_no_content_length(self):
1536 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1537 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1538 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True,
1539 cd6ada1d Sofia Papagiannaki
                                     content_length = None)
1540 33ffca25 Sofia Papagiannaki
    
1541 33ffca25 Sofia Papagiannaki
    def test_update_object_out_of_limits(self):    
1542 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1543 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1544 3078108a Sofia Papagiannaki
            l = len(self.obj[0]['data'])
1545 23028d31 Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 0, l+1, True)
1546 25c3841c Sofia Papagiannaki
    
1547 33ffca25 Sofia Papagiannaki
    def test_append(self):
1548 33ffca25 Sofia Papagiannaki
        data = get_random_data(500)
1549 25c3841c Sofia Papagiannaki
        headers = {}
1550 3078108a Sofia Papagiannaki
        self.client.update_object(self.containers[0], self.obj[0]['name'],
1551 25c3841c Sofia Papagiannaki
                                  StringIO(data), content_length=500,
1552 25c3841c Sofia Papagiannaki
                                  content_type='application/octet-stream')
1553 33ffca25 Sofia Papagiannaki
        
1554 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1555 3078108a Sofia Papagiannaki
                                              self.obj[0]['name'])
1556 3078108a Sofia Papagiannaki
        self.assertEqual(len(content), len(self.obj[0]['data']) + 500)
1557 3078108a Sofia Papagiannaki
        self.assertEqual(content[:-500], self.obj[0]['data'])
1558 25c3841c Sofia Papagiannaki
    
1559 bd8a3026 Sofia Papagiannaki
    def test_update_with_chunked_transfer(self):
1560 25c3841c Sofia Papagiannaki
        data = get_random_data(500)
1561 25c3841c Sofia Papagiannaki
        dl = len(data)
1562 3078108a Sofia Papagiannaki
        fl = len(self.obj[0]['data'])
1563 bd8a3026 Sofia Papagiannaki
        
1564 25c3841c Sofia Papagiannaki
        self.client.update_object_using_chunks(self.containers[0],
1565 3078108a Sofia Papagiannaki
                                               self.obj[0]['name'],
1566 3078108a Sofia Papagiannaki
                                               StringIO(data),
1567 25c3841c Sofia Papagiannaki
                                               offset=0,
1568 25c3841c Sofia Papagiannaki
                                               content_type='application/octet-stream')
1569 bd8a3026 Sofia Papagiannaki
        
1570 bd8a3026 Sofia Papagiannaki
        #check modified object
1571 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1572 3078108a Sofia Papagiannaki
                                              self.obj[0]['name'])
1573 25c3841c Sofia Papagiannaki
        self.assertEqual(content[0:dl], data)
1574 3078108a Sofia Papagiannaki
        self.assertEqual(content[dl:fl], self.obj[0]['data'][dl:fl])
1575 a5149fd0 Sofia Papagiannaki
    
1576 a5149fd0 Sofia Papagiannaki
    def test_update_from_other_object(self):
1577 3078108a Sofia Papagiannaki
        c = self.containers[0]
1578 3078108a Sofia Papagiannaki
        src = o_names[0]
1579 3078108a Sofia Papagiannaki
        dest = 'object'
1580 3078108a Sofia Papagiannaki
        
1581 3078108a Sofia Papagiannaki
        source_data = self.client.retrieve_object(c, src)
1582 3078108a Sofia Papagiannaki
        source_meta = self.client.retrieve_object_metadata(c, src)
1583 fd9f505c Antony Chazapis
        source_hash = self.client.retrieve_object_hashmap(c, src)["hashes"]
1584 3078108a Sofia Papagiannaki
        
1585 3078108a Sofia Papagiannaki
        #update zero length object
1586 3078108a Sofia Papagiannaki
        self.client.create_zero_length_object(c, dest)
1587 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, src)
1588 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object)
1589 3078108a Sofia Papagiannaki
        dest_data = self.client.retrieve_object(c, src)
1590 3078108a Sofia Papagiannaki
        dest_meta = self.client.retrieve_object_metadata(c, dest)
1591 fd9f505c Antony Chazapis
        dest_hash = self.client.retrieve_object_hashmap(c, src)["hashes"]
1592 3078108a Sofia Papagiannaki
        self.assertEqual(source_data, dest_data)
1593 3078108a Sofia Papagiannaki
        self.assertEqual(source_hash, dest_hash)
1594 3078108a Sofia Papagiannaki
        
1595 3078108a Sofia Papagiannaki
        #test append
1596 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object)
1597 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1598 3078108a Sofia Papagiannaki
        self.assertEqual(source_data * 2, content)
1599 3078108a Sofia Papagiannaki
    
1600 3078108a Sofia Papagiannaki
    def test_update_range_from_other_object(self):
1601 3078108a Sofia Papagiannaki
        c = self.containers[0]
1602 3078108a Sofia Papagiannaki
        dest = 'object'
1603 3078108a Sofia Papagiannaki
        
1604 3078108a Sofia Papagiannaki
        #test update range
1605 3078108a Sofia Papagiannaki
        src = self.obj[1]['name']
1606 3078108a Sofia Papagiannaki
        src_data = self.client.retrieve_object(c, src)
1607 3078108a Sofia Papagiannaki
        
1608 3078108a Sofia Papagiannaki
        #update zero length object
1609 3078108a Sofia Papagiannaki
        prev_data = self.upload_random_data(c, dest, length=4*1024*1024+10)['data']
1610 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, src)
1611 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024+1
1612 3078108a Sofia Papagiannaki
        last_byte_pos = 4*1024*1024+4
1613 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1614 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object,
1615 3078108a Sofia Papagiannaki
                                             content_range=range)
1616 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1617 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], prev_data[:first_byte_pos])
1618 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], src_data[:last_byte_pos - first_byte_pos + 1])
1619 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], prev_data[last_byte_pos+1:])
1620 3078108a Sofia Papagiannaki
    
1621 3078108a Sofia Papagiannaki
    def test_update_hashes_from_other_object(self):
1622 3078108a Sofia Papagiannaki
        c = self.containers[0]
1623 3078108a Sofia Papagiannaki
        dest = 'object'
1624 3078108a Sofia Papagiannaki
        
1625 3078108a Sofia Papagiannaki
        #test update range
1626 3078108a Sofia Papagiannaki
        src_data = self.upload_random_data(c, o_names[0], length=1024*1024+10)['data']
1627 3078108a Sofia Papagiannaki
        
1628 3078108a Sofia Papagiannaki
        #update zero length object
1629 3078108a Sofia Papagiannaki
        prev_data = self.upload_random_data(c, dest, length=5*1024*1024+10)['data']
1630 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, o_names[0])
1631 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024
1632 3078108a Sofia Papagiannaki
        last_byte_pos = 5*1024*1024
1633 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1634 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object,
1635 3078108a Sofia Papagiannaki
                                             content_range=range)
1636 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1637 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], prev_data[:first_byte_pos])
1638 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], src_data[:last_byte_pos - first_byte_pos + 1])
1639 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], prev_data[last_byte_pos+1:])
1640 3078108a Sofia Papagiannaki
    
1641 3078108a Sofia Papagiannaki
    
1642 3078108a Sofia Papagiannaki
    def test_update_zero_length_object(self):
1643 3078108a Sofia Papagiannaki
        c = self.containers[0]
1644 3078108a Sofia Papagiannaki
        o = 'object'
1645 3078108a Sofia Papagiannaki
        other = 'other'
1646 3078108a Sofia Papagiannaki
        zero = self.client.create_zero_length_object(c, o)
1647 a5149fd0 Sofia Papagiannaki
        
1648 3078108a Sofia Papagiannaki
        data = get_random_data()
1649 3078108a Sofia Papagiannaki
        self.client.update_object(c, o, StringIO(data))
1650 3078108a Sofia Papagiannaki
        self.client.create_object(c, other, StringIO(data))
1651 3078108a Sofia Papagiannaki
        
1652 3078108a Sofia Papagiannaki
        self.assertEqual(self.client.retrieve_object(c, o),
1653 3078108a Sofia Papagiannaki
                         self.client.retrieve_object(c, other))
1654 3078108a Sofia Papagiannaki
        
1655 fd9f505c Antony Chazapis
        self.assertEqual(self.client.retrieve_object_hashmap(c, o)["hashes"],
1656 fd9f505c Antony Chazapis
                         self.client.retrieve_object_hashmap(c, other)["hashes"])
1657 a5149fd0 Sofia Papagiannaki
    
1658 d1e43d6f Sofia Papagiannaki
class ObjectDelete(BaseTestCase):
1659 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1660 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1661 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1662 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1663 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1664 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1665 25c3841c Sofia Papagiannaki
    
1666 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
1667 b09c9aaa Sofia Papagiannaki
        #perform delete object
1668 23028d31 Sofia Papagiannaki
        self.client.delete_object(self.containers[0], self.obj['name'])[0]
1669 25c3841c Sofia Papagiannaki
    
1670 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
1671 23028d31 Sofia Papagiannaki
        #assert item not found
1672 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.delete_object, self.containers[1],
1673 23028d31 Sofia Papagiannaki
                                 self.obj['name'])
1674 b09c9aaa Sofia Papagiannaki
1675 ae75584f Sofia Papagiannaki
class ListSharing(BaseTestCase):
1676 ae75584f Sofia Papagiannaki
    def setUp(self):
1677 ae75584f Sofia Papagiannaki
        BaseTestCase.setUp(self)
1678 8d964102 Sofia Papagiannaki
        for i in range(2):
1679 8d964102 Sofia Papagiannaki
            self.client.create_container('c%s' %i)
1680 ae75584f Sofia Papagiannaki
        self.client.create_container('c')
1681 ae75584f Sofia Papagiannaki
        for i in range(2):
1682 8d964102 Sofia Papagiannaki
            self.upload_random_data('c1', 'o%s' %i)
1683 ae75584f Sofia Papagiannaki
        accounts = OTHER_ACCOUNTS.copy()
1684 ae75584f Sofia Papagiannaki
        self.o1_sharing_with = accounts.popitem()
1685 ae75584f Sofia Papagiannaki
        self.o1_sharing = [self.o1_sharing_with[1]]
1686 8d964102 Sofia Papagiannaki
        self.client.share_object('c1', 'o1', self.o1_sharing, read=True)
1687 ae75584f Sofia Papagiannaki
        
1688 ae75584f Sofia Papagiannaki
        l = []
1689 ae75584f Sofia Papagiannaki
        for i in range(2):
1690 ae75584f Sofia Papagiannaki
            l.append(accounts.popitem())
1691 ae75584f Sofia Papagiannaki
    
1692 8d964102 Sofia Papagiannaki
    def test_list_other_shared(self):
1693 43cc6f76 Sofia Papagiannaki
        self.other = Pithos_Client(get_url(),
1694 ae75584f Sofia Papagiannaki
                              self.o1_sharing_with[0],
1695 43cc6f76 Sofia Papagiannaki
                              self.o1_sharing_with[1])
1696 a607181b Sofia Papagiannaki
        self.assertTrue(get_user() in self.other.list_shared_by_others())
1697 8d964102 Sofia Papagiannaki
    
1698 8d964102 Sofia Papagiannaki
    def test_list_my_shared(self):
1699 8d964102 Sofia Papagiannaki
        my_shared_containers = self.client.list_containers(shared=True)
1700 8d964102 Sofia Papagiannaki
        self.assertTrue('c1' in my_shared_containers)
1701 8d964102 Sofia Papagiannaki
        self.assertTrue('c2' not in my_shared_containers)
1702 8d964102 Sofia Papagiannaki
        
1703 8d964102 Sofia Papagiannaki
        my_shared_objects = self.client.list_objects('c1', shared=True)
1704 8d964102 Sofia Papagiannaki
        self.assertTrue('o1' in my_shared_objects)
1705 8d964102 Sofia Papagiannaki
        self.assertTrue('o2' not in my_shared_objects)
1706 8d964102 Sofia Papagiannaki
    
1707 ae75584f Sofia Papagiannaki
class TestGreek(BaseTestCase):
1708 ae75584f Sofia Papagiannaki
    def test_create_container(self):
1709 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1710 ae75584f Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1711 e7b51248 Sofia Papagiannaki
        
1712 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' in self.client.list_containers())
1713 ae75584f Sofia Papagiannaki
    
1714 ae75584f Sofia Papagiannaki
    def test_create_object(self):
1715 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1716 ae75584f Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1717 ae75584f Sofia Papagiannaki
        
1718 ae75584f Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1719 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in self.client.list_objects('φάκελος'))
1720 ae75584f Sofia Papagiannaki
    
1721 ae75584f Sofia Papagiannaki
    def test_copy_object(self):
1722 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1723 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1724 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1725 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1726 ae75584f Sofia Papagiannaki
        
1727 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1728 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1729 ae75584f Sofia Papagiannaki
        
1730 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1731 e7b51248 Sofia Papagiannaki
        self.client.copy_object(src_container, src_object, dest_container,
1732 e7b51248 Sofia Papagiannaki
                                dest_object)
1733 e7b51248 Sofia Papagiannaki
        
1734 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(src_container, src_object)
1735 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1736 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1737 ae75584f Sofia Papagiannaki
    
1738 ae75584f Sofia Papagiannaki
    def test_move_object(self):
1739 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1740 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1741 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1742 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1743 ae75584f Sofia Papagiannaki
        
1744 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1745 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1746 ae75584f Sofia Papagiannaki
        
1747 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1748 e7b51248 Sofia Papagiannaki
        self.client.move_object(src_container, src_object, dest_container,
1749 e7b51248 Sofia Papagiannaki
                                dest_object)
1750 e7b51248 Sofia Papagiannaki
        
1751 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists(src_container, src_object)
1752 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1753 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1754 ae75584f Sofia Papagiannaki
    
1755 ae75584f Sofia Papagiannaki
    def test_delete_object(self):
1756 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1757 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1758 e7b51248 Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1759 ae75584f Sofia Papagiannaki
    
1760 e7b51248 Sofia Papagiannaki
        self.client.delete_object('φάκελος', 'αντικείμενο')
1761 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists('φάκελος', 'αντικείμενο')
1762 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' not in self.client.list_objects('φάκελος'))
1763 ae75584f Sofia Papagiannaki
    
1764 e7b51248 Sofia Papagiannaki
    def test_delete_container(self):
1765 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1766 e7b51248 Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1767 e7b51248 Sofia Papagiannaki
        
1768 e7b51248 Sofia Papagiannaki
        self.client.delete_container('φάκελος')
1769 e7b51248 Sofia Papagiannaki
        self.assert_container_not_exists('φάκελος')
1770 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' not in self.client.list_containers())
1771 e7b51248 Sofia Papagiannaki
1772 ae75584f Sofia Papagiannaki
    def test_account_meta(self):
1773 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1774 e7b51248 Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
1775 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True)
1776 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1777 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1778 ae75584f Sofia Papagiannaki
    
1779 ae75584f Sofia Papagiannaki
    def test_container_meta(self):
1780 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1781 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος', **meta)
1782 e7b51248 Sofia Papagiannaki
        
1783 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('φάκελος', restricted=True)
1784 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1785 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1786 ae75584f Sofia Papagiannaki
    
1787 e7b51248 Sofia Papagiannaki
    def test_object_meta(self):
1788 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1789 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1790 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο', **meta)
1791 e7b51248 Sofia Papagiannaki
        
1792 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('φάκελος', 'αντικείμενο',
1793 e7b51248 Sofia Papagiannaki
                                                    restricted=True)
1794 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1795 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')    
1796 ae75584f Sofia Papagiannaki
    
1797 ae75584f Sofia Papagiannaki
    def test_list_meta_filtering(self):
1798 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1799 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1800 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο1', **meta)
1801 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο2')
1802 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο3')
1803 e7b51248 Sofia Papagiannaki
        
1804 e7b51248 Sofia Papagiannaki
        meta = {'ποσότητα':'μεγάλη'}
1805 e7b51248 Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1806 e7b51248 Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα, ποσότητα')
1807 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1', 'ο2'])
1808 3d13f97a Sofia Papagiannaki
        
1809 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα')
1810 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο2', 'ο3'])
1811 3d13f97a Sofia Papagiannaki
        
1812 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα, !ποσότητα')
1813 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο3'])
1814 3d13f97a Sofia Papagiannaki
        
1815 3d13f97a Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΒ'}
1816 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1817 f897bea9 Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα=ΑΑΑ')
1818 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1'])
1819 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα!=ΑΑΑ')
1820 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο2'])
1821 3d13f97a Sofia Papagiannaki
        
1822 3d13f97a Sofia Papagiannaki
        meta = {'έτος':'2011'}
1823 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο3', **meta)
1824 3d13f97a Sofia Papagiannaki
        meta = {'έτος':'2012'}
1825 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1826 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<2012')
1827 f897bea9 Sofia Papagiannaki
        self.assertEquals(objects, ['ο3'])
1828 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<=2012')
1829 f897bea9 Sofia Papagiannaki
        self.assertEquals(objects, ['ο2', 'ο3'])
1830 f897bea9 Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<2012,έτος!=2011')
1831 f897bea9 Sofia Papagiannaki
        self.assertEquals(objects, '')
1832 ae75584f Sofia Papagiannaki
    
1833 ae75584f Sofia Papagiannaki
    def test_groups(self):
1834 e7b51248 Sofia Papagiannaki
        #create a group
1835 95e92490 Sofia Papagiannaki
        groups = {'σεφς':'chazapis,διογένης'}
1836 e7b51248 Sofia Papagiannaki
        self.client.set_account_groups(**groups)
1837 e7b51248 Sofia Papagiannaki
        groups.update(self.initial_groups)
1838 e7b51248 Sofia Papagiannaki
        self.assertEqual(groups['σεφς'],
1839 e7b51248 Sofia Papagiannaki
                         self.client.retrieve_account_groups()['σεφς'])
1840 e7b51248 Sofia Papagiannaki
        
1841 95e92490 Sofia Papagiannaki
        #check read access
1842 95e92490 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1843 95e92490 Sofia Papagiannaki
        o = self.upload_random_data('φάκελος', 'ο1')
1844 a607181b Sofia Papagiannaki
        self.client.share_object('φάκελος', 'ο1', ['%s:σεφς' % get_user()])
1845 a06e2ad6 Sofia Papagiannaki
        chef = Pithos_Client(get_url(),
1846 95e92490 Sofia Papagiannaki
                            '0009',
1847 96738a78 Sofia Papagiannaki
                            'διογένης')
1848 297513ba Antony Chazapis
        self.assert_not_raises_fault(403, chef.retrieve_object_metadata,
1849 a5149fd0 Sofia Papagiannaki
                                     'φάκελος', 'ο1', account=get_user())
1850 95e92490 Sofia Papagiannaki
        
1851 95e92490 Sofia Papagiannaki
        #check write access
1852 95e92490 Sofia Papagiannaki
        self.client.share_object('φάκελος', 'ο1', ['διογένης'], read=False)
1853 95e92490 Sofia Papagiannaki
        new_data = get_random_data()
1854 297513ba Antony Chazapis
        self.assert_not_raises_fault(403, chef.update_object,
1855 95e92490 Sofia Papagiannaki
                                     'φάκελος', 'ο1', StringIO(new_data),
1856 a5149fd0 Sofia Papagiannaki
                                     account=get_user())
1857 95e92490 Sofia Papagiannaki
        
1858 95e92490 Sofia Papagiannaki
        server_data = self.client.retrieve_object('φάκελος', 'ο1')
1859 95e92490 Sofia Papagiannaki
        self.assertEqual(server_data[:len(o['data'])], o['data'])
1860 95e92490 Sofia Papagiannaki
        self.assertEqual(server_data[len(o['data']):], new_data)
1861 95e92490 Sofia Papagiannaki
    
1862 95e92490 Sofia Papagiannaki
    def test_manifestation(self):
1863 95e92490 Sofia Papagiannaki
        self.client.create_container('κουβάς')
1864 95e92490 Sofia Papagiannaki
        prefix = 'μέρη/'
1865 95e92490 Sofia Papagiannaki
        data = ''
1866 95e92490 Sofia Papagiannaki
        for i in range(5):
1867 95e92490 Sofia Papagiannaki
            part = '%s%d' %(prefix, i)
1868 95e92490 Sofia Papagiannaki
            o = self.upload_random_data('κουβάς', part)
1869 95e92490 Sofia Papagiannaki
            data += o['data']
1870 95e92490 Sofia Papagiannaki
        
1871 95e92490 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1872 95e92490 Sofia Papagiannaki
        manifest = '%s/%s' %('κουβάς', prefix)
1873 95e92490 Sofia Papagiannaki
        self.client.create_manifestation('φάκελος', 'άπαντα', manifest)
1874 95e92490 Sofia Papagiannaki
        
1875 95e92490 Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'άπαντα')
1876 95e92490 Sofia Papagiannaki
        self.assertEqual(data, self.client.retrieve_object('φάκελος',
1877 95e92490 Sofia Papagiannaki
                                                           'άπαντα'))
1878 95e92490 Sofia Papagiannaki
        
1879 95e92490 Sofia Papagiannaki
        #wrong manifestation
1880 95e92490 Sofia Papagiannaki
        self.client.create_manifestation('φάκελος', 'άπαντα', 'κουβάς/άκυρο')
1881 95e92490 Sofia Papagiannaki
        self.assertEqual('', self.client.retrieve_object('φάκελος', 'άπαντα'))
1882 ae75584f Sofia Papagiannaki
    
1883 952f4da1 Sofia Papagiannaki
    def test_update_from_another_object(self):
1884 a5149fd0 Sofia Papagiannaki
        self.client.create_container('κουβάς')
1885 a5149fd0 Sofia Papagiannaki
        src_data = self.upload_random_data('κουβάς', 'πηγή')['data']
1886 a5149fd0 Sofia Papagiannaki
        initial_data = self.upload_random_data('κουβάς', 'νέο')['data']
1887 a5149fd0 Sofia Papagiannaki
        source_object = '/%s/%s' % ('κουβάς', 'πηγή')
1888 a5149fd0 Sofia Papagiannaki
        self.client.update_from_other_source('κουβάς', 'νέο', source_object)
1889 a5149fd0 Sofia Papagiannaki
        
1890 a5149fd0 Sofia Papagiannaki
        self.assertEqual(
1891 a5149fd0 Sofia Papagiannaki
            self.client.retrieve_object('κουβάς', 'νέο'),
1892 a5149fd0 Sofia Papagiannaki
            '%s%s' % (initial_data, self.client.retrieve_object('κουβάς', 'πηγή')))
1893 952f4da1 Sofia Papagiannaki
1894 95e92490 Sofia Papagiannaki
class TestPermissions(BaseTestCase):
1895 95e92490 Sofia Papagiannaki
    def setUp(self):
1896 95e92490 Sofia Papagiannaki
        BaseTestCase.setUp(self)
1897 95e92490 Sofia Papagiannaki
        
1898 95e92490 Sofia Papagiannaki
        #create a group
1899 ad7e4bea Sofia Papagiannaki
        self.authorized = ['chazapis', 'verigak', 'gtsouk']
1900 95e92490 Sofia Papagiannaki
        groups = {'pithosdev':','.join(self.authorized)}
1901 95e92490 Sofia Papagiannaki
        self.client.set_account_groups(**groups)
1902 236b1575 Sofia Papagiannaki
        
1903 236b1575 Sofia Papagiannaki
        self.container = 'c'
1904 236b1575 Sofia Papagiannaki
        self.object = 'o'
1905 236b1575 Sofia Papagiannaki
        self.client.create_container(self.container)
1906 236b1575 Sofia Papagiannaki
        self.upload_random_data(self.container, self.object)
1907 236b1575 Sofia Papagiannaki
        self.upload_random_data(self.container, self.object+'/')
1908 236b1575 Sofia Papagiannaki
        self.upload_random_data(self.container, self.object+'/a')
1909 236b1575 Sofia Papagiannaki
        self.upload_random_data(self.container, self.object+'a')
1910 236b1575 Sofia Papagiannaki
        self.upload_random_data(self.container, self.object+'a/')
1911 236b1575 Sofia Papagiannaki
        self.dir_content_types = ('application/directory', 'application/folder')
1912 236b1575 Sofia Papagiannaki
    
1913 236b1575 Sofia Papagiannaki
    def assert_read(self, authorized=[], any=False, depth=0):
1914 95e92490 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1915 96738a78 Sofia Papagiannaki
            cl = Pithos_Client(get_url(), token, account)
1916 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1917 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.retrieve_object_metadata,
1918 236b1575 Sofia Papagiannaki
                                             self.container, self.object,
1919 236b1575 Sofia Papagiannaki
                                             account=get_user())
1920 95e92490 Sofia Papagiannaki
            else:
1921 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.retrieve_object_metadata,
1922 236b1575 Sofia Papagiannaki
                                         self.container, self.object,
1923 236b1575 Sofia Papagiannaki
                                         account=get_user())
1924 95e92490 Sofia Papagiannaki
        
1925 8d964102 Sofia Papagiannaki
        #check inheritance
1926 236b1575 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.container, self.object)
1927 236b1575 Sofia Papagiannaki
        type = meta['content-type']
1928 236b1575 Sofia Papagiannaki
        derivatives = self.client.list_objects(self.container, prefix=self.object)
1929 236b1575 Sofia Papagiannaki
        #exclude the self.object
1930 236b1575 Sofia Papagiannaki
        del derivatives[derivatives.index(self.object)]
1931 236b1575 Sofia Papagiannaki
        for o in derivatives:
1932 236b1575 Sofia Papagiannaki
            for token, account in OTHER_ACCOUNTS.items():
1933 236b1575 Sofia Papagiannaki
                cl = Pithos_Client(get_url(), token, account)
1934 236b1575 Sofia Papagiannaki
                prefix = self.object if self.object.endswith('/') else self.object+'/'
1935 236b1575 Sofia Papagiannaki
                if (account in authorized or any) and \
1936 236b1575 Sofia Papagiannaki
                (type in self.dir_content_types) and \
1937 236b1575 Sofia Papagiannaki
                o.startswith(prefix):
1938 236b1575 Sofia Papagiannaki
                    self.assert_not_raises_fault(403, cl.retrieve_object_metadata,
1939 236b1575 Sofia Papagiannaki
                                             self.container, o, account=get_user())
1940 236b1575 Sofia Papagiannaki
                else:
1941 236b1575 Sofia Papagiannaki
                    self.assert_raises_fault(403, cl.retrieve_object_metadata,
1942 236b1575 Sofia Papagiannaki
                                         self.container, o, account=get_user())
1943 236b1575 Sofia Papagiannaki
    
1944 236b1575 Sofia Papagiannaki
    def assert_write(self, authorized=[], any=False):
1945 236b1575 Sofia Papagiannaki
        o_data = self.client.retrieve_object(self.container, self.object)
1946 86186593 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1947 96738a78 Sofia Papagiannaki
            cl = Pithos_Client(get_url(), token, account)
1948 86186593 Sofia Papagiannaki
            new_data = get_random_data()
1949 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1950 ad7e4bea Sofia Papagiannaki
                # test write access
1951 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.update_object,
1952 236b1575 Sofia Papagiannaki
                                             self.container, self.object, StringIO(new_data),
1953 86186593 Sofia Papagiannaki
                                             account=get_user())
1954 ad7e4bea Sofia Papagiannaki
                try:
1955 ad7e4bea Sofia Papagiannaki
                    # test read access
1956 236b1575 Sofia Papagiannaki
                    server_data = cl.retrieve_object(self.container, self.object, account=get_user())
1957 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(o_data, server_data[:len(o_data)])
1958 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(new_data, server_data[len(o_data):])
1959 ad7e4bea Sofia Papagiannaki
                    o_data = server_data
1960 ad7e4bea Sofia Papagiannaki
                except Fault, f:
1961 297513ba Antony Chazapis
                    self.failIf(f.status == 403)
1962 86186593 Sofia Papagiannaki
            else:
1963 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.update_object,
1964 236b1575 Sofia Papagiannaki
                                             self.container, self.object, StringIO(new_data),
1965 86186593 Sofia Papagiannaki
                                             account=get_user())
1966 8d964102 Sofia Papagiannaki
        #check inheritance
1967 236b1575 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.container, self.object)
1968 236b1575 Sofia Papagiannaki
        type = meta['content-type']
1969 236b1575 Sofia Papagiannaki
        derivatives = self.client.list_objects(self.container, prefix=self.object)
1970 236b1575 Sofia Papagiannaki
        #exclude the object
1971 236b1575 Sofia Papagiannaki
        del derivatives[derivatives.index(self.object)]
1972 236b1575 Sofia Papagiannaki
        for o in derivatives:
1973 236b1575 Sofia Papagiannaki
            for token, account in OTHER_ACCOUNTS.items():
1974 236b1575 Sofia Papagiannaki
                prefix = self.object if self.object.endswith('/') else self.object+'/'
1975 236b1575 Sofia Papagiannaki
                cl = Pithos_Client(get_url(), token, account)
1976 236b1575 Sofia Papagiannaki
                new_data = get_random_data()
1977 236b1575 Sofia Papagiannaki
                if (account in authorized or any) and \
1978 236b1575 Sofia Papagiannaki
                (type in self.dir_content_types) and \
1979 236b1575 Sofia Papagiannaki
                o.startswith(prefix):
1980 236b1575 Sofia Papagiannaki
                    # test write access
1981 236b1575 Sofia Papagiannaki
                    self.assert_not_raises_fault(403, cl.update_object,
1982 236b1575 Sofia Papagiannaki
                                                 self.container, o,
1983 236b1575 Sofia Papagiannaki
                                                 StringIO(new_data),
1984 236b1575 Sofia Papagiannaki
                                                 account=get_user())
1985 236b1575 Sofia Papagiannaki
                    try:
1986 236b1575 Sofia Papagiannaki
                        server_data = cl.retrieve_object(self.container, o, account=get_user())
1987 236b1575 Sofia Papagiannaki
                        self.assertEqual(new_data, server_data[-len(new_data):])
1988 236b1575 Sofia Papagiannaki
                    except Fault, f:
1989 236b1575 Sofia Papagiannaki
                        self.failIf(f.status == 403)
1990 236b1575 Sofia Papagiannaki
                else:
1991 236b1575 Sofia Papagiannaki
                    self.assert_raises_fault(403, cl.update_object,
1992 236b1575 Sofia Papagiannaki
                                                 self.container, o,
1993 236b1575 Sofia Papagiannaki
                                                 StringIO(new_data),
1994 236b1575 Sofia Papagiannaki
                                                 account=get_user())
1995 ad7e4bea Sofia Papagiannaki
    
1996 ad7e4bea Sofia Papagiannaki
    def test_group_read(self):
1997 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, ['%s:pithosdev' % get_user()])
1998 ad7e4bea Sofia Papagiannaki
        self.assert_read(authorized=self.authorized)
1999 ad7e4bea Sofia Papagiannaki
    
2000 ad7e4bea Sofia Papagiannaki
    def test_read_many(self):
2001 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, self.authorized)
2002 ad7e4bea Sofia Papagiannaki
        self.assert_read(authorized=self.authorized)
2003 ad7e4bea Sofia Papagiannaki
    
2004 ad7e4bea Sofia Papagiannaki
    def test_read_by_everyone(self):
2005 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, ['*'])
2006 ad7e4bea Sofia Papagiannaki
        self.assert_read(any=True)
2007 ad7e4bea Sofia Papagiannaki
    
2008 236b1575 Sofia Papagiannaki
    def test_read_directory(self):
2009 236b1575 Sofia Papagiannaki
        for type in self.dir_content_types:
2010 236b1575 Sofia Papagiannaki
            #change content type
2011 236b1575 Sofia Papagiannaki
            self.client.move_object(self.container, self.object, self.container, self.object, content_type=type)
2012 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, ['*'])
2013 236b1575 Sofia Papagiannaki
            self.assert_read(any=True)
2014 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, self.authorized)
2015 236b1575 Sofia Papagiannaki
            self.assert_read(authorized=self.authorized)
2016 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, ['%s:pithosdev' % get_user()])
2017 236b1575 Sofia Papagiannaki
            self.assert_read(authorized=self.authorized)
2018 236b1575 Sofia Papagiannaki
    
2019 ad7e4bea Sofia Papagiannaki
    def test_group_write(self):
2020 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, ['%s:pithosdev' % get_user()], read=False)
2021 236b1575 Sofia Papagiannaki
        self.assert_write(authorized=self.authorized)
2022 ad7e4bea Sofia Papagiannaki
    
2023 ad7e4bea Sofia Papagiannaki
    def test_write_many(self):
2024 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, self.authorized, read=False)
2025 236b1575 Sofia Papagiannaki
        self.assert_write(authorized=self.authorized)
2026 ad7e4bea Sofia Papagiannaki
    
2027 ad7e4bea Sofia Papagiannaki
    def test_write_by_everyone(self):
2028 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, ['*'], read=False)
2029 236b1575 Sofia Papagiannaki
        self.assert_write(any=True)
2030 236b1575 Sofia Papagiannaki
    
2031 236b1575 Sofia Papagiannaki
    def test_write_directory(self):
2032 236b1575 Sofia Papagiannaki
        dir_content_types = ('application/directory', 'application/foler')
2033 236b1575 Sofia Papagiannaki
        for type in dir_content_types:
2034 236b1575 Sofia Papagiannaki
            #change content type
2035 236b1575 Sofia Papagiannaki
            self.client.move_object(self.container, self.object, self.container, self.object, content_type='application/folder')
2036 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, ['*'], read=False)
2037 236b1575 Sofia Papagiannaki
            self.assert_write(any=True)
2038 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, self.authorized, read=False)
2039 236b1575 Sofia Papagiannaki
            self.assert_write(authorized=self.authorized)
2040 236b1575 Sofia Papagiannaki
            self.client.share_object(self.container, self.object, ['%s:pithosdev' % get_user()], read=False)
2041 236b1575 Sofia Papagiannaki
            self.assert_write(authorized=self.authorized)
2042 236b1575 Sofia Papagiannaki
    
2043 236b1575 Sofia Papagiannaki
    def test_shared_listing(self):
2044 236b1575 Sofia Papagiannaki
        self.client.share_object(self.container, self.object, self.authorized)
2045 236b1575 Sofia Papagiannaki
        
2046 236b1575 Sofia Papagiannaki
        my_shared_containers = self.client.list_containers(shared=True)
2047 236b1575 Sofia Papagiannaki
        self.assertEqual(['c'], my_shared_containers)
2048 236b1575 Sofia Papagiannaki
        my_shared_objects = self.client.list_objects('c', shared=True)
2049 236b1575 Sofia Papagiannaki
        self.assertEqual(['o'], my_shared_objects)
2050 236b1575 Sofia Papagiannaki
        
2051 236b1575 Sofia Papagiannaki
        dir_content_types = ('application/directory', 'application/foler')
2052 236b1575 Sofia Papagiannaki
        for type in dir_content_types:
2053 236b1575 Sofia Papagiannaki
            #change content type
2054 236b1575 Sofia Papagiannaki
            self.client.move_object(self.container, self.object, self.container, self.object, content_type='application/folder')
2055 236b1575 Sofia Papagiannaki
            my_shared_objects = self.client.list_objects('c', shared=True)
2056 236b1575 Sofia Papagiannaki
            self.assertEqual(['o', 'o/', 'o/a'], my_shared_objects)
2057 236b1575 Sofia Papagiannaki
        
2058 236b1575 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
2059 236b1575 Sofia Papagiannaki
            if account in self.authorized:
2060 236b1575 Sofia Papagiannaki
                self.other = Pithos_Client(get_url(), token, account)
2061 236b1575 Sofia Papagiannaki
                self.assertTrue(get_user() in self.other.list_shared_by_others())
2062 236b1575 Sofia Papagiannaki
    
2063 ad7e4bea Sofia Papagiannaki
class TestPublish(BaseTestCase):
2064 ad7e4bea Sofia Papagiannaki
    def test_publish(self):
2065 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
2066 ad7e4bea Sofia Papagiannaki
        o_data = self.upload_random_data('c', 'o')['data']
2067 ad7e4bea Sofia Papagiannaki
        self.client.publish_object('c', 'o')
2068 ad7e4bea Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('c', 'o')
2069 ad7e4bea Sofia Papagiannaki
        self.assertTrue('x-object-public' in meta)
2070 b5dc1bda Sofia Papagiannaki
        url = meta['x-object-public']
2071 96738a78 Sofia Papagiannaki
        
2072 96738a78 Sofia Papagiannaki
        p = urlparse(get_url())
2073 96738a78 Sofia Papagiannaki
        if p.scheme == 'http':
2074 96738a78 Sofia Papagiannaki
            conn = HTTPConnection(p.netloc)
2075 96738a78 Sofia Papagiannaki
        elif p.scheme == 'https':
2076 96738a78 Sofia Papagiannaki
            conn = HTTPSConnection(p.netloc)
2077 96738a78 Sofia Papagiannaki
        else:
2078 96738a78 Sofia Papagiannaki
            raise Exception('Unknown URL scheme')
2079 96738a78 Sofia Papagiannaki
        
2080 96738a78 Sofia Papagiannaki
        conn.request('GET', url)
2081 96738a78 Sofia Papagiannaki
        resp = conn.getresponse()
2082 96738a78 Sofia Papagiannaki
        length = resp.getheader('content-length', None)
2083 96738a78 Sofia Papagiannaki
        data = resp.read(length)
2084 ad7e4bea Sofia Papagiannaki
        self.assertEqual(o_data, data)
2085 952f4da1 Sofia Papagiannaki
2086 5a8dc30c Sofia Papagiannaki
class TestPolicies(BaseTestCase):
2087 5a8dc30c Sofia Papagiannaki
    def test_none_versioning(self):
2088 5a8dc30c Sofia Papagiannaki
        self.client.create_container('c', policies={'versioning':'none'})
2089 5a8dc30c Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
2090 5a8dc30c Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('c', 'o')
2091 5a8dc30c Sofia Papagiannaki
        v = meta['x-object-version']
2092 5a8dc30c Sofia Papagiannaki
        more_data = get_random_data()
2093 5a8dc30c Sofia Papagiannaki
        self.client.update_object('c', 'o', StringIO(more_data))
2094 5a8dc30c Sofia Papagiannaki
        vlist = self.client.retrieve_object_versionlist('c', 'o')
2095 5a8dc30c Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.retrieve_object_version,
2096 5a8dc30c Sofia Papagiannaki
                                 'c', 'o', v)
2097 5a8dc30c Sofia Papagiannaki
        data = self.client.retrieve_object('c', 'o')
2098 5a8dc30c Sofia Papagiannaki
        end = len(o['data'])
2099 5a8dc30c Sofia Papagiannaki
        self.assertEqual(data[:end], o['data'])
2100 5a8dc30c Sofia Papagiannaki
        self.assertEqual(data[end:], more_data)
2101 5a8dc30c Sofia Papagiannaki
    
2102 5a8dc30c Sofia Papagiannaki
    def test_quota(self):
2103 5a8dc30c Sofia Papagiannaki
        self.client.create_container('c', policies={'quota':'1'})
2104 5a8dc30c Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('c')
2105 5a8dc30c Sofia Papagiannaki
        self.assertEqual(meta['x-container-policy-quota'], '1')
2106 5a8dc30c Sofia Papagiannaki
        self.assert_raises_fault(413, self.upload_random_data, 'c', 'o',
2107 5a8dc30c Sofia Papagiannaki
                                 length=1024*1024+1)
2108 5a8dc30c Sofia Papagiannaki
    
2109 5a8dc30c Sofia Papagiannaki
    def test_quota_none(self):
2110 5a8dc30c Sofia Papagiannaki
        self.client.create_container('c', policies={'quota':'0'})
2111 5a8dc30c Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('c')
2112 5a8dc30c Sofia Papagiannaki
        self.assertEqual(meta['x-container-policy-quota'], '0')
2113 5a8dc30c Sofia Papagiannaki
        self.assert_not_raises_fault(413, self.upload_random_data, 'c', 'o',
2114 5a8dc30c Sofia Papagiannaki
                                 length=1024*1024+1)
2115 5a8dc30c Sofia Papagiannaki
2116 95e0d8ee Sofia Papagiannaki
class AssertUUidInvariant(object):
2117 95e0d8ee Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
2118 95e0d8ee Sofia Papagiannaki
        self.callable = callable
2119 95e0d8ee Sofia Papagiannaki
        self.args = args
2120 95e0d8ee Sofia Papagiannaki
        self.kwargs = kwargs
2121 95e0d8ee Sofia Papagiannaki
    
2122 95e0d8ee Sofia Papagiannaki
    def __enter__(self):
2123 95e0d8ee Sofia Papagiannaki
        self.map = self.callable(*self.args, **self.kwargs)
2124 95e0d8ee Sofia Papagiannaki
        assert('x-object-uuid' in self.map)
2125 95e0d8ee Sofia Papagiannaki
        self.uuid = self.map['x-object-uuid']
2126 95e0d8ee Sofia Papagiannaki
        return self.map
2127 95e0d8ee Sofia Papagiannaki
    
2128 95e0d8ee Sofia Papagiannaki
    def __exit__(self, type, value, tb):
2129 95e0d8ee Sofia Papagiannaki
        map = self.callable(*self.args, **self.kwargs)
2130 95e0d8ee Sofia Papagiannaki
        assert('x-object-uuid' in self.map)
2131 95e0d8ee Sofia Papagiannaki
        uuid = map['x-object-uuid']
2132 95e0d8ee Sofia Papagiannaki
        assert(uuid == self.uuid)
2133 95e0d8ee Sofia Papagiannaki
2134 23028d31 Sofia Papagiannaki
class AssertMappingInvariant(object):
2135 b09c9aaa Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
2136 b09c9aaa Sofia Papagiannaki
        self.callable = callable
2137 b09c9aaa Sofia Papagiannaki
        self.args = args
2138 b09c9aaa Sofia Papagiannaki
        self.kwargs = kwargs
2139 25c3841c Sofia Papagiannaki
    
2140 b09c9aaa Sofia Papagiannaki
    def __enter__(self):
2141 23028d31 Sofia Papagiannaki
        self.map = self.callable(*self.args, **self.kwargs)
2142 23028d31 Sofia Papagiannaki
        return self.map
2143 25c3841c Sofia Papagiannaki
    
2144 b09c9aaa Sofia Papagiannaki
    def __exit__(self, type, value, tb):
2145 23028d31 Sofia Papagiannaki
        map = self.callable(*self.args, **self.kwargs)
2146 95e0d8ee Sofia Papagiannaki
        for k, v in self.map.items():
2147 95e0d8ee Sofia Papagiannaki
            if is_date(v):
2148 23028d31 Sofia Papagiannaki
                continue
2149 f2a3d5a3 Antony Chazapis
            #print '#', k, v, map[k]
2150 95e0d8ee Sofia Papagiannaki
            assert(k in map)
2151 95e0d8ee Sofia Papagiannaki
            assert v == map[k]
2152 95e0d8ee Sofia Papagiannaki
    
2153 33ffca25 Sofia Papagiannaki
class AssertContentInvariant(object):
2154 33ffca25 Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
2155 33ffca25 Sofia Papagiannaki
        self.callable = callable
2156 33ffca25 Sofia Papagiannaki
        self.args = args
2157 33ffca25 Sofia Papagiannaki
        self.kwargs = kwargs
2158 25c3841c Sofia Papagiannaki
    
2159 33ffca25 Sofia Papagiannaki
    def __enter__(self):
2160 23028d31 Sofia Papagiannaki
        self.content = self.callable(*self.args, **self.kwargs)[2]
2161 33ffca25 Sofia Papagiannaki
        return self.content
2162 25c3841c Sofia Papagiannaki
    
2163 33ffca25 Sofia Papagiannaki
    def __exit__(self, type, value, tb):
2164 23028d31 Sofia Papagiannaki
        content = self.callable(*self.args, **self.kwargs)[2]
2165 33ffca25 Sofia Papagiannaki
        assert self.content == content
2166 33ffca25 Sofia Papagiannaki
2167 b09c9aaa Sofia Papagiannaki
def get_content_splitted(response):
2168 b09c9aaa Sofia Papagiannaki
    if response:
2169 b09c9aaa Sofia Papagiannaki
        return response.content.split('\n')
2170 b09c9aaa Sofia Papagiannaki
2171 d1e43d6f Sofia Papagiannaki
def compute_md5_hash(data):
2172 b09c9aaa Sofia Papagiannaki
    md5 = hashlib.md5()
2173 b09c9aaa Sofia Papagiannaki
    offset = 0
2174 b09c9aaa Sofia Papagiannaki
    md5.update(data)
2175 b09c9aaa Sofia Papagiannaki
    return md5.hexdigest().lower()
2176 b09c9aaa Sofia Papagiannaki
2177 33ffca25 Sofia Papagiannaki
def compute_block_hash(data, algorithm):
2178 33ffca25 Sofia Papagiannaki
    h = hashlib.new(algorithm)
2179 d1e43d6f Sofia Papagiannaki
    h.update(data.rstrip('\x00'))
2180 d1e43d6f Sofia Papagiannaki
    return h.hexdigest()
2181 d1e43d6f Sofia Papagiannaki
2182 bd8a3026 Sofia Papagiannaki
def get_random_data(length=500):
2183 33ffca25 Sofia Papagiannaki
    char_set = string.ascii_uppercase + string.digits
2184 5a8dc30c Sofia Papagiannaki
    return ''.join(random.choice(char_set) for x in xrange(length))
2185 33ffca25 Sofia Papagiannaki
2186 23028d31 Sofia Papagiannaki
def is_date(date):
2187 23028d31 Sofia Papagiannaki
    MONTHS = 'jan feb mar apr may jun jul aug sep oct nov dec'.split()
2188 23028d31 Sofia Papagiannaki
    __D = r'(?P<day>\d{2})'
2189 23028d31 Sofia Papagiannaki
    __D2 = r'(?P<day>[ \d]\d)'
2190 23028d31 Sofia Papagiannaki
    __M = r'(?P<mon>\w{3})'
2191 23028d31 Sofia Papagiannaki
    __Y = r'(?P<year>\d{4})'
2192 23028d31 Sofia Papagiannaki
    __Y2 = r'(?P<year>\d{2})'
2193 23028d31 Sofia Papagiannaki
    __T = r'(?P<hour>\d{2}):(?P<min>\d{2}):(?P<sec>\d{2})'
2194 23028d31 Sofia Papagiannaki
    RFC1123_DATE = re.compile(r'^\w{3}, %s %s %s %s GMT$' % (__D, __M, __Y, __T))
2195 23028d31 Sofia Papagiannaki
    RFC850_DATE = re.compile(r'^\w{6,9}, %s-%s-%s %s GMT$' % (__D, __M, __Y2, __T))
2196 23028d31 Sofia Papagiannaki
    ASCTIME_DATE = re.compile(r'^\w{3} %s %s %s %s$' % (__M, __D2, __T, __Y))
2197 23028d31 Sofia Papagiannaki
    for regex in RFC1123_DATE, RFC850_DATE, ASCTIME_DATE:
2198 23028d31 Sofia Papagiannaki
        m = regex.match(date)
2199 23028d31 Sofia Papagiannaki
        if m is not None:
2200 23028d31 Sofia Papagiannaki
            return True
2201 23028d31 Sofia Papagiannaki
    return False
2202 23028d31 Sofia Papagiannaki
2203 b09c9aaa Sofia Papagiannaki
o_names = ['kate.jpg',
2204 b09c9aaa Sofia Papagiannaki
           'kate_beckinsale.jpg',
2205 b09c9aaa Sofia Papagiannaki
           'How To Win Friends And Influence People.pdf',
2206 b09c9aaa Sofia Papagiannaki
           'moms_birthday.jpg',
2207 b09c9aaa Sofia Papagiannaki
           'poodle_strut.mov',
2208 b09c9aaa Sofia Papagiannaki
           'Disturbed - Down With The Sickness.mp3',
2209 b09c9aaa Sofia Papagiannaki
           'army_of_darkness.avi',
2210 b09c9aaa Sofia Papagiannaki
           'the_mad.avi',
2211 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/poodle.jpg',
2212 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/terrier.jpg',
2213 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/persian.jpg',
2214 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/siamese.jpg',
2215 b09c9aaa Sofia Papagiannaki
           'photos/plants/fern.jpg',
2216 b09c9aaa Sofia Papagiannaki
           'photos/plants/rose.jpg',
2217 0a425890 Antony Chazapis
           'photos/me.jpg']
2218 23028d31 Sofia Papagiannaki
2219 23028d31 Sofia Papagiannaki
if __name__ == "__main__":
2220 d7eb5499 Sofia Papagiannaki
    if get_user() == 'test':
2221 d7eb5499 Sofia Papagiannaki
        unittest.main()
2222 dc080673 Antony Chazapis
    else:
2223 dc080673 Antony Chazapis
        print 'Will not run tests as any other user except \'test\' (current user: %s).' % get_user()