Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / test / unicode.py @ ee7a28be

History | View | Annotate | Download (17.6 kB)

1 ee7a28be Sofia Papagiannaki
#!/usr/bin/env python
2 ee7a28be Sofia Papagiannaki
#coding=utf8
3 ee7a28be Sofia Papagiannaki
4 ee7a28be Sofia Papagiannaki
# Copyright 2011-2013 GRNET S.A. All rights reserved.
5 ee7a28be Sofia Papagiannaki
#
6 ee7a28be Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
7 ee7a28be Sofia Papagiannaki
# without modification, are permitted provided that the following
8 ee7a28be Sofia Papagiannaki
# conditions are met:
9 ee7a28be Sofia Papagiannaki
#
10 ee7a28be Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
11 ee7a28be Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
12 ee7a28be Sofia Papagiannaki
#      disclaimer.
13 ee7a28be Sofia Papagiannaki
#
14 ee7a28be Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
15 ee7a28be Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
16 ee7a28be Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
17 ee7a28be Sofia Papagiannaki
#      provided with the distribution.
18 ee7a28be Sofia Papagiannaki
#
19 ee7a28be Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 ee7a28be Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 ee7a28be Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 ee7a28be Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 ee7a28be Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 ee7a28be Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 ee7a28be Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 ee7a28be Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 ee7a28be Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 ee7a28be Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 ee7a28be Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 ee7a28be Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
31 ee7a28be Sofia Papagiannaki
#
32 ee7a28be Sofia Papagiannaki
# The views and conclusions contained in the software and
33 ee7a28be Sofia Papagiannaki
# documentation are those of the authors and should not be
34 ee7a28be Sofia Papagiannaki
# interpreted as representing official policies, either expressed
35 ee7a28be Sofia Papagiannaki
# or implied, of GRNET S.A.
36 ee7a28be Sofia Papagiannaki
37 ee7a28be Sofia Papagiannaki
from pithos.api.test import PithosAPITest, TEST_BLOCK_SIZE
38 ee7a28be Sofia Papagiannaki
from pithos.api.test.util import get_random_data
39 ee7a28be Sofia Papagiannaki
40 ee7a28be Sofia Papagiannaki
from synnefo.lib import join_urls
41 ee7a28be Sofia Papagiannaki
42 ee7a28be Sofia Papagiannaki
from urllib import quote
43 ee7a28be Sofia Papagiannaki
44 ee7a28be Sofia Papagiannaki
import random
45 ee7a28be Sofia Papagiannaki
46 ee7a28be Sofia Papagiannaki
47 ee7a28be Sofia Papagiannaki
class TestUnicode(PithosAPITest):
48 ee7a28be Sofia Papagiannaki
    #def setUp(self):
49 ee7a28be Sofia Papagiannaki
    #    super(TestUnicode, self).setUp()
50 ee7a28be Sofia Papagiannaki
    #    self.user = 'χρήστης'
51 ee7a28be Sofia Papagiannaki
52 ee7a28be Sofia Papagiannaki
    def test_create_container(self):
53 ee7a28be Sofia Papagiannaki
        cname = 'φάκελος'
54 ee7a28be Sofia Papagiannaki
        self.create_container(cname)
55 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
56 ee7a28be Sofia Papagiannaki
        r = self.head(url)
57 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
58 ee7a28be Sofia Papagiannaki
59 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
60 ee7a28be Sofia Papagiannaki
        r = self.get(url)
61 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
62 ee7a28be Sofia Papagiannaki
        containers = r.content.split('\n')
63 ee7a28be Sofia Papagiannaki
        self.assertTrue('φάκελος' in containers)
64 ee7a28be Sofia Papagiannaki
65 ee7a28be Sofia Papagiannaki
    def test_create_object(self):
66 ee7a28be Sofia Papagiannaki
        cname = 'φάκελος'
67 ee7a28be Sofia Papagiannaki
        oname = 'αντικείμενο'
68 ee7a28be Sofia Papagiannaki
        self.create_container(cname)
69 ee7a28be Sofia Papagiannaki
        odata = self.upload_object(cname, oname)[1]
70 ee7a28be Sofia Papagiannaki
71 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
72 ee7a28be Sofia Papagiannaki
        r = self.head(url)
73 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
74 ee7a28be Sofia Papagiannaki
75 ee7a28be Sofia Papagiannaki
        r = self.get(url)
76 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
77 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.content, odata)
78 ee7a28be Sofia Papagiannaki
79 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
80 ee7a28be Sofia Papagiannaki
        r = self.get(url)
