root / snf-pithos-app / pithos / api / test / containers.py @ 2560c061
History | View | Annotate | Download (39 kB)
1 | f3787696 | Sofia Papagiannaki | #!/usr/bin/env python
|
---|---|---|---|
2 | f3787696 | Sofia Papagiannaki | #coding=utf8
|
3 | f3787696 | Sofia Papagiannaki | |
4 | f3787696 | Sofia Papagiannaki | # Copyright 2011-2013 GRNET S.A. All rights reserved.
|
5 | f3787696 | Sofia Papagiannaki | #
|
6 | f3787696 | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
7 | f3787696 | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
8 | f3787696 | Sofia Papagiannaki | # conditions are met:
|
9 | f3787696 | Sofia Papagiannaki | #
|
10 | f3787696 | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
11 | f3787696 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
12 | f3787696 | Sofia Papagiannaki | # disclaimer.
|
13 | f3787696 | Sofia Papagiannaki | #
|
14 | f3787696 | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
15 | f3787696 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
16 | f3787696 | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
17 | f3787696 | Sofia Papagiannaki | # provided with the distribution.
|
18 | f3787696 | Sofia Papagiannaki | #
|
19 | f3787696 | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
20 | f3787696 | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21 | f3787696 | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
22 | f3787696 | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
23 | f3787696 | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24 | f3787696 | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25 | f3787696 | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
26 | f3787696 | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
27 | f3787696 | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28 | f3787696 | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
29 | f3787696 | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 | f3787696 | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
31 | f3787696 | Sofia Papagiannaki | #
|
32 | f3787696 | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
33 | f3787696 | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
34 | f3787696 | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
35 | f3787696 | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
36 | f3787696 | Sofia Papagiannaki | |
37 | 3a19e99b | Sofia Papagiannaki | from pithos.api.test import (PithosAPITest, DATE_FORMATS, o_names, |
38 | 3a19e99b | Sofia Papagiannaki | pithos_settings, pithos_test_settings) |
39 | bc4f25c0 | Sofia Papagiannaki | from pithos.api.test.util import strnextling, get_random_data, get_random_name |
40 | f3787696 | Sofia Papagiannaki | |
41 | d6a92fa0 | Sofia Papagiannaki | from synnefo.lib import join_urls |
42 | d6a92fa0 | Sofia Papagiannaki | |
43 | f3787696 | Sofia Papagiannaki | import django.utils.simplejson as json |
44 | f3787696 | Sofia Papagiannaki | from django.http import urlencode |
45 | f3787696 | Sofia Papagiannaki | |
46 | f3787696 | Sofia Papagiannaki | from xml.dom import minidom |
47 | f3787696 | Sofia Papagiannaki | from urllib import quote |
48 | 3a19e99b | Sofia Papagiannaki | import time as _time |
49 | f3787696 | Sofia Papagiannaki | |
50 | f3787696 | Sofia Papagiannaki | import random |
51 | f3787696 | Sofia Papagiannaki | import datetime |
52 | f3787696 | Sofia Papagiannaki | |
53 | f3787696 | Sofia Papagiannaki | |
54 | f3787696 | Sofia Papagiannaki | class ContainerHead(PithosAPITest): |
55 | f3787696 | Sofia Papagiannaki | def test_get_meta(self): |
56 | f3787696 | Sofia Papagiannaki | self.create_container('apples') |
57 | f3787696 | Sofia Papagiannaki | |
58 | f3787696 | Sofia Papagiannaki | # populate with objects
|
59 | f3787696 | Sofia Papagiannaki | objects = {} |
60 | f3787696 | Sofia Papagiannaki | for i in range(random.randint(1, 100)): |
61 | f3787696 | Sofia Papagiannaki | |
62 | f3787696 | Sofia Papagiannaki | # upload object
|
63 | f3787696 | Sofia Papagiannaki | meta = {'foo%s' % i: 'bar'} |
64 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object('apples', **meta) |
65 | f3787696 | Sofia Papagiannaki | objects[name] = data |
66 | f3787696 | Sofia Papagiannaki | |
67 | f3787696 | Sofia Papagiannaki | t1 = datetime.datetime.utcnow() |
68 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
69 | d6a92fa0 | Sofia Papagiannaki | r = self.head(url)
|
70 | f3787696 | Sofia Papagiannaki | self.assertEqual(int(r['X-Container-Object-Count']), len(objects)) |
71 | f3787696 | Sofia Papagiannaki | self.assertEqual(int(r['X-Container-Bytes-Used']), |
72 | f3787696 | Sofia Papagiannaki | sum([len(i) for i in objects.values()])) |
73 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Container-Block-Size' in r) |
74 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Container-Block-Hash' in r) |
75 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Container-Until-Timestamp' not in r) |
76 | f3787696 | Sofia Papagiannaki | self.assertEqual(r['X-Container-Policy-Versioning'], 'auto') |
77 | f3787696 | Sofia Papagiannaki | self.assertEqual(int(r['X-Container-Policy-Quota']), 0) |
78 | f3787696 | Sofia Papagiannaki | t2 = datetime.datetime.strptime(r['Last-Modified'], DATE_FORMATS[2]) |
79 | f3787696 | Sofia Papagiannaki | delta = (t2 - t1) |
80 | f3787696 | Sofia Papagiannaki | threashold = datetime.timedelta(seconds=1)
|
81 | f3787696 | Sofia Papagiannaki | self.assertTrue(delta < threashold)
|
82 | f3787696 | Sofia Papagiannaki | self.assertTrue(r['X-Container-Object-Meta']) |
83 | f3787696 | Sofia Papagiannaki | (self.assertTrue('foo%s' % i in r['X-Container-Object-Meta']) |
84 | f3787696 | Sofia Papagiannaki | for i in range(len(objects))) |
85 | f3787696 | Sofia Papagiannaki | |
86 | 8b5c1106 | Sofia Papagiannaki | def test_get_container_meta_until(self): |
87 | 8b5c1106 | Sofia Papagiannaki | self.create_container('apples') |
88 | 8b5c1106 | Sofia Papagiannaki | |
89 | 8b5c1106 | Sofia Papagiannaki | # populate with objects
|
90 | 8b5c1106 | Sofia Papagiannaki | objects = {} |
91 | 8b5c1106 | Sofia Papagiannaki | metalist = [] |
92 | 8b5c1106 | Sofia Papagiannaki | for i in range(random.randint(1, 100)): |
93 | 8b5c1106 | Sofia Papagiannaki | # upload object
|
94 | 8b5c1106 | Sofia Papagiannaki | metakey = 'Foo%s' % i
|
95 | 8b5c1106 | Sofia Papagiannaki | meta = {metakey: 'bar'}
|
96 | 8b5c1106 | Sofia Papagiannaki | name, data, resp = self.upload_object('apples', **meta) |
97 | 8b5c1106 | Sofia Papagiannaki | objects[name] = data |
98 | e8e50dcc | Ilias Tsitsimpis | metalist.append(metakey) |
99 | 8b5c1106 | Sofia Papagiannaki | |
100 | 8b5c1106 | Sofia Papagiannaki | self.update_container_meta('apples', {'foo': 'bar'}) |
101 | 8b5c1106 | Sofia Papagiannaki | |
102 | 8b5c1106 | Sofia Papagiannaki | container_info = self.get_container_info('apples') |
103 | 8b5c1106 | Sofia Papagiannaki | t = datetime.datetime.strptime(container_info['Last-Modified'],
|
104 | 8b5c1106 | Sofia Papagiannaki | DATE_FORMATS[2])
|
105 | 8b5c1106 | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
106 | 8b5c1106 | Sofia Papagiannaki | until = int(_time.mktime(t1.timetuple()))
|
107 | 8b5c1106 | Sofia Papagiannaki | |
108 | 8b5c1106 | Sofia Papagiannaki | _time.sleep(2)
|
109 | 8b5c1106 | Sofia Papagiannaki | |
110 | 8b5c1106 | Sofia Papagiannaki | for i in range(random.randint(1, 100)): |
111 | 8b5c1106 | Sofia Papagiannaki | # upload object
|
112 | 8b5c1106 | Sofia Papagiannaki | meta = {'foo%s' % i: 'bar'} |
113 | 8b5c1106 | Sofia Papagiannaki | self.upload_object('apples', **meta) |
114 | 8b5c1106 | Sofia Papagiannaki | |
115 | 8b5c1106 | Sofia Papagiannaki | self.update_container_meta('apples', {'quality': 'AAA'}) |
116 | 8b5c1106 | Sofia Papagiannaki | |
117 | 8b5c1106 | Sofia Papagiannaki | container_info = self.get_container_info('apples') |
118 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Meta-Quality' in container_info) |
119 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Meta-Foo' in container_info) |
120 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Object-Count' in container_info) |
121 | 84c67d8e | Sofia Papagiannaki | self.assertTrue(int(container_info['X-Container-Object-Count']) > |
122 | 84c67d8e | Sofia Papagiannaki | len(objects))
|
123 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Bytes-Used' in container_info) |
124 | 8b5c1106 | Sofia Papagiannaki | |
125 | 8b5c1106 | Sofia Papagiannaki | t = datetime.datetime.strptime(container_info['Last-Modified'],
|
126 | 8b5c1106 | Sofia Papagiannaki | DATE_FORMATS[-1])
|
127 | 8b5c1106 | Sofia Papagiannaki | last_modified = int(_time.mktime(t.timetuple()))
|
128 | 8b5c1106 | Sofia Papagiannaki | assert until < last_modified
|
129 | 8b5c1106 | Sofia Papagiannaki | |
130 | 8b5c1106 | Sofia Papagiannaki | container_info = self.get_container_info('apples', until=until) |
131 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Meta-Quality' not in container_info) |
132 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Meta-Foo' in container_info) |
133 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Until-Timestamp' in container_info) |
134 | 8b5c1106 | Sofia Papagiannaki | t = datetime.datetime.strptime( |
135 | 8b5c1106 | Sofia Papagiannaki | container_info['X-Container-Until-Timestamp'], DATE_FORMATS[2]) |
136 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue(int(_time.mktime(t1.timetuple())) <= until) |
137 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Object-Count' in container_info) |
138 | 84c67d8e | Sofia Papagiannaki | self.assertEqual(int(container_info['X-Container-Object-Count']), |
139 | 84c67d8e | Sofia Papagiannaki | len(objects))
|
140 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Bytes-Used' in container_info) |
141 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(int(container_info['X-Container-Bytes-Used']), |
142 | 8b5c1106 | Sofia Papagiannaki | sum([len(data) for data in objects.values()])) |
143 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Container-Object-Meta' in container_info) |
144 | 84c67d8e | Sofia Papagiannaki | self.assertEqual(
|
145 | 84c67d8e | Sofia Papagiannaki | sorted(container_info['X-Container-Object-Meta'].split(',')), |
146 | 84c67d8e | Sofia Papagiannaki | sorted(metalist))
|
147 | 8b5c1106 | Sofia Papagiannaki | |
148 | f3787696 | Sofia Papagiannaki | |
149 | f3787696 | Sofia Papagiannaki | class ContainerGet(PithosAPITest): |
150 | f3787696 | Sofia Papagiannaki | def setUp(self): |
151 | f3787696 | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
152 | f3787696 | Sofia Papagiannaki | |
153 | f3787696 | Sofia Papagiannaki | self.cnames = ['pears', 'apples'] |
154 | f3787696 | Sofia Papagiannaki | self.objects = {}
|
155 | f3787696 | Sofia Papagiannaki | for c in self.cnames: |
156 | f3787696 | Sofia Papagiannaki | self.create_container(c)
|
157 | f3787696 | Sofia Papagiannaki | |
158 | f3787696 | Sofia Papagiannaki | self.objects['pears'] = {} |
159 | f3787696 | Sofia Papagiannaki | for o in o_names[:8]: |
160 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object('pears', o) |
161 | f3787696 | Sofia Papagiannaki | self.objects['pears'][name] = data |
162 | f3787696 | Sofia Papagiannaki | self.objects['apples'] = {} |
163 | f3787696 | Sofia Papagiannaki | for o in o_names[8:]: |
164 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object('apples', o) |
165 | f3787696 | Sofia Papagiannaki | self.objects['apples'][name] = data |
166 | f3787696 | Sofia Papagiannaki | |
167 | 8b5c1106 | Sofia Papagiannaki | def test_list_until(self): |
168 | 8b5c1106 | Sofia Papagiannaki | account_info = self.get_account_info()
|
169 | 8b5c1106 | Sofia Papagiannaki | t = datetime.datetime.strptime(account_info['Last-Modified'],
|
170 | 8b5c1106 | Sofia Papagiannaki | DATE_FORMATS[2])
|
171 | 8b5c1106 | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
172 | 8b5c1106 | Sofia Papagiannaki | until = int(_time.mktime(t1.timetuple()))
|
173 | 8b5c1106 | Sofia Papagiannaki | |
174 | 8b5c1106 | Sofia Papagiannaki | _time.sleep(2)
|
175 | 8b5c1106 | Sofia Papagiannaki | |
176 | 8b5c1106 | Sofia Papagiannaki | cname = self.cnames[0] |
177 | 8b5c1106 | Sofia Papagiannaki | self.upload_object(cname)
|
178 | 8b5c1106 | Sofia Papagiannaki | |
179 | 8b5c1106 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
180 | 8b5c1106 | Sofia Papagiannaki | r = self.get('%s?until=%s' % (url, until)) |
181 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue(r.status_code, 200) |
182 | 8b5c1106 | Sofia Papagiannaki | objects = r.content.split('\n')
|
183 | 8b5c1106 | Sofia Papagiannaki | if '' in objects: |
184 | 8b5c1106 | Sofia Papagiannaki | objects.remove('')
|
185 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(objects,
|
186 | 8b5c1106 | Sofia Papagiannaki | sorted(self.objects[cname].keys())) |
187 | 8b5c1106 | Sofia Papagiannaki | |
188 | 8b5c1106 | Sofia Papagiannaki | r = self.get('%s?until=%s&format=json' % (url, until)) |
189 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue(r.status_code, 200) |
190 | 8b5c1106 | Sofia Papagiannaki | try:
|
191 | 8b5c1106 | Sofia Papagiannaki | objects = json.loads(r.content) |
192 | 8b5c1106 | Sofia Papagiannaki | except:
|
193 | 8b5c1106 | Sofia Papagiannaki | self.fail('json format expected') |
194 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual([o['name'] for o in objects], |
195 | 8b5c1106 | Sofia Papagiannaki | sorted(self.objects[cname].keys())) |
196 | 8b5c1106 | Sofia Papagiannaki | |
197 | f3787696 | Sofia Papagiannaki | def test_list_shared(self): |
198 | f3787696 | Sofia Papagiannaki | # share an object
|
199 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
200 | f3787696 | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
201 | ba402621 | Sofia Papagiannaki | shared1 = onames.pop() |
202 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, shared1) |
203 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*') |
204 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
205 | f3787696 | Sofia Papagiannaki | |
206 | ba402621 | Sofia Papagiannaki | # share another object
|
207 | ba402621 | Sofia Papagiannaki | shared2 = onames.pop() |
208 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, shared2) |
209 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*') |
210 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
211 | ba402621 | Sofia Papagiannaki | |
212 | ba402621 | Sofia Papagiannaki | # publish another object
|
213 | ba402621 | Sofia Papagiannaki | public1 = onames.pop() |
214 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, public1) |
215 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
216 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
217 | ba402621 | Sofia Papagiannaki | |
218 | f3787696 | Sofia Papagiannaki | # publish another object
|
219 | ba402621 | Sofia Papagiannaki | public2 = onames.pop() |
220 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, public2) |
221 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
222 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
223 | f3787696 | Sofia Papagiannaki | |
224 | f3787696 | Sofia Papagiannaki | # list shared and assert only the shared object is returned
|
225 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
226 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
227 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
228 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
229 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
230 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
231 | ba402621 | Sofia Papagiannaki | self.assertEqual(sorted([shared1, shared2]), objects) |
232 | f3787696 | Sofia Papagiannaki | |
233 | f3787696 | Sofia Papagiannaki | # list detailed shared and assert only the shared object is returned
|
234 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
235 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=&format=json' % url) |
236 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
237 | f3787696 | Sofia Papagiannaki | try:
|
238 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
239 | f3787696 | Sofia Papagiannaki | except:
|
240 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
241 | ba402621 | Sofia Papagiannaki | l = sorted([shared1, shared2])
|
242 | ba402621 | Sofia Papagiannaki | i = 0
|
243 | ba402621 | Sofia Papagiannaki | for name in l: |
244 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['name'], name) |
245 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['bytes'], |
246 | ba402621 | Sofia Papagiannaki | len(self.objects[cname][name])) |
247 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[i]) |
248 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_public' not in objects[i]) |
249 | ba402621 | Sofia Papagiannaki | i += 1
|
250 | f3787696 | Sofia Papagiannaki | |
251 | f3787696 | Sofia Papagiannaki | # publish the shared object and assert it is still listed in the
|
252 | f3787696 | Sofia Papagiannaki | # shared objects
|
253 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, shared1) |
254 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
255 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
256 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
257 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=&format=json' % url) |
258 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
259 | f3787696 | Sofia Papagiannaki | try:
|
260 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
261 | f3787696 | Sofia Papagiannaki | except:
|
262 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
263 | ba402621 | Sofia Papagiannaki | i = 0
|
264 | ba402621 | Sofia Papagiannaki | for name in l: |
265 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['name'], name) |
266 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['bytes'], |
267 | ba402621 | Sofia Papagiannaki | len(self.objects[cname][name])) |
268 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[i]) |
269 | ba402621 | Sofia Papagiannaki | if name == shared1:
|
270 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[i]) |
271 | ba402621 | Sofia Papagiannaki | else:
|
272 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_public' not in objects[i]) |
273 | ba402621 | Sofia Papagiannaki | i += 1
|
274 | f3787696 | Sofia Papagiannaki | |
275 | f3787696 | Sofia Papagiannaki | # create child object
|
276 | ba402621 | Sofia Papagiannaki | descendant = strnextling(shared1) |
277 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
278 | f3787696 | Sofia Papagiannaki | # request shared and assert child obejct is not listed
|
279 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
280 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
281 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
282 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
283 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
284 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
285 | ba402621 | Sofia Papagiannaki | self.assertTrue(shared1 in objects) |
286 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
287 | f3787696 | Sofia Papagiannaki | |
288 | f3787696 | Sofia Papagiannaki | # check folder inheritance
|
289 | ba402621 | Sofia Papagiannaki | folder, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*') |
290 | f3787696 | Sofia Papagiannaki | # create child object
|
291 | ba402621 | Sofia Papagiannaki | descendant = '%s/%s' % (folder, get_random_name())
|
292 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
293 | f3787696 | Sofia Papagiannaki | # request shared
|
294 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
295 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
296 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
297 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
298 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
299 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
300 | ba402621 | Sofia Papagiannaki | self.assertTrue(folder in objects) |
301 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant in objects) |
302 | f3787696 | Sofia Papagiannaki | |
303 | f3787696 | Sofia Papagiannaki | def test_list_public(self): |
304 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
305 | f3787696 | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
306 | 3a19e99b | Sofia Papagiannaki | |
307 | 3a19e99b | Sofia Papagiannaki | # publish an object
|
308 | ba402621 | Sofia Papagiannaki | public1 = onames.pop() |
309 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, public1) |
310 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
311 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
312 | f3787696 | Sofia Papagiannaki | |
313 | ba402621 | Sofia Papagiannaki | # publish another
|
314 | ba402621 | Sofia Papagiannaki | public2 = onames.pop() |
315 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, public2) |
316 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
317 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
318 | ba402621 | Sofia Papagiannaki | |
319 | ba402621 | Sofia Papagiannaki | # share an object
|
320 | ba402621 | Sofia Papagiannaki | shared1 = onames.pop() |
321 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, shared1) |
322 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
323 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
324 | ba402621 | Sofia Papagiannaki | |
325 | f3787696 | Sofia Papagiannaki | # share another
|
326 | ba402621 | Sofia Papagiannaki | shared2 = onames.pop() |
327 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, shared2) |
328 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
329 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
330 | f3787696 | Sofia Papagiannaki | |
331 | f3787696 | Sofia Papagiannaki | # list public and assert only the public object is returned
|
332 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
333 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
334 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
335 | ba402621 | Sofia Papagiannaki | objects = r.content.split('\n')
|
336 | ba402621 | Sofia Papagiannaki | if '' in objects: |
337 | ba402621 | Sofia Papagiannaki | objects.remove('')
|
338 | ba402621 | Sofia Papagiannaki | self.assertEqual(sorted([public1, public2]), objects) |
339 | f3787696 | Sofia Papagiannaki | |
340 | f3787696 | Sofia Papagiannaki | # list detailed public and assert only the public object is returned
|
341 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
342 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url) |
343 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
344 | f3787696 | Sofia Papagiannaki | try:
|
345 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
346 | f3787696 | Sofia Papagiannaki | except:
|
347 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
348 | ba402621 | Sofia Papagiannaki | l = sorted([public1, public2])
|
349 | ba402621 | Sofia Papagiannaki | i = 0
|
350 | ba402621 | Sofia Papagiannaki | for name in l: |
351 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['name'], name) |
352 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['bytes'], |
353 | ba402621 | Sofia Papagiannaki | len(self.objects[cname][name])) |
354 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' not in objects[i]) |
355 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[i]) |
356 | ba402621 | Sofia Papagiannaki | i += 1
|
357 | f3787696 | Sofia Papagiannaki | |
358 | f3787696 | Sofia Papagiannaki | # share the public object and assert it is still listed in the
|
359 | f3787696 | Sofia Papagiannaki | # public objects
|
360 | ba402621 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, public1) |
361 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
362 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
363 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
364 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url) |
365 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
366 | f3787696 | Sofia Papagiannaki | try:
|
367 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
368 | f3787696 | Sofia Papagiannaki | except:
|
369 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
370 | ba402621 | Sofia Papagiannaki | i = 0
|
371 | ba402621 | Sofia Papagiannaki | for name in l: |
372 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['name'], name) |
373 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['bytes'], |
374 | ba402621 | Sofia Papagiannaki | len(self.objects[cname][name])) |
375 | ba402621 | Sofia Papagiannaki | if name == public1:
|
376 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[i]) |
377 | ba402621 | Sofia Papagiannaki | else:
|
378 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' not in objects[i]) |
379 | ba402621 | Sofia Papagiannaki | i += 1
|
380 | f3787696 | Sofia Papagiannaki | |
381 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
382 | d6a92fa0 | Sofia Papagiannaki | |
383 | f3787696 | Sofia Papagiannaki | # Assert listing the container public contents is forbidden to not
|
384 | f3787696 | Sofia Papagiannaki | # shared users
|
385 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url, user='bob') |
386 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
387 | f3787696 | Sofia Papagiannaki | |
388 | 3a19e99b | Sofia Papagiannaki | # Assert forbidden public object listing to shared users
|
389 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url, user='alice') |
390 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
391 | f3787696 | Sofia Papagiannaki | |
392 | f3787696 | Sofia Papagiannaki | # create child object
|
393 | ba402621 | Sofia Papagiannaki | descendant = strnextling(public1) |
394 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
395 | f3787696 | Sofia Papagiannaki | # request public and assert child obejct is not listed
|
396 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
397 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
398 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
399 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
400 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
401 | ba402621 | Sofia Papagiannaki | self.assertTrue(public1 in objects) |
402 | ba402621 | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
403 | f3787696 | Sofia Papagiannaki | |
404 | f3787696 | Sofia Papagiannaki | # test folder inheritance
|
405 | ba402621 | Sofia Papagiannaki | folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true') |
406 | f3787696 | Sofia Papagiannaki | # create child object
|
407 | ba402621 | Sofia Papagiannaki | descendant = '%s/%s' % (folder, get_random_name())
|
408 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
409 | f3787696 | Sofia Papagiannaki | # request public
|
410 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
411 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
412 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
413 | ba402621 | Sofia Papagiannaki | self.assertTrue(folder in objects) |
414 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
415 | f3787696 | Sofia Papagiannaki | |
416 | 3a19e99b | Sofia Papagiannaki | def test_list_shared_public(self): |
417 | 3a19e99b | Sofia Papagiannaki | cname = self.cnames[0] |
418 | 3a19e99b | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
419 | 3a19e99b | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
420 | ba402621 | Sofia Papagiannaki | |
421 | 92428559 | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url) |
422 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
423 | 92428559 | Sofia Papagiannaki | objects = json.loads(r.content) |
424 | 92428559 | Sofia Papagiannaki | self.assertEqual(len(objects), 0) |
425 | 92428559 | Sofia Papagiannaki | |
426 | ba402621 | Sofia Papagiannaki | # publish an object
|
427 | ba402621 | Sofia Papagiannaki | public1 = onames.pop() |
428 | ba402621 | Sofia Papagiannaki | url = join_urls(container_url, public1) |
429 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
430 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
431 | 3a19e99b | Sofia Papagiannaki | |
432 | 92428559 | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url) |
433 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
434 | 92428559 | Sofia Papagiannaki | objects = json.loads(r.content) |
435 | 92428559 | Sofia Papagiannaki | self.assertEqual(len(objects), 1) |
436 | 92428559 | Sofia Papagiannaki | self.assertEqual(objects[0]['name'], public1) |
437 | 92428559 | Sofia Papagiannaki | self.assertEqual(objects[0]['bytes'], |
438 | 92428559 | Sofia Papagiannaki | len(self.objects[cname][public1])) |
439 | 92428559 | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[0]) |
440 | 92428559 | Sofia Papagiannaki | |
441 | ba402621 | Sofia Papagiannaki | # publish another
|
442 | ba402621 | Sofia Papagiannaki | public2 = onames.pop() |
443 | ba402621 | Sofia Papagiannaki | url = join_urls(container_url, public2) |
444 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
445 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
446 | ba402621 | Sofia Papagiannaki | |
447 | ba402621 | Sofia Papagiannaki | # share an object
|
448 | ba402621 | Sofia Papagiannaki | shared1 = onames.pop() |
449 | ba402621 | Sofia Papagiannaki | url = join_urls(container_url, shared1) |
450 | ba402621 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
451 | ba402621 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
452 | ba402621 | Sofia Papagiannaki | |
453 | 3a19e99b | Sofia Papagiannaki | # share another
|
454 | ba402621 | Sofia Papagiannaki | shared2 = onames.pop() |
455 | ba402621 | Sofia Papagiannaki | url = join_urls(container_url, shared2) |
456 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
457 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
458 | 3a19e99b | Sofia Papagiannaki | |
459 | 3a19e99b | Sofia Papagiannaki | # list shared and public objects and assert object is listed
|
460 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url) |
461 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
462 | 3a19e99b | Sofia Papagiannaki | objects = json.loads(r.content) |
463 | ba402621 | Sofia Papagiannaki | l = sorted([public1, public2, shared1, shared2])
|
464 | ba402621 | Sofia Papagiannaki | i = 0
|
465 | ba402621 | Sofia Papagiannaki | for name in l: |
466 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['name'], name) |
467 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects[i]['bytes'], |
468 | ba402621 | Sofia Papagiannaki | len(self.objects[cname][name])) |
469 | ba402621 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[i] or |
470 | ba402621 | Sofia Papagiannaki | 'x_object_public' in objects[i]) |
471 | ba402621 | Sofia Papagiannaki | i += 1
|
472 | 3a19e99b | Sofia Papagiannaki | |
473 | 3a19e99b | Sofia Papagiannaki | # assert not listing shared and public to a not shared user
|
474 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url, |
475 | 3a19e99b | Sofia Papagiannaki | user='bob')
|
476 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
477 | 3a19e99b | Sofia Papagiannaki | |
478 | 3a19e99b | Sofia Papagiannaki | # assert not listing public to a shared user
|
479 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url, |
480 | 3a19e99b | Sofia Papagiannaki | user='alice')
|
481 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
482 | 3a19e99b | Sofia Papagiannaki | |
483 | 3a19e99b | Sofia Papagiannaki | # create child object
|
484 | ba402621 | Sofia Papagiannaki | descendant = strnextling(public1) |
485 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
486 | 92428559 | Sofia Papagiannaki | # request public and assert child object is not listed
|
487 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=' % container_url) |
488 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
489 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
490 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
491 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
492 | ba402621 | Sofia Papagiannaki | self.assertEqual(objects, l)
|
493 | 3a19e99b | Sofia Papagiannaki | |
494 | 3a19e99b | Sofia Papagiannaki | # test folder inheritance
|
495 | ba402621 | Sofia Papagiannaki | folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true') |
496 | 3a19e99b | Sofia Papagiannaki | # create child object
|
497 | ba402621 | Sofia Papagiannaki | descendant = '%s/%s' % (folder, get_random_name())
|
498 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
499 | 3a19e99b | Sofia Papagiannaki | # request public
|
500 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=' % container_url) |
501 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
502 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
503 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
504 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
505 | ba402621 | Sofia Papagiannaki | self.assertTrue(folder in objects) |
506 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
507 | 3a19e99b | Sofia Papagiannaki | |
508 | 92428559 | Sofia Papagiannaki | # unpublish public1
|
509 | 92428559 | Sofia Papagiannaki | url = join_urls(container_url, public1) |
510 | 92428559 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false') |
511 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
512 | 92428559 | Sofia Papagiannaki | |
513 | 92428559 | Sofia Papagiannaki | # unpublish public2
|
514 | 92428559 | Sofia Papagiannaki | url = join_urls(container_url, public2) |
515 | 92428559 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false') |
516 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
517 | 92428559 | Sofia Papagiannaki | |
518 | 92428559 | Sofia Papagiannaki | # unpublish folder
|
519 | 92428559 | Sofia Papagiannaki | url = join_urls(container_url, folder) |
520 | 92428559 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false') |
521 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
522 | 92428559 | Sofia Papagiannaki | |
523 | 92428559 | Sofia Papagiannaki | r = self.get('%s?shared=&public=' % container_url) |
524 | 92428559 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
525 | 92428559 | Sofia Papagiannaki | objects = r.content.split('\n')
|
526 | 92428559 | Sofia Papagiannaki | if '' in objects: |
527 | 92428559 | Sofia Papagiannaki | objects.remove('')
|
528 | 92428559 | Sofia Papagiannaki | l = sorted([shared1, shared2])
|
529 | 92428559 | Sofia Papagiannaki | self.assertEqual(objects, l)
|
530 | 92428559 | Sofia Papagiannaki | |
531 | f3787696 | Sofia Papagiannaki | def test_list_objects(self): |
532 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
533 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
534 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url)
|
535 | f3787696 | Sofia Papagiannaki | self.assertTrue(r.status_code, 200) |
536 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
537 | f3787696 | Sofia Papagiannaki | if '' in objects: |
538 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
539 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, sorted(self.objects[cname].keys())) |
540 | f3787696 | Sofia Papagiannaki | |
541 | f3787696 | Sofia Papagiannaki | def test_list_objects_containing_slash(self): |
542 | f3787696 | Sofia Papagiannaki | self.create_container('test') |
543 | 3a19e99b | Sofia Papagiannaki | self.upload_object('test', quote('/objectname', '')) |
544 | f3787696 | Sofia Papagiannaki | |
545 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'test') |
546 | d6a92fa0 | Sofia Papagiannaki | |
547 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url)
|
548 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
549 | f3787696 | Sofia Papagiannaki | if '' in objects: |
550 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
551 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, ['/objectname']) |
552 | f3787696 | Sofia Papagiannaki | |
553 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=json' % url) |
554 | f3787696 | Sofia Papagiannaki | try:
|
555 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
556 | f3787696 | Sofia Papagiannaki | except:
|
557 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
558 | f3787696 | Sofia Papagiannaki | self.assertEqual([o['name'] for o in objects], ['/objectname']) |
559 | f3787696 | Sofia Papagiannaki | |
560 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=xml' % url) |
561 | f3787696 | Sofia Papagiannaki | try:
|
562 | f3787696 | Sofia Papagiannaki | objects = minidom.parseString(r.content) |
563 | f3787696 | Sofia Papagiannaki | except:
|
564 | f3787696 | Sofia Papagiannaki | self.fail('xml format expected') |
565 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
566 | f3787696 | Sofia Papagiannaki | [n.firstChild.data for n in objects.getElementsByTagName('name')], |
567 | f3787696 | Sofia Papagiannaki | ['/objectname'])
|
568 | f3787696 | Sofia Papagiannaki | |
569 | f3787696 | Sofia Papagiannaki | def test_list_objects_with_limit_marker(self): |
570 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
571 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
572 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=qwert' % url) |
573 | f3787696 | Sofia Papagiannaki | self.assertTrue(r.status_code != 500) |
574 | f3787696 | Sofia Papagiannaki | |
575 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=2' % url) |
576 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
577 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
578 | f3787696 | Sofia Papagiannaki | if '' in objects: |
579 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
580 | f3787696 | Sofia Papagiannaki | |
581 | f3787696 | Sofia Papagiannaki | onames = sorted(self.objects[cname].keys()) |
582 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, onames[:2]) |
583 | f3787696 | Sofia Papagiannaki | |
584 | f3787696 | Sofia Papagiannaki | markers = ['How To Win Friends And Influence People.pdf',
|
585 | f3787696 | Sofia Papagiannaki | 'moms_birthday.jpg']
|
586 | f3787696 | Sofia Papagiannaki | limit = 4
|
587 | f3787696 | Sofia Papagiannaki | for m in markers: |
588 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=%s&marker=%s' % (url, limit, m)) |
589 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
590 | f3787696 | Sofia Papagiannaki | if '' in objects: |
591 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
592 | f3787696 | Sofia Papagiannaki | start = onames.index(m) + 1
|
593 | f3787696 | Sofia Papagiannaki | end = start + limit |
594 | f3787696 | Sofia Papagiannaki | end = end if len(onames) >= end else len(onames) |
595 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, onames[start:end])
|
596 | f3787696 | Sofia Papagiannaki | |
597 | f3787696 | Sofia Papagiannaki | @pithos_test_settings(API_LIST_LIMIT=10) |
598 | f3787696 | Sofia Papagiannaki | def test_list_limit_exceeds(self): |
599 | f3787696 | Sofia Papagiannaki | self.create_container('container') |
600 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'container') |
601 | f3787696 | Sofia Papagiannaki | |
602 | f3787696 | Sofia Papagiannaki | for _ in range(pithos_settings.API_LIST_LIMIT + 1): |
603 | f3787696 | Sofia Papagiannaki | self.upload_object('container') |
604 | f3787696 | Sofia Papagiannaki | |
605 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=json' % url) |
606 | f3787696 | Sofia Papagiannaki | try:
|
607 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
608 | f3787696 | Sofia Papagiannaki | except:
|
609 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
610 | f3787696 | Sofia Papagiannaki | self.assertEqual(pithos_settings.API_LIST_LIMIT,
|
611 | f3787696 | Sofia Papagiannaki | len(objects))
|
612 | f3787696 | Sofia Papagiannaki | |
613 | f3787696 | Sofia Papagiannaki | def test_list_pseudo_hierarchical_folders(self): |
614 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
615 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?prefix=photos&delimiter=/' % url) |
616 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
617 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
618 | f3787696 | Sofia Papagiannaki | if '' in objects: |
619 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
620 | f3787696 | Sofia Papagiannaki | self.assertEquals(
|
621 | f3787696 | Sofia Papagiannaki | ['photos/animals/', 'photos/me.jpg', 'photos/plants/'], |
622 | f3787696 | Sofia Papagiannaki | objects) |
623 | f3787696 | Sofia Papagiannaki | |
624 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?prefix=photos/animals&delimiter=/' % url) |
625 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
626 | f3787696 | Sofia Papagiannaki | if '' in objects: |
627 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
628 | f3787696 | Sofia Papagiannaki | self.assertEquals(
|
629 | f3787696 | Sofia Papagiannaki | ['photos/animals/cats/', 'photos/animals/dogs/'], objects) |
630 | f3787696 | Sofia Papagiannaki | |
631 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?path=photos' % url) |
632 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
633 | f3787696 | Sofia Papagiannaki | if '' in objects: |
634 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
635 | f3787696 | Sofia Papagiannaki | self.assertEquals(['photos/me.jpg'], objects) |
636 | f3787696 | Sofia Papagiannaki | |
637 | f3787696 | Sofia Papagiannaki | def test_extended_list_json(self): |
638 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
639 | f3787696 | Sofia Papagiannaki | params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals', |
640 | f3787696 | Sofia Papagiannaki | 'delimiter': '/'} |
641 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?%s' % (url, urlencode(params))) |
642 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
643 | f3787696 | Sofia Papagiannaki | try:
|
644 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
645 | f3787696 | Sofia Papagiannaki | except:
|
646 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
647 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/') |
648 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/') |
649 | f3787696 | Sofia Papagiannaki | |
650 | f3787696 | Sofia Papagiannaki | def test_extended_list_xml(self): |
651 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
652 | f3787696 | Sofia Papagiannaki | params = {'format': 'xml', 'limit': 4, 'prefix': 'photos', |
653 | f3787696 | Sofia Papagiannaki | 'delimiter': '/'} |
654 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?%s' % (url, urlencode(params))) |
655 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
656 | f3787696 | Sofia Papagiannaki | try:
|
657 | f3787696 | Sofia Papagiannaki | xml = minidom.parseString(r.content) |
658 | f3787696 | Sofia Papagiannaki | except:
|
659 | f3787696 | Sofia Papagiannaki | self.fail('xml format expected') |
660 | f3787696 | Sofia Papagiannaki | self.assert_extended(xml, 'xml', 'object', size=4) |
661 | f3787696 | Sofia Papagiannaki | dirs = xml.getElementsByTagName('subdir')
|
662 | f3787696 | Sofia Papagiannaki | self.assertEqual(len(dirs), 2) |
663 | f3787696 | Sofia Papagiannaki | self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/') |
664 | f3787696 | Sofia Papagiannaki | self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/') |
665 | f3787696 | Sofia Papagiannaki | |
666 | f3787696 | Sofia Papagiannaki | objects = xml.getElementsByTagName('name')
|
667 | f3787696 | Sofia Papagiannaki | self.assertEqual(len(objects), 1) |
668 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg') |
669 | f3787696 | Sofia Papagiannaki | |
670 | f3787696 | Sofia Papagiannaki | def test_list_meta_double_matching(self): |
671 | f3787696 | Sofia Papagiannaki | # update object meta
|
672 | f3787696 | Sofia Papagiannaki | cname = 'apples'
|
673 | d6a92fa0 | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
674 | f3787696 | Sofia Papagiannaki | oname = self.objects[cname].keys().pop()
|
675 | f3787696 | Sofia Papagiannaki | meta = {'quality': 'aaa', 'stock': 'true'} |
676 | f3787696 | Sofia Papagiannaki | headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v) |
677 | f3787696 | Sofia Papagiannaki | for k, v in meta.iteritems()) |
678 | d6a92fa0 | Sofia Papagiannaki | object_url = join_urls(container_url, oname) |
679 | d6a92fa0 | Sofia Papagiannaki | self.post(object_url, content_type='', **headers) |
680 | f3787696 | Sofia Papagiannaki | |
681 | f3787696 | Sofia Papagiannaki | # list objects that satisfy the criteria
|
682 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Stock' % container_url) |
683 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
684 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
685 | f3787696 | Sofia Papagiannaki | if '' in objects: |
686 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
687 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, [oname])
|
688 | f3787696 | Sofia Papagiannaki | |
689 | f3787696 | Sofia Papagiannaki | def test_list_using_meta(self): |
690 | f3787696 | Sofia Papagiannaki | # update object meta
|
691 | f3787696 | Sofia Papagiannaki | cname = 'apples'
|
692 | d6a92fa0 | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
693 | d6a92fa0 | Sofia Papagiannaki | |
694 | 3a19e99b | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
695 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[0])
|
696 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa') |
697 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
698 | d6a92fa0 | Sofia Papagiannaki | |
699 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[1])
|
700 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab') |
701 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
702 | f3787696 | Sofia Papagiannaki | |
703 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[2])
|
704 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100') |
705 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
706 | d6a92fa0 | Sofia Papagiannaki | |
707 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[3])
|
708 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200') |
709 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
710 | f3787696 | Sofia Papagiannaki | |
711 | f3787696 | Sofia Papagiannaki | # test multiple existence criteria matches
|
712 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Stock' % container_url) |
713 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
714 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
715 | f3787696 | Sofia Papagiannaki | if '' in objects: |
716 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
717 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames)) |
718 | f3787696 | Sofia Papagiannaki | |
719 | f3787696 | Sofia Papagiannaki | # list objects that satisfy the existence criteria
|
720 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Stock' % container_url) |
721 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
722 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
723 | f3787696 | Sofia Papagiannaki | if '' in objects: |
724 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
725 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[2:])) |
726 | f3787696 | Sofia Papagiannaki | |
727 | f3787696 | Sofia Papagiannaki | # test case insensitive existence criteria matching
|
728 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=quality' % container_url) |
729 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
730 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
731 | f3787696 | Sofia Papagiannaki | if '' in objects: |
732 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
733 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[:2])) |
734 | f3787696 | Sofia Papagiannaki | |
735 | f3787696 | Sofia Papagiannaki | # test do not all existencecriteria match
|
736 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Foo' % container_url) |
737 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
738 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
739 | f3787696 | Sofia Papagiannaki | if '' in objects: |
740 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
741 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[:2])) |
742 | f3787696 | Sofia Papagiannaki | |
743 | f3787696 | Sofia Papagiannaki | # test equals criteria
|
744 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa'))) |
745 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
746 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
747 | f3787696 | Sofia Papagiannaki | if '' in objects: |
748 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
749 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[0]]) |
750 | f3787696 | Sofia Papagiannaki | |
751 | f3787696 | Sofia Papagiannaki | # test not equals criteria
|
752 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Quality!=aaa'))) |
753 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
754 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
755 | f3787696 | Sofia Papagiannaki | if '' in objects: |
756 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
757 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[1]]) |
758 | f3787696 | Sofia Papagiannaki | |
759 | f3787696 | Sofia Papagiannaki | # test lte criteria
|
760 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Stock<=120'))) |
761 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
762 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
763 | f3787696 | Sofia Papagiannaki | if '' in objects: |
764 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
765 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[2]]) |
766 | f3787696 | Sofia Papagiannaki | |
767 | f3787696 | Sofia Papagiannaki | # test gte criteria
|
768 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Stock>=200'))) |
769 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
770 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
771 | f3787696 | Sofia Papagiannaki | if '' in objects: |
772 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
773 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[3]]) |
774 | f3787696 | Sofia Papagiannaki | |
775 | 3a19e99b | Sofia Papagiannaki | def test_if_modified_since(self): |
776 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
777 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
778 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
779 | 3a19e99b | Sofia Papagiannaki | t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
780 | 3a19e99b | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
781 | 3a19e99b | Sofia Papagiannaki | |
782 | 3a19e99b | Sofia Papagiannaki | # Check not modified
|
783 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
784 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
785 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
786 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 304) |
787 | 3a19e99b | Sofia Papagiannaki | |
788 | 3a19e99b | Sofia Papagiannaki | # modify account: add container
|
789 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
790 | 3a19e99b | Sofia Papagiannaki | oname = self.upload_object(cname)[0] |
791 | 3a19e99b | Sofia Papagiannaki | |
792 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
793 | 3a19e99b | Sofia Papagiannaki | objects = self.objects[cname].keys()
|
794 | 3a19e99b | Sofia Papagiannaki | objects.append(oname) |
795 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
796 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
797 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
798 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], sorted(objects)) |
799 | 3a19e99b | Sofia Papagiannaki | |
800 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
801 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
802 | 3a19e99b | Sofia Papagiannaki | t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
803 | 3a19e99b | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
804 | 3a19e99b | Sofia Papagiannaki | |
805 | 3a19e99b | Sofia Papagiannaki | # modify account: update account meta
|
806 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
807 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, {'foo': 'bar'}) |
808 | 3a19e99b | Sofia Papagiannaki | |
809 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
810 | 3a19e99b | Sofia Papagiannaki | for t in t2_formats: |
811 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
812 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
813 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], sorted(objects)) |
814 | 3a19e99b | Sofia Papagiannaki | |
815 | 3a19e99b | Sofia Papagiannaki | def test_if_modified_since_invalid_date(self): |
816 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
817 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
818 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday') |
819 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
820 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], |
821 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'].keys())) |
822 | 3a19e99b | Sofia Papagiannaki | |
823 | 3a19e99b | Sofia Papagiannaki | def test_if_not_modified_since(self): |
824 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
825 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
826 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
827 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
828 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
829 | 3a19e99b | Sofia Papagiannaki | |
830 | 3a19e99b | Sofia Papagiannaki | # Check unmodified
|
831 | 3a19e99b | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
832 | 3a19e99b | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
833 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
834 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
835 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
836 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(
|
837 | 3a19e99b | Sofia Papagiannaki | r.content.split('\n')[:-1], |
838 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'])) |
839 | 3a19e99b | Sofia Papagiannaki | |
840 | 3a19e99b | Sofia Papagiannaki | # modify account: add container
|
841 | 3a19e99b | Sofia Papagiannaki | _time.sleep(2)
|
842 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname)
|
843 | 3a19e99b | Sofia Papagiannaki | |
844 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
845 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
846 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
847 | 3a19e99b | Sofia Papagiannaki | t2 = t - datetime.timedelta(seconds=1)
|
848 | 3a19e99b | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
849 | 3a19e99b | Sofia Papagiannaki | |
850 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
851 | 3a19e99b | Sofia Papagiannaki | for t in t2_formats: |
852 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
853 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
854 | 3a19e99b | Sofia Papagiannaki | |
855 | 3a19e99b | Sofia Papagiannaki | # modify account: update account meta
|
856 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
857 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, {'foo': 'bar'}) |
858 | 3a19e99b | Sofia Papagiannaki | |
859 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
860 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
861 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
862 | 3a19e99b | Sofia Papagiannaki | t3 = t - datetime.timedelta(seconds=1)
|
863 | 3a19e99b | Sofia Papagiannaki | t3_formats = map(t3.strftime, DATE_FORMATS)
|
864 | 3a19e99b | Sofia Papagiannaki | |
865 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
866 | 3a19e99b | Sofia Papagiannaki | for t in t3_formats: |
867 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
868 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
869 | 3a19e99b | Sofia Papagiannaki | |
870 | 3a19e99b | Sofia Papagiannaki | def test_if_unmodified_since(self): |
871 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
872 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
873 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
874 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
875 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
876 | 3a19e99b | Sofia Papagiannaki | t = t + datetime.timedelta(seconds=1)
|
877 | 3a19e99b | Sofia Papagiannaki | t_formats = map(t.strftime, DATE_FORMATS)
|
878 | 3a19e99b | Sofia Papagiannaki | |
879 | 3a19e99b | Sofia Papagiannaki | for tf in t_formats: |
880 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
|
881 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
882 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(
|
883 | 3a19e99b | Sofia Papagiannaki | r.content.split('\n')[:-1], |
884 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'])) |
885 | 3a19e99b | Sofia Papagiannaki | |
886 | 3a19e99b | Sofia Papagiannaki | def test_if_unmodified_since_precondition_failed(self): |
887 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
888 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
889 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
890 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
891 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
892 | 3a19e99b | Sofia Papagiannaki | t = t - datetime.timedelta(seconds=1)
|
893 | 3a19e99b | Sofia Papagiannaki | t_formats = map(t.strftime, DATE_FORMATS)
|
894 | 3a19e99b | Sofia Papagiannaki | |
895 | 3a19e99b | Sofia Papagiannaki | for tf in t_formats: |
896 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
|
897 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
898 | 3a19e99b | Sofia Papagiannaki | |
899 | 3a19e99b | Sofia Papagiannaki | |
900 | 3a19e99b | Sofia Papagiannaki | class ContainerPut(PithosAPITest): |
901 | 3a19e99b | Sofia Papagiannaki | def test_create(self): |
902 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
903 | 3a19e99b | Sofia Papagiannaki | self.list_containers()
|
904 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
905 | 3a19e99b | Sofia Papagiannaki | |
906 | 3a19e99b | Sofia Papagiannaki | def test_create_twice(self): |
907 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
908 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
909 | 2a194295 | Sofia Papagiannaki | r = self.create_container('c1')[-1] |
910 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
911 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
912 | 3a19e99b | Sofia Papagiannaki | |
913 | 3a19e99b | Sofia Papagiannaki | |
914 | 3a19e99b | Sofia Papagiannaki | class ContainerPost(PithosAPITest): |
915 | 3a19e99b | Sofia Papagiannaki | def test_update_meta(self): |
916 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
917 | 3a19e99b | Sofia Papagiannaki | self.create_container(cname)
|
918 | 3a19e99b | Sofia Papagiannaki | meta = {'test': 'test33', 'tost': 'tost22'} |
919 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, meta)
|
920 | 3a19e99b | Sofia Papagiannaki | info = self.get_container_info(cname)
|
921 | 3a19e99b | Sofia Papagiannaki | for k, v in meta.items(): |
922 | 3a19e99b | Sofia Papagiannaki | k = 'x-container-meta-%s' % k
|
923 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(k in info) |
924 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(info[k], v)
|
925 | 3a19e99b | Sofia Papagiannaki | |
926 | 3a19e99b | Sofia Papagiannaki | def test_quota(self): |
927 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
928 | 3a19e99b | Sofia Papagiannaki | |
929 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
930 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='100') |
931 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
932 | 3a19e99b | Sofia Papagiannaki | |
933 | 3a19e99b | Sofia Papagiannaki | info = self.get_container_info('c1') |
934 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('x-container-policy-quota' in info) |
935 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(info['x-container-policy-quota'], '100') |
936 | 3a19e99b | Sofia Papagiannaki | |
937 | c977b0b6 | Sofia Papagiannaki | r = self.upload_object('c1', length=101, verify_status=False)[2] |
938 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 413) |
939 | 3a19e99b | Sofia Papagiannaki | |
940 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
941 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='0') |
942 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
943 | 3a19e99b | Sofia Papagiannaki | |
944 | 3a19e99b | Sofia Papagiannaki | r = self.upload_object('c1', length=1) |
945 | 3a19e99b | Sofia Papagiannaki | |
946 | 2560c061 | Sofia Papagiannaki | def test_upload_blocks(self): |
947 | 2560c061 | Sofia Papagiannaki | cname = self.create_container()[0] |
948 | 2560c061 | Sofia Papagiannaki | |
949 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
950 | 2560c061 | Sofia Papagiannaki | r = self.post(url, data=get_random_data())
|
951 | 2560c061 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
952 | 2560c061 | Sofia Papagiannaki | |
953 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, 'chuck', cname) |
954 | 2560c061 | Sofia Papagiannaki | r = self.post(url, data=get_random_data())
|
955 | 2560c061 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
956 | 2560c061 | Sofia Papagiannaki | |
957 | 2560c061 | Sofia Papagiannaki | # share object for read only
|
958 | 2560c061 | Sofia Papagiannaki | oname = self.upload_object(cname)[0] |
959 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
960 | 2560c061 | Sofia Papagiannaki | self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*', |
961 | 2560c061 | Sofia Papagiannaki | HTTP_X_OBJECT_SHARING='read=*')
|
962 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, 'chuck', cname) |
963 | 2560c061 | Sofia Papagiannaki | r = self.post(url, data=get_random_data())
|
964 | 2560c061 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
965 | 2560c061 | Sofia Papagiannaki | |
966 | 2560c061 | Sofia Papagiannaki | # share object for write only
|
967 | 2560c061 | Sofia Papagiannaki | oname = self.upload_object(cname)[0] |
968 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
969 | 2560c061 | Sofia Papagiannaki | self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*', |
970 | 2560c061 | Sofia Papagiannaki | HTTP_X_OBJECT_SHARING='write=*')
|
971 | 2560c061 | Sofia Papagiannaki | url = join_urls(self.pithos_path, 'chuck', cname) |
972 | 2560c061 | Sofia Papagiannaki | r = self.post(url, data=get_random_data())
|
973 | 2560c061 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
974 | 2560c061 | Sofia Papagiannaki | |
975 | 3a19e99b | Sofia Papagiannaki | |
976 | 3a19e99b | Sofia Papagiannaki | class ContainerDelete(PithosAPITest): |
977 | 3a19e99b | Sofia Papagiannaki | def setUp(self): |
978 | 3a19e99b | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
979 | 3a19e99b | Sofia Papagiannaki | cnames = ['c1', 'c2'] |
980 | 3a19e99b | Sofia Papagiannaki | |
981 | 3a19e99b | Sofia Papagiannaki | for c in cnames: |
982 | 3a19e99b | Sofia Papagiannaki | self.create_container(c)
|
983 | 3a19e99b | Sofia Papagiannaki | |
984 | 3a19e99b | Sofia Papagiannaki | def test_delete(self): |
985 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
986 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
987 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 204) |
988 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' not in self.list_containers(format=None)) |
989 | 3a19e99b | Sofia Papagiannaki | |
990 | 3a19e99b | Sofia Papagiannaki | def test_delete_non_empty(self): |
991 | 3a19e99b | Sofia Papagiannaki | self.upload_object('c1') |
992 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
993 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
994 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 409) |
995 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
996 | 3a19e99b | Sofia Papagiannaki | |
997 | 3a19e99b | Sofia Papagiannaki | def test_delete_invalid(self): |
998 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c3') |
999 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
1000 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |
1001 | 3a19e99b | Sofia Papagiannaki | |
1002 | 3a19e99b | Sofia Papagiannaki | def test_delete_contents(self): |
1003 | 3a19e99b | Sofia Papagiannaki | folder = self.create_folder('c1')[0] |
1004 | 3a19e99b | Sofia Papagiannaki | descendant = strnextling(folder) |
1005 | 3a19e99b | Sofia Papagiannaki | self.upload_object('c1', descendant) |
1006 | 3a19e99b | Sofia Papagiannaki | self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0] |
1007 | 3a19e99b | Sofia Papagiannaki | |
1008 | 3a19e99b | Sofia Papagiannaki | self.delete('%s?delimiter=/' % join_urls( |
1009 | 3a19e99b | Sofia Papagiannaki | self.pithos_path, self.user, 'c1')) |
1010 | 3a19e99b | Sofia Papagiannaki | self.assertEqual([], self.list_objects('c1')) |
1011 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |