Statistics
| Branch: | Tag: | Revision:

root / pithos / api / tests.py @ b09c9aaa

History | View | Annotate | Download (47.7 kB)

1 b09c9aaa Sofia Papagiannaki
from django.test.client import Client
2 b09c9aaa Sofia Papagiannaki
from django.test import TestCase
3 b09c9aaa Sofia Papagiannaki
from django.utils import simplejson as json
4 b09c9aaa Sofia Papagiannaki
from xml.dom import minidom
5 b09c9aaa Sofia Papagiannaki
import types
6 b09c9aaa Sofia Papagiannaki
import hashlib
7 b09c9aaa Sofia Papagiannaki
import os
8 b09c9aaa Sofia Papagiannaki
import mimetypes
9 b09c9aaa Sofia Papagiannaki
import random
10 b09c9aaa Sofia Papagiannaki
import datetime
11 b09c9aaa Sofia Papagiannaki
12 b09c9aaa Sofia Papagiannaki
DATE_FORMATS = ["%a %b %d %H:%M:%S %Y",
13 b09c9aaa Sofia Papagiannaki
                "%A, %d-%b-%y %H:%M:%S GMT",
14 b09c9aaa Sofia Papagiannaki
                "%a, %d %b %Y %H:%M:%S GMT"]
15 b09c9aaa Sofia Papagiannaki
16 b09c9aaa Sofia Papagiannaki
class AaiClient(Client):
17 b09c9aaa Sofia Papagiannaki
    def request(self, **request):
18 b09c9aaa Sofia Papagiannaki
        request['HTTP_X_AUTH_TOKEN'] = '46e427d657b20defe352804f0eb6f8a2'
19 b09c9aaa Sofia Papagiannaki
        return super(AaiClient, self).request(**request)
20 b09c9aaa Sofia Papagiannaki
21 b09c9aaa Sofia Papagiannaki
class BaseTestCase(TestCase):
22 b09c9aaa Sofia Papagiannaki
    #TODO unauthorized request
23 b09c9aaa Sofia Papagiannaki
    def setUp(self):
24 b09c9aaa Sofia Papagiannaki
        self.client = AaiClient()
25 b09c9aaa Sofia Papagiannaki
        self.headers = {
26 b09c9aaa Sofia Papagiannaki
            'account':(
27 b09c9aaa Sofia Papagiannaki
                'X-Account-Container-Count',
28 b09c9aaa Sofia Papagiannaki
                'X-Account-Bytes-Used',
29 b09c9aaa Sofia Papagiannaki
                'Last-Modified',
30 b09c9aaa Sofia Papagiannaki
                'Content-Length',
31 b09c9aaa Sofia Papagiannaki
                'Date',
32 b09c9aaa Sofia Papagiannaki
                'Content-Type',),
33 b09c9aaa Sofia Papagiannaki
            'container':(
34 b09c9aaa Sofia Papagiannaki
                'X-Container-Object-Count',
35 b09c9aaa Sofia Papagiannaki
                'X-Container-Bytes-Used',
36 b09c9aaa Sofia Papagiannaki
                'Content-Type',
37 b09c9aaa Sofia Papagiannaki
                'Last-Modified',
38 b09c9aaa Sofia Papagiannaki
                'Content-Length',
39 b09c9aaa Sofia Papagiannaki
                'Date',),
40 b09c9aaa Sofia Papagiannaki
            'object':(
41 b09c9aaa Sofia Papagiannaki
                'ETag',
42 b09c9aaa Sofia Papagiannaki
                'Content-Length',
43 b09c9aaa Sofia Papagiannaki
                'Content-Type',
44 b09c9aaa Sofia Papagiannaki
                'Content-Encoding',
45 b09c9aaa Sofia Papagiannaki
                'Last-Modified',
46 b09c9aaa Sofia Papagiannaki
                'Date',
47 b09c9aaa Sofia Papagiannaki
                'X-Object-Manifest',
48 b09c9aaa Sofia Papagiannaki
                'Content-Range',)}
49 b09c9aaa Sofia Papagiannaki
        self.contentTypes = {'xml':'application/xml',
50 b09c9aaa Sofia Papagiannaki
                             'json':'application/json',
51 b09c9aaa Sofia Papagiannaki
                             '':'text/plain'}
52 b09c9aaa Sofia Papagiannaki
        self.extended = {
53 b09c9aaa Sofia Papagiannaki
            'container':(
54 b09c9aaa Sofia Papagiannaki
                'name',
55 b09c9aaa Sofia Papagiannaki
                'count',
56 b09c9aaa Sofia Papagiannaki
                'bytes',
57 b09c9aaa Sofia Papagiannaki
                'last_modified'),
58 b09c9aaa Sofia Papagiannaki
            'object':(
59 b09c9aaa Sofia Papagiannaki
                'name',
60 b09c9aaa Sofia Papagiannaki
                'hash',
61 b09c9aaa Sofia Papagiannaki
                'bytes',
62 b09c9aaa Sofia Papagiannaki
                'content_type',
63 b09c9aaa Sofia Papagiannaki
                'content_encoding',
64 b09c9aaa Sofia Papagiannaki
                'last_modified',)}
65 b09c9aaa Sofia Papagiannaki
        self.return_codes = (400, 401, 404, 503,)
66 b09c9aaa Sofia Papagiannaki
    
67 b09c9aaa Sofia Papagiannaki
    def assertFault(self, response, status_code, name):
68 b09c9aaa Sofia Papagiannaki
        self.assertEqual(response.status_code, status_code)
69 b09c9aaa Sofia Papagiannaki
    
70 b09c9aaa Sofia Papagiannaki
    def assertBadRequest(self, response):
71 b09c9aaa Sofia Papagiannaki
        self.assertFault(response, 400, 'badRequest')
72 b09c9aaa Sofia Papagiannaki
    
73 b09c9aaa Sofia Papagiannaki
    def assertItemNotFound(self, response):
74 b09c9aaa Sofia Papagiannaki
        self.assertFault(response, 404, 'itemNotFound')
75 b09c9aaa Sofia Papagiannaki
76 b09c9aaa Sofia Papagiannaki
    def assertUnauthorized(self, response):
77 b09c9aaa Sofia Papagiannaki
        self.assertFault(response, 401, 'unauthorized')
78 b09c9aaa Sofia Papagiannaki
79 b09c9aaa Sofia Papagiannaki
    def assertServiceUnavailable(self, response):
80 b09c9aaa Sofia Papagiannaki
        self.assertFault(response, 503, 'serviceUnavailable')
81 b09c9aaa Sofia Papagiannaki
82 b09c9aaa Sofia Papagiannaki
    def assertNonEmpty(self, response):
83 b09c9aaa Sofia Papagiannaki
        self.assertFault(response, 409, 'nonEmpty')
84 b09c9aaa Sofia Papagiannaki
85 b09c9aaa Sofia Papagiannaki
    def assert_status(self, response, codes):
86 b09c9aaa Sofia Papagiannaki
        l = [elem for elem in self.return_codes]
87 b09c9aaa Sofia Papagiannaki
        if type(codes) == types.ListType:
88 b09c9aaa Sofia Papagiannaki
            l.extend(codes)
89 b09c9aaa Sofia Papagiannaki
        else:
90 b09c9aaa Sofia Papagiannaki
            l.append(codes)
91 b09c9aaa Sofia Papagiannaki
        self.assertTrue(response.status_code in l)
92 b09c9aaa Sofia Papagiannaki
93 b09c9aaa Sofia Papagiannaki
    def get_account_meta(self, account, exp_meta={}):
94 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s' % account
95 b09c9aaa Sofia Papagiannaki
        response = self.client.head(path)
96 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 204)
97 b09c9aaa Sofia Papagiannaki
        self.assert_headers(response, 'account', exp_meta)
98 b09c9aaa Sofia Papagiannaki
        return response
99 b09c9aaa Sofia Papagiannaki
100 b09c9aaa Sofia Papagiannaki
    def list_containers(self, account, limit=10000, marker='', format=''):
101 b09c9aaa Sofia Papagiannaki
        params = locals()
102 b09c9aaa Sofia Papagiannaki
        params.pop('self')
103 b09c9aaa Sofia Papagiannaki
        params.pop('account')
104 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s' % account
105 b09c9aaa Sofia Papagiannaki
        response = self.client.get(path, params)
106 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [200, 204])
107 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
108 b09c9aaa Sofia Papagiannaki
        if format:
109 b09c9aaa Sofia Papagiannaki
            self.assert_extended(response, format, 'container', limit)
110 b09c9aaa Sofia Papagiannaki
        else:
111 b09c9aaa Sofia Papagiannaki
            names = get_content_splitted(response)
112 b09c9aaa Sofia Papagiannaki
            self.assertTrue(len(names) <= limit)
113 b09c9aaa Sofia Papagiannaki
        return response
114 b09c9aaa Sofia Papagiannaki
115 b09c9aaa Sofia Papagiannaki
    def update_account_meta(self, account, **metadata):
116 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s' % account
117 b09c9aaa Sofia Papagiannaki
        response = self.client.post(path, **metadata)
118 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
119 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 202)
120 b09c9aaa Sofia Papagiannaki
        return response
121 b09c9aaa Sofia Papagiannaki
122 b09c9aaa Sofia Papagiannaki
    def get_container_meta(self, account, container, exp_meta={}):
123 b09c9aaa Sofia Papagiannaki
        params = locals()
124 b09c9aaa Sofia Papagiannaki
        params.pop('self')
125 b09c9aaa Sofia Papagiannaki
        params.pop('account')
126 b09c9aaa Sofia Papagiannaki
        params.pop('container')
127 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s' %(account, container)
128 b09c9aaa Sofia Papagiannaki
        response = self.client.head(path, params)
129 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
130 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 204)
131 b09c9aaa Sofia Papagiannaki
        if response.status_code == 204:
132 b09c9aaa Sofia Papagiannaki
            self.assert_headers(response, 'container', exp_meta)
133 b09c9aaa Sofia Papagiannaki
        return response
134 b09c9aaa Sofia Papagiannaki
135 b09c9aaa Sofia Papagiannaki
    def list_objects(self, account, container, limit=10000, marker='', prefix='', format='', path='', delimiter='', meta=''):
136 b09c9aaa Sofia Papagiannaki
        params = locals()
137 b09c9aaa Sofia Papagiannaki
        params.pop('self')
138 b09c9aaa Sofia Papagiannaki
        params.pop('account')
139 b09c9aaa Sofia Papagiannaki
        params.pop('container')
140 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s' % (account, container)
141 b09c9aaa Sofia Papagiannaki
        response = self.client.get(path, params)
142 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
143 b09c9aaa Sofia Papagiannaki
        if format:
144 b09c9aaa Sofia Papagiannaki
            self.assert_extended(response, format, 'object', limit)