81 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
82 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
83 ee7a28be Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in objects)
84 ee7a28be Sofia Papagiannaki
85 ee7a28be Sofia Papagiannaki
    def test_copy_object(self):
86 ee7a28be Sofia Papagiannaki
        src_container = 'φάκελος'
87 ee7a28be Sofia Papagiannaki
        src_object = 'αντικείμενο'
88 ee7a28be Sofia Papagiannaki
        dest_container = 'αντίγραφα'
89 ee7a28be Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
90 ee7a28be Sofia Papagiannaki
91 ee7a28be Sofia Papagiannaki
        self.create_container(src_container)
92 ee7a28be Sofia Papagiannaki
        self.upload_object(src_container, src_object)
93 ee7a28be Sofia Papagiannaki
94 ee7a28be Sofia Papagiannaki
        self.create_container(dest_container)
95 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, dest_container,
96 ee7a28be Sofia Papagiannaki
                        dest_object)
97 ee7a28be Sofia Papagiannaki
        self.put(url, data='',
98 ee7a28be Sofia Papagiannaki
                 HTTP_X_COPY_FROM='/%s/%s' % (src_container, src_object))
99 ee7a28be Sofia Papagiannaki
100 ee7a28be Sofia Papagiannaki
        # assert destination object exists
101 ee7a28be Sofia Papagiannaki
        r = self.head(url)
102 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
103 ee7a28be Sofia Papagiannaki
        r = self.get(url)
104 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
105 ee7a28be Sofia Papagiannaki
106 ee7a28be Sofia Papagiannaki
        # assert source object exists
107 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, src_container,
108 ee7a28be Sofia Papagiannaki
                        src_object)
109 ee7a28be Sofia Papagiannaki
        r = self.head(url)
110 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
111 ee7a28be Sofia Papagiannaki
        r = self.get(url)
112 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
113 ee7a28be Sofia Papagiannaki
114 ee7a28be Sofia Papagiannaki
        # list source container objects
115 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, src_container)
116 ee7a28be Sofia Papagiannaki
        r = self.get(url)
117 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
118 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
119 ee7a28be Sofia Papagiannaki
        self.assertTrue(src_object in objects)
120 ee7a28be Sofia Papagiannaki
        self.assertTrue(dest_object not in objects)
121 ee7a28be Sofia Papagiannaki
122 ee7a28be Sofia Papagiannaki
        # list destination container objects
123 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, dest_container)
124 ee7a28be Sofia Papagiannaki
        r = self.get(url)
125 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
126 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
127 ee7a28be Sofia Papagiannaki
        self.assertTrue(src_object not in objects)
128 ee7a28be Sofia Papagiannaki
        self.assertTrue(dest_object in objects)
129 ee7a28be Sofia Papagiannaki
130 ee7a28be Sofia Papagiannaki
    def test_move_object(self):
131 ee7a28be Sofia Papagiannaki
        src_container = 'φάκελος'
132 ee7a28be Sofia Papagiannaki
        src_object = 'αντικείμενο'
133 ee7a28be Sofia Papagiannaki
        dest_container = 'αντίγραα'
134 ee7a28be Sofia Papagiannaki
        dest_object = 'ασφαλές-αντίγραφο'
135 ee7a28be Sofia Papagiannaki
136 ee7a28be Sofia Papagiannaki
        self.create_container(src_container)
137 ee7a28be Sofia Papagiannaki
        self.upload_object(src_container, src_object)
138 ee7a28be Sofia Papagiannaki
139 ee7a28be Sofia Papagiannaki
        self.create_container(dest_container)
140 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, dest_container,
141 ee7a28be Sofia Papagiannaki
                        dest_object)
142 ee7a28be Sofia Papagiannaki
        self.put(url, data='',
143 ee7a28be Sofia Papagiannaki
                 HTTP_X_MOVE_FROM='/%s/%s' % (src_container, src_object))
144 ee7a28be Sofia Papagiannaki
145 ee7a28be Sofia Papagiannaki
        # assert destination object exists
146 ee7a28be Sofia Papagiannaki
        r = self.head(url)
147 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
148 ee7a28be Sofia Papagiannaki
        r = self.get(url)
149 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
150 ee7a28be Sofia Papagiannaki
151 ee7a28be Sofia Papagiannaki
        # assert source object does not exist
152 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, src_container,
153 ee7a28be Sofia Papagiannaki
                        src_object)
