root / snf-pithos-app / pithos / api / test / public.py @ f5bbcb5d
History | View | Annotate | Download (8.3 kB)
1 | bc4f25c0 | Sofia Papagiannaki | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | bc4f25c0 | Sofia Papagiannaki | #
|
3 | bc4f25c0 | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
4 | bc4f25c0 | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
5 | bc4f25c0 | Sofia Papagiannaki | # conditions are met:
|
6 | bc4f25c0 | Sofia Papagiannaki | #
|
7 | bc4f25c0 | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
8 | bc4f25c0 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
9 | bc4f25c0 | Sofia Papagiannaki | # disclaimer.
|
10 | bc4f25c0 | Sofia Papagiannaki | #
|
11 | bc4f25c0 | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
12 | bc4f25c0 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
13 | bc4f25c0 | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
14 | bc4f25c0 | Sofia Papagiannaki | # provided with the distribution.
|
15 | bc4f25c0 | Sofia Papagiannaki | #
|
16 | bc4f25c0 | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | bc4f25c0 | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | bc4f25c0 | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | bc4f25c0 | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | bc4f25c0 | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | bc4f25c0 | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | bc4f25c0 | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | bc4f25c0 | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | bc4f25c0 | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | bc4f25c0 | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | bc4f25c0 | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | bc4f25c0 | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
28 | bc4f25c0 | Sofia Papagiannaki | #
|
29 | bc4f25c0 | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
30 | bc4f25c0 | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
31 | bc4f25c0 | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
32 | bc4f25c0 | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
33 | bc4f25c0 | Sofia Papagiannaki | |
34 | bc4f25c0 | Sofia Papagiannaki | import random |
35 | bc4f25c0 | Sofia Papagiannaki | import datetime |
36 | bc4f25c0 | Sofia Papagiannaki | import time as _time |
37 | bc4f25c0 | Sofia Papagiannaki | |
38 | bc4f25c0 | Sofia Papagiannaki | from synnefo.lib import join_urls |
39 | bc4f25c0 | Sofia Papagiannaki | |
40 | bc4f25c0 | Sofia Papagiannaki | import django.utils.simplejson as json |
41 | bc4f25c0 | Sofia Papagiannaki | |
42 | bc4f25c0 | Sofia Papagiannaki | from pithos.api.test import PithosAPITest |
43 | bc4f25c0 | Sofia Papagiannaki | from pithos.api.test.util import get_random_name |
44 | bc4f25c0 | Sofia Papagiannaki | from pithos.api import settings as pithos_settings |
45 | bc4f25c0 | Sofia Papagiannaki | |
46 | bc4f25c0 | Sofia Papagiannaki | |
47 | bc4f25c0 | Sofia Papagiannaki | class TestPublic(PithosAPITest): |
48 | bc4f25c0 | Sofia Papagiannaki | def _assert_not_public_object(self, cname, oname): |
49 | bc4f25c0 | Sofia Papagiannaki | info = self.get_object_info(cname, oname)
|
50 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue('X-Object-Public' not in info) |
51 | bc4f25c0 | Sofia Papagiannaki | |
52 | bc4f25c0 | Sofia Papagiannaki | def _assert_public_object(self, cname, oname, odata): |
53 | bc4f25c0 | Sofia Papagiannaki | info = self.get_object_info(cname, oname)
|
54 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue('X-Object-Public' in info) |
55 | bc4f25c0 | Sofia Papagiannaki | public = info['X-Object-Public']
|
56 | bc4f25c0 | Sofia Papagiannaki | |
57 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue(len(public) >= pithos_settings.PUBLIC_URL_SECURITY) |
58 | bc4f25c0 | Sofia Papagiannaki | (self.assertTrue(l in pithos_settings.PUBLIC_URL_ALPHABET) for |
59 | bc4f25c0 | Sofia Papagiannaki | l in public)
|
60 | bc4f25c0 | Sofia Papagiannaki | |
61 | bc4f25c0 | Sofia Papagiannaki | r = self.get(public, user='user2') |
62 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
63 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue('X-Object-Public' not in r) |
64 | bc4f25c0 | Sofia Papagiannaki | |
65 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.content, odata)
|
66 | bc4f25c0 | Sofia Papagiannaki | |
67 | bc4f25c0 | Sofia Papagiannaki | # assert other users cannot access the object using the priavate path
|
68 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
69 | bc4f25c0 | Sofia Papagiannaki | r = self.head(url, user='user2') |
70 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
71 | bc4f25c0 | Sofia Papagiannaki | |
72 | bc4f25c0 | Sofia Papagiannaki | r = self.get(url, user='user2') |
73 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
74 | bc4f25c0 | Sofia Papagiannaki | |
75 | bc4f25c0 | Sofia Papagiannaki | return public
|
76 | bc4f25c0 | Sofia Papagiannaki | |
77 | bc4f25c0 | Sofia Papagiannaki | def test_set_object_public(self): |
78 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
79 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
80 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
81 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
82 | bc4f25c0 | Sofia Papagiannaki | |
83 | bc4f25c0 | Sofia Papagiannaki | # set public
|
84 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
85 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
86 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
87 | bc4f25c0 | Sofia Papagiannaki | |
88 | bc4f25c0 | Sofia Papagiannaki | self._assert_public_object(cname, oname, odata)
|
89 | bc4f25c0 | Sofia Papagiannaki | |
90 | bc4f25c0 | Sofia Papagiannaki | def test_set_twice(self): |
91 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
92 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
93 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
94 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
95 | bc4f25c0 | Sofia Papagiannaki | |
96 | bc4f25c0 | Sofia Papagiannaki | # set public
|
97 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
98 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
99 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
100 | bc4f25c0 | Sofia Papagiannaki | |
101 | bc4f25c0 | Sofia Papagiannaki | public = self._assert_public_object(cname, oname, odata)
|
102 | bc4f25c0 | Sofia Papagiannaki | |
103 | bc4f25c0 | Sofia Papagiannaki | # set public
|
104 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
105 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
106 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
107 | bc4f25c0 | Sofia Papagiannaki | |
108 | bc4f25c0 | Sofia Papagiannaki | public2 = self._assert_public_object(cname, oname, odata)
|
109 | bc4f25c0 | Sofia Papagiannaki | |
110 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(public, public2)
|
111 | bc4f25c0 | Sofia Papagiannaki | |
112 | bc4f25c0 | Sofia Papagiannaki | def test_set_unset_set(self): |
113 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
114 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
115 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
116 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
117 | bc4f25c0 | Sofia Papagiannaki | |
118 | bc4f25c0 | Sofia Papagiannaki | # set public
|
119 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
120 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
121 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
122 | bc4f25c0 | Sofia Papagiannaki | |
123 | bc4f25c0 | Sofia Papagiannaki | public = self._assert_public_object(cname, oname, odata)
|
124 | bc4f25c0 | Sofia Papagiannaki | |
125 | bc4f25c0 | Sofia Papagiannaki | # unset public
|
126 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
127 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false') |
128 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
129 | bc4f25c0 | Sofia Papagiannaki | |
130 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
131 | bc4f25c0 | Sofia Papagiannaki | |
132 | bc4f25c0 | Sofia Papagiannaki | # set public
|
133 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
134 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
135 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
136 | bc4f25c0 | Sofia Papagiannaki | |
137 | bc4f25c0 | Sofia Papagiannaki | public2 = self._assert_public_object(cname, oname, odata)
|
138 | bc4f25c0 | Sofia Papagiannaki | |
139 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue(public != public2)
|
140 | bc4f25c0 | Sofia Papagiannaki | |
141 | bc4f25c0 | Sofia Papagiannaki | # unset public
|
142 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
143 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false') |
144 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
145 | bc4f25c0 | Sofia Papagiannaki | |
146 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
147 | bc4f25c0 | Sofia Papagiannaki | |
148 | bc4f25c0 | Sofia Papagiannaki | def test_update_public_object(self): |
149 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
150 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
151 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
152 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
153 | bc4f25c0 | Sofia Papagiannaki | |
154 | bc4f25c0 | Sofia Papagiannaki | # set public
|
155 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
156 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
157 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
158 | bc4f25c0 | Sofia Papagiannaki | |
159 | bc4f25c0 | Sofia Papagiannaki | public = self._assert_public_object(cname, oname, odata)
|
160 | bc4f25c0 | Sofia Papagiannaki | |
161 | bc4f25c0 | Sofia Papagiannaki | odata2 = self.append_object_data(cname, oname)[1] |
162 | bc4f25c0 | Sofia Papagiannaki | |
163 | bc4f25c0 | Sofia Papagiannaki | public2 = self._assert_public_object(cname, oname, odata + odata2)
|
164 | bc4f25c0 | Sofia Papagiannaki | |
165 | bc4f25c0 | Sofia Papagiannaki | self.assertTrue(public == public2)
|
166 | bc4f25c0 | Sofia Papagiannaki | |
167 | bc4f25c0 | Sofia Papagiannaki | def test_delete_public_object(self): |
168 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
169 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
170 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
171 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
172 | bc4f25c0 | Sofia Papagiannaki | |
173 | bc4f25c0 | Sofia Papagiannaki | # set public
|
174 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
175 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
176 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
177 | bc4f25c0 | Sofia Papagiannaki | public = self._assert_public_object(cname, oname, odata)
|
178 | bc4f25c0 | Sofia Papagiannaki | |
179 | bc4f25c0 | Sofia Papagiannaki | # delete object
|
180 | bc4f25c0 | Sofia Papagiannaki | r = self.delete(url)
|
181 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 204) |
182 | bc4f25c0 | Sofia Papagiannaki | r = self.get(url)
|
183 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |
184 | bc4f25c0 | Sofia Papagiannaki | r = self.get(public)
|
185 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |
186 | bc4f25c0 | Sofia Papagiannaki | |
187 | bc4f25c0 | Sofia Papagiannaki | def test_delete_public_object_history(self): |
188 | bc4f25c0 | Sofia Papagiannaki | cname = get_random_name() |
189 | bc4f25c0 | Sofia Papagiannaki | self.create_container(cname)
|
190 | bc4f25c0 | Sofia Papagiannaki | oname, odata = self.upload_object(cname)[:-1] |
191 | bc4f25c0 | Sofia Papagiannaki | self._assert_not_public_object(cname, oname)
|
192 | bc4f25c0 | Sofia Papagiannaki | |
193 | bc4f25c0 | Sofia Papagiannaki | # set public
|
194 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
195 | bc4f25c0 | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
196 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
197 | bc4f25c0 | Sofia Papagiannaki | public = self._assert_public_object(cname, oname, odata)
|
198 | bc4f25c0 | Sofia Papagiannaki | |
199 | bc4f25c0 | Sofia Papagiannaki | for _ in range(random.randint(1, 10)): |
200 | bc4f25c0 | Sofia Papagiannaki | odata += self.append_object_data(cname, oname)[1] |
201 | bc4f25c0 | Sofia Papagiannaki | _time.sleep(1)
|
202 | bc4f25c0 | Sofia Papagiannaki | |
203 | bc4f25c0 | Sofia Papagiannaki | # get object versions
|
204 | bc4f25c0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, cname, oname) |
205 | bc4f25c0 | Sofia Papagiannaki | r = self.get('%s?version=list&format=json' % url) |
206 | bc4f25c0 | Sofia Papagiannaki | version_list = json.loads(r.content)['versions']
|
207 | f5bbcb5d | Sofia Papagiannaki | mtime = [int(float(t[1])) for t in version_list] |
208 | bc4f25c0 | Sofia Papagiannaki | |
209 | bc4f25c0 | Sofia Papagiannaki | # delete object history
|
210 | bc4f25c0 | Sofia Papagiannaki | i = random.randrange(len(mtime))
|
211 | bc4f25c0 | Sofia Papagiannaki | self.delete('%s?until=%d' % (url, mtime[i])) |
212 | bc4f25c0 | Sofia Papagiannaki | public2 = self._assert_public_object(cname, oname, odata)
|
213 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(public, public2)
|
214 | bc4f25c0 | Sofia Papagiannaki | |
215 | bc4f25c0 | Sofia Papagiannaki | # delete object histoy until now
|
216 | bc4f25c0 | Sofia Papagiannaki | _time.sleep(1)
|
217 | bc4f25c0 | Sofia Papagiannaki | t = datetime.datetime.utcnow() |
218 | bc4f25c0 | Sofia Papagiannaki | now = int(_time.mktime(t.timetuple()))
|
219 | bc4f25c0 | Sofia Papagiannaki | r = self.delete('%s?intil=%d' % (url, now)) |
220 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 204) |
221 | bc4f25c0 | Sofia Papagiannaki | r = self.get(url)
|
222 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |
223 | bc4f25c0 | Sofia Papagiannaki | r = self.get(public)
|
224 | bc4f25c0 | Sofia Papagiannaki | self.assertEqual(r.status_code, 404) |