Statistics
| Branch: | Tag: | Revision:

root / pithos / tools / pithos-test @ 3d13f97a

History | View | Annotate | Download (85.9 kB)

1 952f4da1 Sofia Papagiannaki
#!/usr/bin/env python
2 ae75584f Sofia Papagiannaki
#coding=utf8
3 ae75584f Sofia Papagiannaki
4 4288ade0 Sofia Papagiannaki
# Copyright 2011 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 5a96180b Antony Chazapis
from pithos.lib.util import get_user, get_auth, get_server, get_api
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 b5dc1bda Sofia Papagiannaki
45 e7b51248 Sofia Papagiannaki
import json
46 7812e1f9 Sofia Papagiannaki
import unittest
47 f0eacc2c Sofia Papagiannaki
import time as _time
48 b09c9aaa Sofia Papagiannaki
import types
49 b09c9aaa Sofia Papagiannaki
import hashlib
50 b09c9aaa Sofia Papagiannaki
import mimetypes
51 b09c9aaa Sofia Papagiannaki
import random
52 b09c9aaa Sofia Papagiannaki
import datetime
53 d1e43d6f Sofia Papagiannaki
import string
54 23028d31 Sofia Papagiannaki
import re
55 23028d31 Sofia Papagiannaki
56 b09c9aaa Sofia Papagiannaki
DATE_FORMATS = ["%a %b %d %H:%M:%S %Y",
57 b09c9aaa Sofia Papagiannaki
                "%A, %d-%b-%y %H:%M:%S GMT",
58 b09c9aaa Sofia Papagiannaki
                "%a, %d %b %Y %H:%M:%S GMT"]
59 b09c9aaa Sofia Papagiannaki
60 ae75584f Sofia Papagiannaki
OTHER_ACCOUNTS = {
61 ae75584f Sofia Papagiannaki
    '0001': 'verigak',
62 ae75584f Sofia Papagiannaki
    '0002': 'chazapis',
63 ae75584f Sofia Papagiannaki
    '0003': 'gtsouk',
64 ae75584f Sofia Papagiannaki
    '0004': 'papagian',
65 ae75584f Sofia Papagiannaki
    '0005': 'louridas',
66 ae75584f Sofia Papagiannaki
    '0006': 'chstath',
67 ae75584f Sofia Papagiannaki
    '0007': 'pkanavos',
68 e7b51248 Sofia Papagiannaki
    '0008': 'mvasilak',
69 95e92490 Sofia Papagiannaki
    '0009': 'διογένης'}
70 ae75584f Sofia Papagiannaki
71 23028d31 Sofia Papagiannaki
class BaseTestCase(unittest.TestCase):
72 b09c9aaa Sofia Papagiannaki
    #TODO unauthorized request
73 b09c9aaa Sofia Papagiannaki
    def setUp(self):
74 a5149fd0 Sofia Papagiannaki
        self.client = Pithos_Client(get_server(), get_auth(), get_user(),
75 a5149fd0 Sofia Papagiannaki
                                    get_api())
76 96bfb229 Sofia Papagiannaki
        self._clean_account()
77 a5149fd0 Sofia Papagiannaki
        self.invalid_client = Pithos_Client(get_server(), get_auth(), 'invalid',
78 a5149fd0 Sofia Papagiannaki
                                            get_api())
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 b09c9aaa Sofia Papagiannaki
        #perform move
1378 23028d31 Sofia Papagiannaki
        meta = {'test':'testcopy'}
1379 f7667baf Antony Chazapis
        src_path = '/'.join(('/', self.containers[0], self.obj['name']))
1380 23028d31 Sofia Papagiannaki
        status = self.client.move_object(self.containers[0], self.obj['name'],
1381 23028d31 Sofia Papagiannaki
                                         self.containers[0], 'testcopy',
1382 7812e1f9 Sofia Papagiannaki
                                         meta)[0]
1383 23028d31 Sofia Papagiannaki
        
1384 b09c9aaa Sofia Papagiannaki
        #assert successful move
1385 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 201)
1386 b09c9aaa Sofia Papagiannaki
        
1387 b09c9aaa Sofia Papagiannaki
        #assert updated metadata
1388 23028d31 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata(self.containers[0],
1389 23028d31 Sofia Papagiannaki
                                                    'testcopy',
1390 23028d31 Sofia Papagiannaki
                                                    restricted=True)
1391 23028d31 Sofia Papagiannaki
        self.assertTrue('test' in meta.keys())
1392 23028d31 Sofia Papagiannaki
        self.assertTrue(meta['test'], 'testcopy')
1393 b09c9aaa Sofia Papagiannaki
        
1394 b09c9aaa Sofia Papagiannaki
        #assert src object no more exists
1395 23028d31 Sofia Papagiannaki
        self.assert_object_not_exists(self.containers[0], self.obj['name'])
1396 b09c9aaa Sofia Papagiannaki
1397 d1e43d6f Sofia Papagiannaki
class ObjectPost(BaseTestCase):
1398 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1399 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1400 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1401 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1402 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1403 3078108a Sofia Papagiannaki
        self.obj = []
1404 3078108a Sofia Papagiannaki
        for i in range(2):
1405 3078108a Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.containers[0], o_names[i]))
1406 25c3841c Sofia Papagiannaki
    
1407 33ffca25 Sofia Papagiannaki
    def test_update_meta(self):
1408 b09c9aaa Sofia Papagiannaki
        #perform update metadata
1409 23028d31 Sofia Papagiannaki
        more = {'foo':'foo', 'bar':'bar'}
1410 23028d31 Sofia Papagiannaki
        status = self.client.update_object_metadata(self.containers[0],
1411 3078108a Sofia Papagiannaki
                                                    self.obj[0]['name'],
1412 23028d31 Sofia Papagiannaki
                                                    **more)[0]
1413 b09c9aaa Sofia Papagiannaki
        #assert request accepted
1414 23028d31 Sofia Papagiannaki
        self.assertEqual(status, 202)
1415 b09c9aaa Sofia Papagiannaki
        
1416 b09c9aaa Sofia Papagiannaki
        #assert old metadata are still there
1417 23028d31 Sofia Papagiannaki
        headers = self.client.retrieve_object_metadata(self.containers[0],
1418 3078108a Sofia Papagiannaki
                                                       self.obj[0]['name'],
1419 23028d31 Sofia Papagiannaki
                                                       restricted=True)
1420 b09c9aaa Sofia Papagiannaki
        #assert new metadata have been updated
1421 b09c9aaa Sofia Papagiannaki
        for k,v in more.items():
1422 23028d31 Sofia Papagiannaki
            self.assertTrue(k in headers.keys())
1423 23028d31 Sofia Papagiannaki
            self.assertTrue(headers[k], v)
1424 25c3841c Sofia Papagiannaki
    
1425 33ffca25 Sofia Papagiannaki
    def test_update_object(self,
1426 33ffca25 Sofia Papagiannaki
                           first_byte_pos=0,
1427 33ffca25 Sofia Papagiannaki
                           last_byte_pos=499,
1428 33ffca25 Sofia Papagiannaki
                           instance_length = True,
1429 33ffca25 Sofia Papagiannaki
                           content_length = 500):
