Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / test / containers.py @ d6a92fa0

History | View | Annotate | Download (26.9 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 f3787696 Sofia Papagiannaki
from pithos.api.test import PithosAPITest, DATE_FORMATS, o_names,\
38 f3787696 Sofia Papagiannaki
    strnextling, pithos_settings, pithos_test_settings
39 f3787696 Sofia Papagiannaki
from pithos.backends.random_word import get_random_word
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 f3787696 Sofia Papagiannaki
49 f3787696 Sofia Papagiannaki
import random
50 f3787696 Sofia Papagiannaki
import datetime
51 f3787696 Sofia Papagiannaki
52 f3787696 Sofia Papagiannaki
53 f3787696 Sofia Papagiannaki
class ContainerHead(PithosAPITest):
54 f3787696 Sofia Papagiannaki
    def test_get_meta(self):
55 f3787696 Sofia Papagiannaki
        self.create_container('apples')
56 f3787696 Sofia Papagiannaki
57 f3787696 Sofia Papagiannaki
        # populate with objects
58 f3787696 Sofia Papagiannaki
        objects = {}
59 f3787696 Sofia Papagiannaki
        for i in range(random.randint(1, 100)):
60 f3787696 Sofia Papagiannaki
61 f3787696 Sofia Papagiannaki
            # upload object
62 f3787696 Sofia Papagiannaki
            meta = {'foo%s' % i: 'bar'}
63 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', **meta)
64 f3787696 Sofia Papagiannaki
            objects[name] = data
65 f3787696 Sofia Papagiannaki
66 f3787696 Sofia Papagiannaki
        t1 = datetime.datetime.utcnow()
67 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
68 d6a92fa0 Sofia Papagiannaki
        r = self.head(url)
69 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Object-Count']), len(objects))
70 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Bytes-Used']),
71 f3787696 Sofia Papagiannaki
                         sum([len(i) for i in objects.values()]))
72 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Block-Size' in r)
73 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Block-Hash' in r)
74 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Until-Timestamp' not in r)
75 f3787696 Sofia Papagiannaki
        self.assertEqual(r['X-Container-Policy-Versioning'], 'auto')
76 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Policy-Quota']), 0)
77 f3787696 Sofia Papagiannaki
        t2 = datetime.datetime.strptime(r['Last-Modified'], DATE_FORMATS[2])
78 f3787696 Sofia Papagiannaki
        delta = (t2 - t1)
79 f3787696 Sofia Papagiannaki
        threashold = datetime.timedelta(seconds=1)
80 f3787696 Sofia Papagiannaki
        self.assertTrue(delta < threashold)
81 f3787696 Sofia Papagiannaki
        self.assertTrue(r['X-Container-Object-Meta'])
82 f3787696 Sofia Papagiannaki
        (self.assertTrue('foo%s' % i in r['X-Container-Object-Meta'])
83 f3787696 Sofia Papagiannaki
            for i in range(len(objects)))
84 f3787696 Sofia Papagiannaki
85 f3787696 Sofia Papagiannaki
86 f3787696 Sofia Papagiannaki
class ContainerGet(PithosAPITest):
87 f3787696 Sofia Papagiannaki
    def setUp(self):
88 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
89 f3787696 Sofia Papagiannaki
90 f3787696 Sofia Papagiannaki
        self.cnames = ['pears', 'apples']
91 f3787696 Sofia Papagiannaki
        self.objects = {}
92 f3787696 Sofia Papagiannaki
        for c in self.cnames:
93 f3787696 Sofia Papagiannaki
            self.create_container(c)
94 f3787696 Sofia Papagiannaki
95 f3787696 Sofia Papagiannaki
        self.objects['pears'] = {}
96 f3787696 Sofia Papagiannaki
        for o in o_names[:8]:
97 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('pears', o)
98 f3787696 Sofia Papagiannaki
            self.objects['pears'][name] = data
99 f3787696 Sofia Papagiannaki
        self.objects['apples'] = {}
100 f3787696 Sofia Papagiannaki
        for o in o_names[8:]:
101 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', o)
102 f3787696 Sofia Papagiannaki
            self.objects['apples'][name] = data
103 f3787696 Sofia Papagiannaki
104 f3787696 Sofia Papagiannaki
    def test_list_shared(self):
105 f3787696 Sofia Papagiannaki
        # share an object
106 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
107 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
108 f3787696 Sofia Papagiannaki
        oname = onames.pop()
109 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
110 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*')
111 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
112 f3787696 Sofia Papagiannaki
113 f3787696 Sofia Papagiannaki
        # publish another object
114 f3787696 Sofia Papagiannaki
        other = onames.pop()
