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