Statistics
| Branch: | Tag: | Revision:

root / pithos / api / tests.py @ 4288ade0

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