115 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, other)
116 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
117 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
118 f3787696 Sofia Papagiannaki
119 f3787696 Sofia Papagiannaki
        # list shared and assert only the shared object is returned
120 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
121 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
122 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
123 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
124 f3787696 Sofia Papagiannaki
        objects.remove('')
125 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], objects)
126 f3787696 Sofia Papagiannaki
127 f3787696 Sofia Papagiannaki
        # list detailed shared and assert only the shared object is returned
128 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
129 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
130 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
131 f3787696 Sofia Papagiannaki
        try:
132 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
133 f3787696 Sofia Papagiannaki
        except:
134 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
135 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
136 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
137 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' not in objects[0])
138 f3787696 Sofia Papagiannaki
139 f3787696 Sofia Papagiannaki
        # publish the shared object and assert it is still listed in the
140 f3787696 Sofia Papagiannaki
        # shared objects
141 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
142 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
143 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
144 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
145 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
146 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
147 f3787696 Sofia Papagiannaki
        try:
148 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
149 f3787696 Sofia Papagiannaki
        except:
150 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
151 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
152 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
153 f3787696 Sofia Papagiannaki
        # TODO
154 f3787696 Sofia Papagiannaki
        #self.assertTrue('x_object_public' in objects[0])
155 f3787696 Sofia Papagiannaki
156 f3787696 Sofia Papagiannaki
        # create child object
157 f3787696 Sofia Papagiannaki
        descendant = strnextling(oname)
158 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
159 f3787696 Sofia Papagiannaki
        # request shared and assert child obejct is not listed
160 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
161 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
162 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
163 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
164 f3787696 Sofia Papagiannaki
        objects.remove('')
165 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
166 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
167 f3787696 Sofia Papagiannaki
168 f3787696 Sofia Papagiannaki
        # check folder inheritance
169 f3787696 Sofia Papagiannaki
        oname, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*')
170 f3787696 Sofia Papagiannaki
        # create child object
171 f3787696 Sofia Papagiannaki
        descendant = '%s/%s' % (oname, get_random_word(8))
172 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
173 f3787696 Sofia Papagiannaki
        # request shared
174 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
175 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
176 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
177 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
178 f3787696 Sofia Papagiannaki
        objects.remove('')
179 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
180 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant in objects)
181 f3787696 Sofia Papagiannaki
182 f3787696 Sofia Papagiannaki
    def test_list_public(self):
183 f3787696 Sofia Papagiannaki
        # publish an object
184 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
185 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
186 f3787696 Sofia Papagiannaki
        oname = onames.pop()
187 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
188 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
189 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
190 f3787696 Sofia Papagiannaki
191 f3787696 Sofia Papagiannaki
        # share another
192 f3787696 Sofia Papagiannaki
        other = onames.pop()
193 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, other)
194 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
195 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
196 f3787696 Sofia Papagiannaki
197 f3787696 Sofia Papagiannaki
        # list public and assert only the public object is returned
198 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
199 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
200 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
201 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
202 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in r.content.split('\n'))
203 f3787696 Sofia Papagiannaki
        (self.assertTrue(o not in objects) for o in o_names[1:])
204 f3787696 Sofia Papagiannaki
205 f3787696 Sofia Papagiannaki
        # list detailed public and assert only the public object is returned
206 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
207 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
208 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
209 f3787696 Sofia Papagiannaki
        try:
210 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
211 f3787696 Sofia Papagiannaki
        except:
212 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
213 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
214 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' not in objects[0])
215 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
216 f3787696 Sofia Papagiannaki
217 f3787696 Sofia Papagiannaki
        # share the public object and assert it is still listed in the
218 f3787696 Sofia Papagiannaki
        # public objects
219 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
220 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
221 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
222 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
223 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
224 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
225 f3787696 Sofia Papagiannaki
        try:
226 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
227 f3787696 Sofia Papagiannaki
        except:
228 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
229 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
230 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
231 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
232 f3787696 Sofia Papagiannaki
233 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
234 d6a92fa0 Sofia Papagiannaki
235 f3787696 Sofia Papagiannaki
        # Assert listing the container public contents is forbidden to not
236 f3787696 Sofia Papagiannaki
        # shared users
237 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='bob')
238 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
239 f3787696 Sofia Papagiannaki
240 f3787696 Sofia Papagiannaki
        # Assert listing the container public contents to shared users
241 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='alice')
242 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
243 f3787696 Sofia Papagiannaki
        try:
244 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
245 f3787696 Sofia Papagiannaki
        except:
246 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
247 f3787696 Sofia Papagiannaki
        # TODO
248 f3787696 Sofia Papagiannaki
        #self.assertEqual([oname], [o['name'] for o in objects])
249 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
250 f3787696 Sofia Papagiannaki
        # assert public is not returned though
251 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' not in objects[0])
252 f3787696 Sofia Papagiannaki
253 f3787696 Sofia Papagiannaki
        # create child object
254 f3787696 Sofia Papagiannaki
        descendant = strnextling(oname)
255 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
256 f3787696 Sofia Papagiannaki
        # request public and assert child obejct is not listed
257 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
258 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
259 f3787696 Sofia Papagiannaki
        objects.remove('')
260 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
261 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
262 f3787696 Sofia Papagiannaki
        (self.assertTrue(o not in objects) for o in o_names[1:])
263 f3787696 Sofia Papagiannaki
264 f3787696 Sofia Papagiannaki
        # test folder inheritance
265 f3787696 Sofia Papagiannaki
        oname, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
266 f3787696 Sofia Papagiannaki
        # create child object
267 f3787696 Sofia Papagiannaki
        descendant = '%s/%s' % (oname, get_random_word(8))
268 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
269 f3787696 Sofia Papagiannaki
        # request public
270 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
271 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
272 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
273 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
274 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
275 f3787696 Sofia Papagiannaki
276 f3787696 Sofia Papagiannaki
#    def test_list_shared_public(self):
277 f3787696 Sofia Papagiannaki
#        # publish an object
278 f3787696 Sofia Papagiannaki
#        cname = self.cnames[0]
279 f3787696 Sofia Papagiannaki
#        onames = self.objects[cname].keys()
280 f3787696 Sofia Papagiannaki
#        oname = onames.pop()
281 f3787696 Sofia Papagiannaki
#        r = self.post('/v1/%s/%s/%s' % (self.user, cname, oname),
282 f3787696 Sofia Papagiannaki
#                      content_type='',
283 f3787696 Sofia Papagiannaki
#                      HTTP_X_OBJECT_PUBLIC='true')
284 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 202)
285 f3787696 Sofia Papagiannaki
#
286 f3787696 Sofia Papagiannaki
#        # share another
287 f3787696 Sofia Papagiannaki
#        other = onames.pop()
288 f3787696 Sofia Papagiannaki
#        r = self.post('/v1/%s/%s/%s' % (self.user, cname, other),
289 f3787696 Sofia Papagiannaki
#                      content_type='',
290 f3787696 Sofia Papagiannaki
#                      HTTP_X_OBJECT_SHARING='read=alice')
291 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 202)
292 f3787696 Sofia Papagiannaki
#
293 f3787696 Sofia Papagiannaki
#        # list shared and public objects and assert object is listed
294 f3787696 Sofia Papagiannaki
#        r = self.get('/v1/%s/%s?shared=&public=&format=json' % (
295 f3787696 Sofia Papagiannaki
#            self.user, cname))
296 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 200)
297 f3787696 Sofia Papagiannaki
#        objects = json.loads(r.content)
298 f3787696 Sofia Papagiannaki
#        self.assertEqual([o['name'] for o in objects], sorted([oname, other]))
299 f3787696 Sofia Papagiannaki
#        for o in objects:
300 f3787696 Sofia Papagiannaki
#            if o['name'] == oname:
301 f3787696 Sofia Papagiannaki
#                self.assertTrue('x_object_public' in objects[0])
302 f3787696 Sofia Papagiannaki
#            elif o['name'] == other:
303 f3787696 Sofia Papagiannaki
#                self.assertTrue('x_object_sharing' in objects[1])
304 f3787696 Sofia Papagiannaki
#
305 f3787696 Sofia Papagiannaki
#        # assert not listing shared and public to a not shared user
306 f3787696 Sofia Papagiannaki
#        r = self.get('/v1/%s/%s?shared=&public=&format=json' % (
307 f3787696 Sofia Papagiannaki
#            self.user, cname), user='bob')
308 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 403)
309 f3787696 Sofia Papagiannaki
#
310 f3787696 Sofia Papagiannaki
#        # assert listing shared and public to a shared user
311 f3787696 Sofia Papagiannaki
#        r = self.get('/v1/%s/%s?shared=&public=&format=json' % (
312 f3787696 Sofia Papagiannaki
#            self.user, cname), user='alice')
313 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 200)
314 f3787696 Sofia Papagiannaki
#        try:
315 f3787696 Sofia Papagiannaki
#            objects = json.loads(r.content)
316 f3787696 Sofia Papagiannaki
#        except:
317 f3787696 Sofia Papagiannaki
#            self.fail('json format expected')
318 f3787696 Sofia Papagiannaki
#        self.assertEqual([o['name'] for o in objects], sorted([oname, other]))
319 f3787696 Sofia Papagiannaki
#
320 f3787696 Sofia Papagiannaki
#        # create child object
321 f3787696 Sofia Papagiannaki
#        descentant1 = strnextling(oname)
322 f3787696 Sofia Papagiannaki
#        self.upload_object(cname, descendant1)
323 f3787696 Sofia Papagiannaki
#        descentant2 = strnextling(other)
324 f3787696 Sofia Papagiannaki
#        self.upload_object(cname, descendant2)
325 f3787696 Sofia Papagiannaki
#        r = self.get('/v1/%s/%s?shared=&public=&format=json' % (
326 f3787696 Sofia Papagiannaki
#            self.user, cname), user='alice')
327 f3787696 Sofia Papagiannaki
#        self.assertEqual(r.status_code, 200)
328 f3787696 Sofia Papagiannaki
#        try:
329 f3787696 Sofia Papagiannaki
#            objects = json.loads(r.content)
330 f3787696 Sofia Papagiannaki
#        except:
331 f3787696 Sofia Papagiannaki
#            self.fail('json format expected')
332 f3787696 Sofia Papagiannaki
#        self.assertEqual([o['name'] for o in objects], [oname])
333 f3787696 Sofia Papagiannaki
#
334 f3787696 Sofia Papagiannaki
#        # test inheritance
335 f3787696 Sofia Papagiannaki
#        oname1, _ = self.create_folder(cname,
336 f3787696 Sofia Papagiannaki
#                                       HTTP_X_OBJECT_SHARING='read=alice')
337 f3787696 Sofia Papagiannaki
#        # create child object
338 f3787696 Sofia Papagiannaki
#        descendant1 = '%s/%s' % (oname, get_random_word(8))
339 f3787696 Sofia Papagiannaki
#        self.upload_object(cname, descendant1)
340 f3787696 Sofia Papagiannaki
#
341 f3787696 Sofia Papagiannaki
#        oname2, _ = self.create_folder(cname,
342 f3787696 Sofia Papagiannaki
#                                       HTTP_X_OBJECT_PUBLIC='true')
343 f3787696 Sofia Papagiannaki
#        # create child object
344 f3787696 Sofia Papagiannaki
#        descendant2 = '%s/%s' % (oname, get_random_word(8))
345 f3787696 Sofia Papagiannaki
#        self.upload_object(cname, descendant2)
346 f3787696 Sofia Papagiannaki
#
347 f3787696 Sofia Papagiannaki
#
348 f3787696 Sofia Papagiannaki
#        o = self.upload_random_data(self.container[1], 'folder2/object')
349 d6a92fa0 Sofia Papagiannaki
#        objs = self.client.list_objects(
350 d6a92fa0 Sofia Papagiannaki
#            self.container[1], shared=True, public=True)
351 f3787696 Sofia Papagiannaki
#        self.assertEqual(objs, ['folder1', 'folder1/object', 'folder2'])
352 f3787696 Sofia Papagiannaki
#        objs = cl.list_objects(
353 f3787696 Sofia Papagiannaki
#            self.container[1], shared=True, public=True, account=get_user()
354 f3787696 Sofia Papagiannaki
#        )
355 f3787696 Sofia Papagiannaki
#        self.assertEqual(objs, ['folder1', 'folder1/object'])
356 f3787696 Sofia Papagiannaki
#
357 f3787696 Sofia Papagiannaki
    def test_list_objects(self):