154 ee7a28be Sofia Papagiannaki
        r = self.head(url)
155 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
156 ee7a28be Sofia Papagiannaki
        r = self.get(url)
157 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
158 ee7a28be Sofia Papagiannaki
159 ee7a28be Sofia Papagiannaki
        # list source container objects
160 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, src_container)
161 ee7a28be Sofia Papagiannaki
        r = self.get(url)
162 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
163 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
164 ee7a28be Sofia Papagiannaki
        self.assertTrue(src_object not in objects)
165 ee7a28be Sofia Papagiannaki
        self.assertTrue(dest_object not in objects)
166 ee7a28be Sofia Papagiannaki
167 ee7a28be Sofia Papagiannaki
        # list destination container objects
168 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, dest_container)
169 ee7a28be Sofia Papagiannaki
        r = self.get(url)
170 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
171 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
172 ee7a28be Sofia Papagiannaki
        self.assertTrue(src_object not in objects)
173 ee7a28be Sofia Papagiannaki
        self.assertTrue(dest_object in objects)
174 ee7a28be Sofia Papagiannaki
175 ee7a28be Sofia Papagiannaki
    def test_delete_object(self):
176 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
177 ee7a28be Sofia Papagiannaki
        self.upload_object('φάκελος', 'αντικείμενο')
178 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
179 ee7a28be Sofia Papagiannaki
        r = self.get(url)
180 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
181 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
182 ee7a28be Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in objects)
183 ee7a28be Sofia Papagiannaki
184 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'αντικείμενο')
185 ee7a28be Sofia Papagiannaki
        r = self.head(url)
186 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
187 ee7a28be Sofia Papagiannaki
        r = self.get(url)
188 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
189 ee7a28be Sofia Papagiannaki
190 ee7a28be Sofia Papagiannaki
        r = self.delete(url)
191 ee7a28be Sofia Papagiannaki
        r = self.head(url)
192 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
193 ee7a28be Sofia Papagiannaki
        r = self.get(url)
194 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
195 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
196 ee7a28be Sofia Papagiannaki
        r = self.get(url)
197 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
198 ee7a28be Sofia Papagiannaki
        self.assertTrue('αντικείμενο' not in objects)
199 ee7a28be Sofia Papagiannaki
200 ee7a28be Sofia Papagiannaki
    def test_delete_container(self):
201 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
202 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
203 ee7a28be Sofia Papagiannaki
        r = self.get(url)
204 ee7a28be Sofia Papagiannaki
        containers = r.content.split('\n')
205 ee7a28be Sofia Papagiannaki
        self.assertTrue('φάκελος' in containers)
206 ee7a28be Sofia Papagiannaki
207 ee7a28be Sofia Papagiannaki
        self.upload_object('φάκελος', 'αντικείμενο')
208 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
209 ee7a28be Sofia Papagiannaki
        r = self.get(url)
210 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
211 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
212 ee7a28be Sofia Papagiannaki
        self.assertTrue('αντικείμενο' in objects)
213 ee7a28be Sofia Papagiannaki
214 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'αντικείμενο')
215 ee7a28be Sofia Papagiannaki
        r = self.head(url)
216 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
217 ee7a28be Sofia Papagiannaki
        r = self.get(url)
218 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
219 ee7a28be Sofia Papagiannaki
220 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
221 ee7a28be Sofia Papagiannaki
        r = self.delete(url)
222 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 409)
223 ee7a28be Sofia Papagiannaki
224 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'αντικείμενο')
225 ee7a28be Sofia Papagiannaki
        r = self.delete(url)
226 ee7a28be Sofia Papagiannaki
        r = self.head(url)
227 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
228 ee7a28be Sofia Papagiannaki
        r = self.get(url)
229 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
230 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
231 ee7a28be Sofia Papagiannaki
        r = self.get(url)
232 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
233 ee7a28be Sofia Papagiannaki
        self.assertTrue('αντικείμενο' not in objects)
234 ee7a28be Sofia Papagiannaki
235 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
236 ee7a28be Sofia Papagiannaki
        r = self.delete(url)
237 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
238 ee7a28be Sofia Papagiannaki
239 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
240 ee7a28be Sofia Papagiannaki
        r = self.get(url)
241 ee7a28be Sofia Papagiannaki
        containers = r.content.split('\n')
242 ee7a28be Sofia Papagiannaki
        self.assertTrue('φάκελος' not in containers)