1430 3078108a Sofia Papagiannaki
        l = len(self.obj[0]['data'])
1431 bd8a3026 Sofia Papagiannaki
        range = 'bytes %d-%d/%s' %(first_byte_pos,
1432 33ffca25 Sofia Papagiannaki
                                       last_byte_pos,
1433 3078108a Sofia Papagiannaki
                                        l if instance_length else '*')
1434 33ffca25 Sofia Papagiannaki
        partial = last_byte_pos - first_byte_pos + 1
1435 3078108a Sofia Papagiannaki
        length = first_byte_pos + partial
1436 33ffca25 Sofia Papagiannaki
        data = get_random_data(partial)
1437 25c3841c Sofia Papagiannaki
        args = {'content_type':'application/octet-stream',
1438 25c3841c Sofia Papagiannaki
                'content_range':'%s' %range}
1439 33ffca25 Sofia Papagiannaki
        if content_length:
1440 25c3841c Sofia Papagiannaki
            args['content_length'] = content_length
1441 cd6ada1d Sofia Papagiannaki
        
1442 3078108a Sofia Papagiannaki
        status = self.client.update_object(self.containers[0], self.obj[0]['name'],
1443 25c3841c Sofia Papagiannaki
                                  StringIO(data), **args)[0]
1444 33ffca25 Sofia Papagiannaki
        
1445 33ffca25 Sofia Papagiannaki
        if partial < 0 or (instance_length and l <= last_byte_pos):
1446 23028d31 Sofia Papagiannaki
            self.assertEqual(status, 202)    
1447 33ffca25 Sofia Papagiannaki
        else:
1448 25c3841c Sofia Papagiannaki
            self.assertEqual(status, 204)           
1449 33ffca25 Sofia Papagiannaki
            #check modified object
1450 25c3841c Sofia Papagiannaki
            content = self.client.retrieve_object(self.containers[0],
1451 3078108a Sofia Papagiannaki
                                              self.obj[0]['name'])
1452 3078108a Sofia Papagiannaki
            self.assertEqual(content[:first_byte_pos], self.obj[0]['data'][:first_byte_pos])
1453 3078108a Sofia Papagiannaki
            self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1454 3078108a Sofia Papagiannaki
            self.assertEqual(content[last_byte_pos+1:], self.obj[0]['data'][last_byte_pos+1:])
1455 3078108a Sofia Papagiannaki
    
1456 3078108a Sofia Papagiannaki
    def test_update_object_lt_blocksize(self):
1457 3078108a Sofia Papagiannaki
        self.test_update_object(10, 20, content_length=None)
1458 3078108a Sofia Papagiannaki
    
1459 3078108a Sofia Papagiannaki
    def test_update_object_gt_blocksize(self):
1460 3078108a Sofia Papagiannaki
        o = self.upload_random_data(self.containers[0], o_names[1],
1461 3078108a Sofia Papagiannaki
                                length=4*1024*1024+5)
1462 3078108a Sofia Papagiannaki
        c = self.containers[0]
1463 3078108a Sofia Papagiannaki
        o_name = o['name']
1464 3078108a Sofia Papagiannaki
        o_data = o['data']
1465 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024+1
1466 3078108a Sofia Papagiannaki
        last_byte_pos = 4*1024*1024+4
1467 3078108a Sofia Papagiannaki
        l = last_byte_pos - first_byte_pos + 1
1468 3078108a Sofia Papagiannaki
        data = get_random_data(l)
1469 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1470 3078108a Sofia Papagiannaki
        self.client.update_object(c, o_name, StringIO(data), content_range=range)
1471 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, o_name)
1472 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], o_data[:first_byte_pos])
1473 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1474 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], o_data[last_byte_pos+1:])    
1475 3078108a Sofia Papagiannaki
    
1476 3078108a Sofia Papagiannaki
    def test_update_object_divided_by_blocksize(self):
1477 3078108a Sofia Papagiannaki
        o = self.upload_random_data(self.containers[0], o_names[1],
1478 3078108a Sofia Papagiannaki
                                length=4*1024*1024+5)
1479 3078108a Sofia Papagiannaki
        c = self.containers[0]
1480 3078108a Sofia Papagiannaki
        o_name = o['name']
1481 3078108a Sofia Papagiannaki
        o_data = o['data']
1482 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024
1483 3078108a Sofia Papagiannaki
        last_byte_pos = 5*1024*1024
1484 3078108a Sofia Papagiannaki
        l = last_byte_pos - first_byte_pos + 1
1485 3078108a Sofia Papagiannaki
        data = get_random_data(l)
1486 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1487 3078108a Sofia Papagiannaki
        self.client.update_object(c, o_name, StringIO(data), content_range=range)
1488 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, o_name)
1489 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], o_data[:first_byte_pos])
1490 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], data)
1491 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], o_data[last_byte_pos+1:])    
1492 25c3841c Sofia Papagiannaki
    
1493 33ffca25 Sofia Papagiannaki
    def test_update_object_no_content_length(self):
1494 33ffca25 Sofia Papagiannaki
        self.test_update_object(content_length = None)
1495 25c3841c Sofia Papagiannaki
    
1496 25c3841c Sofia Papagiannaki
    def test_update_object_invalid_content_length(self):
1497 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1498 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1499 25c3841c Sofia Papagiannaki
            self.assert_raises_fault(400, self.test_update_object,
1500 25c3841c Sofia Papagiannaki
                                     content_length = 1000)
1501 25c3841c Sofia Papagiannaki
    
1502 68229c3e Sofia Papagiannaki
    def _test_update_object_invalid_range(self):
1503 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1504 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1505 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True)
1506 33ffca25 Sofia Papagiannaki
    
1507 68229c3e Sofia Papagiannaki
    def _test_update_object_invalid_range_and_length(self):
1508 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1509 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1510 0538cac6 Sofia Papagiannaki
            self.assert_raises_fault([400, 416], self.test_update_object, 499, 0, True,
1511 cd6ada1d Sofia Papagiannaki
                                     -1)
1512 33ffca25 Sofia Papagiannaki
    
1513 33ffca25 Sofia Papagiannaki
    def test_update_object_invalid_range_with_no_content_length(self):
1514 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1515 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1516 cd6ada1d Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 499, 0, True,
1517 cd6ada1d Sofia Papagiannaki
                                     content_length = None)
1518 33ffca25 Sofia Papagiannaki
    
1519 33ffca25 Sofia Papagiannaki
    def test_update_object_out_of_limits(self):    
1520 25c3841c Sofia Papagiannaki
        with AssertContentInvariant(self.client.retrieve_object,
1521 3078108a Sofia Papagiannaki
                                    self.containers[0], self.obj[0]['name']):
1522 3078108a Sofia Papagiannaki
            l = len(self.obj[0]['data'])
1523 23028d31 Sofia Papagiannaki
            self.assert_raises_fault(416, self.test_update_object, 0, l+1, True)
1524 25c3841c Sofia Papagiannaki
    
1525 33ffca25 Sofia Papagiannaki
    def test_append(self):
1526 33ffca25 Sofia Papagiannaki
        data = get_random_data(500)
1527 25c3841c Sofia Papagiannaki
        headers = {}
1528 3078108a Sofia Papagiannaki
        self.client.update_object(self.containers[0], self.obj[0]['name'],
1529 25c3841c Sofia Papagiannaki
                                  StringIO(data), content_length=500,
1530 25c3841c Sofia Papagiannaki
                                  content_type='application/octet-stream')
1531 33ffca25 Sofia Papagiannaki
        
1532 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1533 3078108a Sofia Papagiannaki
                                              self.obj[0]['name'])
1534 3078108a Sofia Papagiannaki
        self.assertEqual(len(content), len(self.obj[0]['data']) + 500)
1535 3078108a Sofia Papagiannaki
        self.assertEqual(content[:-500], self.obj[0]['data'])
1536 25c3841c Sofia Papagiannaki
    
1537 bd8a3026 Sofia Papagiannaki
    def test_update_with_chunked_transfer(self):
1538 25c3841c Sofia Papagiannaki
        data = get_random_data(500)
1539 25c3841c Sofia Papagiannaki
        dl = len(data)
1540 3078108a Sofia Papagiannaki
        fl = len(self.obj[0]['data'])
1541 bd8a3026 Sofia Papagiannaki
        
1542 25c3841c Sofia Papagiannaki
        self.client.update_object_using_chunks(self.containers[0],
1543 3078108a Sofia Papagiannaki
                                               self.obj[0]['name'],
1544 3078108a Sofia Papagiannaki
                                               StringIO(data),
1545 25c3841c Sofia Papagiannaki
                                               offset=0,
1546 25c3841c Sofia Papagiannaki
                                               content_type='application/octet-stream')
1547 bd8a3026 Sofia Papagiannaki
        
1548 bd8a3026 Sofia Papagiannaki
        #check modified object
1549 25c3841c Sofia Papagiannaki
        content = self.client.retrieve_object(self.containers[0],
1550 3078108a Sofia Papagiannaki
                                              self.obj[0]['name'])
1551 25c3841c Sofia Papagiannaki
        self.assertEqual(content[0:dl], data)
1552 3078108a Sofia Papagiannaki
        self.assertEqual(content[dl:fl], self.obj[0]['data'][dl:fl])
1553 a5149fd0 Sofia Papagiannaki
    
1554 a5149fd0 Sofia Papagiannaki
    def test_update_from_other_object(self):
1555 3078108a Sofia Papagiannaki
        c = self.containers[0]
1556 3078108a Sofia Papagiannaki
        src = o_names[0]
1557 3078108a Sofia Papagiannaki
        dest = 'object'
1558 3078108a Sofia Papagiannaki
        
1559 3078108a Sofia Papagiannaki
        source_data = self.client.retrieve_object(c, src)
1560 3078108a Sofia Papagiannaki
        source_meta = self.client.retrieve_object_metadata(c, src)
1561 fd9f505c Antony Chazapis
        source_hash = self.client.retrieve_object_hashmap(c, src)["hashes"]
1562 3078108a Sofia Papagiannaki
        
1563 3078108a Sofia Papagiannaki
        #update zero length object
1564 3078108a Sofia Papagiannaki
        self.client.create_zero_length_object(c, dest)
1565 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, src)
1566 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object)
1567 3078108a Sofia Papagiannaki
        dest_data = self.client.retrieve_object(c, src)
1568 3078108a Sofia Papagiannaki
        dest_meta = self.client.retrieve_object_metadata(c, dest)
1569 fd9f505c Antony Chazapis
        dest_hash = self.client.retrieve_object_hashmap(c, src)["hashes"]
1570 3078108a Sofia Papagiannaki
        self.assertEqual(source_data, dest_data)
1571 3078108a Sofia Papagiannaki
        self.assertEqual(source_hash, dest_hash)
1572 3078108a Sofia Papagiannaki
        
1573 3078108a Sofia Papagiannaki
        #test append
1574 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object)
1575 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1576 3078108a Sofia Papagiannaki
        self.assertEqual(source_data * 2, content)
1577 3078108a Sofia Papagiannaki
    
1578 3078108a Sofia Papagiannaki
    def test_update_range_from_other_object(self):
1579 3078108a Sofia Papagiannaki
        c = self.containers[0]
1580 3078108a Sofia Papagiannaki
        dest = 'object'
1581 3078108a Sofia Papagiannaki
        
1582 3078108a Sofia Papagiannaki
        #test update range
1583 3078108a Sofia Papagiannaki
        src = self.obj[1]['name']
1584 3078108a Sofia Papagiannaki
        src_data = self.client.retrieve_object(c, src)
1585 3078108a Sofia Papagiannaki
        
1586 3078108a Sofia Papagiannaki
        #update zero length object
1587 3078108a Sofia Papagiannaki
        prev_data = self.upload_random_data(c, dest, length=4*1024*1024+10)['data']
1588 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, src)
1589 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024+1
1590 3078108a Sofia Papagiannaki
        last_byte_pos = 4*1024*1024+4
1591 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1592 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object,
1593 3078108a Sofia Papagiannaki
                                             content_range=range)
1594 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1595 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], prev_data[:first_byte_pos])
1596 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], src_data[:last_byte_pos - first_byte_pos + 1])
1597 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], prev_data[last_byte_pos+1:])
1598 3078108a Sofia Papagiannaki
    
1599 3078108a Sofia Papagiannaki
    def test_update_hashes_from_other_object(self):
1600 3078108a Sofia Papagiannaki
        c = self.containers[0]
1601 3078108a Sofia Papagiannaki
        dest = 'object'
1602 3078108a Sofia Papagiannaki
        
1603 3078108a Sofia Papagiannaki
        #test update range
1604 3078108a Sofia Papagiannaki
        src_data = self.upload_random_data(c, o_names[0], length=1024*1024+10)['data']
1605 3078108a Sofia Papagiannaki
        
1606 3078108a Sofia Papagiannaki
        #update zero length object
1607 3078108a Sofia Papagiannaki
        prev_data = self.upload_random_data(c, dest, length=5*1024*1024+10)['data']
1608 3078108a Sofia Papagiannaki
        source_object = '/%s/%s' % (c, o_names[0])
1609 3078108a Sofia Papagiannaki
        first_byte_pos = 4*1024*1024
1610 3078108a Sofia Papagiannaki
        last_byte_pos = 5*1024*1024
1611 3078108a Sofia Papagiannaki
        range = 'bytes %d-%d/*' %(first_byte_pos, last_byte_pos)
1612 3078108a Sofia Papagiannaki
        self.client.update_from_other_source(c, dest, source_object,
1613 3078108a Sofia Papagiannaki
                                             content_range=range)
1614 3078108a Sofia Papagiannaki
        content = self.client.retrieve_object(c, dest)
1615 3078108a Sofia Papagiannaki
        self.assertEqual(content[:first_byte_pos], prev_data[:first_byte_pos])
1616 3078108a Sofia Papagiannaki
        self.assertEqual(content[first_byte_pos:last_byte_pos+1], src_data[:last_byte_pos - first_byte_pos + 1])
1617 3078108a Sofia Papagiannaki
        self.assertEqual(content[last_byte_pos+1:], prev_data[last_byte_pos+1:])
1618 3078108a Sofia Papagiannaki
    
1619 3078108a Sofia Papagiannaki
    
1620 3078108a Sofia Papagiannaki
    def test_update_zero_length_object(self):
1621 3078108a Sofia Papagiannaki
        c = self.containers[0]
1622 3078108a Sofia Papagiannaki
        o = 'object'
1623 3078108a Sofia Papagiannaki
        other = 'other'
1624 3078108a Sofia Papagiannaki
        zero = self.client.create_zero_length_object(c, o)
1625 a5149fd0 Sofia Papagiannaki
        
1626 3078108a Sofia Papagiannaki
        data = get_random_data()
1627 3078108a Sofia Papagiannaki
        self.client.update_object(c, o, StringIO(data))
1628 3078108a Sofia Papagiannaki
        self.client.create_object(c, other, StringIO(data))
1629 3078108a Sofia Papagiannaki
        
1630 3078108a Sofia Papagiannaki
        self.assertEqual(self.client.retrieve_object(c, o),
1631 3078108a Sofia Papagiannaki
                         self.client.retrieve_object(c, other))
1632 3078108a Sofia Papagiannaki
        
1633 fd9f505c Antony Chazapis
        self.assertEqual(self.client.retrieve_object_hashmap(c, o)["hashes"],
1634 fd9f505c Antony Chazapis
                         self.client.retrieve_object_hashmap(c, other)["hashes"])
1635 a5149fd0 Sofia Papagiannaki
    
1636 d1e43d6f Sofia Papagiannaki
class ObjectDelete(BaseTestCase):
1637 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1638 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1639 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1640 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1641 25c3841c Sofia Papagiannaki
            self.client.create_container(c)
1642 23028d31 Sofia Papagiannaki
        self.obj = self.upload_random_data(self.containers[0], o_names[0])
1643 25c3841c Sofia Papagiannaki
    
1644 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
1645 b09c9aaa Sofia Papagiannaki
        #perform delete object
1646 23028d31 Sofia Papagiannaki
        self.client.delete_object(self.containers[0], self.obj['name'])[0]
1647 25c3841c Sofia Papagiannaki
    
1648 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
1649 23028d31 Sofia Papagiannaki
        #assert item not found
1650 23028d31 Sofia Papagiannaki
        self.assert_raises_fault(404, self.client.delete_object, self.containers[1],
1651 23028d31 Sofia Papagiannaki
                                 self.obj['name'])
1652 b09c9aaa Sofia Papagiannaki
1653 ae75584f Sofia Papagiannaki
class ListSharing(BaseTestCase):
1654 ae75584f Sofia Papagiannaki
    def setUp(self):
1655 ae75584f Sofia Papagiannaki
        BaseTestCase.setUp(self)
1656 8d964102 Sofia Papagiannaki
        for i in range(2):
1657 8d964102 Sofia Papagiannaki
            self.client.create_container('c%s' %i)
1658 ae75584f Sofia Papagiannaki
        self.client.create_container('c')
1659 ae75584f Sofia Papagiannaki
        for i in range(2):
1660 8d964102 Sofia Papagiannaki
            self.upload_random_data('c1', 'o%s' %i)
1661 ae75584f Sofia Papagiannaki
        accounts = OTHER_ACCOUNTS.copy()
1662 ae75584f Sofia Papagiannaki
        self.o1_sharing_with = accounts.popitem()
1663 ae75584f Sofia Papagiannaki
        self.o1_sharing = [self.o1_sharing_with[1]]
1664 8d964102 Sofia Papagiannaki
        self.client.share_object('c1', 'o1', self.o1_sharing, read=True)
1665 ae75584f Sofia Papagiannaki
        
1666 ae75584f Sofia Papagiannaki
        l = []
1667 ae75584f Sofia Papagiannaki
        for i in range(2):
1668 ae75584f Sofia Papagiannaki
            l.append(accounts.popitem())
1669 ae75584f Sofia Papagiannaki
    
1670 8d964102 Sofia Papagiannaki
    def test_list_other_shared(self):
1671 a5149fd0 Sofia Papagiannaki
        self.other = Pithos_Client(get_server(),
1672 ae75584f Sofia Papagiannaki
                              self.o1_sharing_with[0],
1673 ae75584f Sofia Papagiannaki
                              self.o1_sharing_with[1],
1674 a5149fd0 Sofia Papagiannaki
                              get_api())
1675 a607181b Sofia Papagiannaki
        self.assertTrue(get_user() in self.other.list_shared_by_others())
1676 8d964102 Sofia Papagiannaki
    
1677 8d964102 Sofia Papagiannaki
    def test_list_my_shared(self):
1678 8d964102 Sofia Papagiannaki
        my_shared_containers = self.client.list_containers(shared=True)
1679 8d964102 Sofia Papagiannaki
        self.assertTrue('c1' in my_shared_containers)
1680 8d964102 Sofia Papagiannaki
        self.assertTrue('c2' not in my_shared_containers)
1681 8d964102 Sofia Papagiannaki
        
1682 8d964102 Sofia Papagiannaki
        my_shared_objects = self.client.list_objects('c1', shared=True)
1683 8d964102 Sofia Papagiannaki
        self.assertTrue('o1' in my_shared_objects)
1684 8d964102 Sofia Papagiannaki
        self.assertTrue('o2' not in my_shared_objects)
1685 8d964102 Sofia Papagiannaki
    
1686 ae75584f Sofia Papagiannaki
class TestGreek(BaseTestCase):
1687 3d13f97a Sofia Papagiannaki
    def tearDown(self):
1688 3d13f97a Sofia Papagiannaki
        pass
1689 3d13f97a Sofia Papagiannaki
    
1690 ae75584f Sofia Papagiannaki
    def test_create_container(self):
1691 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1692 ae75584f Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1693 e7b51248 Sofia Papagiannaki
        
1694 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' in self.client.list_containers())
1695 ae75584f Sofia Papagiannaki
    
1696 ae75584f Sofia Papagiannaki
    def test_create_object(self):
1697 ae75584f Sofia Papagiannaki
        self.client.create_container('φάκελος')
1698 ae75584f Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1699 ae75584f Sofia Papagiannaki
        
1700 ae75584f Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1701 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in self.client.list_objects('φάκελος'))
1702 ae75584f Sofia Papagiannaki
    
1703 ae75584f Sofia Papagiannaki
    def test_copy_object(self):
1704 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1705 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1706 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1707 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1708 ae75584f Sofia Papagiannaki
        
1709 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1710 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1711 ae75584f Sofia Papagiannaki
        