358 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
359 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
360 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
361 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
362 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
363 f3787696 Sofia Papagiannaki
        if '' in objects:
364 f3787696 Sofia Papagiannaki
            objects.remove('')
365 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, sorted(self.objects[cname].keys()))
366 f3787696 Sofia Papagiannaki
367 f3787696 Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
368 f3787696 Sofia Papagiannaki
        self.create_container('test')
369 f3787696 Sofia Papagiannaki
        self.upload_object('test', '/objectname')
370 f3787696 Sofia Papagiannaki
371 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'test')
372 d6a92fa0 Sofia Papagiannaki
373 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
374 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
375 f3787696 Sofia Papagiannaki
        if '' in objects:
376 f3787696 Sofia Papagiannaki
            objects.remove('')
377 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, ['/objectname'])
378 f3787696 Sofia Papagiannaki
379 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
380 f3787696 Sofia Papagiannaki
        try:
381 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
382 f3787696 Sofia Papagiannaki
        except:
383 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
384 f3787696 Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects], ['/objectname'])
385 f3787696 Sofia Papagiannaki
386 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=xml' % url)
387 f3787696 Sofia Papagiannaki
        try:
388 f3787696 Sofia Papagiannaki
            objects = minidom.parseString(r.content)
389 f3787696 Sofia Papagiannaki
        except:
390 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
391 f3787696 Sofia Papagiannaki
        self.assertEqual(
392 f3787696 Sofia Papagiannaki
            [n.firstChild.data for n in objects.getElementsByTagName('name')],
393 f3787696 Sofia Papagiannaki
            ['/objectname'])
394 f3787696 Sofia Papagiannaki
395 f3787696 Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
396 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
397 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
398 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=qwert' % url)
399 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code != 500)
400 f3787696 Sofia Papagiannaki
401 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=2' % url)
402 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
403 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
404 f3787696 Sofia Papagiannaki
        if '' in objects:
405 f3787696 Sofia Papagiannaki
            objects.remove('')
406 f3787696 Sofia Papagiannaki
407 f3787696 Sofia Papagiannaki
        onames = sorted(self.objects[cname].keys())
408 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, onames[:2])
409 f3787696 Sofia Papagiannaki
410 f3787696 Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
411 f3787696 Sofia Papagiannaki
                   'moms_birthday.jpg']
412 f3787696 Sofia Papagiannaki
        limit = 4
413 f3787696 Sofia Papagiannaki
        for m in markers:
414 d6a92fa0 Sofia Papagiannaki
            r = self.get('%s?limit=%s&marker=%s' % (url, limit, m))
415 f3787696 Sofia Papagiannaki
            objects = r.content.split('\n')
416 f3787696 Sofia Papagiannaki
            if '' in objects:
417 f3787696 Sofia Papagiannaki
                objects.remove('')
418 f3787696 Sofia Papagiannaki
            start = onames.index(m) + 1
419 f3787696 Sofia Papagiannaki
            end = start + limit
420 f3787696 Sofia Papagiannaki
            end = end if len(onames) >= end else len(onames)
421 f3787696 Sofia Papagiannaki
            self.assertEqual(objects, onames[start:end])
422 f3787696 Sofia Papagiannaki
423 f3787696 Sofia Papagiannaki
    @pithos_test_settings(API_LIST_LIMIT=10)
424 f3787696 Sofia Papagiannaki
    def test_list_limit_exceeds(self):
425 f3787696 Sofia Papagiannaki
        self.create_container('container')
426 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'container')
427 f3787696 Sofia Papagiannaki
428 f3787696 Sofia Papagiannaki
        for _ in range(pithos_settings.API_LIST_LIMIT + 1):
429 f3787696 Sofia Papagiannaki
            self.upload_object('container')
430 f3787696 Sofia Papagiannaki
431 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
432 f3787696 Sofia Papagiannaki
        try:
433 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
434 f3787696 Sofia Papagiannaki
        except:
435 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
436 f3787696 Sofia Papagiannaki
        self.assertEqual(pithos_settings.API_LIST_LIMIT,
437 f3787696 Sofia Papagiannaki
                         len(objects))
438 f3787696 Sofia Papagiannaki
439 f3787696 Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
440 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
441 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos&delimiter=/' % url)
442 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
443 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
444 f3787696 Sofia Papagiannaki
        if '' in objects:
445 f3787696 Sofia Papagiannaki
            objects.remove('')
446 f3787696 Sofia Papagiannaki
        self.assertEquals(
447 f3787696 Sofia Papagiannaki
            ['photos/animals/', 'photos/me.jpg', 'photos/plants/'],
448 f3787696 Sofia Papagiannaki
            objects)
449 f3787696 Sofia Papagiannaki
450 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos/animals&delimiter=/' % url)
451 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
452 f3787696 Sofia Papagiannaki
        if '' in objects:
453 f3787696 Sofia Papagiannaki
            objects.remove('')
454 f3787696 Sofia Papagiannaki
        self.assertEquals(
455 f3787696 Sofia Papagiannaki
            ['photos/animals/cats/', 'photos/animals/dogs/'], objects)
456 f3787696 Sofia Papagiannaki
457 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?path=photos' % url)
458 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
459 f3787696 Sofia Papagiannaki
        if '' in objects:
460 f3787696 Sofia Papagiannaki
            objects.remove('')
461 f3787696 Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
462 f3787696 Sofia Papagiannaki
463 f3787696 Sofia Papagiannaki
    def test_extended_list_json(self):
464 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
465 f3787696 Sofia Papagiannaki
        params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals',
466 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
467 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
468 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
469 f3787696 Sofia Papagiannaki
        try:
470 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
471 f3787696 Sofia Papagiannaki
        except:
472 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
473 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
474 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
475 f3787696 Sofia Papagiannaki
476 f3787696 Sofia Papagiannaki
    def test_extended_list_xml(self):