145 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [200, 204])
146 b09c9aaa Sofia Papagiannaki
        return response
147 b09c9aaa Sofia Papagiannaki
148 b09c9aaa Sofia Papagiannaki
    def create_container(self, account, name, **meta):
149 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s' %(account, name)
150 b09c9aaa Sofia Papagiannaki
        response = self.client.put(path, **meta)
151 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
152 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [201, 202])
153 b09c9aaa Sofia Papagiannaki
        return response
154 b09c9aaa Sofia Papagiannaki
155 b09c9aaa Sofia Papagiannaki
    def update_container_meta(self, account, name, **meta):
156 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s' %(account, name)
157 b09c9aaa Sofia Papagiannaki
        response = self.client.post(path, data={}, content_type='text/xml', follow=False, **meta)
158 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
159 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 202)
160 b09c9aaa Sofia Papagiannaki
        return response
161 b09c9aaa Sofia Papagiannaki
162 b09c9aaa Sofia Papagiannaki
    def delete_container(self, account, container):
163 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s' %(account, container)
164 b09c9aaa Sofia Papagiannaki
        response = self.client.delete(path)
165 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
166 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [204, 409])
167 b09c9aaa Sofia Papagiannaki
        return response
168 b09c9aaa Sofia Papagiannaki
169 b09c9aaa Sofia Papagiannaki
    def get_object_meta(self, account, container, name):
170 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
171 b09c9aaa Sofia Papagiannaki
        response = self.client.head(path)
172 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
173 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 204)
174 b09c9aaa Sofia Papagiannaki
        return response
175 b09c9aaa Sofia Papagiannaki
176 b09c9aaa Sofia Papagiannaki
    def get_object(self, account, container, name, exp_meta={}, **headers):
177 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
178 b09c9aaa Sofia Papagiannaki
        response = self.client.get(path, **headers)
179 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
180 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [200, 206, 304, 412, 416])
181 b09c9aaa Sofia Papagiannaki
        if response.status_code in [200, 206]:
182 b09c9aaa Sofia Papagiannaki
            self.assert_headers(response, 'object')
183 b09c9aaa Sofia Papagiannaki
        return response
184 b09c9aaa Sofia Papagiannaki
185 b09c9aaa Sofia Papagiannaki
    def upload_object(self, account, container, name, data, content_type='application/json', **headers):
186 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
187 b09c9aaa Sofia Papagiannaki
        response = self.client.put(path, data, content_type, **headers)
188 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
189 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, [201, 411, 422])
190 b09c9aaa Sofia Papagiannaki
        if response.status_code == 201:
191 b09c9aaa Sofia Papagiannaki
            self.assertTrue(response['Etag'])
192 b09c9aaa Sofia Papagiannaki
        return response
193 b09c9aaa Sofia Papagiannaki
194 b09c9aaa Sofia Papagiannaki
    def copy_object(self, account, container, name, src, **headers):
195 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
196 b09c9aaa Sofia Papagiannaki
        headers['HTTP_X_COPY_FROM'] = src
197 b09c9aaa Sofia Papagiannaki
        response = self.client.put(path, **headers)
198 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
199 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 201)
200 b09c9aaa Sofia Papagiannaki
        return response
201 b09c9aaa Sofia Papagiannaki
202 b09c9aaa Sofia Papagiannaki
    def move_object(self, account, container, name, src, **headers):
203 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' % (account, container, name)
204 b09c9aaa Sofia Papagiannaki
        headers['HTTP_X_MOVE_FROM'] = src
205 b09c9aaa Sofia Papagiannaki
        response = self.client.put(path, **headers)
206 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
207 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 201)
208 b09c9aaa Sofia Papagiannaki
        return response
209 b09c9aaa Sofia Papagiannaki
210 b09c9aaa Sofia Papagiannaki
    def update_object_meta(self, account, container, name, **headers):
211 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
212 b09c9aaa Sofia Papagiannaki
        response = self.client.post(path, **headers)
213 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
214 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 202)
215 b09c9aaa Sofia Papagiannaki
        return response
216 b09c9aaa Sofia Papagiannaki
217 b09c9aaa Sofia Papagiannaki
    def delete_object(self, account, container, name):
218 b09c9aaa Sofia Papagiannaki
        path = '/v1/%s/%s/%s' %(account, container, name)
219 b09c9aaa Sofia Papagiannaki
        response = self.client.delete(path)
220 b09c9aaa Sofia Papagiannaki
        response.content = response.content.strip()
221 b09c9aaa Sofia Papagiannaki
        self.assert_status(response, 204)
222 b09c9aaa Sofia Papagiannaki
        return response
223 b09c9aaa Sofia Papagiannaki
224 b09c9aaa Sofia Papagiannaki
    def assert_headers(self, response, type, exp_meta={}):
225 b09c9aaa Sofia Papagiannaki
        entities = ['Account', 'Container', 'Container-Object', 'Object']
226 b09c9aaa Sofia Papagiannaki
        user_defined_meta = ['X-%s-Meta' %elem for elem in entities]
227 b09c9aaa Sofia Papagiannaki
        headers = [item for item in response._headers.values()]
228 b09c9aaa Sofia Papagiannaki
        system_headers = [h for h in headers if not h[0].startswith(tuple(user_defined_meta))]
229 b09c9aaa Sofia Papagiannaki
        for h in system_headers:
230 b09c9aaa Sofia Papagiannaki
            self.assertTrue(h[0] in self.headers[type])
231 b09c9aaa Sofia Papagiannaki
            if exp_meta:
232 b09c9aaa Sofia Papagiannaki
                self.assertEqual(h[1], exp_meta[h[0]])
233 b09c9aaa Sofia Papagiannaki
234 b09c9aaa Sofia Papagiannaki
    def assert_extended(self, response, format, type, size):
235 b09c9aaa Sofia Papagiannaki
        self.assertEqual(response['Content-Type'].find(self.contentTypes[format]), 0)
236 b09c9aaa Sofia Papagiannaki
        if format == 'xml':
237 b09c9aaa Sofia Papagiannaki
            self.assert_xml(response, type, size)
238 b09c9aaa Sofia Papagiannaki
        elif format == 'json':
239 b09c9aaa Sofia Papagiannaki
            self.assert_json(response, type, size)
240 b09c9aaa Sofia Papagiannaki
241 b09c9aaa Sofia Papagiannaki
    def assert_json(self, response, type, size):
242 b09c9aaa Sofia Papagiannaki
        convert = lambda s: s.lower()
243 b09c9aaa Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
244 b09c9aaa Sofia Papagiannaki
        data = json.loads(response.content)
245 b09c9aaa Sofia Papagiannaki
        self.assertTrue(len(data) <= size)
246 b09c9aaa Sofia Papagiannaki
        for item in info:
247 b09c9aaa Sofia Papagiannaki
            for i in data:
248 b09c9aaa Sofia Papagiannaki
                if 'subdir' in i.keys():
249 b09c9aaa Sofia Papagiannaki
                    continue
250 b09c9aaa Sofia Papagiannaki
                self.assertTrue(item in i.keys())
251 b09c9aaa Sofia Papagiannaki
252 b09c9aaa Sofia Papagiannaki
    def assert_xml(self, response, type, size):
253 b09c9aaa Sofia Papagiannaki
        convert = lambda s: s.lower()
254 b09c9aaa Sofia Papagiannaki
        info = [convert(elem) for elem in self.extended[type]]
255 b09c9aaa Sofia Papagiannaki
        try:
256 b09c9aaa Sofia Papagiannaki
            info.remove('content_encoding')
257 b09c9aaa Sofia Papagiannaki
        except ValueError:
258 b09c9aaa Sofia Papagiannaki
            pass
259 b09c9aaa Sofia Papagiannaki
        xml = minidom.parseString(response.content)
260 b09c9aaa Sofia Papagiannaki
        for item in info:
261 b09c9aaa Sofia Papagiannaki
            nodes = xml.getElementsByTagName(item)
262 b09c9aaa Sofia Papagiannaki
            self.assertTrue(nodes)
263 b09c9aaa Sofia Papagiannaki
            self.assertTrue(len(nodes) <= size)
264 b09c9aaa Sofia Papagiannaki
            
265 b09c9aaa Sofia Papagiannaki
266 b09c9aaa Sofia Papagiannaki
    def upload_os_file(self, account, container, fullpath, meta={}):
267 b09c9aaa Sofia Papagiannaki
        try:
268 b09c9aaa Sofia Papagiannaki
            f = open(fullpath, 'r')
269 b09c9aaa Sofia Papagiannaki
            data = f.read()
270 b09c9aaa Sofia Papagiannaki
            name = os.path.split(fullpath)[-1]
271 b09c9aaa Sofia Papagiannaki
            return self.upload_data(account, container, name, data)    
272 b09c9aaa Sofia Papagiannaki
        except IOError:
273 b09c9aaa Sofia Papagiannaki
            return
274 b09c9aaa Sofia Papagiannaki
275 b09c9aaa Sofia Papagiannaki
    def upload_random_data(self, account, container, name, length=1024, meta={}):
276 b09c9aaa Sofia Papagiannaki
        data = str(random.getrandbits(length))
277 b09c9aaa Sofia Papagiannaki
        return self.upload_data(account, container, name, data, meta)
278 b09c9aaa Sofia Papagiannaki
279 b09c9aaa Sofia Papagiannaki
    def upload_data(self, account, container, name, data, meta={}):
280 b09c9aaa Sofia Papagiannaki
        obj = {}
281 b09c9aaa Sofia Papagiannaki
        obj['name'] = name
282 b09c9aaa Sofia Papagiannaki
        try:
283 b09c9aaa Sofia Papagiannaki
            obj['data'] = data
284 b09c9aaa Sofia Papagiannaki
            obj['hash'] = compute_hash(obj['data'])
285 b09c9aaa Sofia Papagiannaki
            meta.update({'HTTP_X_OBJECT_META_TEST':'test1',
286 b09c9aaa Sofia Papagiannaki
                         'HTTP_ETAG':obj['hash']})
287 b09c9aaa Sofia Papagiannaki
            meta['HTTP_CONTENT_TYPE'], enc = mimetypes.guess_type(name)
288 b09c9aaa Sofia Papagiannaki
            if enc:
289 b09c9aaa Sofia Papagiannaki
                meta['HTTP_CONTENT_TYPE'] = enc
290 b09c9aaa Sofia Papagiannaki
            obj['meta'] = meta
291 b09c9aaa Sofia Papagiannaki
            r = self.upload_object(account,
292 b09c9aaa Sofia Papagiannaki
                               container,
293 b09c9aaa Sofia Papagiannaki
                               obj['name'],
294 b09c9aaa Sofia Papagiannaki
                               obj['data'],
295 b09c9aaa Sofia Papagiannaki
                               meta['HTTP_CONTENT_TYPE'],
296 b09c9aaa Sofia Papagiannaki
                               **meta)
297 b09c9aaa Sofia Papagiannaki
            if r.status_code == 201:
298 b09c9aaa Sofia Papagiannaki
                return obj
299 b09c9aaa Sofia Papagiannaki
        except IOError:
300 b09c9aaa Sofia Papagiannaki
            return
301 b09c9aaa Sofia Papagiannaki
302 b09c9aaa Sofia Papagiannaki
class ListContainers(BaseTestCase):
303 b09c9aaa Sofia Papagiannaki
    def setUp(self):
304 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
305 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
306 b09c9aaa Sofia Papagiannaki
        #create some containers
307 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
308 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
309 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, item)
310 b09c9aaa Sofia Papagiannaki
311 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
312 b09c9aaa Sofia Papagiannaki
        for c in get_content_splitted(self.list_containers(self.account)):
313 b09c9aaa Sofia Papagiannaki
            response = self.delete_container(self.account, c)
314 b09c9aaa Sofia Papagiannaki
315 b09c9aaa Sofia Papagiannaki
    def test_list(self):
316 b09c9aaa Sofia Papagiannaki
        #list containers
317 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account)
318 b09c9aaa Sofia Papagiannaki
        containers = get_content_splitted(response)
319 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers, containers)
320 b09c9aaa Sofia Papagiannaki
321 b09c9aaa Sofia Papagiannaki
    #def test_list_204(self):
322 b09c9aaa Sofia Papagiannaki
    #    response = self.list_containers('non-existing-account')
323 b09c9aaa Sofia Papagiannaki
    #    self.assertEqual(response.status_code, 204)
324 b09c9aaa Sofia Papagiannaki
325 b09c9aaa Sofia Papagiannaki
    def test_list_with_limit(self):
326 b09c9aaa Sofia Papagiannaki
        limit = 2
327 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account, limit=limit)
328 b09c9aaa Sofia Papagiannaki
        containers = get_content_splitted(response)
329 b09c9aaa Sofia Papagiannaki
        self.assertEquals(len(containers), limit)
330 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers[:2], containers)
331 b09c9aaa Sofia Papagiannaki
332 b09c9aaa Sofia Papagiannaki
    def test_list_with_marker(self):
333 b09c9aaa Sofia Papagiannaki
        limit = 2
334 b09c9aaa Sofia Papagiannaki
        marker = 'bananas'
335 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account, limit=limit, marker=marker)
336 b09c9aaa Sofia Papagiannaki
        containers =  get_content_splitted(response)
337 b09c9aaa Sofia Papagiannaki
        i = self.containers.index(marker) + 1
338 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+limit)], containers)
339 b09c9aaa Sofia Papagiannaki
        
340 b09c9aaa Sofia Papagiannaki
        marker = 'oranges'
341 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account, limit=limit, marker=marker)
342 b09c9aaa Sofia Papagiannaki
        containers = get_content_splitted(response)
343 b09c9aaa Sofia Papagiannaki
        i = self.containers.index(marker) + 1
344 b09c9aaa Sofia Papagiannaki
        self.assertEquals(self.containers[i:(i+limit)], containers)
345 b09c9aaa Sofia Papagiannaki
346 b09c9aaa Sofia Papagiannaki
    #def test_extended_list(self):
347 b09c9aaa Sofia Papagiannaki
    #    self.list_containers(self.account, limit=3, format='xml')
348 b09c9aaa Sofia Papagiannaki
    #    self.list_containers(self.account, limit=3, format='json')
349 b09c9aaa Sofia Papagiannaki
350 b09c9aaa Sofia Papagiannaki
    def test_list_json_with_marker(self):
351 b09c9aaa Sofia Papagiannaki
        limit = 2
352 b09c9aaa Sofia Papagiannaki
        marker = 'bananas'
353 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account, limit=limit, marker=marker, format='json')
354 b09c9aaa Sofia Papagiannaki
        containers = json.loads(response.content)
355 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'kiwis')
356 b09c9aaa Sofia Papagiannaki
        self.assertEqual(containers[1]['name'], 'oranges')
357 b09c9aaa Sofia Papagiannaki
358 b09c9aaa Sofia Papagiannaki
    def test_list_xml_with_marker(self):
359 b09c9aaa Sofia Papagiannaki
        limit = 2
360 b09c9aaa Sofia Papagiannaki
        marker = 'oranges'
361 b09c9aaa Sofia Papagiannaki
        response = self.list_containers(self.account, limit=limit, marker=marker, format='xml')
362 b09c9aaa Sofia Papagiannaki
        xml = minidom.parseString(response.content)
363 b09c9aaa Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
364 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(nodes), 1)
365 b09c9aaa Sofia Papagiannaki
        self.assertEqual(nodes[0].childNodes[0].data, 'pears')
366 b09c9aaa Sofia Papagiannaki
367 b09c9aaa Sofia Papagiannaki
class AccountMetadata(BaseTestCase):
368 b09c9aaa Sofia Papagiannaki
    def setUp(self):
369 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
370 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
371 b09c9aaa Sofia Papagiannaki
        self.containers = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
372 b09c9aaa Sofia Papagiannaki
        for item in self.containers:
373 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, item)
374 b09c9aaa Sofia Papagiannaki
375 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
376 b09c9aaa Sofia Papagiannaki
        for c in  get_content_splitted(self.list_containers(self.account)):
377 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
378 b09c9aaa Sofia Papagiannaki
379 b09c9aaa Sofia Papagiannaki
    def test_get_account_meta(self):
380 b09c9aaa Sofia Papagiannaki
        response = self.get_account_meta(self.account)
381 b09c9aaa Sofia Papagiannaki
        r2 = self.list_containers(self.account)
382 b09c9aaa Sofia Papagiannaki
        containers =  get_content_splitted(r2)
383 b09c9aaa Sofia Papagiannaki
        self.assertEqual(response['X-Account-Container-Count'], str(len(containers)))
384 b09c9aaa Sofia Papagiannaki
        size = 0
385 b09c9aaa Sofia Papagiannaki
        for c in containers:
386 b09c9aaa Sofia Papagiannaki
            r = self.get_container_meta(self.account, c)
387 b09c9aaa Sofia Papagiannaki
            size = size + int(r['X-Container-Bytes-Used'])
388 b09c9aaa Sofia Papagiannaki
        self.assertEqual(response['X-Account-Bytes-Used'], str(size))
389 b09c9aaa Sofia Papagiannaki
390 b09c9aaa Sofia Papagiannaki
    #def test_get_account_401(self):
391 b09c9aaa Sofia Papagiannaki
    #    response = self.get_account_meta('non-existing-account')
392 b09c9aaa Sofia Papagiannaki
    #    print response
393 b09c9aaa Sofia Papagiannaki
    #    self.assertEqual(response.status_code, 401)
394 b09c9aaa Sofia Papagiannaki
395 b09c9aaa Sofia Papagiannaki
    def test_update_meta(self):
396 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_ACCOUNT_META_TEST':'test', 'HTTP_X_ACCOUNT_META_TOST':'tost'}
397 b09c9aaa Sofia Papagiannaki
        response = self.update_account_meta(self.account, **meta)
398 b09c9aaa Sofia Papagiannaki
        response = self.get_account_meta(self.account)
399 b09c9aaa Sofia Papagiannaki
        for k,v in meta.items():
400 b09c9aaa Sofia Papagiannaki
            key = '-'.join(elem.capitalize() for elem in k.split('_')[1:])
401 b09c9aaa Sofia Papagiannaki
            self.assertTrue(response[key])
402 b09c9aaa Sofia Papagiannaki
            self.assertEqual(response[key], v)
403 b09c9aaa Sofia Papagiannaki
404 b09c9aaa Sofia Papagiannaki
    #def test_invalid_account_update_meta(self):
405 b09c9aaa Sofia Papagiannaki
    #    with AssertInvariant(self.get_account_meta, self.account):
406 b09c9aaa Sofia Papagiannaki
    #        meta = {'HTTP_X_ACCOUNT_META_TEST':'test', 'HTTP_X_ACCOUNT_META_TOST':'tost'}
407 b09c9aaa Sofia Papagiannaki
    #        response = self.update_account_meta('non-existing-account', **meta)
408 b09c9aaa Sofia Papagiannaki
409 b09c9aaa Sofia Papagiannaki
class ListObjects(BaseTestCase):
410 b09c9aaa Sofia Papagiannaki
    def setUp(self):
411 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
412 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
413 b09c9aaa Sofia Papagiannaki
        self.container = ['pears', 'apples']
414 b09c9aaa Sofia Papagiannaki
        for c in self.container:
415 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
416 b09c9aaa Sofia Papagiannaki
        self.obj = []
417 b09c9aaa Sofia Papagiannaki
        for o in o_names[:8]:
418 b09c9aaa Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.account,
419 b09c9aaa Sofia Papagiannaki
                                                    self.container[0],
420 b09c9aaa Sofia Papagiannaki
                                                    o))
421 b09c9aaa Sofia Papagiannaki
        for o in o_names[8:]:
422 b09c9aaa Sofia Papagiannaki
            self.obj.append(self.upload_random_data(self.account,
423 b09c9aaa Sofia Papagiannaki
                                                    self.container[1],
424 b09c9aaa Sofia Papagiannaki
                                                    o))
425 b09c9aaa Sofia Papagiannaki
426 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
427 b09c9aaa Sofia Papagiannaki
        for c in self.container:
428 b09c9aaa Sofia Papagiannaki
            self.delete_container_recursively(c)
429 b09c9aaa Sofia Papagiannaki
430 b09c9aaa Sofia Papagiannaki
    def delete_container_recursively(self, c):
431 b09c9aaa Sofia Papagiannaki
        for obj in get_content_splitted(self.list_objects(self.account, c)):
432 b09c9aaa Sofia Papagiannaki
            self.delete_object(self.account, c, obj)
433 b09c9aaa Sofia Papagiannaki
        self.delete_container(self.account, c)
434 b09c9aaa Sofia Papagiannaki
435 b09c9aaa Sofia Papagiannaki
    def test_list_objects(self):
436 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[0])
437 b09c9aaa Sofia Papagiannaki
        objects = get_content_splitted(response)
438 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
439 b09c9aaa Sofia Papagiannaki
        l.sort()
440 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l)
441 b09c9aaa Sofia Papagiannaki
442 b09c9aaa Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
443 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[0], limit=2)
444 b09c9aaa Sofia Papagiannaki
        objects = get_content_splitted(response)
445 b09c9aaa Sofia Papagiannaki
        l = [elem['name'] for elem in self.obj[:8]]
446 b09c9aaa Sofia Papagiannaki
        l.sort()
447 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects, l[:2])
448 b09c9aaa Sofia Papagiannaki
        
