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'] |