Statistics
| Branch: | Tag: | Revision:

root / pithos / api / tests.py @ ae75584f

History | View | Annotate | Download (65.9 kB)

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