243 ee7a28be Sofia Papagiannaki
244 ee7a28be Sofia Papagiannaki
    def test_account_meta(self):
245 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
246 ee7a28be Sofia Papagiannaki
        headers = {'HTTP_X_ACCOUNT_META_Ποιότητα': 'Ααα'}
247 ee7a28be Sofia Papagiannaki
        r = self.post(url, content_type='', **headers)
248 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
249 ee7a28be Sofia Papagiannaki
250 ee7a28be Sofia Papagiannaki
        meta = self.get_account_meta()
251 ee7a28be Sofia Papagiannaki
        self.assertTrue('Ποιότητα' in meta)
252 ee7a28be Sofia Papagiannaki
        self.assertEqual(meta['Ποιότητα'], 'Ααα')
253 ee7a28be Sofia Papagiannaki
254 ee7a28be Sofia Papagiannaki
    def test_container_meta(self):
255 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
256 ee7a28be Sofia Papagiannaki
        headers = {'HTTP_X_CONTAINER_META_Ποιότητα': 'Ααα'}
257 ee7a28be Sofia Papagiannaki
        r = self.put(url, data='', **headers)
258 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
259 ee7a28be Sofia Papagiannaki
260 ee7a28be Sofia Papagiannaki
        meta = self.get_container_meta('φάκελος')
261 ee7a28be Sofia Papagiannaki
        self.assertTrue('Ποιότητα' in meta)
262 ee7a28be Sofia Papagiannaki
        self.assertEqual(meta['Ποιότητα'], 'Ααα')
263 ee7a28be Sofia Papagiannaki
264 ee7a28be Sofia Papagiannaki
    def test_object_meta(self):
265 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
266 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'αντικείμενο')
267 ee7a28be Sofia Papagiannaki
        headers = {'HTTP_X_OBJECT_META_Ποιότητα': 'Ααα'}
268 ee7a28be Sofia Papagiannaki
        r = self.put(url, data=get_random_data(), **headers)
269 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
270 ee7a28be Sofia Papagiannaki
271 ee7a28be Sofia Papagiannaki
        meta = self.get_object_meta('φάκελος', 'αντικείμενο')
272 ee7a28be Sofia Papagiannaki
        self.assertTrue('Ποιότητα' in meta)
273 ee7a28be Sofia Papagiannaki
        self.assertEqual(meta['Ποιότητα'], 'Ααα')
274 ee7a28be Sofia Papagiannaki
275 ee7a28be Sofia Papagiannaki
    def test_list_meta_filtering(self):
276 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
277 ee7a28be Sofia Papagiannaki
        meta = {'ποιότητα': 'Ααα'}
278 ee7a28be Sofia Papagiannaki
        self.upload_object('φάκελος', 'ο1', **meta)
279 ee7a28be Sofia Papagiannaki
        self.upload_object('φάκελος', 'ο2')
280 ee7a28be Sofia Papagiannaki
        self.upload_object('φάκελος', 'ο3')
281 ee7a28be Sofia Papagiannaki
282 ee7a28be Sofia Papagiannaki
        meta = {'ποσότητα': 'μεγάλη'}
283 ee7a28be Sofia Papagiannaki
        self.update_object_meta('φάκελος', 'ο2', meta)
284 ee7a28be Sofia Papagiannaki
285 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος')
286 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('ποιότητα, ποσότητα')))
287 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
288 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
289 ee7a28be Sofia Papagiannaki
        if '' in objects:
290 ee7a28be Sofia Papagiannaki
            objects.remove('')
291 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο1', 'ο2'])
292 ee7a28be Sofia Papagiannaki
293 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('!ποιότητα')))
294 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
295 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
296 ee7a28be Sofia Papagiannaki
        if '' in objects:
297 ee7a28be Sofia Papagiannaki
            objects.remove('')
298 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο2', 'ο3'])
299 ee7a28be Sofia Papagiannaki
300 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('!ποιότητα, !ποσότητα')))
301 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
302 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
303 ee7a28be Sofia Papagiannaki
        if '' in objects:
304 ee7a28be Sofia Papagiannaki
            objects.remove('')
305 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο3'])
306 ee7a28be Sofia Papagiannaki
307 ee7a28be Sofia Papagiannaki
        meta = {'ποιότητα': 'ΑΒ'}
308 ee7a28be Sofia Papagiannaki
        self.update_object_meta('φάκελος', 'ο2', meta)
309 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('ποιότητα=Ααα')))
310 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
311 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
312 ee7a28be Sofia Papagiannaki
        if '' in objects:
313 ee7a28be Sofia Papagiannaki
            objects.remove('')
314 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο1'])
315 ee7a28be Sofia Papagiannaki
316 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('ποιότητα!=Ααα')))
317 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
318 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
319 ee7a28be Sofia Papagiannaki
        if '' in objects:
320 ee7a28be Sofia Papagiannaki
            objects.remove('')
321 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο2'])
322 ee7a28be Sofia Papagiannaki
323 ee7a28be Sofia Papagiannaki
        meta = {'έτος': '2011'}
324 ee7a28be Sofia Papagiannaki
        self.update_object_meta('φάκελος', 'ο3', meta)
325 ee7a28be Sofia Papagiannaki
        meta = {'έτος': '2012'}
326 ee7a28be Sofia Papagiannaki
        self.update_object_meta('φάκελος', 'ο2', meta)
327 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('έτος<2012')))
328 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
329 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
330 ee7a28be Sofia Papagiannaki
        if '' in objects:
331 ee7a28be Sofia Papagiannaki
            objects.remove('')
332 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο3'])
333 ee7a28be Sofia Papagiannaki
334 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('έτος<=2012')))
335 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
336 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
337 ee7a28be Sofia Papagiannaki
        if '' in objects:
338 ee7a28be Sofia Papagiannaki
            objects.remove('')
339 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο2', 'ο3'])
340 ee7a28be Sofia Papagiannaki
341 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('έτος<=2012, έτος!=2011')))
342 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
343 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
344 ee7a28be Sofia Papagiannaki
        if '' in objects:
345 ee7a28be Sofia Papagiannaki
            objects.remove('')
346 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, ['ο2'])
347 ee7a28be Sofia Papagiannaki
348 ee7a28be Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (url, quote('έτος<2012, έτος!=2011')))
349 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
350 ee7a28be Sofia Papagiannaki
        objects = r.content.split('\n')
351 ee7a28be Sofia Papagiannaki
        if '' in objects:
352 ee7a28be Sofia Papagiannaki
            objects.remove('')
353 ee7a28be Sofia Papagiannaki
        self.assertEquals(objects, [])
354 ee7a28be Sofia Papagiannaki
355 ee7a28be Sofia Papagiannaki
    def test_groups(self):
356 ee7a28be Sofia Papagiannaki
        # create a group
357 ee7a28be Sofia Papagiannaki
        headers = {'HTTP_X_ACCOUNT_GROUP_γκρουπ': 'chazapis,διογένης'}
358 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
359 ee7a28be Sofia Papagiannaki
        r = self.post(url, **headers)
360 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
361 ee7a28be Sofia Papagiannaki
362 ee7a28be Sofia Papagiannaki
        groups = self.get_account_groups()
363 ee7a28be Sofia Papagiannaki
        self.assertTrue('γκρουπ' in groups)
364 ee7a28be Sofia Papagiannaki
        self.assertEqual(groups['γκρουπ'], 'chazapis,διογένης')
365 ee7a28be Sofia Papagiannaki
366 ee7a28be Sofia Papagiannaki
        # check read access
367 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
368 ee7a28be Sofia Papagiannaki
        odata = self.upload_object('φάκελος', 'ο1')[1]
369 ee7a28be Sofia Papagiannaki
370 ee7a28be Sofia Papagiannaki
        r = self.head(url, user='διογένης')
371 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
372 ee7a28be Sofia Papagiannaki
        r = self.get(url, user='διογένης')
373 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
374 ee7a28be Sofia Papagiannaki
375 ee7a28be Sofia Papagiannaki
        # share for read
376 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1')
377 ee7a28be Sofia Papagiannaki
        r = self.post(url, content_type='',
378 ee7a28be Sofia Papagiannaki
                      HTTP_X_OBJECT_SHARING='read=%s:γκρουπ' % self.user)
379 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
380 ee7a28be Sofia Papagiannaki
381 ee7a28be Sofia Papagiannaki
        r = self.head(url, user='διογένης')
382 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
383 ee7a28be Sofia Papagiannaki
        r = self.get(url, user='διογένης')
384 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
385 ee7a28be Sofia Papagiannaki
386 ee7a28be Sofia Papagiannaki
        # check write access
387 ee7a28be Sofia Papagiannaki
        appended_data = get_random_data()