449 b09c9aaa Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
450 b09c9aaa Sofia Papagiannaki
                   'moms_birthday.jpg']
451 b09c9aaa Sofia Papagiannaki
        limit = 4
452 b09c9aaa Sofia Papagiannaki
        for m in markers:
453 b09c9aaa Sofia Papagiannaki
            response = self.list_objects(self.account, self.container[0], limit=limit, marker=m)
454 b09c9aaa Sofia Papagiannaki
            objects = get_content_splitted(response)
455 b09c9aaa Sofia Papagiannaki
            l = [elem['name'] for elem in self.obj[:8]]
456 b09c9aaa Sofia Papagiannaki
            l.sort()
457 b09c9aaa Sofia Papagiannaki
            start = l.index(m) + 1
458 b09c9aaa Sofia Papagiannaki
            end = start + limit
459 b09c9aaa Sofia Papagiannaki
            end = len(l) >= end and end or len(l)
460 b09c9aaa Sofia Papagiannaki
            self.assertEqual(objects, l[start:end])
461 b09c9aaa Sofia Papagiannaki
462 b09c9aaa Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
463 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[1], prefix='photos', delimiter='/')
464 b09c9aaa Sofia Papagiannaki
        objects = get_content_splitted(response)
465 b09c9aaa Sofia Papagiannaki
        self.assertEquals(['photos/animals/', 'photos/me.jpg', 'photos/plants/'], objects)
466 b09c9aaa Sofia Papagiannaki
        
467 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[1], prefix='photos/animals', delimiter='/')
468 b09c9aaa Sofia Papagiannaki
        objects = get_content_splitted(response)
469 b09c9aaa Sofia Papagiannaki
        self.assertEquals(['photos/animals/cats/', 'photos/animals/dogs/'], objects)
470 b09c9aaa Sofia Papagiannaki
        
471 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[1], path='photos')
472 b09c9aaa Sofia Papagiannaki
        objects = get_content_splitted(response)
473 b09c9aaa Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
474 b09c9aaa Sofia Papagiannaki
475 b09c9aaa Sofia Papagiannaki
    def test_extended_list_json(self):
476 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[1], format='json', limit=2, prefix='photos/animals', delimiter='/')
477 b09c9aaa Sofia Papagiannaki
        objects = json.loads(response.content)
478 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
479 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
480 b09c9aaa Sofia Papagiannaki
481 b09c9aaa Sofia Papagiannaki
    def test_extended_list_xml(self):
482 b09c9aaa Sofia Papagiannaki
        response = self.list_objects(self.account, self.container[1], format='xml', limit=4, prefix='photos', delimiter='/')
483 b09c9aaa Sofia Papagiannaki
        xml = minidom.parseString(response.content)
484 b09c9aaa Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
485 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
486 b09c9aaa Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
487 b09c9aaa Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
488 b09c9aaa Sofia Papagiannaki
        
489 b09c9aaa Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
490 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
491 b09c9aaa Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
492 b09c9aaa Sofia Papagiannaki
493 b09c9aaa Sofia Papagiannaki
    def test_list_using_meta(self):
494 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_OBJECT_META_QUALITY':'aaa'}
495 b09c9aaa Sofia Papagiannaki
        for o in self.obj[:2]:
496 b09c9aaa Sofia Papagiannaki
            r = self.update_object_meta(self.account,
497 b09c9aaa Sofia Papagiannaki
                                    self.container[0],
498 b09c9aaa Sofia Papagiannaki
                                    o['name'],
499 b09c9aaa Sofia Papagiannaki
                                    **meta)
500 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_OBJECT_META_STOCK':'true'}
501 b09c9aaa Sofia Papagiannaki
        for o in self.obj[3:5]:
502 b09c9aaa Sofia Papagiannaki
            r = self.update_object_meta(self.account,
503 b09c9aaa Sofia Papagiannaki
                                    self.container[0],
504 b09c9aaa Sofia Papagiannaki
                                    o['name'],
505 b09c9aaa Sofia Papagiannaki
                                    **meta)
506 b09c9aaa Sofia Papagiannaki
            
507 b09c9aaa Sofia Papagiannaki
        r = self.list_objects(self.account,
508 b09c9aaa Sofia Papagiannaki
                          self.container[0],
509 b09c9aaa Sofia Papagiannaki
                          meta='Quality')
510 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
511 b09c9aaa Sofia Papagiannaki
        obj = get_content_splitted(r)
512 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
513 b09c9aaa Sofia Papagiannaki
        
514 b09c9aaa Sofia Papagiannaki
        # test case insensitive
515 b09c9aaa Sofia Papagiannaki
        r = self.list_objects(self.account,
516 b09c9aaa Sofia Papagiannaki
                          self.container[0],
517 b09c9aaa Sofia Papagiannaki
                          meta='quality')
518 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
519 b09c9aaa Sofia Papagiannaki
        obj = get_content_splitted(r)
520 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
521 b09c9aaa Sofia Papagiannaki
        
522 b09c9aaa Sofia Papagiannaki
        # test multiple matches
523 b09c9aaa Sofia Papagiannaki
        r = self.list_objects(self.account,
524 b09c9aaa Sofia Papagiannaki
                          self.container[0],
525 b09c9aaa Sofia Papagiannaki
                          meta='Quality, Stock')
526 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
527 b09c9aaa Sofia Papagiannaki
        obj = get_content_splitted(r)
528 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 4)
529 b09c9aaa Sofia Papagiannaki
        
530 b09c9aaa Sofia Papagiannaki
        # test non 1-1 multiple match
531 b09c9aaa Sofia Papagiannaki
        r = self.list_objects(self.account,
532 b09c9aaa Sofia Papagiannaki
                          self.container[0],
533 b09c9aaa Sofia Papagiannaki
                          meta='Quality, aaaa')
534 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
535 b09c9aaa Sofia Papagiannaki
        obj = get_content_splitted(r)
536 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(obj), 2)
537 b09c9aaa Sofia Papagiannaki
        
538 b09c9aaa Sofia Papagiannaki
539 b09c9aaa Sofia Papagiannaki
class ContainerMeta(BaseTestCase):
540 b09c9aaa Sofia Papagiannaki
    def setUp(self):
541 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
542 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
543 b09c9aaa Sofia Papagiannaki
        self.container = 'apples'
544 b09c9aaa Sofia Papagiannaki
        self.create_container(self.account, self.container)
545 b09c9aaa Sofia Papagiannaki
546 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
547 b09c9aaa Sofia Papagiannaki
        for o in self.list_objects(self.account, self.container):
548 b09c9aaa Sofia Papagiannaki
            self.delete_object(self.account, self.container, o)
549 b09c9aaa Sofia Papagiannaki
        self.delete_container(self.account, self.container)
550 b09c9aaa Sofia Papagiannaki
    
551 b09c9aaa Sofia Papagiannaki
    def test_get_meta(self):
552 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_X_OBJECT_META_TRASH':'true'}
553 b09c9aaa Sofia Papagiannaki
        t1 = datetime.datetime.utcnow()
554 b09c9aaa Sofia Papagiannaki
        o = self.upload_random_data(self.account,
555 b09c9aaa Sofia Papagiannaki
                                self.container,
556 b09c9aaa Sofia Papagiannaki
                                'McIntosh.jpg',
557 b09c9aaa Sofia Papagiannaki
                                meta=headers)
558 b09c9aaa Sofia Papagiannaki
        if o:
559 b09c9aaa Sofia Papagiannaki
            r = self.get_container_meta(self.account,
560 b09c9aaa Sofia Papagiannaki
                                        self.container)
561 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r['X-Container-Object-Count'], '1')
562 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r['X-Container-Bytes-Used'], str(len(o['data'])))
563 b09c9aaa Sofia Papagiannaki
            t2 = datetime.datetime.strptime(r['Last-Modified'], DATE_FORMATS[2])
564 b09c9aaa Sofia Papagiannaki
            delta = (t2 - t1)
565 b09c9aaa Sofia Papagiannaki
            threashold = datetime.timedelta(seconds=1) 
566 b09c9aaa Sofia Papagiannaki
            self.assertTrue(delta < threashold)
567 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r['X-Container-Object-Meta'])
568 b09c9aaa Sofia Papagiannaki
            self.assertTrue('Trash' in r['X-Container-Object-Meta'])
569 b09c9aaa Sofia Papagiannaki
570 b09c9aaa Sofia Papagiannaki
    def test_update_meta(self):
571 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_CONTAINER_META_TEST':'test33', 'HTTP_X_CONTAINER_META_TOST':'tost22'}
572 b09c9aaa Sofia Papagiannaki
        response = self.update_container_meta(self.account, self.container, **meta)
573 b09c9aaa Sofia Papagiannaki
        response = self.get_container_meta(self.account, self.container)
574 b09c9aaa Sofia Papagiannaki
        for k,v in meta.items():
575 b09c9aaa Sofia Papagiannaki
            key = '-'.join(elem.capitalize() for elem in k.split('_')[1:])
576 b09c9aaa Sofia Papagiannaki
            self.assertTrue(response[key])
577 b09c9aaa Sofia Papagiannaki
            self.assertEqual(response[key], v)
578 b09c9aaa Sofia Papagiannaki
579 b09c9aaa Sofia Papagiannaki
class CreateContainer(BaseTestCase):
580 b09c9aaa Sofia Papagiannaki
    def setUp(self):
581 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
582 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
583 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
584 b09c9aaa Sofia Papagiannaki
585 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
586 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
587 b09c9aaa Sofia Papagiannaki
            r = self.delete_container(self.account, c)
588 b09c9aaa Sofia Papagiannaki
589 b09c9aaa Sofia Papagiannaki
    def test_create(self):
590 b09c9aaa Sofia Papagiannaki
        response = self.create_container(self.account, self.containers[0])
591 b09c9aaa Sofia Papagiannaki
        if response.status_code == 201:
592 b09c9aaa Sofia Papagiannaki
            response = self.list_containers(self.account)
593 b09c9aaa Sofia Papagiannaki
            self.assertTrue(self.containers[0] in get_content_splitted(response))
594 b09c9aaa Sofia Papagiannaki
            r = self.get_container_meta(self.account, self.containers[0])
595 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 204)
596 b09c9aaa Sofia Papagiannaki
597 b09c9aaa Sofia Papagiannaki
    def test_create_twice(self):
598 b09c9aaa Sofia Papagiannaki
        response = self.create_container(self.account, self.containers[0])
599 b09c9aaa Sofia Papagiannaki
        if response.status_code == 201:
600 b09c9aaa Sofia Papagiannaki
            self.assertTrue(self.create_container(self.account, self.containers[0]).status_code, 202)
601 b09c9aaa Sofia Papagiannaki
602 b09c9aaa Sofia Papagiannaki
class DeleteContainer(BaseTestCase):
603 b09c9aaa Sofia Papagiannaki
    def setUp(self):
604 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
605 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
606 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
607 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
608 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
609 b09c9aaa Sofia Papagiannaki
        self.upload_random_data(self.account,
610 b09c9aaa Sofia Papagiannaki
                                self.containers[1],
611 b09c9aaa Sofia Papagiannaki
                                'nice.jpg')
612 b09c9aaa Sofia Papagiannaki
613 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
614 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
615 b09c9aaa Sofia Papagiannaki
            for o in get_content_splitted(self.list_objects(self.account, c)):
616 b09c9aaa Sofia Papagiannaki
                self.delete_object(self.account, c, o)
617 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
618 b09c9aaa Sofia Papagiannaki
619 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
620 b09c9aaa Sofia Papagiannaki
        r = self.delete_container(self.account, self.containers[0])
621 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
622 b09c9aaa Sofia Papagiannaki
623 b09c9aaa Sofia Papagiannaki
    def test_delete_non_empty(self):
624 b09c9aaa Sofia Papagiannaki
        r = self.delete_container(self.account, self.containers[1])
625 b09c9aaa Sofia Papagiannaki
        self.assertNonEmpty(r)
626 b09c9aaa Sofia Papagiannaki
627 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
628 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(self.delete_container(self.account, 'c3'))
629 b09c9aaa Sofia Papagiannaki
630 b09c9aaa Sofia Papagiannaki
class GetObjects(BaseTestCase):
631 b09c9aaa Sofia Papagiannaki
    def setUp(self):
632 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
633 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
634 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
635 b09c9aaa Sofia Papagiannaki
        #create some containers
636 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
637 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
638 b09c9aaa Sofia Papagiannaki
        
639 b09c9aaa Sofia Papagiannaki
        #upload a file
640 b09c9aaa Sofia Papagiannaki
        self.objects = []
641 b09c9aaa Sofia Papagiannaki
        self.objects.append(self.upload_os_file(self.account,
642 b09c9aaa Sofia Papagiannaki
                            self.containers[1],
643 b09c9aaa Sofia Papagiannaki
                            './api/tests.py'))
644 b09c9aaa Sofia Papagiannaki
        self.objects.append(self.upload_os_file(self.account,
645 b09c9aaa Sofia Papagiannaki
                            self.containers[1],
646 b09c9aaa Sofia Papagiannaki
                            'settings.py'))
647 b09c9aaa Sofia Papagiannaki
648 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
649 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
650 b09c9aaa Sofia Papagiannaki
            for o in get_content_splitted(self.list_objects(self.account, c)):
651 b09c9aaa Sofia Papagiannaki
                self.delete_object(self.account, c, o)
652 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
653 b09c9aaa Sofia Papagiannaki
654 b09c9aaa Sofia Papagiannaki
    def test_get(self):
655 b09c9aaa Sofia Papagiannaki
        #perform get
656 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
657 b09c9aaa Sofia Papagiannaki
                            self.containers[1],
658 b09c9aaa Sofia Papagiannaki
                            self.objects[0]['name'],
659 b09c9aaa Sofia Papagiannaki
                            self.objects[0]['meta'])
660 b09c9aaa Sofia Papagiannaki
        #assert success
661 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
662 b09c9aaa Sofia Papagiannaki
663 b09c9aaa Sofia Papagiannaki
    def test_get_invalid(self):
664 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
665 b09c9aaa Sofia Papagiannaki
                            self.containers[0],
666 b09c9aaa Sofia Papagiannaki
                            self.objects[0]['name'])
667 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(r)
668 b09c9aaa Sofia Papagiannaki
669 b09c9aaa Sofia Papagiannaki
    def test_get_partial(self):
670 b09c9aaa Sofia Papagiannaki
        #perform get with range
671 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE':'bytes=0-499'}
672 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
673 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
674 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
675 b09c9aaa Sofia Papagiannaki
                        **headers)
676 b09c9aaa Sofia Papagiannaki
        
677 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
678 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 206)
679 b09c9aaa Sofia Papagiannaki
        
680 b09c9aaa Sofia Papagiannaki
        #assert content length
681 b09c9aaa Sofia Papagiannaki
        self.assertEqual(int(r['Content-Length']), 500)
682 b09c9aaa Sofia Papagiannaki
        
683 b09c9aaa Sofia Papagiannaki
        #assert content
684 b09c9aaa Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'][:500], r.content)
685 b09c9aaa Sofia Papagiannaki
686 b09c9aaa Sofia Papagiannaki
    def test_get_final_500(self):
687 b09c9aaa Sofia Papagiannaki
        #perform get with range
688 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE':'bytes=-500'}
689 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
690 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
691 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
692 b09c9aaa Sofia Papagiannaki
                        **headers)
693 b09c9aaa Sofia Papagiannaki
        
694 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
695 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 206)
696 b09c9aaa Sofia Papagiannaki
        
697 b09c9aaa Sofia Papagiannaki
        #assert content length
698 b09c9aaa Sofia Papagiannaki
        self.assertEqual(int(r['Content-Length']), 500)
699 b09c9aaa Sofia Papagiannaki
        
700 b09c9aaa Sofia Papagiannaki
        #assert content
701 b09c9aaa Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], r.content)
702 b09c9aaa Sofia Papagiannaki
703 b09c9aaa Sofia Papagiannaki
    def test_get_rest(self):
704 b09c9aaa Sofia Papagiannaki
        #perform get with range
705 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) - 500
706 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE':'bytes=%s-' %offset}
707 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
708 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
709 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
710 b09c9aaa Sofia Papagiannaki
                        **headers)
711 b09c9aaa Sofia Papagiannaki
        
712 b09c9aaa Sofia Papagiannaki
        #assert successful partial content
713 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 206)
714 b09c9aaa Sofia Papagiannaki
        
715 b09c9aaa Sofia Papagiannaki
        #assert content length
716 b09c9aaa Sofia Papagiannaki
        self.assertEqual(int(r['Content-Length']), 500)
717 b09c9aaa Sofia Papagiannaki
        
718 b09c9aaa Sofia Papagiannaki
        #assert content
719 b09c9aaa Sofia Papagiannaki
        self.assertTrue(self.objects[0]['data'][-500:], r.content)
720 b09c9aaa Sofia Papagiannaki
        
721 b09c9aaa Sofia Papagiannaki
    def test_get_range_not_satisfiable(self):
722 b09c9aaa Sofia Papagiannaki
        #perform get with range
723 b09c9aaa Sofia Papagiannaki
        offset = len(self.objects[0]['data']) + 1
724 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE':'bytes=0-%s' %offset}
725 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
726 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
727 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
728 b09c9aaa Sofia Papagiannaki
                        **headers)
729 b09c9aaa Sofia Papagiannaki
        
730 b09c9aaa Sofia Papagiannaki
        #assert Range Not Satisfiable
731 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 416)
732 b09c9aaa Sofia Papagiannaki
733 b09c9aaa Sofia Papagiannaki
    def test_multiple_range(self):
734 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
735 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '1000-']
736 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE' : 'bytes=%s' % ','.join(ranges)}
737 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
738 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
739 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
740 b09c9aaa Sofia Papagiannaki
                        **headers)
741 b09c9aaa Sofia Papagiannaki
        
742 b09c9aaa Sofia Papagiannaki
        # assert partial content
743 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 206)
744 b09c9aaa Sofia Papagiannaki
        
745 b09c9aaa Sofia Papagiannaki
        # assert Content-Type of the reply will be multipart/byteranges
746 b09c9aaa Sofia Papagiannaki
        self.assertTrue(r['Content-Type'])
747 b09c9aaa Sofia Papagiannaki
        content_type_parts = r['Content-Type'].split()
748 b09c9aaa Sofia Papagiannaki
        self.assertEqual(content_type_parts[0], ('multipart/byteranges;'))
749 b09c9aaa Sofia Papagiannaki
        
750 b09c9aaa Sofia Papagiannaki
        boundary = '--%s' %content_type_parts[1].split('=')[-1:][0]
751 b09c9aaa Sofia Papagiannaki
        cparts = r.content.split(boundary)[1:-1]
752 b09c9aaa Sofia Papagiannaki
        
753 b09c9aaa Sofia Papagiannaki
        # assert content parts are exactly 2
754 b09c9aaa Sofia Papagiannaki
        self.assertEqual(len(cparts), len(ranges))
755 b09c9aaa Sofia Papagiannaki
        
756 b09c9aaa Sofia Papagiannaki
        # for each content part assert headers
757 b09c9aaa Sofia Papagiannaki
        i = 0
758 b09c9aaa Sofia Papagiannaki
        for cpart in cparts:
759 b09c9aaa Sofia Papagiannaki
            content = cpart.split('\r\n')
760 b09c9aaa Sofia Papagiannaki
            headers = content[1:3]
761 b09c9aaa Sofia Papagiannaki
            content_range = headers[0].split(': ')
762 b09c9aaa Sofia Papagiannaki
            self.assertEqual(content_range[0], 'Content-Range')
763 b09c9aaa Sofia Papagiannaki
            
764 b09c9aaa Sofia Papagiannaki
            r = ranges[i].split('-')
765 b09c9aaa Sofia Papagiannaki
            if not r[0] and not r[1]:
766 b09c9aaa Sofia Papagiannaki
                pass
767 b09c9aaa Sofia Papagiannaki
            elif not r[0]:
768 b09c9aaa Sofia Papagiannaki
                start = len(self.objects[0]['data']) - int(r[1])
769 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
770 b09c9aaa Sofia Papagiannaki
            elif not r[1]:
771 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
772 b09c9aaa Sofia Papagiannaki
                end = len(self.objects[0]['data'])
773 b09c9aaa Sofia Papagiannaki
            else:
774 b09c9aaa Sofia Papagiannaki
                start = int(r[0])
775 b09c9aaa Sofia Papagiannaki
                end = int(r[1]) + 1
776 b09c9aaa Sofia Papagiannaki
            fdata = self.objects[0]['data'][start:end]
777 b09c9aaa Sofia Papagiannaki
            sdata = '\r\n'.join(content[4:-1])
778 b09c9aaa Sofia Papagiannaki
            self.assertEqual(len(fdata), len(sdata))
779 b09c9aaa Sofia Papagiannaki
            self.assertEquals(fdata, sdata)
780 b09c9aaa Sofia Papagiannaki
            i+=1
781 b09c9aaa Sofia Papagiannaki
782 b09c9aaa Sofia Papagiannaki
    def test_multiple_range_not_satisfiable(self):
783 b09c9aaa Sofia Papagiannaki
        #perform get with multiple range
784 b09c9aaa Sofia Papagiannaki
        out_of_range = len(self.objects[0]['data']) + 1
785 b09c9aaa Sofia Papagiannaki
        ranges = ['0-499', '-500', '%d-' %out_of_range]
786 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_RANGE' : 'bytes=%s' % ','.join(ranges)}
787 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
788 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
789 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
790 b09c9aaa Sofia Papagiannaki
                        **headers)
791 b09c9aaa Sofia Papagiannaki
        
792 b09c9aaa Sofia Papagiannaki
        # assert partial content
793 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 416)
794 b09c9aaa Sofia Papagiannaki
795 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match(self):
796 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
797 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_MATCH':self.objects[0]['hash']}
798 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
799 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
800 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
801 b09c9aaa Sofia Papagiannaki
                        **headers)
802 b09c9aaa Sofia Papagiannaki
        #assert get success
803 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
804 b09c9aaa Sofia Papagiannaki
        
805 b09c9aaa Sofia Papagiannaki
        #assert response content
806 b09c9aaa Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'].strip(), r.content.strip())
807 b09c9aaa Sofia Papagiannaki
808 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_match_star(self):
809 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match *
810 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_MATCH':'*'}
811 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
812 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
813 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
814 b09c9aaa Sofia Papagiannaki
                        **headers)
815 b09c9aaa Sofia Papagiannaki
        #assert get success
816 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
817 b09c9aaa Sofia Papagiannaki
        
818 b09c9aaa Sofia Papagiannaki
        #assert response content
819 b09c9aaa Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'].strip(), r.content.strip())
820 b09c9aaa Sofia Papagiannaki
821 b09c9aaa Sofia Papagiannaki
    def test_get_with_multiple_if_match(self):
822 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
823 b09c9aaa Sofia Papagiannaki
        etags = [i['hash'] for i in self.objects if i]
824 b09c9aaa Sofia Papagiannaki
        etags = ','.join('"%s"' % etag for etag in etags)
825 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_MATCH':etags}
826 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
827 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
828 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
829 b09c9aaa Sofia Papagiannaki
                        **headers)
830 b09c9aaa Sofia Papagiannaki
        #assert get success
831 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
832 b09c9aaa Sofia Papagiannaki
        
833 b09c9aaa Sofia Papagiannaki
        #assert response content
834 b09c9aaa Sofia Papagiannaki
        self.assertEqual(self.objects[0]['data'].strip(), r.content.strip())
835 b09c9aaa Sofia Papagiannaki
836 b09c9aaa Sofia Papagiannaki
    def test_if_match_precondition_failed(self):
837 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
838 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_MATCH':'123'}
839 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
840 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
841 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
842 b09c9aaa Sofia Papagiannaki
                        **headers)
843 b09c9aaa Sofia Papagiannaki
        
844 b09c9aaa Sofia Papagiannaki
        #assert precondition failed 
845 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 412)
846 b09c9aaa Sofia Papagiannaki
847 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
848 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
849 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_NONE_MATCH':'123'}
850 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
851 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
852 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
853 b09c9aaa Sofia Papagiannaki
                        **headers)
854 b09c9aaa Sofia Papagiannaki
        
855 b09c9aaa Sofia Papagiannaki
        #assert get success
856 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
857 b09c9aaa Sofia Papagiannaki
858 b09c9aaa Sofia Papagiannaki
    def test_if_none_match(self):
859 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match *
860 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_NONE_MATCH':'*'}
861 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
862 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
863 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
864 b09c9aaa Sofia Papagiannaki
                        **headers)
865 b09c9aaa Sofia Papagiannaki
        
866 b09c9aaa Sofia Papagiannaki
        #assert get success
867 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 304)
868 b09c9aaa Sofia Papagiannaki
        
869 b09c9aaa Sofia Papagiannaki
    def test_if_none_match_not_modified(self):
870 b09c9aaa Sofia Papagiannaki
        #perform get with If-Match
871 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_NONE_MATCH':'%s' %self.objects[0]['hash']}
872 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
873 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
874 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
875 b09c9aaa Sofia Papagiannaki
                        **headers)
876 b09c9aaa Sofia Papagiannaki
        
877 b09c9aaa Sofia Papagiannaki
        #assert not modified
878 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 304)
879 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r['ETag'], self.objects[0]['hash'])
880 b09c9aaa Sofia Papagiannaki
        
881 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_modified_since(self):
882 b09c9aaa Sofia Papagiannaki
        t = datetime.datetime.utcnow()
883 b09c9aaa Sofia Papagiannaki
        t2 = t - datetime.timedelta(minutes=10)
884 b09c9aaa Sofia Papagiannaki
        
885 b09c9aaa Sofia Papagiannaki
        #modify the object
886 b09c9aaa Sofia Papagiannaki
        self.upload_object(self.account,
887 b09c9aaa Sofia Papagiannaki
                           self.containers[1],
888 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['name'],
889 b09c9aaa Sofia Papagiannaki
                           self.objects[0]['data'][:200])
890 b09c9aaa Sofia Papagiannaki
        
891 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
892 b09c9aaa Sofia Papagiannaki
            past = t2.strftime(f)
893 b09c9aaa Sofia Papagiannaki
            
894 b09c9aaa Sofia Papagiannaki
            headers = {'HTTP_IF_MODIFIED_SINCE':'%s' %past}
895 b09c9aaa Sofia Papagiannaki
            r = self.get_object(self.account,
896 b09c9aaa Sofia Papagiannaki
                        self.containers[1],
897 b09c9aaa Sofia Papagiannaki
                        self.objects[0]['name'],
898 b09c9aaa Sofia Papagiannaki
                        **headers)
899 b09c9aaa Sofia Papagiannaki
            
900 b09c9aaa Sofia Papagiannaki
            #assert get success
901 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
902 b09c9aaa Sofia Papagiannaki
            
903 b09c9aaa Sofia Papagiannaki
    def test_get_modified_since_invalid_date(self):
904 b09c9aaa Sofia Papagiannaki
        headers = {'HTTP_IF_MODIFIED_SINCE':''}
905 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
906 b09c9aaa Sofia Papagiannaki
                    self.containers[1],
907 b09c9aaa Sofia Papagiannaki
                    self.objects[0]['name'],
908 b09c9aaa Sofia Papagiannaki
                    **headers)
909 b09c9aaa Sofia Papagiannaki
        
910 b09c9aaa Sofia Papagiannaki
        #assert get success
911 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
912 b09c9aaa Sofia Papagiannaki
913 b09c9aaa Sofia Papagiannaki
    def test_get_not_modified_since(self):
914 b09c9aaa Sofia Papagiannaki
        now = datetime.datetime.utcnow()
915 b09c9aaa Sofia Papagiannaki
        since = now + datetime.timedelta(1)
916 b09c9aaa Sofia Papagiannaki
        
917 b09c9aaa Sofia Papagiannaki
        for f in DATE_FORMATS:
918 b09c9aaa Sofia Papagiannaki
            headers = {'HTTP_IF_MODIFIED_SINCE':'%s' %since.strftime(f)}
919 b09c9aaa Sofia Papagiannaki
            r = self.get_object(self.account,
920 b09c9aaa Sofia Papagiannaki
                                self.containers[1],
921 b09c9aaa Sofia Papagiannaki
                                self.objects[0]['name'],
922 b09c9aaa Sofia Papagiannaki
                                **headers)
923 b09c9aaa Sofia Papagiannaki
            
924 b09c9aaa Sofia Papagiannaki
            #assert not modified
925 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
926 b09c9aaa Sofia Papagiannaki
927 b09c9aaa Sofia Papagiannaki
    def test_get_with_if_unmodified_since(self):
928 b09c9aaa Sofia Papagiannaki
        return
929 b09c9aaa Sofia Papagiannaki
930 b09c9aaa Sofia Papagiannaki
class UploadObject(BaseTestCase):
931 b09c9aaa Sofia Papagiannaki
    def setUp(self):
932 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
933 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
934 b09c9aaa Sofia Papagiannaki
        self.container = 'c1'
935 b09c9aaa Sofia Papagiannaki
        self.create_container(self.account, self.container)
936 b09c9aaa Sofia Papagiannaki
        
937 b09c9aaa Sofia Papagiannaki
        self.src = os.path.join('.', 'api', 'tests.py')
938 b09c9aaa Sofia Papagiannaki
        self.dest = os.path.join('.', 'api', 'chunked_update_test_file')
939 b09c9aaa Sofia Papagiannaki
        create_chunked_update_test_file(self.src, self.dest)
940 b09c9aaa Sofia Papagiannaki
941 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
942 b09c9aaa Sofia Papagiannaki
        for o in get_content_splitted(self.list_objects(self.account, self.container)):
943 b09c9aaa Sofia Papagiannaki
            self.delete_object(self.account, self.container, o)
944 b09c9aaa Sofia Papagiannaki
        self.delete_container(self.account, self.container)
945 b09c9aaa Sofia Papagiannaki
        
946 b09c9aaa Sofia Papagiannaki
        # delete test file
947 b09c9aaa Sofia Papagiannaki
        os.remove(self.dest)
948 b09c9aaa Sofia Papagiannaki
        
949 b09c9aaa Sofia Papagiannaki
    def test_upload(self):
950 b09c9aaa Sofia Papagiannaki
        filename = 'tests.py'
951 b09c9aaa Sofia Papagiannaki
        fullpath = os.path.join('.', 'api', filename) 
952 b09c9aaa Sofia Papagiannaki
        f = open(fullpath, 'r')
953 b09c9aaa Sofia Papagiannaki
        data = f.read()
954 b09c9aaa Sofia Papagiannaki
        hash = compute_hash(data)
955 b09c9aaa Sofia Papagiannaki
        meta={'HTTP_ETAG':hash,
956 b09c9aaa Sofia Papagiannaki
              'HTTP_X_OBJECT_MANIFEST':123,
957 b09c9aaa Sofia Papagiannaki
              'HTTP_X_OBJECT_META_TEST':'test1'
958 b09c9aaa Sofia Papagiannaki
              }
959 b09c9aaa Sofia Papagiannaki
        meta['HTTP_CONTENT_TYPE'], meta['HTTP_CONTENT_ENCODING'] = mimetypes.guess_type(fullpath)
960 b09c9aaa Sofia Papagiannaki
        r = self.upload_object(self.account,
961 b09c9aaa Sofia Papagiannaki
                               self.container,
962 b09c9aaa Sofia Papagiannaki
                               filename,
963 b09c9aaa Sofia Papagiannaki
                               data,
964 b09c9aaa Sofia Papagiannaki
                               content_type=meta['HTTP_CONTENT_TYPE'],
965 b09c9aaa Sofia Papagiannaki
                               **meta)
966 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
967 b09c9aaa Sofia Papagiannaki
        r = self.get_object_meta(self.account, self.container, filename)
968 b09c9aaa Sofia Papagiannaki
        self.assertTrue(r['X-Object-Meta-Test'])
969 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r['X-Object-Meta-Test'], meta['HTTP_X_OBJECT_META_TEST'])
970 b09c9aaa Sofia Papagiannaki
        
971 b09c9aaa Sofia Papagiannaki
        #assert uploaded content
972 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account, self.container, filename)
973 b09c9aaa Sofia Papagiannaki
        self.assertEqual(os.path.getsize(fullpath), int(r['Content-Length']))
974 b09c9aaa Sofia Papagiannaki
        self.assertEqual(data.strip(), r.content.strip())
975 b09c9aaa Sofia Papagiannaki
976 b09c9aaa Sofia Papagiannaki
    def test_upload_unprocessable_entity(self):
977 b09c9aaa Sofia Papagiannaki
        filename = 'tests.py'
978 b09c9aaa Sofia Papagiannaki
        fullpath = os.path.join('.', 'api', filename) 
979 b09c9aaa Sofia Papagiannaki
        f = open(fullpath, 'r')
980 b09c9aaa Sofia Papagiannaki
        data = f.read()
981 b09c9aaa Sofia Papagiannaki
        meta={'HTTP_ETAG':'123',
982 b09c9aaa Sofia Papagiannaki
              'HTTP_X_OBJECT_MANIFEST':123,
983 b09c9aaa Sofia Papagiannaki
              'HTTP_X_OBJECT_META_TEST':'test1'
984 b09c9aaa Sofia Papagiannaki
              }
985 b09c9aaa Sofia Papagiannaki
        meta['HTTP_CONTENT_TYPE'], meta['HTTP_CONTENT_ENCODING'] = mimetypes.guess_type(fullpath)
986 b09c9aaa Sofia Papagiannaki
        r = self.upload_object(self.account,
987 b09c9aaa Sofia Papagiannaki
                               self.container,
988 b09c9aaa Sofia Papagiannaki
                               filename,
989 b09c9aaa Sofia Papagiannaki
                               data,
990 b09c9aaa Sofia Papagiannaki
                               content_type = meta['HTTP_CONTENT_TYPE'],
991 b09c9aaa Sofia Papagiannaki
                               **meta)
992 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 422)
993 b09c9aaa Sofia Papagiannaki
        
994 b09c9aaa Sofia Papagiannaki
    def test_chucked_update(self):
995 b09c9aaa Sofia Papagiannaki
        objname = os.path.split(self.src)[-1:][0]
996 b09c9aaa Sofia Papagiannaki
        f = open(self.dest, 'r')
997 b09c9aaa Sofia Papagiannaki
        data = f.read()
998 b09c9aaa Sofia Papagiannaki
        meta = {}
999 b09c9aaa Sofia Papagiannaki
        meta['HTTP_CONTENT_TYPE'], meta['HTTP_CONTENT_ENCODING'] = mimetypes.guess_type(objname)
1000 b09c9aaa Sofia Papagiannaki
        meta.update({'HTTP_TRANSFER_ENCODING':'chunked'})
1001 b09c9aaa Sofia Papagiannaki
        r = self.upload_object(self.account,
1002 b09c9aaa Sofia Papagiannaki
                               self.container,
1003 b09c9aaa Sofia Papagiannaki
                               objname,
1004 b09c9aaa Sofia Papagiannaki
                               data,
1005 b09c9aaa Sofia Papagiannaki
                               content_type = 'plain/text',
1006 b09c9aaa Sofia Papagiannaki
                               **meta)
1007 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
1008 b09c9aaa Sofia Papagiannaki
        
1009 b09c9aaa Sofia Papagiannaki
        r = self.get_object(self.account,
1010 b09c9aaa Sofia Papagiannaki
                            self.container,
1011 b09c9aaa Sofia Papagiannaki
                            objname)
1012 b09c9aaa Sofia Papagiannaki
        uploaded_data = r.content
1013 b09c9aaa Sofia Papagiannaki
        f = open(self.src, 'r')
1014 b09c9aaa Sofia Papagiannaki
        actual_data = f.read()
1015 b09c9aaa Sofia Papagiannaki
        self.assertEqual(actual_data, uploaded_data)
1016 b09c9aaa Sofia Papagiannaki
1017 b09c9aaa Sofia Papagiannaki
class CopyObject(BaseTestCase):
1018 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1019 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1020 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1021 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1022 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1023 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
1024 b09c9aaa Sofia Papagiannaki
        self.obj = self.upload_os_file(self.account,
1025 b09c9aaa Sofia Papagiannaki
                            self.containers[0],
1026 b09c9aaa Sofia Papagiannaki
                            './api/tests.py')
1027 b09c9aaa Sofia Papagiannaki
1028 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
1029 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1030 b09c9aaa Sofia Papagiannaki
            for o in get_content_splitted(self.list_objects(self.account, c)):
1031 b09c9aaa Sofia Papagiannaki
                self.delete_object(self.account, c, o)
1032 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
1033 b09c9aaa Sofia Papagiannaki
1034 b09c9aaa Sofia Papagiannaki
    def test_copy(self):
1035 b09c9aaa Sofia Papagiannaki
        with AssertInvariant(self.get_object_meta, self.account, self.containers[0], self.obj['name']):
1036 b09c9aaa Sofia Papagiannaki
            #perform copy
1037 b09c9aaa Sofia Papagiannaki
            meta = {'HTTP_X_OBJECT_META_TEST':'testcopy'}
1038 b09c9aaa Sofia Papagiannaki
            src_path = os.path.join('/', self.containers[0], self.obj['name'])
1039 b09c9aaa Sofia Papagiannaki
            r = self.copy_object(self.account,
1040 b09c9aaa Sofia Papagiannaki
                             self.containers[0],
1041 b09c9aaa Sofia Papagiannaki
                             'testcopy',
1042 b09c9aaa Sofia Papagiannaki
                             src_path,
1043 b09c9aaa Sofia Papagiannaki
                             **meta)
1044 b09c9aaa Sofia Papagiannaki
            #assert copy success
1045 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 201)
1046 b09c9aaa Sofia Papagiannaki
            
1047 b09c9aaa Sofia Papagiannaki
            #assert access the new object
1048 b09c9aaa Sofia Papagiannaki
            r = self.get_object_meta(self.account,
1049 b09c9aaa Sofia Papagiannaki
                                     self.containers[0],
1050 b09c9aaa Sofia Papagiannaki
                                     'testcopy')
1051 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r['X-Object-Meta-Test'])
1052 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r['X-Object-Meta-Test'], 'testcopy')
1053 b09c9aaa Sofia Papagiannaki
            
1054 b09c9aaa Sofia Papagiannaki
            #assert etag is the same
1055 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r['ETag'], self.obj['hash'])
1056 b09c9aaa Sofia Papagiannaki
            
1057 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1058 b09c9aaa Sofia Papagiannaki
            r = self.get_object_meta(self.account, self.containers[0], self.obj['name'])
1059 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 204)
1060 b09c9aaa Sofia Papagiannaki
1061 b09c9aaa Sofia Papagiannaki
    def test_copy_from_different_container(self):
1062 b09c9aaa Sofia Papagiannaki
        with AssertInvariant(self.get_object_meta,
1063 b09c9aaa Sofia Papagiannaki
                             self.account,
1064 b09c9aaa Sofia Papagiannaki
                             self.containers[0],
1065 b09c9aaa Sofia Papagiannaki
                             self.obj['name']):
1066 b09c9aaa Sofia Papagiannaki
            meta = {'HTTP_X_OBJECT_META_TEST':'testcopy'}
1067 b09c9aaa Sofia Papagiannaki
            src_path = os.path.join('/', self.containers[0], self.obj['name'])
1068 b09c9aaa Sofia Papagiannaki
            r = self.copy_object(self.account,
1069 b09c9aaa Sofia Papagiannaki
                             self.containers[1],
1070 b09c9aaa Sofia Papagiannaki
                             'testcopy',
1071 b09c9aaa Sofia Papagiannaki
                             src_path,
1072 b09c9aaa Sofia Papagiannaki
                             **meta)
1073 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 201)
1074 b09c9aaa Sofia Papagiannaki
            
1075 b09c9aaa Sofia Papagiannaki
            # assert updated metadata
1076 b09c9aaa Sofia Papagiannaki
            r = self.get_object_meta(self.account,
1077 b09c9aaa Sofia Papagiannaki
                                     self.containers[1],
1078 b09c9aaa Sofia Papagiannaki
                                     'testcopy')
1079 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r['X-Object-Meta-Test'])
1080 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r['X-Object-Meta-Test'], 'testcopy')
1081 b09c9aaa Sofia Papagiannaki
            
1082 b09c9aaa Sofia Papagiannaki
            #assert src object still exists
1083 b09c9aaa Sofia Papagiannaki
            r = self.get_object_meta(self.account, self.containers[0], self.obj['name'])
1084 b09c9aaa Sofia Papagiannaki
            self.assertEqual(r.status_code, 204)
1085 b09c9aaa Sofia Papagiannaki
1086 b09c9aaa Sofia Papagiannaki
    def test_copy_invalid(self):
1087 b09c9aaa Sofia Papagiannaki
        #copy from invalid object
1088 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_OBJECT_META_TEST':'testcopy'}
1089 b09c9aaa Sofia Papagiannaki
        r = self.copy_object(self.account,
1090 b09c9aaa Sofia Papagiannaki
                         self.containers[1],
1091 b09c9aaa Sofia Papagiannaki
                         'testcopy',
1092 b09c9aaa Sofia Papagiannaki
                         os.path.join('/', self.containers[0], 'test.py'),
1093 b09c9aaa Sofia Papagiannaki
                         **meta)
1094 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(r)
1095 b09c9aaa Sofia Papagiannaki
        
1096 b09c9aaa Sofia Papagiannaki
        
1097 b09c9aaa Sofia Papagiannaki
        #copy from invalid container
1098 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_OBJECT_META_TEST':'testcopy'}
1099 b09c9aaa Sofia Papagiannaki
        src_path = os.path.join('/', self.containers[1], self.obj['name'])
1100 b09c9aaa Sofia Papagiannaki
        r = self.copy_object(self.account,
1101 b09c9aaa Sofia Papagiannaki
                         self.containers[1],
1102 b09c9aaa Sofia Papagiannaki
                         'testcopy',
1103 b09c9aaa Sofia Papagiannaki
                         src_path,
1104 b09c9aaa Sofia Papagiannaki
                         **meta)
1105 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(r)
1106 b09c9aaa Sofia Papagiannaki
1107 b09c9aaa Sofia Papagiannaki
class MoveObject(CopyObject):
1108 b09c9aaa Sofia Papagiannaki
    def test_move(self):
1109 b09c9aaa Sofia Papagiannaki
        #perform move
1110 b09c9aaa Sofia Papagiannaki
        meta = {'HTTP_X_OBJECT_META_TEST':'testcopy'}
