Statistics
| Branch: | Tag: | Revision:

root / pithos / api / tests.py @ 468b8b86

History | View | Annotate | Download (67.7 kB)

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