1712 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1713 e7b51248 Sofia Papagiannaki
        self.client.copy_object(src_container, src_object, dest_container,
1714 e7b51248 Sofia Papagiannaki
                                dest_object)
1715 e7b51248 Sofia Papagiannaki
        
1716 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(src_container, src_object)
1717 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1718 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1719 ae75584f Sofia Papagiannaki
    
1720 ae75584f Sofia Papagiannaki
    def test_move_object(self):
1721 e7b51248 Sofia Papagiannaki
        src_container = 'φάκελος'
1722 e7b51248 Sofia Papagiannaki
        src_object = 'αντικείμενο'
1723 e7b51248 Sofia Papagiannaki
        dest_container = 'αντίγραφα'
1724 e7b51248 Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
1725 ae75584f Sofia Papagiannaki
        
1726 e7b51248 Sofia Papagiannaki
        self.client.create_container(src_container)
1727 e7b51248 Sofia Papagiannaki
        self.upload_random_data(src_container, src_object)
1728 ae75584f Sofia Papagiannaki
        
1729 e7b51248 Sofia Papagiannaki
        self.client.create_container(dest_container)
1730 e7b51248 Sofia Papagiannaki
        self.client.move_object(src_container, src_object, dest_container,
1731 e7b51248 Sofia Papagiannaki
                                dest_object)
1732 e7b51248 Sofia Papagiannaki
        
1733 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists(src_container, src_object)
1734 e7b51248 Sofia Papagiannaki
        self.assert_object_exists(dest_container, dest_object)
1735 e7b51248 Sofia Papagiannaki
        self.assertTrue(dest_object in self.client.list_objects(dest_container))
1736 ae75584f Sofia Papagiannaki
    
1737 ae75584f Sofia Papagiannaki
    def test_delete_object(self):
1738 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1739 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο')
1740 e7b51248 Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'αντικείμενο')
1741 ae75584f Sofia Papagiannaki
    
1742 e7b51248 Sofia Papagiannaki
        self.client.delete_object('φάκελος', 'αντικείμενο')
1743 e7b51248 Sofia Papagiannaki
        self.assert_object_not_exists('φάκελος', 'αντικείμενο')
1744 e7b51248 Sofia Papagiannaki
        self.assertTrue('αντικείμενο' not in self.client.list_objects('φάκελος'))
1745 ae75584f Sofia Papagiannaki
    
1746 e7b51248 Sofia Papagiannaki
    def test_delete_container(self):
1747 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1748 e7b51248 Sofia Papagiannaki
        self.assert_container_exists('φάκελος')
1749 e7b51248 Sofia Papagiannaki
        
1750 e7b51248 Sofia Papagiannaki
        self.client.delete_container('φάκελος')
1751 e7b51248 Sofia Papagiannaki
        self.assert_container_not_exists('φάκελος')
1752 e7b51248 Sofia Papagiannaki
        self.assertTrue('φάκελος' not in self.client.list_containers())
1753 e7b51248 Sofia Papagiannaki
1754 ae75584f Sofia Papagiannaki
    def test_account_meta(self):
1755 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1756 e7b51248 Sofia Papagiannaki
        self.client.update_account_metadata(**meta)
1757 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_account_metadata(restricted=True)
1758 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1759 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1760 ae75584f Sofia Papagiannaki
    
1761 ae75584f Sofia Papagiannaki
    def test_container_meta(self):
1762 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1763 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος', **meta)
1764 e7b51248 Sofia Papagiannaki
        
1765 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_container_metadata('φάκελος', restricted=True)
1766 e7b51248 Sofia Papagiannaki
        self.assertTrue('ποιότητα' in meta.keys())
1767 e7b51248 Sofia Papagiannaki
        self.assertEqual(meta['ποιότητα'], 'ΑΑΑ')
1768 ae75584f Sofia Papagiannaki
    
1769 e7b51248 Sofia Papagiannaki
    def test_object_meta(self):
1770 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1771 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1772 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'αντικείμενο', **meta)
1773 e7b51248 Sofia Papagiannaki
        
1774 e7b51248 Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('φάκελος', 'αντικείμενο',
1775 e7b51248 Sofia Papagiannaki
                                                    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_list_meta_filtering(self):
1780 e7b51248 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1781 e7b51248 Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΑΑ'}
1782 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο1', **meta)
1783 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο2')
1784 e7b51248 Sofia Papagiannaki
        self.upload_random_data('φάκελος', 'ο3')
1785 e7b51248 Sofia Papagiannaki
        
1786 e7b51248 Sofia Papagiannaki
        meta = {'ποσότητα':'μεγάλη'}
1787 e7b51248 Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1788 e7b51248 Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα, ποσότητα')
1789 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1', 'ο2'])
1790 3d13f97a Sofia Papagiannaki
        
1791 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα')
1792 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο2', 'ο3'])
1793 3d13f97a Sofia Papagiannaki
        
1794 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα, !ποσότητα')
1795 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο3'])
1796 3d13f97a Sofia Papagiannaki
        
1797 3d13f97a Sofia Papagiannaki
        meta = {'ποιότητα':'ΑΒ'}
1798 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1799 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα==ΑΑΑ')
1800 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1'])
1801 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='ποιότητα!=ΑΑΑ')
1802 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο2'])
1803 3d13f97a Sofia Papagiannaki
        
1804 3d13f97a Sofia Papagiannaki
        meta = {'έτος':'2011'}
1805 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο3', **meta)
1806 3d13f97a Sofia Papagiannaki
        meta = {'έτος':'2012'}
1807 3d13f97a Sofia Papagiannaki
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1808 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<2012')
1809 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1'])
1810 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<=2012')
1811 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο1', 'ο2'])
1812 3d13f97a Sofia Papagiannaki
        objects = self.client.list_objects('φάκελος', meta='έτος<2012,έτος!=2012')
1813 3d13f97a Sofia Papagiannaki
        self.assertEquals(objects, ['ο2'])
1814 ae75584f Sofia Papagiannaki
    
1815 ae75584f Sofia Papagiannaki
    def test_groups(self):
1816 e7b51248 Sofia Papagiannaki
        #create a group
1817 95e92490 Sofia Papagiannaki
        groups = {'σεφς':'chazapis,διογένης'}
1818 e7b51248 Sofia Papagiannaki
        self.client.set_account_groups(**groups)
1819 e7b51248 Sofia Papagiannaki
        groups.update(self.initial_groups)
1820 e7b51248 Sofia Papagiannaki
        self.assertEqual(groups['σεφς'],
1821 e7b51248 Sofia Papagiannaki
                         self.client.retrieve_account_groups()['σεφς'])
1822 e7b51248 Sofia Papagiannaki
        
1823 95e92490 Sofia Papagiannaki
        #check read access
1824 95e92490 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1825 95e92490 Sofia Papagiannaki
        o = self.upload_random_data('φάκελος', 'ο1')
1826 a607181b Sofia Papagiannaki
        self.client.share_object('φάκελος', 'ο1', ['%s:σεφς' % get_user()])
1827 a5149fd0 Sofia Papagiannaki
        chef = Pithos_Client(get_server(),
1828 95e92490 Sofia Papagiannaki
                            '0009',
1829 95e92490 Sofia Papagiannaki
                            'διογένης',
1830 a5149fd0 Sofia Papagiannaki
                            get_api())
1831 297513ba Antony Chazapis
        self.assert_not_raises_fault(403, chef.retrieve_object_metadata,
1832 a5149fd0 Sofia Papagiannaki
                                     'φάκελος', 'ο1', account=get_user())
1833 95e92490 Sofia Papagiannaki
        
1834 95e92490 Sofia Papagiannaki
        #check write access
1835 95e92490 Sofia Papagiannaki
        self.client.share_object('φάκελος', 'ο1', ['διογένης'], read=False)
1836 95e92490 Sofia Papagiannaki
        new_data = get_random_data()
1837 297513ba Antony Chazapis
        self.assert_not_raises_fault(403, chef.update_object,
1838 95e92490 Sofia Papagiannaki
                                     'φάκελος', 'ο1', StringIO(new_data),
1839 a5149fd0 Sofia Papagiannaki
                                     account=get_user())
1840 95e92490 Sofia Papagiannaki
        
1841 95e92490 Sofia Papagiannaki
        server_data = self.client.retrieve_object('φάκελος', 'ο1')
1842 95e92490 Sofia Papagiannaki
        self.assertEqual(server_data[:len(o['data'])], o['data'])
1843 95e92490 Sofia Papagiannaki
        self.assertEqual(server_data[len(o['data']):], new_data)
1844 95e92490 Sofia Papagiannaki
    
1845 95e92490 Sofia Papagiannaki
    def test_manifestation(self):
1846 95e92490 Sofia Papagiannaki
        self.client.create_container('κουβάς')
1847 95e92490 Sofia Papagiannaki
        prefix = 'μέρη/'
1848 95e92490 Sofia Papagiannaki
        data = ''
1849 95e92490 Sofia Papagiannaki
        for i in range(5):
1850 95e92490 Sofia Papagiannaki
            part = '%s%d' %(prefix, i)
1851 95e92490 Sofia Papagiannaki
            o = self.upload_random_data('κουβάς', part)
1852 95e92490 Sofia Papagiannaki
            data += o['data']
1853 95e92490 Sofia Papagiannaki
        
1854 95e92490 Sofia Papagiannaki
        self.client.create_container('φάκελος')
1855 95e92490 Sofia Papagiannaki
        manifest = '%s/%s' %('κουβάς', prefix)
1856 95e92490 Sofia Papagiannaki
        self.client.create_manifestation('φάκελος', 'άπαντα', manifest)
1857 95e92490 Sofia Papagiannaki
        
1858 95e92490 Sofia Papagiannaki
        self.assert_object_exists('φάκελος', 'άπαντα')
1859 95e92490 Sofia Papagiannaki
        self.assertEqual(data, self.client.retrieve_object('φάκελος',
1860 95e92490 Sofia Papagiannaki
                                                           'άπαντα'))
1861 95e92490 Sofia Papagiannaki
        
1862 95e92490 Sofia Papagiannaki
        #wrong manifestation
1863 95e92490 Sofia Papagiannaki
        self.client.create_manifestation('φάκελος', 'άπαντα', 'κουβάς/άκυρο')
1864 95e92490 Sofia Papagiannaki
        self.assertEqual('', self.client.retrieve_object('φάκελος', 'άπαντα'))
1865 ae75584f Sofia Papagiannaki
    
1866 952f4da1 Sofia Papagiannaki
    def test_update_from_another_object(self):
1867 a5149fd0 Sofia Papagiannaki
        self.client.create_container('κουβάς')
1868 a5149fd0 Sofia Papagiannaki
        src_data = self.upload_random_data('κουβάς', 'πηγή')['data']
1869 a5149fd0 Sofia Papagiannaki
        initial_data = self.upload_random_data('κουβάς', 'νέο')['data']
1870 a5149fd0 Sofia Papagiannaki
        source_object = '/%s/%s' % ('κουβάς', 'πηγή')
1871 a5149fd0 Sofia Papagiannaki
        self.client.update_from_other_source('κουβάς', 'νέο', source_object)
1872 a5149fd0 Sofia Papagiannaki
        
1873 a5149fd0 Sofia Papagiannaki
        self.assertEqual(
1874 a5149fd0 Sofia Papagiannaki
            self.client.retrieve_object('κουβάς', 'νέο'),
1875 a5149fd0 Sofia Papagiannaki
            '%s%s' % (initial_data, self.client.retrieve_object('κουβάς', 'πηγή')))
1876 952f4da1 Sofia Papagiannaki
1877 95e92490 Sofia Papagiannaki
class TestPermissions(BaseTestCase):
1878 95e92490 Sofia Papagiannaki
    def setUp(self):
1879 95e92490 Sofia Papagiannaki
        BaseTestCase.setUp(self)
1880 95e92490 Sofia Papagiannaki
        
1881 95e92490 Sofia Papagiannaki
        #create a group
1882 ad7e4bea Sofia Papagiannaki
        self.authorized = ['chazapis', 'verigak', 'gtsouk']
1883 95e92490 Sofia Papagiannaki
        groups = {'pithosdev':','.join(self.authorized)}
1884 95e92490 Sofia Papagiannaki
        self.client.set_account_groups(**groups)
1885 95e92490 Sofia Papagiannaki
    
1886 ad7e4bea Sofia Papagiannaki
    def assert_read(self, authorized=[], any=False):
1887 95e92490 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1888 a5149fd0 Sofia Papagiannaki
            cl = Pithos_Client(get_server(), token, account, get_api()) 
1889 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1890 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.retrieve_object_metadata,
1891 a5149fd0 Sofia Papagiannaki
                                             'c', 'o', account=get_user())
1892 95e92490 Sofia Papagiannaki
            else:
1893 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.retrieve_object_metadata,
1894 a5149fd0 Sofia Papagiannaki
                                         'c', 'o', account=get_user())
1895 95e92490 Sofia Papagiannaki
        
1896 8d964102 Sofia Papagiannaki
        #check inheritance
1897 8d964102 Sofia Papagiannaki
        o = self.upload_random_data('c', 'o/also-shared')
1898 8d964102 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1899 8d964102 Sofia Papagiannaki
            cl = Pithos_Client(get_server(), token, account, get_api()) 
1900 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1901 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.retrieve_object_metadata,
1902 8d964102 Sofia Papagiannaki
                                             'c', 'o/also-shared', account=get_user())
1903 8d964102 Sofia Papagiannaki
            else:
1904 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.retrieve_object_metadata,
1905 8d964102 Sofia Papagiannaki
                                         'c', 'o/also-shared', account=get_user())
1906 ae75584f Sofia Papagiannaki
    
1907 ad7e4bea Sofia Papagiannaki
    def assert_write(self, o_data, authorized=[], any=False):
1908 86186593 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1909 86186593 Sofia Papagiannaki
            cl = Pithos_Client(get_server(), token, account, get_api()) 