477 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
478 f3787696 Sofia Papagiannaki
        params = {'format': 'xml', 'limit': 4, 'prefix': 'photos',
479 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
480 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
481 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
482 f3787696 Sofia Papagiannaki
        try:
483 f3787696 Sofia Papagiannaki
            xml = minidom.parseString(r.content)
484 f3787696 Sofia Papagiannaki
        except:
485 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
486 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
487 f3787696 Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
488 f3787696 Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
489 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
490 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
491 f3787696 Sofia Papagiannaki
492 f3787696 Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
493 f3787696 Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
494 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
495 f3787696 Sofia Papagiannaki
496 f3787696 Sofia Papagiannaki
    def test_list_meta_double_matching(self):
497 f3787696 Sofia Papagiannaki
        # update object meta
498 f3787696 Sofia Papagiannaki
        cname = 'apples'
499 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
500 f3787696 Sofia Papagiannaki
        oname = self.objects[cname].keys().pop()
501 f3787696 Sofia Papagiannaki
        meta = {'quality': 'aaa', 'stock': 'true'}
502 f3787696 Sofia Papagiannaki
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
503 f3787696 Sofia Papagiannaki
                       for k, v in meta.iteritems())
504 d6a92fa0 Sofia Papagiannaki
        object_url = join_urls(container_url, oname)
505 d6a92fa0 Sofia Papagiannaki
        self.post(object_url, content_type='', **headers)
506 f3787696 Sofia Papagiannaki
507 f3787696 Sofia Papagiannaki
        # list objects that satisfy the criteria
508 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
509 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
510 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
511 f3787696 Sofia Papagiannaki
        if '' in objects:
512 f3787696 Sofia Papagiannaki
            objects.remove('')
513 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, [oname])
514 f3787696 Sofia Papagiannaki
515 f3787696 Sofia Papagiannaki
    def test_list_using_meta(self):
516 f3787696 Sofia Papagiannaki
        # update object meta
517 f3787696 Sofia Papagiannaki
        cname = 'apples'
518 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
519 d6a92fa0 Sofia Papagiannaki
520 f3787696 Sofia Papagiannaki
        oname1 = self.objects[cname].keys().pop()
521 d6a92fa0 Sofia Papagiannaki
        url = join_urls(container_url, oname1)
522 d6a92fa0 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa')
523 d6a92fa0 Sofia Papagiannaki
524 f3787696 Sofia Papagiannaki
        oname2 = self.objects[cname].keys().pop()
525 d6a92fa0 Sofia Papagiannaki
        url = join_urls(container_url, cname, oname2)
526 d6a92fa0 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab')
527 f3787696 Sofia Papagiannaki
528 f3787696 Sofia Papagiannaki
        oname3 = self.objects[cname].keys().pop()
529 d6a92fa0 Sofia Papagiannaki
        url = join_urls(container_url, oname3)
530 d6a92fa0 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100')
531 d6a92fa0 Sofia Papagiannaki
532 f3787696 Sofia Papagiannaki
        oname4 = self.objects[cname].keys().pop()
533 d6a92fa0 Sofia Papagiannaki
        url = join_urls(container_url, oname4)
534 d6a92fa0 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200')
535 f3787696 Sofia Papagiannaki
536 f3787696 Sofia Papagiannaki
        # test multiple existence criteria matches
537 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
538 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
539 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
540 f3787696 Sofia Papagiannaki
        if '' in objects:
541 f3787696 Sofia Papagiannaki
            objects.remove('')
542 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, sorted([oname1, oname2, oname3, oname4]))
543 f3787696 Sofia Papagiannaki
544 f3787696 Sofia Papagiannaki
        # list objects that satisfy the existence criteria
545 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Stock' % container_url)
546 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
547 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
548 f3787696 Sofia Papagiannaki
        if '' in objects:
549 f3787696 Sofia Papagiannaki
            objects.remove('')
550 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, sorted([oname3, oname4]))
551 f3787696 Sofia Papagiannaki
552 f3787696 Sofia Papagiannaki
        # test case insensitive existence criteria matching
553 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=quality' % container_url)
554 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
555 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
556 f3787696 Sofia Papagiannaki
        if '' in objects:
557 f3787696 Sofia Papagiannaki
            objects.remove('')
558 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, sorted([oname1, oname2]))
559 f3787696 Sofia Papagiannaki
560 f3787696 Sofia Papagiannaki
        # test do not all existencecriteria match
561 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Foo' % container_url)
562 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
563 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
564 f3787696 Sofia Papagiannaki
        if '' in objects:
565 f3787696 Sofia Papagiannaki
            objects.remove('')
566 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, sorted([oname1, oname2]))
567 f3787696 Sofia Papagiannaki
568 f3787696 Sofia Papagiannaki
        # test equals criteria