388 ee7a28be Sofia Papagiannaki
        r = self.post(url, user='διογένης',  data=appended_data,
389 ee7a28be Sofia Papagiannaki
                      content_type='application/octet-stream',
390 ee7a28be Sofia Papagiannaki
                      HTTP_CONTENT_LENGTH=str(len(appended_data)),
391 ee7a28be Sofia Papagiannaki
                      HTTP_CONTENT_RANGE='bytes */*')
392 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
393 ee7a28be Sofia Papagiannaki
394 ee7a28be Sofia Papagiannaki
        # share for write
395 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1')
396 ee7a28be Sofia Papagiannaki
        r = self.post(url, content_type='',
397 ee7a28be Sofia Papagiannaki
                      HTTP_X_OBJECT_SHARING='write=%s:γκρουπ' % self.user)
398 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
399 ee7a28be Sofia Papagiannaki
400 ee7a28be Sofia Papagiannaki
        r = self.post(url, user='διογένης', data=appended_data,
401 ee7a28be Sofia Papagiannaki
                      content_type='application/octet-stream',
402 ee7a28be Sofia Papagiannaki
                      HTTP_CONTENT_LENGTH=str(len(appended_data)),
403 ee7a28be Sofia Papagiannaki
                      HTTP_CONTENT_RANGE='bytes */*')
404 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
405 ee7a28be Sofia Papagiannaki
406 ee7a28be Sofia Papagiannaki
        r = self.get(url, user='διογένης')
407 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
408 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.content, odata + appended_data)
409 ee7a28be Sofia Papagiannaki
410 ee7a28be Sofia Papagiannaki
    def test_manifestation(self):
411 ee7a28be Sofia Papagiannaki
        self.create_container('κουβάς')
412 ee7a28be Sofia Papagiannaki
        prefix = 'μέρη/'
413 ee7a28be Sofia Papagiannaki
        data = ''
414 ee7a28be Sofia Papagiannaki
        for i in range(5):
415 ee7a28be Sofia Papagiannaki
            part = '%s%d' % (prefix, i)
416 ee7a28be Sofia Papagiannaki
            data += self.upload_object('κουβάς', part)[1]
417 ee7a28be Sofia Papagiannaki
418 ee7a28be Sofia Papagiannaki
        self.create_container('φάκελος')
419 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'άπαντα')
420 ee7a28be Sofia Papagiannaki
        r = self.put(url, data='', HTTP_X_OBJECT_MANIFEST='κουβάς/%s' % prefix)
421 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
422 ee7a28be Sofia Papagiannaki
423 ee7a28be Sofia Papagiannaki
        r = self.head(url)
424 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
425 ee7a28be Sofia Papagiannaki
426 ee7a28be Sofia Papagiannaki
        r = self.get(url)
427 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
428 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.content, data)
429 ee7a28be Sofia Papagiannaki
430 ee7a28be Sofia Papagiannaki
        # wrong manifestation
431 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'φάκελος', 'άπαντα')
432 ee7a28be Sofia Papagiannaki
        r = self.put(url, data='', HTTP_X_OBJECT_MANIFEST='κουβάς/λάθος')
433 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 201)
434 ee7a28be Sofia Papagiannaki
435 ee7a28be Sofia Papagiannaki
        r = self.get(url)
436 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
437 ee7a28be Sofia Papagiannaki
        self.assertTrue(r.content != data)
438 ee7a28be Sofia Papagiannaki
439 ee7a28be Sofia Papagiannaki
    def test_update_from_another_object(self):
440 ee7a28be Sofia Papagiannaki
        self.create_container('κουβάς')
441 ee7a28be Sofia Papagiannaki
        initial_data = self.upload_object('κουβάς', 'νέο')[1]
442 ee7a28be Sofia Papagiannaki
        length = TEST_BLOCK_SIZE + random.randint(1, TEST_BLOCK_SIZE - 1)
443 ee7a28be Sofia Papagiannaki
        src_data = self.upload_object('κουβάς', 'πηγή', length=length)[1]
444 ee7a28be Sofia Papagiannaki
445 ee7a28be Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'κουβάς', 'νέο')
446 ee7a28be Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
447 ee7a28be Sofia Papagiannaki
                      HTTP_X_SOURCE_OBJECT='/κουβάς/πηγή')
448 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
449 ee7a28be Sofia Papagiannaki
450 ee7a28be Sofia Papagiannaki
        r = self.get(url)
451 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
452 ee7a28be Sofia Papagiannaki
        self.assertEqual(r.content, initial_data + src_data)