1111 b09c9aaa Sofia Papagiannaki
        src_path = os.path.join('/', self.containers[0], self.obj['name'])
1112 b09c9aaa Sofia Papagiannaki
        r = self.move_object(self.account,
1113 b09c9aaa Sofia Papagiannaki
                         self.containers[0],
1114 b09c9aaa Sofia Papagiannaki
                         'testcopy',
1115 b09c9aaa Sofia Papagiannaki
                         src_path,
1116 b09c9aaa Sofia Papagiannaki
                         **meta)
1117 b09c9aaa Sofia Papagiannaki
        #assert successful move
1118 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
1119 b09c9aaa Sofia Papagiannaki
        
1120 b09c9aaa Sofia Papagiannaki
        #assert updated metadata
1121 b09c9aaa Sofia Papagiannaki
        r = self.get_object_meta(self.account,
1122 b09c9aaa Sofia Papagiannaki
                                 self.containers[0],
1123 b09c9aaa Sofia Papagiannaki
                                 'testcopy')
1124 b09c9aaa Sofia Papagiannaki
        self.assertTrue(r['X-Object-Meta-Test'])
1125 b09c9aaa Sofia Papagiannaki
        self.assertTrue(r['X-Object-Meta-Test'], 'testcopy')
1126 b09c9aaa Sofia Papagiannaki
        
1127 b09c9aaa Sofia Papagiannaki
        #assert src object no more exists
1128 b09c9aaa Sofia Papagiannaki
        r = self.get_object_meta(self.account, self.containers[0], self.obj['name'])
1129 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(r)
1130 b09c9aaa Sofia Papagiannaki
1131 b09c9aaa Sofia Papagiannaki
class UpdateObjectMeta(BaseTestCase):
1132 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1133 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1134 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1135 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1136 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1137 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
1138 b09c9aaa Sofia Papagiannaki
        self.obj = self.upload_os_file(self.account,
1139 b09c9aaa Sofia Papagiannaki
                                       self.containers[0],
1140 b09c9aaa Sofia Papagiannaki
                                       './api/tests.py')
1141 b09c9aaa Sofia Papagiannaki
1142 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
1143 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1144 b09c9aaa Sofia Papagiannaki
            for o in get_content_splitted(self.list_objects(self.account, c)):
1145 b09c9aaa Sofia Papagiannaki
                self.delete_object(self.account, c, o)
1146 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
1147 b09c9aaa Sofia Papagiannaki
1148 b09c9aaa Sofia Papagiannaki
    def test_update(self):
1149 b09c9aaa Sofia Papagiannaki
        #perform update metadata
1150 b09c9aaa Sofia Papagiannaki
        more = {'HTTP_X_OBJECT_META_FOO':'foo',
1151 b09c9aaa Sofia Papagiannaki
                'HTTP_X_OBJECT_META_BAR':'bar'}
1152 b09c9aaa Sofia Papagiannaki
        r = self.update_object_meta(self.account,
1153 b09c9aaa Sofia Papagiannaki
                                self.containers[0],
1154 b09c9aaa Sofia Papagiannaki
                                self.obj['name'],
1155 b09c9aaa Sofia Papagiannaki
                                **more)
1156 b09c9aaa Sofia Papagiannaki
        #assert request accepted
1157 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
1158 b09c9aaa Sofia Papagiannaki
        
1159 b09c9aaa Sofia Papagiannaki
        #assert old metadata are still there
1160 b09c9aaa Sofia Papagiannaki
        r = self.get_object_meta(self.account, self.containers[0], self.obj['name'])
1161 b09c9aaa Sofia Papagiannaki
        self.assertTrue('X-Object-Meta-Test' not in r.items())
1162 b09c9aaa Sofia Papagiannaki
        
1163 b09c9aaa Sofia Papagiannaki
        #assert new metadata have been updated
1164 b09c9aaa Sofia Papagiannaki
        for k,v in more.items():
1165 b09c9aaa Sofia Papagiannaki
            key = '-'.join(elem.capitalize() for elem in k.split('_')[1:])
1166 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r[key])
1167 b09c9aaa Sofia Papagiannaki
            self.assertTrue(r[key], v)
1168 b09c9aaa Sofia Papagiannaki
1169 b09c9aaa Sofia Papagiannaki
class DeleteObject(BaseTestCase):
1170 b09c9aaa Sofia Papagiannaki
    def setUp(self):
1171 b09c9aaa Sofia Papagiannaki
        BaseTestCase.setUp(self)
1172 b09c9aaa Sofia Papagiannaki
        self.account = 'test'
1173 b09c9aaa Sofia Papagiannaki
        self.containers = ['c1', 'c2']
1174 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1175 b09c9aaa Sofia Papagiannaki
            self.create_container(self.account, c)
1176 b09c9aaa Sofia Papagiannaki
        self.obj = self.upload_os_file(self.account,
1177 b09c9aaa Sofia Papagiannaki
                            self.containers[0],
1178 b09c9aaa Sofia Papagiannaki
                            './api/tests.py')
1179 b09c9aaa Sofia Papagiannaki
1180 b09c9aaa Sofia Papagiannaki
    def tearDown(self):
1181 b09c9aaa Sofia Papagiannaki
        for c in self.containers:
1182 b09c9aaa Sofia Papagiannaki
            for o in get_content_splitted(self.list_objects(self.account, c)):
1183 b09c9aaa Sofia Papagiannaki
                self.delete_object(self.account, c, o)
1184 b09c9aaa Sofia Papagiannaki
            self.delete_container(self.account, c)
1185 b09c9aaa Sofia Papagiannaki
1186 b09c9aaa Sofia Papagiannaki
    def test_delete(self):
1187 b09c9aaa Sofia Papagiannaki
        #perform delete object
1188 b09c9aaa Sofia Papagiannaki
        r = self.delete_object(self.account, self.containers[0], self.obj['name'])
1189 b09c9aaa Sofia Papagiannaki
        
1190 b09c9aaa Sofia Papagiannaki
        #assert success
1191 b09c9aaa Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
1192 b09c9aaa Sofia Papagiannaki
        
1193 b09c9aaa Sofia Papagiannaki
    def test_delete_invalid(self):
1194 b09c9aaa Sofia Papagiannaki
        #perform delete object
1195 b09c9aaa Sofia Papagiannaki
        r = self.delete_object(self.account, self.containers[1], self.obj['name'])
1196 b09c9aaa Sofia Papagiannaki
        
1197 b09c9aaa Sofia Papagiannaki
        #assert failure
1198 b09c9aaa Sofia Papagiannaki
        self.assertItemNotFound(r)
1199 b09c9aaa Sofia Papagiannaki
1200 b09c9aaa Sofia Papagiannaki
class AssertInvariant(object):
1201 b09c9aaa Sofia Papagiannaki
    def __init__(self, callable, *args, **kwargs):
1202 b09c9aaa Sofia Papagiannaki
        self.callable = callable
1203 b09c9aaa Sofia Papagiannaki
        self.args = args
1204 b09c9aaa Sofia Papagiannaki
        self.kwargs = kwargs
1205 b09c9aaa Sofia Papagiannaki
1206 b09c9aaa Sofia Papagiannaki
    def __enter__(self):
1207 b09c9aaa Sofia Papagiannaki
        self.items = self.callable(*self.args, **self.kwargs).items()
1208 b09c9aaa Sofia Papagiannaki
        return self.items
1209 b09c9aaa Sofia Papagiannaki
1210 b09c9aaa Sofia Papagiannaki
    def __exit__(self, type, value, tb):
1211 b09c9aaa Sofia Papagiannaki
        items = self.callable(*self.args, **self.kwargs).items()
1212 b09c9aaa Sofia Papagiannaki
        assert self.items == items
1213 b09c9aaa Sofia Papagiannaki
1214 b09c9aaa Sofia Papagiannaki
def get_content_splitted(response):
1215 b09c9aaa Sofia Papagiannaki
    if response:
1216 b09c9aaa Sofia Papagiannaki
        return response.content.split('\n')
1217 b09c9aaa Sofia Papagiannaki
1218 b09c9aaa Sofia Papagiannaki
def compute_hash(data):
1219 b09c9aaa Sofia Papagiannaki
    md5 = hashlib.md5()
1220 b09c9aaa Sofia Papagiannaki
    offset = 0
1221 b09c9aaa Sofia Papagiannaki
    md5.update(data)
1222 b09c9aaa Sofia Papagiannaki
    return md5.hexdigest().lower()
1223 b09c9aaa Sofia Papagiannaki
1224 b09c9aaa Sofia Papagiannaki
def create_chunked_update_test_file(src, dest):
1225 b09c9aaa Sofia Papagiannaki
    fr = open(src, 'r')
1226 b09c9aaa Sofia Papagiannaki
    fw = open(dest, 'w')
1227 b09c9aaa Sofia Papagiannaki
    data = fr.readline()
1228 b09c9aaa Sofia Papagiannaki
    while data:
1229 b09c9aaa Sofia Papagiannaki
        fw.write(hex(len(data)))
1230 b09c9aaa Sofia Papagiannaki
        fw.write('\r\n')
1231 b09c9aaa Sofia Papagiannaki
        fw.write(data)
1232 b09c9aaa Sofia Papagiannaki
        data = fr.readline()
1233 b09c9aaa Sofia Papagiannaki
    fw.write(hex(0))
1234 b09c9aaa Sofia Papagiannaki
    fw.write('\r\n')
1235 b09c9aaa Sofia Papagiannaki
1236 b09c9aaa Sofia Papagiannaki
o_names = ['kate.jpg',
1237 b09c9aaa Sofia Papagiannaki
           'kate_beckinsale.jpg',
1238 b09c9aaa Sofia Papagiannaki
           'How To Win Friends And Influence People.pdf',
1239 b09c9aaa Sofia Papagiannaki
           'moms_birthday.jpg',
1240 b09c9aaa Sofia Papagiannaki
           'poodle_strut.mov',
1241 b09c9aaa Sofia Papagiannaki
           'Disturbed - Down With The Sickness.mp3',
1242 b09c9aaa Sofia Papagiannaki
           'army_of_darkness.avi',
1243 b09c9aaa Sofia Papagiannaki
           'the_mad.avi',
1244 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/poodle.jpg',
1245 b09c9aaa Sofia Papagiannaki
           'photos/animals/dogs/terrier.jpg',
1246 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/persian.jpg',
1247 b09c9aaa Sofia Papagiannaki
           'photos/animals/cats/siamese.jpg',
1248 b09c9aaa Sofia Papagiannaki
           'photos/plants/fern.jpg',
1249 b09c9aaa Sofia Papagiannaki
           'photos/plants/rose.jpg',
1250 b09c9aaa Sofia Papagiannaki
           'photos/me.jpg']