569 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa')))
570 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
571 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
572 f3787696 Sofia Papagiannaki
        if '' in objects:
573 f3787696 Sofia Papagiannaki
            objects.remove('')
574 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, [oname1])
575 f3787696 Sofia Papagiannaki
576 f3787696 Sofia Papagiannaki
        # test not equals criteria
577 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, urlencode('Quality!=aaa')))
578 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
579 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
580 f3787696 Sofia Papagiannaki
        if '' in objects:
581 f3787696 Sofia Papagiannaki
            objects.remove()
582 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, [oname2])
583 f3787696 Sofia Papagiannaki
584 f3787696 Sofia Papagiannaki
        # test lte criteria
585 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, urlencode('Stock<=120')))
586 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
587 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
588 f3787696 Sofia Papagiannaki
        if '' in objects:
589 f3787696 Sofia Papagiannaki
            objects.remove('')
590 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, [oname3])
591 f3787696 Sofia Papagiannaki
592 f3787696 Sofia Papagiannaki
        # test gte criteria
593 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, urlencode('Stock>=200')))
594 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
595 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
596 f3787696 Sofia Papagiannaki
        if '' in objects:
597 f3787696 Sofia Papagiannaki
            objects.remove('')
598 f3787696 Sofia Papagiannaki
        self.assertTrue(objects, [oname4])
