root / snf-pithos-app / pithos / api / test / containers.py @ 2a194295
History | View | Annotate | Download (30.2 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 | f3787696 | Sofia Papagiannaki | |
87 | f3787696 | Sofia Papagiannaki | class ContainerGet(PithosAPITest): |
88 | f3787696 | Sofia Papagiannaki | def setUp(self): |
89 | f3787696 | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
90 | f3787696 | Sofia Papagiannaki | |
91 | f3787696 | Sofia Papagiannaki | self.cnames = ['pears', 'apples'] |
92 | f3787696 | Sofia Papagiannaki | self.objects = {}
|
93 | f3787696 | Sofia Papagiannaki | for c in self.cnames: |
94 | f3787696 | Sofia Papagiannaki | self.create_container(c)
|
95 | f3787696 | Sofia Papagiannaki | |
96 | f3787696 | Sofia Papagiannaki | self.objects['pears'] = {} |
97 | f3787696 | Sofia Papagiannaki | for o in o_names[:8]: |
98 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object('pears', o) |
99 | f3787696 | Sofia Papagiannaki | self.objects['pears'][name] = data |
100 | f3787696 | Sofia Papagiannaki | self.objects['apples'] = {} |
101 | f3787696 | Sofia Papagiannaki | for o in o_names[8:]: |
102 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object('apples', o) |
103 | f3787696 | Sofia Papagiannaki | self.objects['apples'][name] = data |
104 | f3787696 | Sofia Papagiannaki | |
105 | f3787696 | Sofia Papagiannaki | def test_list_shared(self): |
106 | f3787696 | Sofia Papagiannaki | # share an object
|
107 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
108 | f3787696 | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
109 | f3787696 | Sofia Papagiannaki | oname = onames.pop() |
110 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
111 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*') |
112 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
113 | f3787696 | Sofia Papagiannaki | |
114 | f3787696 | Sofia Papagiannaki | # publish another object
|
115 | f3787696 | Sofia Papagiannaki | other = onames.pop() |
116 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, other) |
117 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
118 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
119 | f3787696 | Sofia Papagiannaki | |
120 | f3787696 | Sofia Papagiannaki | # list shared and assert only the shared object is returned
|
121 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
122 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
123 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
124 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
125 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
126 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
127 | f3787696 | Sofia Papagiannaki | self.assertEqual([oname], objects)
|
128 | f3787696 | Sofia Papagiannaki | |
129 | f3787696 | Sofia Papagiannaki | # list detailed shared and assert only the shared object is returned
|
130 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
131 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=&format=json' % url) |
132 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
133 | f3787696 | Sofia Papagiannaki | try:
|
134 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
135 | f3787696 | Sofia Papagiannaki | except:
|
136 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
137 | f3787696 | Sofia Papagiannaki | self.assertEqual([oname], [o['name'] for o in objects]) |
138 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[0]) |
139 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_public' not in objects[0]) |
140 | f3787696 | Sofia Papagiannaki | |
141 | f3787696 | Sofia Papagiannaki | # publish the shared object and assert it is still listed in the
|
142 | f3787696 | Sofia Papagiannaki | # shared objects
|
143 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
144 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
145 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
146 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
147 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=&format=json' % url) |
148 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
149 | f3787696 | Sofia Papagiannaki | try:
|
150 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
151 | f3787696 | Sofia Papagiannaki | except:
|
152 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
153 | f3787696 | Sofia Papagiannaki | self.assertEqual([oname], [o['name'] for o in objects]) |
154 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[0]) |
155 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[0]) |
156 | f3787696 | Sofia Papagiannaki | |
157 | f3787696 | Sofia Papagiannaki | # create child object
|
158 | f3787696 | Sofia Papagiannaki | descendant = strnextling(oname) |
159 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
160 | f3787696 | Sofia Papagiannaki | # request shared and assert child obejct is not listed
|
161 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
162 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
163 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
164 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
165 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
166 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
167 | f3787696 | Sofia Papagiannaki | self.assertTrue(oname in objects) |
168 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
169 | f3787696 | Sofia Papagiannaki | |
170 | f3787696 | Sofia Papagiannaki | # check folder inheritance
|
171 | f3787696 | Sofia Papagiannaki | oname, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*') |
172 | f3787696 | Sofia Papagiannaki | # create child object
|
173 | bc4f25c0 | Sofia Papagiannaki | descendant = '%s/%s' % (oname, get_random_name())
|
174 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
175 | f3787696 | Sofia Papagiannaki | # request shared
|
176 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
177 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
178 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
179 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
180 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
181 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
182 | f3787696 | Sofia Papagiannaki | self.assertTrue(oname in objects) |
183 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant in objects) |
184 | f3787696 | Sofia Papagiannaki | |
185 | f3787696 | Sofia Papagiannaki | def test_list_public(self): |
186 | f3787696 | Sofia Papagiannaki | # publish an object
|
187 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
188 | f3787696 | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
189 | f3787696 | Sofia Papagiannaki | oname = onames.pop() |
190 | 3a19e99b | Sofia Papagiannaki | other = onames.pop() |
191 | 3a19e99b | Sofia Papagiannaki | |
192 | 3a19e99b | Sofia Papagiannaki | # publish an object
|
193 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
194 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
195 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
196 | f3787696 | Sofia Papagiannaki | |
197 | f3787696 | Sofia Papagiannaki | # share another
|
198 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, other) |
199 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
200 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
201 | f3787696 | Sofia Papagiannaki | |
202 | f3787696 | Sofia Papagiannaki | # list public and assert only the public object is returned
|
203 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
204 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
205 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
206 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
207 | f3787696 | Sofia Papagiannaki | self.assertTrue(oname in r.content.split('\n')) |
208 | 3a19e99b | Sofia Papagiannaki | (self.assertTrue(object not in objects) for object in o_names[1:]) |
209 | f3787696 | Sofia Papagiannaki | |
210 | f3787696 | Sofia Papagiannaki | # list detailed public and assert only the public object is returned
|
211 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
212 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url) |
213 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
214 | f3787696 | Sofia Papagiannaki | try:
|
215 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
216 | f3787696 | Sofia Papagiannaki | except:
|
217 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
218 | 3a19e99b | Sofia Papagiannaki | self.assertEqual([oname], [obj['name'] for obj in objects]) |
219 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' not in objects[0]) |
220 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[0]) |
221 | f3787696 | Sofia Papagiannaki | |
222 | f3787696 | Sofia Papagiannaki | # share the public object and assert it is still listed in the
|
223 | f3787696 | Sofia Papagiannaki | # public objects
|
224 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
225 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
226 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
227 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
228 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url) |
229 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
230 | f3787696 | Sofia Papagiannaki | try:
|
231 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
232 | f3787696 | Sofia Papagiannaki | except:
|
233 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
234 | 3a19e99b | Sofia Papagiannaki | self.assertEqual([oname], [obj['name'] for obj in objects]) |
235 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in objects[0]) |
236 | f3787696 | Sofia Papagiannaki | self.assertTrue('x_object_public' in objects[0]) |
237 | f3787696 | Sofia Papagiannaki | |
238 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
239 | d6a92fa0 | Sofia Papagiannaki | |
240 | f3787696 | Sofia Papagiannaki | # Assert listing the container public contents is forbidden to not
|
241 | f3787696 | Sofia Papagiannaki | # shared users
|
242 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url, user='bob') |
243 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
244 | f3787696 | Sofia Papagiannaki | |
245 | 3a19e99b | Sofia Papagiannaki | # Assert forbidden public object listing to shared users
|
246 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=&format=json' % url, user='alice') |
247 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
248 | f3787696 | Sofia Papagiannaki | |
249 | f3787696 | Sofia Papagiannaki | # create child object
|
250 | f3787696 | Sofia Papagiannaki | descendant = strnextling(oname) |
251 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
252 | f3787696 | Sofia Papagiannaki | # request public and assert child obejct is not listed
|
253 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
254 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
255 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
256 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
257 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
258 | f3787696 | Sofia Papagiannaki | self.assertTrue(oname in objects) |
259 | f3787696 | Sofia Papagiannaki | (self.assertTrue(o not in objects) for o in o_names[1:]) |
260 | f3787696 | Sofia Papagiannaki | |
261 | f3787696 | Sofia Papagiannaki | # test folder inheritance
|
262 | f3787696 | Sofia Papagiannaki | oname, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true') |
263 | f3787696 | Sofia Papagiannaki | # create child object
|
264 | bc4f25c0 | Sofia Papagiannaki | descendant = '%s/%s' % (oname, get_random_name())
|
265 | f3787696 | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
266 | f3787696 | Sofia Papagiannaki | # request public
|
267 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
268 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
269 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
270 | f3787696 | Sofia Papagiannaki | self.assertTrue(oname in objects) |
271 | f3787696 | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
272 | f3787696 | Sofia Papagiannaki | |
273 | 3a19e99b | Sofia Papagiannaki | def test_list_shared_public(self): |
274 | 3a19e99b | Sofia Papagiannaki | # publish an object
|
275 | 3a19e99b | Sofia Papagiannaki | cname = self.cnames[0] |
276 | 3a19e99b | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
277 | 3a19e99b | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
278 | 3a19e99b | Sofia Papagiannaki | oname = onames.pop() |
279 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, oname) |
280 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
281 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
282 | 3a19e99b | Sofia Papagiannaki | |
283 | 3a19e99b | Sofia Papagiannaki | # share another
|
284 | 3a19e99b | Sofia Papagiannaki | other = onames.pop() |
285 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, other) |
286 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
287 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
288 | 3a19e99b | Sofia Papagiannaki | |
289 | 3a19e99b | Sofia Papagiannaki | # list shared and public objects and assert object is listed
|
290 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url) |
291 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
292 | 3a19e99b | Sofia Papagiannaki | objects = json.loads(r.content) |
293 | 3a19e99b | Sofia Papagiannaki | self.assertEqual([o['name'] for o in objects], sorted([oname, other])) |
294 | 3a19e99b | Sofia Papagiannaki | for o in objects: |
295 | 3a19e99b | Sofia Papagiannaki | if o['name'] == oname: |
296 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('x_object_public' in o.keys()) |
297 | 3a19e99b | Sofia Papagiannaki | elif o['name'] == other: |
298 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('x_object_sharing' in o.keys()) |
299 | 3a19e99b | Sofia Papagiannaki | |
300 | 3a19e99b | Sofia Papagiannaki | # assert not listing shared and public to a not shared user
|
301 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url, |
302 | 3a19e99b | Sofia Papagiannaki | user='bob')
|
303 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
304 | 3a19e99b | Sofia Papagiannaki | |
305 | 3a19e99b | Sofia Papagiannaki | # assert not listing public to a shared user
|
306 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=&format=json' % container_url, |
307 | 3a19e99b | Sofia Papagiannaki | user='alice')
|
308 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
309 | 3a19e99b | Sofia Papagiannaki | |
310 | 3a19e99b | Sofia Papagiannaki | # create child object
|
311 | 3a19e99b | Sofia Papagiannaki | descendant = strnextling(oname) |
312 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
313 | 3a19e99b | Sofia Papagiannaki | # request public and assert child obejct is not listed
|
314 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=' % container_url) |
315 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
316 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
317 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
318 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
319 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(oname in objects) |
320 | 3a19e99b | Sofia Papagiannaki | (self.assertTrue(o not in objects) for o in o_names[1:]) |
321 | 3a19e99b | Sofia Papagiannaki | |
322 | 3a19e99b | Sofia Papagiannaki | # test folder inheritance
|
323 | 3a19e99b | Sofia Papagiannaki | oname, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true') |
324 | 3a19e99b | Sofia Papagiannaki | # create child object
|
325 | bc4f25c0 | Sofia Papagiannaki | descendant = '%s/%s' % (oname, get_random_name())
|
326 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname, descendant)
|
327 | 3a19e99b | Sofia Papagiannaki | # request public
|
328 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=&public=' % container_url) |
329 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
330 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
331 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
332 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
333 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(oname in objects) |
334 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(descendant not in objects) |
335 | 3a19e99b | Sofia Papagiannaki | |
336 | f3787696 | Sofia Papagiannaki | def test_list_objects(self): |
337 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
338 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
339 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url)
|
340 | f3787696 | Sofia Papagiannaki | self.assertTrue(r.status_code, 200) |
341 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
342 | f3787696 | Sofia Papagiannaki | if '' in objects: |
343 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
344 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, sorted(self.objects[cname].keys())) |
345 | f3787696 | Sofia Papagiannaki | |
346 | f3787696 | Sofia Papagiannaki | def test_list_objects_containing_slash(self): |
347 | f3787696 | Sofia Papagiannaki | self.create_container('test') |
348 | 3a19e99b | Sofia Papagiannaki | self.upload_object('test', quote('/objectname', '')) |
349 | f3787696 | Sofia Papagiannaki | |
350 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'test') |
351 | d6a92fa0 | Sofia Papagiannaki | |
352 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url)
|
353 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
354 | f3787696 | Sofia Papagiannaki | if '' in objects: |
355 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
356 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, ['/objectname']) |
357 | f3787696 | Sofia Papagiannaki | |
358 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=json' % url) |
359 | f3787696 | Sofia Papagiannaki | try:
|
360 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
361 | f3787696 | Sofia Papagiannaki | except:
|
362 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
363 | f3787696 | Sofia Papagiannaki | self.assertEqual([o['name'] for o in objects], ['/objectname']) |
364 | f3787696 | Sofia Papagiannaki | |
365 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=xml' % url) |
366 | f3787696 | Sofia Papagiannaki | try:
|
367 | f3787696 | Sofia Papagiannaki | objects = minidom.parseString(r.content) |
368 | f3787696 | Sofia Papagiannaki | except:
|
369 | f3787696 | Sofia Papagiannaki | self.fail('xml format expected') |
370 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
371 | f3787696 | Sofia Papagiannaki | [n.firstChild.data for n in objects.getElementsByTagName('name')], |
372 | f3787696 | Sofia Papagiannaki | ['/objectname'])
|
373 | f3787696 | Sofia Papagiannaki | |
374 | f3787696 | Sofia Papagiannaki | def test_list_objects_with_limit_marker(self): |
375 | f3787696 | Sofia Papagiannaki | cname = self.cnames[0] |
376 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
377 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=qwert' % url) |
378 | f3787696 | Sofia Papagiannaki | self.assertTrue(r.status_code != 500) |
379 | f3787696 | Sofia Papagiannaki | |
380 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=2' % url) |
381 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
382 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
383 | f3787696 | Sofia Papagiannaki | if '' in objects: |
384 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
385 | f3787696 | Sofia Papagiannaki | |
386 | f3787696 | Sofia Papagiannaki | onames = sorted(self.objects[cname].keys()) |
387 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, onames[:2]) |
388 | f3787696 | Sofia Papagiannaki | |
389 | f3787696 | Sofia Papagiannaki | markers = ['How To Win Friends And Influence People.pdf',
|
390 | f3787696 | Sofia Papagiannaki | 'moms_birthday.jpg']
|
391 | f3787696 | Sofia Papagiannaki | limit = 4
|
392 | f3787696 | Sofia Papagiannaki | for m in markers: |
393 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?limit=%s&marker=%s' % (url, limit, m)) |
394 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
395 | f3787696 | Sofia Papagiannaki | if '' in objects: |
396 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
397 | f3787696 | Sofia Papagiannaki | start = onames.index(m) + 1
|
398 | f3787696 | Sofia Papagiannaki | end = start + limit |
399 | f3787696 | Sofia Papagiannaki | end = end if len(onames) >= end else len(onames) |
400 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, onames[start:end])
|
401 | f3787696 | Sofia Papagiannaki | |
402 | f3787696 | Sofia Papagiannaki | @pithos_test_settings(API_LIST_LIMIT=10) |
403 | f3787696 | Sofia Papagiannaki | def test_list_limit_exceeds(self): |
404 | f3787696 | Sofia Papagiannaki | self.create_container('container') |
405 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'container') |
406 | f3787696 | Sofia Papagiannaki | |
407 | f3787696 | Sofia Papagiannaki | for _ in range(pithos_settings.API_LIST_LIMIT + 1): |
408 | f3787696 | Sofia Papagiannaki | self.upload_object('container') |
409 | f3787696 | Sofia Papagiannaki | |
410 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?format=json' % url) |
411 | f3787696 | Sofia Papagiannaki | try:
|
412 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
413 | f3787696 | Sofia Papagiannaki | except:
|
414 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
415 | f3787696 | Sofia Papagiannaki | self.assertEqual(pithos_settings.API_LIST_LIMIT,
|
416 | f3787696 | Sofia Papagiannaki | len(objects))
|
417 | f3787696 | Sofia Papagiannaki | |
418 | f3787696 | Sofia Papagiannaki | def test_list_pseudo_hierarchical_folders(self): |
419 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
420 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?prefix=photos&delimiter=/' % url) |
421 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
422 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
423 | f3787696 | Sofia Papagiannaki | if '' in objects: |
424 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
425 | f3787696 | Sofia Papagiannaki | self.assertEquals(
|
426 | f3787696 | Sofia Papagiannaki | ['photos/animals/', 'photos/me.jpg', 'photos/plants/'], |
427 | f3787696 | Sofia Papagiannaki | objects) |
428 | f3787696 | Sofia Papagiannaki | |
429 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?prefix=photos/animals&delimiter=/' % url) |
430 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
431 | f3787696 | Sofia Papagiannaki | if '' in objects: |
432 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
433 | f3787696 | Sofia Papagiannaki | self.assertEquals(
|
434 | f3787696 | Sofia Papagiannaki | ['photos/animals/cats/', 'photos/animals/dogs/'], objects) |
435 | f3787696 | Sofia Papagiannaki | |
436 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?path=photos' % url) |
437 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
438 | f3787696 | Sofia Papagiannaki | if '' in objects: |
439 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
440 | f3787696 | Sofia Papagiannaki | self.assertEquals(['photos/me.jpg'], objects) |
441 | f3787696 | Sofia Papagiannaki | |
442 | f3787696 | Sofia Papagiannaki | def test_extended_list_json(self): |
443 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
444 | f3787696 | Sofia Papagiannaki | params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals', |
445 | f3787696 | Sofia Papagiannaki | 'delimiter': '/'} |
446 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?%s' % (url, urlencode(params))) |
447 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
448 | f3787696 | Sofia Papagiannaki | try:
|
449 | f3787696 | Sofia Papagiannaki | objects = json.loads(r.content) |
450 | f3787696 | Sofia Papagiannaki | except:
|
451 | f3787696 | Sofia Papagiannaki | self.fail('json format expected') |
452 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/') |
453 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/') |
454 | f3787696 | Sofia Papagiannaki | |
455 | f3787696 | Sofia Papagiannaki | def test_extended_list_xml(self): |
456 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples') |
457 | f3787696 | Sofia Papagiannaki | params = {'format': 'xml', 'limit': 4, 'prefix': 'photos', |
458 | f3787696 | Sofia Papagiannaki | 'delimiter': '/'} |
459 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?%s' % (url, urlencode(params))) |
460 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
461 | f3787696 | Sofia Papagiannaki | try:
|
462 | f3787696 | Sofia Papagiannaki | xml = minidom.parseString(r.content) |
463 | f3787696 | Sofia Papagiannaki | except:
|
464 | f3787696 | Sofia Papagiannaki | self.fail('xml format expected') |
465 | f3787696 | Sofia Papagiannaki | self.assert_extended(xml, 'xml', 'object', size=4) |
466 | f3787696 | Sofia Papagiannaki | dirs = xml.getElementsByTagName('subdir')
|
467 | f3787696 | Sofia Papagiannaki | self.assertEqual(len(dirs), 2) |
468 | f3787696 | Sofia Papagiannaki | self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/') |
469 | f3787696 | Sofia Papagiannaki | self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/') |
470 | f3787696 | Sofia Papagiannaki | |
471 | f3787696 | Sofia Papagiannaki | objects = xml.getElementsByTagName('name')
|
472 | f3787696 | Sofia Papagiannaki | self.assertEqual(len(objects), 1) |
473 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg') |
474 | f3787696 | Sofia Papagiannaki | |
475 | f3787696 | Sofia Papagiannaki | def test_list_meta_double_matching(self): |
476 | f3787696 | Sofia Papagiannaki | # update object meta
|
477 | f3787696 | Sofia Papagiannaki | cname = 'apples'
|
478 | d6a92fa0 | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
479 | f3787696 | Sofia Papagiannaki | oname = self.objects[cname].keys().pop()
|
480 | f3787696 | Sofia Papagiannaki | meta = {'quality': 'aaa', 'stock': 'true'} |
481 | f3787696 | Sofia Papagiannaki | headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v) |
482 | f3787696 | Sofia Papagiannaki | for k, v in meta.iteritems()) |
483 | d6a92fa0 | Sofia Papagiannaki | object_url = join_urls(container_url, oname) |
484 | d6a92fa0 | Sofia Papagiannaki | self.post(object_url, content_type='', **headers) |
485 | f3787696 | Sofia Papagiannaki | |
486 | f3787696 | Sofia Papagiannaki | # list objects that satisfy the criteria
|
487 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Stock' % container_url) |
488 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
489 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
490 | f3787696 | Sofia Papagiannaki | if '' in objects: |
491 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
492 | f3787696 | Sofia Papagiannaki | self.assertEqual(objects, [oname])
|
493 | f3787696 | Sofia Papagiannaki | |
494 | f3787696 | Sofia Papagiannaki | def test_list_using_meta(self): |
495 | f3787696 | Sofia Papagiannaki | # update object meta
|
496 | f3787696 | Sofia Papagiannaki | cname = 'apples'
|
497 | d6a92fa0 | Sofia Papagiannaki | container_url = join_urls(self.pithos_path, self.user, cname) |
498 | d6a92fa0 | Sofia Papagiannaki | |
499 | 3a19e99b | Sofia Papagiannaki | onames = self.objects[cname].keys()
|
500 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[0])
|
501 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa') |
502 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
503 | d6a92fa0 | Sofia Papagiannaki | |
504 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[1])
|
505 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab') |
506 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
507 | f3787696 | Sofia Papagiannaki | |
508 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[2])
|
509 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100') |
510 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
511 | d6a92fa0 | Sofia Papagiannaki | |
512 | 3a19e99b | Sofia Papagiannaki | url = join_urls(container_url, onames[3])
|
513 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200') |
514 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
515 | f3787696 | Sofia Papagiannaki | |
516 | f3787696 | Sofia Papagiannaki | # test multiple existence criteria matches
|
517 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Stock' % container_url) |
518 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
519 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
520 | f3787696 | Sofia Papagiannaki | if '' in objects: |
521 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
522 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames)) |
523 | f3787696 | Sofia Papagiannaki | |
524 | f3787696 | Sofia Papagiannaki | # list objects that satisfy the existence criteria
|
525 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Stock' % container_url) |
526 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
527 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
528 | f3787696 | Sofia Papagiannaki | if '' in objects: |
529 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
530 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[2:])) |
531 | f3787696 | Sofia Papagiannaki | |
532 | f3787696 | Sofia Papagiannaki | # test case insensitive existence criteria matching
|
533 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=quality' % container_url) |
534 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
535 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
536 | f3787696 | Sofia Papagiannaki | if '' in objects: |
537 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
538 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[:2])) |
539 | f3787696 | Sofia Papagiannaki | |
540 | f3787696 | Sofia Papagiannaki | # test do not all existencecriteria match
|
541 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=Quality,Foo' % container_url) |
542 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
543 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
544 | f3787696 | Sofia Papagiannaki | if '' in objects: |
545 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
546 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, sorted(onames[:2])) |
547 | f3787696 | Sofia Papagiannaki | |
548 | f3787696 | Sofia Papagiannaki | # test equals criteria
|
549 | d6a92fa0 | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa'))) |
550 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
551 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
552 | f3787696 | Sofia Papagiannaki | if '' in objects: |
553 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
554 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[0]]) |
555 | f3787696 | Sofia Papagiannaki | |
556 | f3787696 | Sofia Papagiannaki | # test not equals criteria
|
557 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Quality!=aaa'))) |
558 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
559 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
560 | f3787696 | Sofia Papagiannaki | if '' in objects: |
561 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
562 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[1]]) |
563 | f3787696 | Sofia Papagiannaki | |
564 | f3787696 | Sofia Papagiannaki | # test lte criteria
|
565 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Stock<=120'))) |
566 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
567 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
568 | f3787696 | Sofia Papagiannaki | if '' in objects: |
569 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
570 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[2]]) |
571 | f3787696 | Sofia Papagiannaki | |
572 | f3787696 | Sofia Papagiannaki | # test gte criteria
|
573 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?meta=%s' % (container_url, quote('Stock>=200'))) |
574 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
575 | f3787696 | Sofia Papagiannaki | objects = r.content.split('\n')
|
576 | f3787696 | Sofia Papagiannaki | if '' in objects: |
577 | f3787696 | Sofia Papagiannaki | objects.remove('')
|
578 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(objects, [onames[3]]) |
579 | f3787696 | Sofia Papagiannaki | |
580 | 3a19e99b | Sofia Papagiannaki | def test_if_modified_since(self): |
581 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
582 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
583 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
584 | 3a19e99b | Sofia Papagiannaki | t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
585 | 3a19e99b | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
586 | 3a19e99b | Sofia Papagiannaki | |
587 | 3a19e99b | Sofia Papagiannaki | # Check not modified
|
588 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
589 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
590 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
591 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 304) |
592 | 3a19e99b | Sofia Papagiannaki | |
593 | 3a19e99b | Sofia Papagiannaki | # modify account: add container
|
594 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
595 | 3a19e99b | Sofia Papagiannaki | oname = self.upload_object(cname)[0] |
596 | 3a19e99b | Sofia Papagiannaki | |
597 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
598 | 3a19e99b | Sofia Papagiannaki | objects = self.objects[cname].keys()
|
599 | 3a19e99b | Sofia Papagiannaki | objects.append(oname) |
600 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
601 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
602 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
603 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], sorted(objects)) |
604 | 3a19e99b | Sofia Papagiannaki | |
605 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
606 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
607 | 3a19e99b | Sofia Papagiannaki | t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
608 | 3a19e99b | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
609 | 3a19e99b | Sofia Papagiannaki | |
610 | 3a19e99b | Sofia Papagiannaki | # modify account: update account meta
|
611 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
612 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, {'foo': 'bar'}) |
613 | 3a19e99b | Sofia Papagiannaki | |
614 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
615 | 3a19e99b | Sofia Papagiannaki | for t in t2_formats: |
616 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
617 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
618 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], sorted(objects)) |
619 | 3a19e99b | Sofia Papagiannaki | |
620 | 3a19e99b | Sofia Papagiannaki | def test_if_modified_since_invalid_date(self): |
621 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
622 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
623 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday') |
624 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
625 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.content.split('\n')[:-1], |
626 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'].keys())) |
627 | 3a19e99b | Sofia Papagiannaki | |
628 | 3a19e99b | Sofia Papagiannaki | def test_if_not_modified_since(self): |
629 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
630 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
631 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
632 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
633 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
634 | 3a19e99b | Sofia Papagiannaki | |
635 | 3a19e99b | Sofia Papagiannaki | # Check unmodified
|
636 | 3a19e99b | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
637 | 3a19e99b | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
638 | 3a19e99b | Sofia Papagiannaki | for t in t1_formats: |
639 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
640 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
641 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(
|
642 | 3a19e99b | Sofia Papagiannaki | r.content.split('\n')[:-1], |
643 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'])) |
644 | 3a19e99b | Sofia Papagiannaki | |
645 | 3a19e99b | Sofia Papagiannaki | # modify account: add container
|
646 | 3a19e99b | Sofia Papagiannaki | _time.sleep(2)
|
647 | 3a19e99b | Sofia Papagiannaki | self.upload_object(cname)
|
648 | 3a19e99b | Sofia Papagiannaki | |
649 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
650 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
651 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
652 | 3a19e99b | Sofia Papagiannaki | t2 = t - datetime.timedelta(seconds=1)
|
653 | 3a19e99b | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
654 | 3a19e99b | Sofia Papagiannaki | |
655 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
656 | 3a19e99b | Sofia Papagiannaki | for t in t2_formats: |
657 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
658 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
659 | 3a19e99b | Sofia Papagiannaki | |
660 | 3a19e99b | Sofia Papagiannaki | # modify account: update account meta
|
661 | 3a19e99b | Sofia Papagiannaki | _time.sleep(1)
|
662 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, {'foo': 'bar'}) |
663 | 3a19e99b | Sofia Papagiannaki | |
664 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
665 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
666 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
667 | 3a19e99b | Sofia Papagiannaki | t3 = t - datetime.timedelta(seconds=1)
|
668 | 3a19e99b | Sofia Papagiannaki | t3_formats = map(t3.strftime, DATE_FORMATS)
|
669 | 3a19e99b | Sofia Papagiannaki | |
670 | 3a19e99b | Sofia Papagiannaki | # Check modified
|
671 | 3a19e99b | Sofia Papagiannaki | for t in t3_formats: |
672 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
673 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
674 | 3a19e99b | Sofia Papagiannaki | |
675 | 3a19e99b | Sofia Papagiannaki | def test_if_unmodified_since(self): |
676 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
677 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
678 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
679 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
680 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
681 | 3a19e99b | Sofia Papagiannaki | t = t + datetime.timedelta(seconds=1)
|
682 | 3a19e99b | Sofia Papagiannaki | t_formats = map(t.strftime, DATE_FORMATS)
|
683 | 3a19e99b | Sofia Papagiannaki | |
684 | 3a19e99b | Sofia Papagiannaki | for tf in t_formats: |
685 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
|
686 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
687 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(
|
688 | 3a19e99b | Sofia Papagiannaki | r.content.split('\n')[:-1], |
689 | 3a19e99b | Sofia Papagiannaki | sorted(self.objects['apples'])) |
690 | 3a19e99b | Sofia Papagiannaki | |
691 | 3a19e99b | Sofia Papagiannaki | def test_if_unmodified_since_precondition_failed(self): |
692 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
693 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname) |
694 | 3a19e99b | Sofia Papagiannaki | container_info = self.get_container_info(cname)
|
695 | 3a19e99b | Sofia Papagiannaki | last_modified = container_info['Last-Modified']
|
696 | 3a19e99b | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
697 | 3a19e99b | Sofia Papagiannaki | t = t - datetime.timedelta(seconds=1)
|
698 | 3a19e99b | Sofia Papagiannaki | t_formats = map(t.strftime, DATE_FORMATS)
|
699 | 3a19e99b | Sofia Papagiannaki | |
700 | 3a19e99b | Sofia Papagiannaki | for tf in t_formats: |
701 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
|
702 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
703 | 3a19e99b | Sofia Papagiannaki | |
704 | 3a19e99b | Sofia Papagiannaki | |
705 | 3a19e99b | Sofia Papagiannaki | class ContainerPut(PithosAPITest): |
706 | 3a19e99b | Sofia Papagiannaki | def test_create(self): |
707 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
708 | 3a19e99b | Sofia Papagiannaki | self.list_containers()
|
709 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
710 | 3a19e99b | Sofia Papagiannaki | |
711 | 3a19e99b | Sofia Papagiannaki | def test_create_twice(self): |
712 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
713 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
714 | 2a194295 | Sofia Papagiannaki | r = self.create_container('c1')[-1] |
715 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
716 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
717 | 3a19e99b | Sofia Papagiannaki | |
718 | 3a19e99b | Sofia Papagiannaki | |
719 | 3a19e99b | Sofia Papagiannaki | class ContainerPost(PithosAPITest): |
720 | 3a19e99b | Sofia Papagiannaki | def test_update_meta(self): |
721 | 3a19e99b | Sofia Papagiannaki | cname = 'apples'
|
722 | 3a19e99b | Sofia Papagiannaki | self.create_container(cname)
|
723 | 3a19e99b | Sofia Papagiannaki | meta = {'test': 'test33', 'tost': 'tost22'} |
724 | 3a19e99b | Sofia Papagiannaki | self.update_container_meta(cname, meta)
|
725 | 3a19e99b | Sofia Papagiannaki | info = self.get_container_info(cname)
|
726 | 3a19e99b | Sofia Papagiannaki | for k, v in meta.items(): |
727 | 3a19e99b | Sofia Papagiannaki | k = 'x-container-meta-%s' % k
|
728 | 3a19e99b | Sofia Papagiannaki | self.assertTrue(k in info) |
729 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(info[k], v)
|
730 | 3a19e99b | Sofia Papagiannaki | |
731 | 3a19e99b | Sofia Papagiannaki | def test_quota(self): |
732 | 3a19e99b | Sofia Papagiannaki | self.create_container('c1') |
733 | 3a19e99b | Sofia Papagiannaki | |
734 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
735 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='100') |
736 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
737 | 3a19e99b | Sofia Papagiannaki | |
738 | 3a19e99b | Sofia Papagiannaki | info = self.get_container_info('c1') |
739 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('x-container-policy-quota' in info) |
740 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(info['x-container-policy-quota'], '100') |
741 | 3a19e99b | Sofia Papagiannaki | |
742 | 3a19e99b | Sofia Papagiannaki | r = self.upload_object('c1', length=101, verify=False)[2] |
743 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 413) |
744 | 3a19e99b | Sofia Papagiannaki | |
745 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
746 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='0') |
747 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
748 | 3a19e99b | Sofia Papagiannaki | |
749 | 3a19e99b | Sofia Papagiannaki | r = self.upload_object('c1', length=1) |
750 | 3a19e99b | Sofia Papagiannaki | |
751 | 3a19e99b | Sofia Papagiannaki | |
752 | 3a19e99b | Sofia Papagiannaki | class ContainerDelete(PithosAPITest): |
753 | 3a19e99b | Sofia Papagiannaki | def setUp(self): |
754 | 3a19e99b | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
755 | 3a19e99b | Sofia Papagiannaki | cnames = ['c1', 'c2'] |
756 | 3a19e99b | Sofia Papagiannaki | |
757 | 3a19e99b | Sofia Papagiannaki | for c in cnames: |
758 | 3a19e99b | Sofia Papagiannaki | self.create_container(c)
|
759 | 3a19e99b | Sofia Papagiannaki | |
760 | 3a19e99b | Sofia Papagiannaki | def test_delete(self): |
761 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
762 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
763 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 204) |
764 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' not in self.list_containers(format=None)) |
765 | 3a19e99b | Sofia Papagiannaki | |
766 | 3a19e99b | Sofia Papagiannaki | def test_delete_non_empty(self): |
767 | 3a19e99b | Sofia Papagiannaki | self.upload_object('c1') |
768 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c1') |
769 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
770 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 409) |
771 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |
772 | 3a19e99b | Sofia Papagiannaki | |
773 | 3a19e99b | Sofia Papagiannaki | def test_delete_invalid(self): |
774 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'c3') |
775 | 3a19e99b | Sofia Papagiannaki | r = self.delete(url)
|
776 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |
777 | 3a19e99b | Sofia Papagiannaki | |
778 | 3a19e99b | Sofia Papagiannaki | def test_delete_contents(self): |
779 | 3a19e99b | Sofia Papagiannaki | folder = self.create_folder('c1')[0] |
780 | 3a19e99b | Sofia Papagiannaki | descendant = strnextling(folder) |
781 | 3a19e99b | Sofia Papagiannaki | self.upload_object('c1', descendant) |
782 | 3a19e99b | Sofia Papagiannaki | self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0] |
783 | 3a19e99b | Sofia Papagiannaki | |
784 | 3a19e99b | Sofia Papagiannaki | self.delete('%s?delimiter=/' % join_urls( |
785 | 3a19e99b | Sofia Papagiannaki | self.pithos_path, self.user, 'c1')) |
786 | 3a19e99b | Sofia Papagiannaki | self.assertEqual([], self.list_objects('c1')) |
787 | 3a19e99b | Sofia Papagiannaki | self.assertTrue('c1' in self.list_containers(format=None)) |