Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-tools / pithos / tools / test.py @ 9d4502a8

History | View | Annotate | Download (105.2 kB)

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