599 f3787696 Sofia Papagiannaki
600 f3787696 Sofia Papagiannaki
#
601 f3787696 Sofia Papagiannaki
#    def test_if_modified_since(self):
602 f3787696 Sofia Papagiannaki
#        t = datetime.datetime.utcnow()
603 f3787696 Sofia Papagiannaki
#        t2 = t - datetime.timedelta(minutes=10)
604 f3787696 Sofia Papagiannaki
#
605 f3787696 Sofia Papagiannaki
#        #add a new object
606 f3787696 Sofia Papagiannaki
#        self.upload_random_data(self.container[0], o_names[0])
607 f3787696 Sofia Papagiannaki
#
608 f3787696 Sofia Papagiannaki
#        for f in DATE_FORMATS:
609 f3787696 Sofia Papagiannaki
#            past = t2.strftime(f)
610 f3787696 Sofia Papagiannaki
#            try:
611 f3787696 Sofia Papagiannaki
#                o = self.client.list_objects(self.container[0],
612 f3787696 Sofia Papagiannaki
#                                            if_modified_since=past)
613 f3787696 Sofia Papagiannaki
#                self.assertEqual(o,
614 f3787696 Sofia Papagiannaki
#                                 self.client.list_objects(self.container[0]))
615 f3787696 Sofia Papagiannaki
#            except Fault, f:
616 f3787696 Sofia Papagiannaki
#                self.failIf(f.status == 304) #fail if not modified
617 f3787696 Sofia Papagiannaki
#
618 f3787696 Sofia Papagiannaki
#    def test_if_modified_since_invalid_date(self):
619 f3787696 Sofia Papagiannaki
#        headers = {'if-modified-since':''}
620 f3787696 Sofia Papagiannaki
#        o = self.client.list_objects(self.container[0], if_modified_since='')
621 f3787696 Sofia Papagiannaki
#        self.assertEqual(o, self.client.list_objects(self.container[0]))
622 f3787696 Sofia Papagiannaki
#
623 f3787696 Sofia Papagiannaki
#    def test_if_not_modified_since(self):
624 f3787696 Sofia Papagiannaki
#        now = datetime.datetime.utcnow()
625 f3787696 Sofia Papagiannaki
#        since = now + datetime.timedelta(1)
626 f3787696 Sofia Papagiannaki
#
627 f3787696 Sofia Papagiannaki
#        for f in DATE_FORMATS:
628 f3787696 Sofia Papagiannaki
#            args = {'if_modified_since':'%s' %since.strftime(f)}
629 f3787696 Sofia Papagiannaki
#
630 f3787696 Sofia Papagiannaki
#            #assert not modified
631 f3787696 Sofia Papagiannaki
#            self.assert_raises_fault(304, self.client.list_objects,
632 f3787696 Sofia Papagiannaki
#                                     self.container[0], **args)
633 f3787696 Sofia Papagiannaki
#
634 f3787696 Sofia Papagiannaki
#    def test_if_unmodified_since(self):
635 f3787696 Sofia Papagiannaki
#        now = datetime.datetime.utcnow()
636 f3787696 Sofia Papagiannaki
#        since = now + datetime.timedelta(1)
637 f3787696 Sofia Papagiannaki
#
638 f3787696 Sofia Papagiannaki
#        for f in DATE_FORMATS:
639 d6a92fa0 Sofia Papagiannaki
#            obj = self.client.list_objects(
640 d6a92fa0 Sofia Papagiannaki
#                self.container[0], if_unmodified_since=since.strftime(f))
641 f3787696 Sofia Papagiannaki
#
642 f3787696 Sofia Papagiannaki
#            #assert unmodified
643 f3787696 Sofia Papagiannaki
#            self.assertEqual(obj, self.client.list_objects(self.container[0]))
644 f3787696 Sofia Papagiannaki
#
645 f3787696 Sofia Papagiannaki
#    def test_if_unmodified_since_precondition_failed(self):
646 f3787696 Sofia Papagiannaki
#        t = datetime.datetime.utcnow()
647 f3787696 Sofia Papagiannaki
#        t2 = t - datetime.timedelta(minutes=10)
648 f3787696 Sofia Papagiannaki
#
649 f3787696 Sofia Papagiannaki
#        #add a new container
650 f3787696 Sofia Papagiannaki
#        self.client.create_container('dummy')
651 f3787696 Sofia Papagiannaki
#
652 f3787696 Sofia Papagiannaki
#        for f in DATE_FORMATS:
653 f3787696 Sofia Papagiannaki
#            past = t2.strftime(f)
654 f3787696 Sofia Papagiannaki
#
655 f3787696 Sofia Papagiannaki
#            args = {'if_unmodified_since':'%s' %past}
656 f3787696 Sofia Papagiannaki
#
657 f3787696 Sofia Papagiannaki
#            #assert precondition failed
658 f3787696 Sofia Papagiannaki
#            self.assert_raises_fault(412, self.client.list_objects,
659 f3787696 Sofia Papagiannaki
#                                     self.container[0], **args)
660 f3787696 Sofia Papagiannaki
#
661 f3787696 Sofia Papagiannaki
#class ContainerPut(BaseTestCase):
662 f3787696 Sofia Papagiannaki
#    def setUp(self):
663 f3787696 Sofia Papagiannaki
#        BaseTestCase.setUp(self)
664 f3787696 Sofia Papagiannaki
#        self.containers = list(set(self.initial_containers + ['c1', 'c2']))
665 f3787696 Sofia Papagiannaki
#        self.containers.sort()
666 f3787696 Sofia Papagiannaki
#
667 f3787696 Sofia Papagiannaki
#    def test_create(self):
668 f3787696 Sofia Papagiannaki
#        self.client.create_container(self.containers[0])
669 f3787696 Sofia Papagiannaki
#        containers = self.client.list_containers()
670 f3787696 Sofia Papagiannaki
#        self.assertTrue(self.containers[0] in containers)
671 f3787696 Sofia Papagiannaki
#        self.assert_container_exists(self.containers[0])
672 f3787696 Sofia Papagiannaki
#
673 f3787696 Sofia Papagiannaki
#    def test_create_twice(self):
674 f3787696 Sofia Papagiannaki
#        self.client.create_container(self.containers[0])
675 f3787696 Sofia Papagiannaki
#        self.assertTrue(not self.client.create_container(self.containers[0]))
676 f3787696 Sofia Papagiannaki
#
677 f3787696 Sofia Papagiannaki
#    def test_quota(self):
678 f3787696 Sofia Papagiannaki
#        self.client.create_container(self.containers[0])
679 f3787696 Sofia Papagiannaki
#
680 f3787696 Sofia Papagiannaki
#        policy = {'quota':100}
681 f3787696 Sofia Papagiannaki
#        self.client.set_container_policies(self.containers[0], **policy)
682 f3787696 Sofia Papagiannaki
#
683 f3787696 Sofia Papagiannaki
#        meta = self.client.retrieve_container_metadata(self.containers[0])
684 f3787696 Sofia Papagiannaki
#        self.assertTrue('x-container-policy-quota' in meta)
685 f3787696 Sofia Papagiannaki
#        self.assertEqual(meta['x-container-policy-quota'], '100')
686 f3787696 Sofia Papagiannaki
#
687 f3787696 Sofia Papagiannaki
#        args = [self.containers[0], 'o1']
688 f3787696 Sofia Papagiannaki
#        kwargs = {'length':101}
689 d6a92fa0 Sofia Papagiannaki
#        self.assert_raises_fault(
690 d6a92fa0 Sofia Papagiannaki
#            413, self.upload_random_data, *args, **kwargs)
691 f3787696 Sofia Papagiannaki
#
692 f3787696 Sofia Papagiannaki
#        #reset quota
693 f3787696 Sofia Papagiannaki
#        policy = {'quota':0}
694 f3787696 Sofia Papagiannaki
#        self.client.set_container_policies(self.containers[0], **policy)