1910 86186593 Sofia Papagiannaki
            new_data = get_random_data()
1911 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1912 ad7e4bea Sofia Papagiannaki
                # test write access
1913 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.update_object,
1914 86186593 Sofia Papagiannaki
                                             'c', 'o', StringIO(new_data),
1915 86186593 Sofia Papagiannaki
                                             account=get_user())
1916 ad7e4bea Sofia Papagiannaki
                try:
1917 ad7e4bea Sofia Papagiannaki
                    # test read access
1918 ad7e4bea Sofia Papagiannaki
                    server_data = cl.retrieve_object('c', 'o', account=get_user())
1919 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(o_data, server_data[:len(o_data)])
1920 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(new_data, server_data[len(o_data):])
1921 ad7e4bea Sofia Papagiannaki
                    o_data = server_data
1922 ad7e4bea Sofia Papagiannaki
                except Fault, f:
1923 297513ba Antony Chazapis
                    self.failIf(f.status == 403)
1924 86186593 Sofia Papagiannaki
            else:
1925 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.update_object,
1926 86186593 Sofia Papagiannaki
                                             'c', 'o', StringIO(new_data),
1927 86186593 Sofia Papagiannaki
                                             account=get_user())
1928 8d964102 Sofia Papagiannaki
        
1929 8d964102 Sofia Papagiannaki
        #check inheritance
1930 8d964102 Sofia Papagiannaki
        o = self.upload_random_data('c', 'o/also-shared')
1931 8d964102 Sofia Papagiannaki
        o_data = o['data']
1932 8d964102 Sofia Papagiannaki
        for token, account in OTHER_ACCOUNTS.items():
1933 8d964102 Sofia Papagiannaki
            cl = Pithos_Client(get_server(), token, account, get_api()) 
1934 8d964102 Sofia Papagiannaki
            new_data = get_random_data()
1935 ad7e4bea Sofia Papagiannaki
            if account in authorized or any:
1936 ad7e4bea Sofia Papagiannaki
                # test write access
1937 297513ba Antony Chazapis
                self.assert_not_raises_fault(403, cl.update_object,
1938 8d964102 Sofia Papagiannaki
                                             'c', o['name'],
1939 8d964102 Sofia Papagiannaki
                                             StringIO(new_data),
1940 8d964102 Sofia Papagiannaki
                                             account=get_user())
1941 ad7e4bea Sofia Papagiannaki
                try:
1942 ad7e4bea Sofia Papagiannaki
                    server_data = cl.retrieve_object('c', o['name'], account=get_user())
1943 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(o_data, server_data[:len(o_data)])
1944 ad7e4bea Sofia Papagiannaki
                    self.assertEqual(new_data, server_data[len(o_data):])
1945 ad7e4bea Sofia Papagiannaki
                    o_data = server_data
1946 ad7e4bea Sofia Papagiannaki
                except Fault, f:
1947 297513ba Antony Chazapis
                    self.failIf(f.status == 403)
1948 8d964102 Sofia Papagiannaki
            else:
1949 297513ba Antony Chazapis
                self.assert_raises_fault(403, cl.update_object,
1950 8d964102 Sofia Papagiannaki
                                             'c', o['name'],
1951 8d964102 Sofia Papagiannaki
                                             StringIO(new_data),
1952 8d964102 Sofia Papagiannaki
                                             account=get_user())
1953 ad7e4bea Sofia Papagiannaki
    
1954 ad7e4bea Sofia Papagiannaki
    def test_group_read(self):
1955 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1956 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1957 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', ['%s:pithosdev' % get_user()])
1958 ad7e4bea Sofia Papagiannaki
        self.assert_read(authorized=self.authorized)
1959 ad7e4bea Sofia Papagiannaki
    
1960 ad7e4bea Sofia Papagiannaki
    def test_read_many(self):
1961 ad7e4bea Sofia Papagiannaki
        #test read access
1962 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1963 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1964 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', self.authorized)
1965 ad7e4bea Sofia Papagiannaki
        self.assert_read(authorized=self.authorized)
1966 ad7e4bea Sofia Papagiannaki
    
1967 ad7e4bea Sofia Papagiannaki
    def test_read_by_everyone(self):
1968 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1969 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1970 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', ['*'])
1971 ad7e4bea Sofia Papagiannaki
        self.assert_read(any=True)
1972 ad7e4bea Sofia Papagiannaki
    
1973 ad7e4bea Sofia Papagiannaki
    def test_group_write(self):
1974 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1975 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1976 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', ['%s:pithosdev' % get_user()], read=False)
1977 ad7e4bea Sofia Papagiannaki
        self.assert_write(o['data'], authorized=self.authorized)
1978 ad7e4bea Sofia Papagiannaki
    
1979 ad7e4bea Sofia Papagiannaki
    def test_write_many(self):
1980 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1981 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1982 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', self.authorized, read=False)
1983 ad7e4bea Sofia Papagiannaki
        self.assert_write(o['data'], authorized=self.authorized)
1984 ad7e4bea Sofia Papagiannaki
    
1985 ad7e4bea Sofia Papagiannaki
    def test_write_by_everyone(self):
1986 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1987 ad7e4bea Sofia Papagiannaki
        o = self.upload_random_data('c', 'o')
1988 ad7e4bea Sofia Papagiannaki
        self.client.share_object('c', 'o', ['*'], read=False)
1989 ad7e4bea Sofia Papagiannaki
        o_data = o['data']
1990 ad7e4bea Sofia Papagiannaki
        self.assert_write(o['data'], any=True)
1991 ad7e4bea Sofia Papagiannaki
1992 ad7e4bea Sofia Papagiannaki
class TestPublish(BaseTestCase):
1993 ad7e4bea Sofia Papagiannaki
    def test_publish(self):
1994 ad7e4bea Sofia Papagiannaki
        self.client.create_container('c')
1995 ad7e4bea Sofia Papagiannaki
        o_data = self.upload_random_data('c', 'o')['data']
1996 ad7e4bea Sofia Papagiannaki
        self.client.publish_object('c', 'o')
1997 ad7e4bea Sofia Papagiannaki
        meta = self.client.retrieve_object_metadata('c', 'o')
1998 ad7e4bea Sofia Papagiannaki
        self.assertTrue('x-object-public' in meta)
1999 b5dc1bda Sofia Papagiannaki
        url = meta['x-object-public']
2000 ad7e4bea Sofia Papagiannaki
        public_client = Pithos_Client(get_server(), get_auth(), get_user(), api='')
2001 ad7e4bea Sofia Papagiannaki
        data = public_client.get(url)[2]
2002 ad7e4bea Sofia Papagiannaki
        self.assertEqual(o_data, data)
2003 952f4da1 Sofia Papagiannaki
2004 23028d31 Sofia Papagiannaki
class AssertMappingInvariant(object):
2005 b09c9aaa Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
2006 b09c9aaa Sofia Papagiannaki
        self.callable = callable
2007 b09c9aaa Sofia Papagiannaki
        self.args = args
2008 b09c9aaa Sofia Papagiannaki
        self.kwargs = kwargs
