Statistics
| Branch: | Tag: | Revision:

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

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