Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-tools / pithos / tools / test.py @ 6f6cec5a

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