2009 25c3841c Sofia Papagiannaki
    
2010 b09c9aaa Sofia Papagiannaki
    def __enter__(self):
2011 23028d31 Sofia Papagiannaki
        self.map = self.callable(*self.args, **self.kwargs)
2012 23028d31 Sofia Papagiannaki
        return self.map
2013 25c3841c Sofia Papagiannaki
    
2014 b09c9aaa Sofia Papagiannaki
    def __exit__(self, type, value, tb):
2015 23028d31 Sofia Papagiannaki
        map = self.callable(*self.args, **self.kwargs)
2016 23028d31 Sofia Papagiannaki
        for k in self.map.keys():
2017 cd6ada1d Sofia Papagiannaki
            if is_date(self.map[k]):
2018 23028d31 Sofia Papagiannaki
                continue
2019 23028d31 Sofia Papagiannaki
            assert map[k] == self.map[k]
2020 b09c9aaa Sofia Papagiannaki
2021 33ffca25 Sofia Papagiannaki
class AssertContentInvariant(object):
2022 33ffca25 Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
2023 33ffca25 Sofia Papagiannaki
        self.callable = callable
2024 33ffca25 Sofia Papagiannaki
        self.args = args
2025 33ffca25 Sofia Papagiannaki
        self.kwargs = kwargs
2026 25c3841c Sofia Papagiannaki
    
2027 33ffca25 Sofia Papagiannaki
    def __enter__(self):
2028 23028d31 Sofia Papagiannaki
        self.content = self.callable(*self.args, **self.kwargs)[2]
2029 33ffca25 Sofia Papagiannaki
        return self.content
2030 25c3841c Sofia Papagiannaki
    
2031 33ffca25 Sofia Papagiannaki
    def __exit__(self, type, value, tb):
2032 23028d31 Sofia Papagiannaki
        content = self.callable(*self.args, **self.kwargs)[2]
2033 33ffca25 Sofia Papagiannaki
        assert self.content == content
2034 33ffca25 Sofia Papagiannaki
2035 b09c9aaa Sofia Papagiannaki
def get_content_splitted(response):
2036 b09c9aaa Sofia Papagiannaki
    if response:
2037 b09c9aaa Sofia Papagiannaki
        return response.content.split('\n')
2038 b09c9aaa Sofia Papagiannaki
2039 d1e43d6f Sofia Papagiannaki
def compute_md5_hash(data):
2040 b09c9aaa Sofia Papagiannaki
    md5 = hashlib.md5()
2041 b09c9aaa Sofia Papagiannaki
    offset = 0
2042 b09c9aaa Sofia Papagiannaki
    md5.update(data)
2043 b09c9aaa Sofia Papagiannaki
    return md5.hexdigest().lower()
2044 b09c9aaa Sofia Papagiannaki
2045 33ffca25 Sofia Papagiannaki
def compute_block_hash(data, algorithm):
2046 33ffca25 Sofia Papagiannaki
    h = hashlib.new(algorithm)
2047 d1e43d6f Sofia Papagiannaki
    h.update(data.rstrip('\x00'))
2048 d1e43d6f Sofia Papagiannaki
    return h.hexdigest()
2049 d1e43d6f Sofia Papagiannaki
2050 bd8a3026 Sofia Papagiannaki
def get_random_data(length=500):
2051 33ffca25 Sofia Papagiannaki
    char_set = string.ascii_uppercase + string.digits
2052 33ffca25 Sofia Papagiannaki
    return ''.join(random.choice(char_set) for x in range(length))
2053 33ffca25 Sofia Papagiannaki
2054 23028d31 Sofia Papagiannaki
def is_date(date):
2055 23028d31 Sofia Papagiannaki
    MONTHS = 'jan feb mar apr may jun jul aug sep oct nov dec'.split()
2056 23028d31 Sofia Papagiannaki
    __D = r'(?P<day>\d{2})'
2057 23028d31 Sofia Papagiannaki
    __D2 = r'(?P<day>[ \d]\d)'
2058 23028d31 Sofia Papagiannaki
    __M = r'(?P<mon>\w{3})'
2059 23028d31 Sofia Papagiannaki
    __Y = r'(?P<year>\d{4})'
2060 23028d31 Sofia Papagiannaki
    __Y2 = r'(?P<year>\d{2})'
2061 23028d31 Sofia Papagiannaki
    __T = r'(?P<hour>\d{2}):(?P<min>\d{2}):(?P<sec>\d{2})'
2062 23028d31 Sofia Papagiannaki
    RFC1123_DATE = re.compile(r'^\w{3}, %s %s %s %s GMT$' % (__D, __M, __Y, __T))
2063 23028d31 Sofia Papagiannaki
    RFC850_DATE = re.compile(r'^\w{6,9}, %s-%s-%s %s GMT$' % (__D, __M, __Y2, __T))
2064 23028d31 Sofia Papagiannaki
    ASCTIME_DATE = re.compile(r'^\w{3} %s %s %s %s$' % (__M, __D2, __T, __Y))
2065 23028d31 Sofia Papagiannaki
    for regex in RFC1123_DATE, RFC850_DATE, ASCTIME_DATE:
2066 23028d31 Sofia Papagiannaki
        m = regex.match(date)
2067 23028d31 Sofia Papagiannaki
        if m is not None:
2068 23028d31 Sofia Papagiannaki
            return True
2069 23028d31 Sofia Papagiannaki
    return False
2070 23028d31 Sofia Papagiannaki
2071 b09c9aaa Sofia Papagiannaki
o_names = ['kate.jpg',
2072 b09c9aaa Sofia Papagiannaki
           'kate_beckinsale.jpg',
2073 b09c9aaa Sofia Papagiannaki
           'How To Win Friends And Influence People.pdf',
2074 b09c9aaa Sofia Papagiannaki
           'moms_birthday.jpg',
2075 b09c9aaa Sofia Papagiannaki
           'poodle_strut.mov',
2076 b09c9aaa Sofia Papagiannaki
           'Disturbed - Down With The Sickness.mp3',
2077 b09c9aaa Sofia Papagiannaki
           'army_of_darkness.avi',
2078 b09c9aaa Sofia Papagiannaki
           'the_mad.avi',
2079 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/poodle.jpg',
2080 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/terrier.jpg',
2081 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/persian.jpg',
2082 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/siamese.jpg',
2083 b09c9aaa Sofia Papagiannaki
           'photos/plants/fern.jpg',
2084 b09c9aaa Sofia Papagiannaki
           'photos/plants/rose.jpg',
2085 0a425890 Antony Chazapis
           'photos/me.jpg']
2086 23028d31 Sofia Papagiannaki
2087 23028d31 Sofia Papagiannaki
if __name__ == "__main__":
2088 d7eb5499 Sofia Papagiannaki
    if get_user() == 'test':
2089 d7eb5499 Sofia Papagiannaki
        unittest.main()
2090 dc080673 Antony Chazapis
    else:
2091 dc080673 Antony Chazapis
        print 'Will not run tests as any other user except \'test\' (current user: %s).' % get_user()