Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (30.2 kB)

1 f3787696 Sofia Papagiannaki
#!/usr/bin/env python
2 f3787696 Sofia Papagiannaki
#coding=utf8
3 f3787696 Sofia Papagiannaki
4 f3787696 Sofia Papagiannaki
# Copyright 2011-2013 GRNET S.A. All rights reserved.
5 f3787696 Sofia Papagiannaki
#
6 f3787696 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
7 f3787696 Sofia Papagiannaki
# without modification, are permitted provided that the following
8 f3787696 Sofia Papagiannaki
# conditions are met:
9 f3787696 Sofia Papagiannaki
#
10 f3787696 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
11 f3787696 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
12 f3787696 Sofia Papagiannaki
#      disclaimer.
13 f3787696 Sofia Papagiannaki
#
14 f3787696 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
15 f3787696 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
16 f3787696 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
17 f3787696 Sofia Papagiannaki
#      provided with the distribution.
18 f3787696 Sofia Papagiannaki
#
19 f3787696 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 f3787696 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 f3787696 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 f3787696 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 f3787696 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 f3787696 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 f3787696 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 f3787696 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 f3787696 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 f3787696 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 f3787696 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 f3787696 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
31 f3787696 Sofia Papagiannaki
#
32 f3787696 Sofia Papagiannaki
# The views and conclusions contained in the software and
33 f3787696 Sofia Papagiannaki
# documentation are those of the authors and should not be
34 f3787696 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
35 f3787696 Sofia Papagiannaki
# or implied, of GRNET S.A.
36 f3787696 Sofia Papagiannaki
37 3a19e99b Sofia Papagiannaki
from pithos.api.test import (PithosAPITest, DATE_FORMATS, o_names,
38 3a19e99b Sofia Papagiannaki
                             pithos_settings, pithos_test_settings)
39 bc4f25c0 Sofia Papagiannaki
from pithos.api.test.util import strnextling, get_random_data, get_random_name
40 f3787696 Sofia Papagiannaki
41 d6a92fa0 Sofia Papagiannaki
from synnefo.lib import join_urls
42 d6a92fa0 Sofia Papagiannaki
43 f3787696 Sofia Papagiannaki
import django.utils.simplejson as json
44 f3787696 Sofia Papagiannaki
from django.http import urlencode
45 f3787696 Sofia Papagiannaki
46 f3787696 Sofia Papagiannaki
from xml.dom import minidom
47 f3787696 Sofia Papagiannaki
from urllib import quote
48 3a19e99b Sofia Papagiannaki
import time as _time
49 f3787696 Sofia Papagiannaki
50 f3787696 Sofia Papagiannaki
import random
51 f3787696 Sofia Papagiannaki
import datetime
52 f3787696 Sofia Papagiannaki
53 f3787696 Sofia Papagiannaki
54 f3787696 Sofia Papagiannaki
class ContainerHead(PithosAPITest):
55 f3787696 Sofia Papagiannaki
    def test_get_meta(self):
56 f3787696 Sofia Papagiannaki
        self.create_container('apples')
57 f3787696 Sofia Papagiannaki
58 f3787696 Sofia Papagiannaki
        # populate with objects
59 f3787696 Sofia Papagiannaki
        objects = {}
60 f3787696 Sofia Papagiannaki
        for i in range(random.randint(1, 100)):
61 f3787696 Sofia Papagiannaki
62 f3787696 Sofia Papagiannaki
            # upload object
63 f3787696 Sofia Papagiannaki
            meta = {'foo%s' % i: 'bar'}
64 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', **meta)
65 f3787696 Sofia Papagiannaki
            objects[name] = data
66 f3787696 Sofia Papagiannaki
67 f3787696 Sofia Papagiannaki
        t1 = datetime.datetime.utcnow()
68 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
69 d6a92fa0 Sofia Papagiannaki
        r = self.head(url)
70 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Object-Count']), len(objects))
71 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Bytes-Used']),
72 f3787696 Sofia Papagiannaki
                         sum([len(i) for i in objects.values()]))
73 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Block-Size' in r)
74 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Block-Hash' in r)
75 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Container-Until-Timestamp' not in r)
76 f3787696 Sofia Papagiannaki
        self.assertEqual(r['X-Container-Policy-Versioning'], 'auto')
77 f3787696 Sofia Papagiannaki
        self.assertEqual(int(r['X-Container-Policy-Quota']), 0)
78 f3787696 Sofia Papagiannaki
        t2 = datetime.datetime.strptime(r['Last-Modified'], DATE_FORMATS[2])
79 f3787696 Sofia Papagiannaki
        delta = (t2 - t1)
80 f3787696 Sofia Papagiannaki
        threashold = datetime.timedelta(seconds=1)
81 f3787696 Sofia Papagiannaki
        self.assertTrue(delta < threashold)
82 f3787696 Sofia Papagiannaki
        self.assertTrue(r['X-Container-Object-Meta'])
83 f3787696 Sofia Papagiannaki
        (self.assertTrue('foo%s' % i in r['X-Container-Object-Meta'])
84 f3787696 Sofia Papagiannaki
            for i in range(len(objects)))
85 f3787696 Sofia Papagiannaki
86 f3787696 Sofia Papagiannaki
87 f3787696 Sofia Papagiannaki
class ContainerGet(PithosAPITest):
88 f3787696 Sofia Papagiannaki
    def setUp(self):
89 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
90 f3787696 Sofia Papagiannaki
91 f3787696 Sofia Papagiannaki
        self.cnames = ['pears', 'apples']
92 f3787696 Sofia Papagiannaki
        self.objects = {}
93 f3787696 Sofia Papagiannaki
        for c in self.cnames:
94 f3787696 Sofia Papagiannaki
            self.create_container(c)
95 f3787696 Sofia Papagiannaki
96 f3787696 Sofia Papagiannaki
        self.objects['pears'] = {}
97 f3787696 Sofia Papagiannaki
        for o in o_names[:8]:
98 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('pears', o)
99 f3787696 Sofia Papagiannaki
            self.objects['pears'][name] = data
100 f3787696 Sofia Papagiannaki
        self.objects['apples'] = {}
101 f3787696 Sofia Papagiannaki
        for o in o_names[8:]:
102 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', o)
103 f3787696 Sofia Papagiannaki
            self.objects['apples'][name] = data
104 f3787696 Sofia Papagiannaki
105 f3787696 Sofia Papagiannaki
    def test_list_shared(self):
106 f3787696 Sofia Papagiannaki
        # share an object
107 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
108 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
109 f3787696 Sofia Papagiannaki
        oname = onames.pop()
110 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
111 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*')
112 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
113 f3787696 Sofia Papagiannaki
114 f3787696 Sofia Papagiannaki
        # publish another object
115 f3787696 Sofia Papagiannaki
        other = onames.pop()
116 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, other)
117 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
118 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
119 f3787696 Sofia Papagiannaki
120 f3787696 Sofia Papagiannaki
        # list shared and assert only the shared object is returned
121 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
122 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
123 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
124 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
125 3a19e99b Sofia Papagiannaki
        if '' in objects:
126 3a19e99b Sofia Papagiannaki
            objects.remove('')
127 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], objects)
128 f3787696 Sofia Papagiannaki
129 f3787696 Sofia Papagiannaki
        # list detailed shared and assert only the shared object is returned
130 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
131 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
132 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
133 f3787696 Sofia Papagiannaki
        try:
134 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
135 f3787696 Sofia Papagiannaki
        except:
136 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
137 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
138 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
139 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' not in objects[0])
140 f3787696 Sofia Papagiannaki
141 f3787696 Sofia Papagiannaki
        # publish the shared object and assert it is still listed in the
142 f3787696 Sofia Papagiannaki
        # shared objects
143 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
144 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
145 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
146 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
147 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
148 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
149 f3787696 Sofia Papagiannaki
        try:
150 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
151 f3787696 Sofia Papagiannaki
        except:
152 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
153 f3787696 Sofia Papagiannaki
        self.assertEqual([oname], [o['name'] for o in objects])
154 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
155 3a19e99b Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
156 f3787696 Sofia Papagiannaki
157 f3787696 Sofia Papagiannaki
        # create child object
158 f3787696 Sofia Papagiannaki
        descendant = strnextling(oname)
159 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
160 f3787696 Sofia Papagiannaki
        # request shared and assert child obejct is not listed
161 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
162 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
163 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
164 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
165 3a19e99b Sofia Papagiannaki
        if '' in objects:
166 3a19e99b Sofia Papagiannaki
            objects.remove('')
167 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
168 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
169 f3787696 Sofia Papagiannaki
170 f3787696 Sofia Papagiannaki
        # check folder inheritance
171 f3787696 Sofia Papagiannaki
        oname, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*')
172 f3787696 Sofia Papagiannaki
        # create child object
173 bc4f25c0 Sofia Papagiannaki
        descendant = '%s/%s' % (oname, get_random_name())
174 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
175 f3787696 Sofia Papagiannaki
        # request shared
176 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
177 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
178 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
179 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
180 3a19e99b Sofia Papagiannaki
        if '' in objects:
181 3a19e99b Sofia Papagiannaki
            objects.remove('')
182 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
183 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant in objects)
184 f3787696 Sofia Papagiannaki
185 f3787696 Sofia Papagiannaki
    def test_list_public(self):
186 f3787696 Sofia Papagiannaki
        # publish an object
187 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
188 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
189 f3787696 Sofia Papagiannaki
        oname = onames.pop()
190 3a19e99b Sofia Papagiannaki
        other = onames.pop()
191 3a19e99b Sofia Papagiannaki
192 3a19e99b Sofia Papagiannaki
        # publish an object
193 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
194 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
195 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
196 f3787696 Sofia Papagiannaki
197 f3787696 Sofia Papagiannaki
        # share another
198 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, other)
199 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
200 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
201 f3787696 Sofia Papagiannaki
202 f3787696 Sofia Papagiannaki
        # list public and assert only the public object is returned
203 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
204 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
205 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
206 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
207 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in r.content.split('\n'))
208 3a19e99b Sofia Papagiannaki
        (self.assertTrue(object not in objects) for object in o_names[1:])
209 f3787696 Sofia Papagiannaki
210 f3787696 Sofia Papagiannaki
        # list detailed public and assert only the public object is returned
211 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
212 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
213 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
214 f3787696 Sofia Papagiannaki
        try:
215 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
216 f3787696 Sofia Papagiannaki
        except:
217 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
218 3a19e99b Sofia Papagiannaki
        self.assertEqual([oname], [obj['name'] for obj in objects])
219 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' not in objects[0])
220 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
221 f3787696 Sofia Papagiannaki
222 f3787696 Sofia Papagiannaki
        # share the public object and assert it is still listed in the
223 f3787696 Sofia Papagiannaki
        # public objects
224 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
225 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
226 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
227 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
228 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
229 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
230 f3787696 Sofia Papagiannaki
        try:
231 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
232 f3787696 Sofia Papagiannaki
        except:
233 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
234 3a19e99b Sofia Papagiannaki
        self.assertEqual([oname], [obj['name'] for obj in objects])
235 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_sharing' in objects[0])
236 f3787696 Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
237 f3787696 Sofia Papagiannaki
238 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
239 d6a92fa0 Sofia Papagiannaki
240 f3787696 Sofia Papagiannaki
        # Assert listing the container public contents is forbidden to not
241 f3787696 Sofia Papagiannaki
        # shared users
242 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='bob')
243 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
244 f3787696 Sofia Papagiannaki
245 3a19e99b Sofia Papagiannaki
        # Assert forbidden public object listing to shared users
246 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='alice')
247 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
248 f3787696 Sofia Papagiannaki
249 f3787696 Sofia Papagiannaki
        # create child object
250 f3787696 Sofia Papagiannaki
        descendant = strnextling(oname)
251 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
252 f3787696 Sofia Papagiannaki
        # request public and assert child obejct is not listed
253 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
254 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
255 3a19e99b Sofia Papagiannaki
        if '' in objects:
256 3a19e99b Sofia Papagiannaki
            objects.remove('')
257 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
258 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
259 f3787696 Sofia Papagiannaki
        (self.assertTrue(o not in objects) for o in o_names[1:])
260 f3787696 Sofia Papagiannaki
261 f3787696 Sofia Papagiannaki
        # test folder inheritance
262 f3787696 Sofia Papagiannaki
        oname, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
263 f3787696 Sofia Papagiannaki
        # create child object
264 bc4f25c0 Sofia Papagiannaki
        descendant = '%s/%s' % (oname, get_random_name())
265 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
266 f3787696 Sofia Papagiannaki
        # request public
267 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
268 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
269 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
270 f3787696 Sofia Papagiannaki
        self.assertTrue(oname in objects)
271 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
272 f3787696 Sofia Papagiannaki
273 3a19e99b Sofia Papagiannaki
    def test_list_shared_public(self):
274 3a19e99b Sofia Papagiannaki
        # publish an object
275 3a19e99b Sofia Papagiannaki
        cname = self.cnames[0]
276 3a19e99b Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
277 3a19e99b Sofia Papagiannaki
        onames = self.objects[cname].keys()
278 3a19e99b Sofia Papagiannaki
        oname = onames.pop()
279 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, oname)
280 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
281 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
282 3a19e99b Sofia Papagiannaki
283 3a19e99b Sofia Papagiannaki
        # share another
284 3a19e99b Sofia Papagiannaki
        other = onames.pop()
285 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, other)
286 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
287 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
288 3a19e99b Sofia Papagiannaki
289 3a19e99b Sofia Papagiannaki
        # list shared and public objects and assert object is listed
290 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url)
291 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
292 3a19e99b Sofia Papagiannaki
        objects = json.loads(r.content)
293 3a19e99b Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects], sorted([oname, other]))
294 3a19e99b Sofia Papagiannaki
        for o in objects:
295 3a19e99b Sofia Papagiannaki
            if o['name'] == oname:
296 3a19e99b Sofia Papagiannaki
                self.assertTrue('x_object_public' in o.keys())
297 3a19e99b Sofia Papagiannaki
            elif o['name'] == other:
298 3a19e99b Sofia Papagiannaki
                self.assertTrue('x_object_sharing' in o.keys())
299 3a19e99b Sofia Papagiannaki
300 3a19e99b Sofia Papagiannaki
        # assert not listing shared and public to a not shared user
301 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
302 3a19e99b Sofia Papagiannaki
                     user='bob')
303 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
304 3a19e99b Sofia Papagiannaki
305 3a19e99b Sofia Papagiannaki
        # assert not listing public to a shared user
306 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
307 3a19e99b Sofia Papagiannaki
                     user='alice')
308 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
309 3a19e99b Sofia Papagiannaki
310 3a19e99b Sofia Papagiannaki
        # create child object
311 3a19e99b Sofia Papagiannaki
        descendant = strnextling(oname)
312 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
313 3a19e99b Sofia Papagiannaki
        # request public and assert child obejct is not listed
314 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
315 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
316 3a19e99b Sofia Papagiannaki
        if '' in objects:
317 3a19e99b Sofia Papagiannaki
            objects.remove('')
318 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
319 3a19e99b Sofia Papagiannaki
        self.assertTrue(oname in objects)
320 3a19e99b Sofia Papagiannaki
        (self.assertTrue(o not in objects) for o in o_names[1:])
321 3a19e99b Sofia Papagiannaki
322 3a19e99b Sofia Papagiannaki
        # test folder inheritance
323 3a19e99b Sofia Papagiannaki
        oname, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
324 3a19e99b Sofia Papagiannaki
        # create child object
325 bc4f25c0 Sofia Papagiannaki
        descendant = '%s/%s' % (oname, get_random_name())
326 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
327 3a19e99b Sofia Papagiannaki
        # request public
328 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
329 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
330 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
331 3a19e99b Sofia Papagiannaki
        if '' in objects:
332 3a19e99b Sofia Papagiannaki
            objects.remove('')
333 3a19e99b Sofia Papagiannaki
        self.assertTrue(oname in objects)
334 3a19e99b Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
335 3a19e99b Sofia Papagiannaki
336 f3787696 Sofia Papagiannaki
    def test_list_objects(self):
337 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
338 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
339 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
340 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
341 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
342 f3787696 Sofia Papagiannaki
        if '' in objects:
343 f3787696 Sofia Papagiannaki
            objects.remove('')
344 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, sorted(self.objects[cname].keys()))
345 f3787696 Sofia Papagiannaki
346 f3787696 Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
347 f3787696 Sofia Papagiannaki
        self.create_container('test')
348 3a19e99b Sofia Papagiannaki
        self.upload_object('test', quote('/objectname', ''))
349 f3787696 Sofia Papagiannaki
350 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'test')
351 d6a92fa0 Sofia Papagiannaki
352 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
353 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
354 f3787696 Sofia Papagiannaki
        if '' in objects:
355 f3787696 Sofia Papagiannaki
            objects.remove('')
356 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, ['/objectname'])
357 f3787696 Sofia Papagiannaki
358 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
359 f3787696 Sofia Papagiannaki
        try:
360 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
361 f3787696 Sofia Papagiannaki
        except:
362 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
363 f3787696 Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects], ['/objectname'])
364 f3787696 Sofia Papagiannaki
365 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=xml' % url)
366 f3787696 Sofia Papagiannaki
        try:
367 f3787696 Sofia Papagiannaki
            objects = minidom.parseString(r.content)
368 f3787696 Sofia Papagiannaki
        except:
369 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
370 f3787696 Sofia Papagiannaki
        self.assertEqual(
371 f3787696 Sofia Papagiannaki
            [n.firstChild.data for n in objects.getElementsByTagName('name')],
372 f3787696 Sofia Papagiannaki
            ['/objectname'])
373 f3787696 Sofia Papagiannaki
374 f3787696 Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
375 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
376 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
377 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=qwert' % url)
378 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code != 500)
379 f3787696 Sofia Papagiannaki
380 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=2' % url)
381 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
382 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
383 f3787696 Sofia Papagiannaki
        if '' in objects:
384 f3787696 Sofia Papagiannaki
            objects.remove('')
385 f3787696 Sofia Papagiannaki
386 f3787696 Sofia Papagiannaki
        onames = sorted(self.objects[cname].keys())
387 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, onames[:2])
388 f3787696 Sofia Papagiannaki
389 f3787696 Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
390 f3787696 Sofia Papagiannaki
                   'moms_birthday.jpg']
391 f3787696 Sofia Papagiannaki
        limit = 4
392 f3787696 Sofia Papagiannaki
        for m in markers:
393 d6a92fa0 Sofia Papagiannaki
            r = self.get('%s?limit=%s&marker=%s' % (url, limit, m))
394 f3787696 Sofia Papagiannaki
            objects = r.content.split('\n')
395 f3787696 Sofia Papagiannaki
            if '' in objects:
396 f3787696 Sofia Papagiannaki
                objects.remove('')
397 f3787696 Sofia Papagiannaki
            start = onames.index(m) + 1
398 f3787696 Sofia Papagiannaki
            end = start + limit
399 f3787696 Sofia Papagiannaki
            end = end if len(onames) >= end else len(onames)
400 f3787696 Sofia Papagiannaki
            self.assertEqual(objects, onames[start:end])
401 f3787696 Sofia Papagiannaki
402 f3787696 Sofia Papagiannaki
    @pithos_test_settings(API_LIST_LIMIT=10)
403 f3787696 Sofia Papagiannaki
    def test_list_limit_exceeds(self):
404 f3787696 Sofia Papagiannaki
        self.create_container('container')
405 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'container')
406 f3787696 Sofia Papagiannaki
407 f3787696 Sofia Papagiannaki
        for _ in range(pithos_settings.API_LIST_LIMIT + 1):
408 f3787696 Sofia Papagiannaki
            self.upload_object('container')
409 f3787696 Sofia Papagiannaki
410 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
411 f3787696 Sofia Papagiannaki
        try:
412 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
413 f3787696 Sofia Papagiannaki
        except:
414 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
415 f3787696 Sofia Papagiannaki
        self.assertEqual(pithos_settings.API_LIST_LIMIT,
416 f3787696 Sofia Papagiannaki
                         len(objects))
417 f3787696 Sofia Papagiannaki
418 f3787696 Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
419 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
420 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos&delimiter=/' % url)
421 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
422 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
423 f3787696 Sofia Papagiannaki
        if '' in objects:
424 f3787696 Sofia Papagiannaki
            objects.remove('')
425 f3787696 Sofia Papagiannaki
        self.assertEquals(
426 f3787696 Sofia Papagiannaki
            ['photos/animals/', 'photos/me.jpg', 'photos/plants/'],
427 f3787696 Sofia Papagiannaki
            objects)
428 f3787696 Sofia Papagiannaki
429 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos/animals&delimiter=/' % url)
430 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
431 f3787696 Sofia Papagiannaki
        if '' in objects:
432 f3787696 Sofia Papagiannaki
            objects.remove('')
433 f3787696 Sofia Papagiannaki
        self.assertEquals(
434 f3787696 Sofia Papagiannaki
            ['photos/animals/cats/', 'photos/animals/dogs/'], objects)
435 f3787696 Sofia Papagiannaki
436 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?path=photos' % url)
437 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
438 f3787696 Sofia Papagiannaki
        if '' in objects:
439 f3787696 Sofia Papagiannaki
            objects.remove('')
440 f3787696 Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
441 f3787696 Sofia Papagiannaki
442 f3787696 Sofia Papagiannaki
    def test_extended_list_json(self):
443 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
444 f3787696 Sofia Papagiannaki
        params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals',
445 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
446 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
447 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
448 f3787696 Sofia Papagiannaki
        try:
449 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
450 f3787696 Sofia Papagiannaki
        except:
451 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
452 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
453 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
454 f3787696 Sofia Papagiannaki
455 f3787696 Sofia Papagiannaki
    def test_extended_list_xml(self):
456 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
457 f3787696 Sofia Papagiannaki
        params = {'format': 'xml', 'limit': 4, 'prefix': 'photos',
458 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
459 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
460 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
461 f3787696 Sofia Papagiannaki
        try:
462 f3787696 Sofia Papagiannaki
            xml = minidom.parseString(r.content)
463 f3787696 Sofia Papagiannaki
        except:
464 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
465 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
466 f3787696 Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
467 f3787696 Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
468 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
469 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
470 f3787696 Sofia Papagiannaki
471 f3787696 Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
472 f3787696 Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
473 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
474 f3787696 Sofia Papagiannaki
475 f3787696 Sofia Papagiannaki
    def test_list_meta_double_matching(self):
476 f3787696 Sofia Papagiannaki
        # update object meta
477 f3787696 Sofia Papagiannaki
        cname = 'apples'
478 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
479 f3787696 Sofia Papagiannaki
        oname = self.objects[cname].keys().pop()
480 f3787696 Sofia Papagiannaki
        meta = {'quality': 'aaa', 'stock': 'true'}
481 f3787696 Sofia Papagiannaki
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
482 f3787696 Sofia Papagiannaki
                       for k, v in meta.iteritems())
483 d6a92fa0 Sofia Papagiannaki
        object_url = join_urls(container_url, oname)
484 d6a92fa0 Sofia Papagiannaki
        self.post(object_url, content_type='', **headers)
485 f3787696 Sofia Papagiannaki
486 f3787696 Sofia Papagiannaki
        # list objects that satisfy the criteria
487 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
488 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
489 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
490 f3787696 Sofia Papagiannaki
        if '' in objects:
491 f3787696 Sofia Papagiannaki
            objects.remove('')
492 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, [oname])
493 f3787696 Sofia Papagiannaki
494 f3787696 Sofia Papagiannaki
    def test_list_using_meta(self):
495 f3787696 Sofia Papagiannaki
        # update object meta
496 f3787696 Sofia Papagiannaki
        cname = 'apples'
497 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
498 d6a92fa0 Sofia Papagiannaki
499 3a19e99b Sofia Papagiannaki
        onames = self.objects[cname].keys()
500 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[0])
501 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa')
502 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
503 d6a92fa0 Sofia Papagiannaki
504 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[1])
505 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab')
506 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
507 f3787696 Sofia Papagiannaki
508 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[2])
509 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100')
510 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
511 d6a92fa0 Sofia Papagiannaki
512 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[3])
513 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200')
514 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
515 f3787696 Sofia Papagiannaki
516 f3787696 Sofia Papagiannaki
        # test multiple existence criteria matches
517 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
518 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
519 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
520 f3787696 Sofia Papagiannaki
        if '' in objects:
521 f3787696 Sofia Papagiannaki
            objects.remove('')
522 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames))
523 f3787696 Sofia Papagiannaki
524 f3787696 Sofia Papagiannaki
        # list objects that satisfy the existence criteria
525 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Stock' % container_url)
526 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
527 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
528 f3787696 Sofia Papagiannaki
        if '' in objects:
529 f3787696 Sofia Papagiannaki
            objects.remove('')
530 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[2:]))
531 f3787696 Sofia Papagiannaki
532 f3787696 Sofia Papagiannaki
        # test case insensitive existence criteria matching
533 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=quality' % container_url)
534 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
535 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
536 f3787696 Sofia Papagiannaki
        if '' in objects:
537 f3787696 Sofia Papagiannaki
            objects.remove('')
538 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
539 f3787696 Sofia Papagiannaki
540 f3787696 Sofia Papagiannaki
        # test do not all existencecriteria match
541 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Foo' % container_url)
542 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
543 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
544 f3787696 Sofia Papagiannaki
        if '' in objects:
545 f3787696 Sofia Papagiannaki
            objects.remove('')
546 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
547 f3787696 Sofia Papagiannaki
548 f3787696 Sofia Papagiannaki
        # test equals criteria
549 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa')))
550 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
551 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
552 f3787696 Sofia Papagiannaki
        if '' in objects:
553 f3787696 Sofia Papagiannaki
            objects.remove('')
554 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[0]])
555 f3787696 Sofia Papagiannaki
556 f3787696 Sofia Papagiannaki
        # test not equals criteria
557 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality!=aaa')))
558 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
559 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
560 f3787696 Sofia Papagiannaki
        if '' in objects:
561 3a19e99b Sofia Papagiannaki
            objects.remove('')
562 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[1]])
563 f3787696 Sofia Papagiannaki
564 f3787696 Sofia Papagiannaki
        # test lte criteria
565 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock<=120')))
566 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
567 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
568 f3787696 Sofia Papagiannaki
        if '' in objects:
569 f3787696 Sofia Papagiannaki
            objects.remove('')
570 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[2]])
571 f3787696 Sofia Papagiannaki
572 f3787696 Sofia Papagiannaki
        # test gte criteria
573 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock>=200')))
574 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
575 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
576 f3787696 Sofia Papagiannaki
        if '' in objects:
577 f3787696 Sofia Papagiannaki
            objects.remove('')
578 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[3]])
579 f3787696 Sofia Papagiannaki
580 3a19e99b Sofia Papagiannaki
    def test_if_modified_since(self):
581 3a19e99b Sofia Papagiannaki
        cname = 'apples'
582 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
583 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
584 3a19e99b Sofia Papagiannaki
        t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
585 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
586 3a19e99b Sofia Papagiannaki
587 3a19e99b Sofia Papagiannaki
        # Check not modified
588 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
589 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
590 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
591 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
592 3a19e99b Sofia Papagiannaki
593 3a19e99b Sofia Papagiannaki
        # modify account: add container
594 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
595 3a19e99b Sofia Papagiannaki
        oname = self.upload_object(cname)[0]
596 3a19e99b Sofia Papagiannaki
597 3a19e99b Sofia Papagiannaki
        # Check modified
598 3a19e99b Sofia Papagiannaki
        objects = self.objects[cname].keys()
599 3a19e99b Sofia Papagiannaki
        objects.append(oname)
600 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
601 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
602 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
603 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
604 3a19e99b Sofia Papagiannaki
605 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
606 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
607 3a19e99b Sofia Papagiannaki
        t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
608 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
609 3a19e99b Sofia Papagiannaki
610 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
611 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
612 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
613 3a19e99b Sofia Papagiannaki
614 3a19e99b Sofia Papagiannaki
        # Check modified
615 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
616 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
617 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
618 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
619 3a19e99b Sofia Papagiannaki
620 3a19e99b Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
621 3a19e99b Sofia Papagiannaki
        cname = 'apples'
622 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
623 3a19e99b Sofia Papagiannaki
        r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday')
624 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
625 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.content.split('\n')[:-1],
626 3a19e99b Sofia Papagiannaki
                         sorted(self.objects['apples'].keys()))
627 3a19e99b Sofia Papagiannaki
628 3a19e99b Sofia Papagiannaki
    def test_if_not_modified_since(self):
629 3a19e99b Sofia Papagiannaki
        cname = 'apples'
630 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
631 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
632 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
633 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
634 3a19e99b Sofia Papagiannaki
635 3a19e99b Sofia Papagiannaki
        # Check unmodified
636 3a19e99b Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
637 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
638 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
639 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
640 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
641 3a19e99b Sofia Papagiannaki
            self.assertEqual(
642 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
643 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
644 3a19e99b Sofia Papagiannaki
645 3a19e99b Sofia Papagiannaki
        # modify account: add container
646 3a19e99b Sofia Papagiannaki
        _time.sleep(2)
647 3a19e99b Sofia Papagiannaki
        self.upload_object(cname)
648 3a19e99b Sofia Papagiannaki
649 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
650 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
651 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
652 3a19e99b Sofia Papagiannaki
        t2 = t - datetime.timedelta(seconds=1)
653 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
654 3a19e99b Sofia Papagiannaki
655 3a19e99b Sofia Papagiannaki
        # Check modified
656 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
657 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
658 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
659 3a19e99b Sofia Papagiannaki
660 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
661 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
662 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
663 3a19e99b Sofia Papagiannaki
664 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
665 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
666 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
667 3a19e99b Sofia Papagiannaki
        t3 = t - datetime.timedelta(seconds=1)
668 3a19e99b Sofia Papagiannaki
        t3_formats = map(t3.strftime, DATE_FORMATS)
669 3a19e99b Sofia Papagiannaki
670 3a19e99b Sofia Papagiannaki
        # Check modified
671 3a19e99b Sofia Papagiannaki
        for t in t3_formats:
672 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
673 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
674 3a19e99b Sofia Papagiannaki
675 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since(self):
676 3a19e99b Sofia Papagiannaki
        cname = 'apples'
677 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
678 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
679 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
680 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
681 3a19e99b Sofia Papagiannaki
        t = t + datetime.timedelta(seconds=1)
682 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
683 3a19e99b Sofia Papagiannaki
684 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
685 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
686 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
687 3a19e99b Sofia Papagiannaki
            self.assertEqual(
688 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
689 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
690 3a19e99b Sofia Papagiannaki
691 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
692 3a19e99b Sofia Papagiannaki
        cname = 'apples'
693 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
694 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
695 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
696 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
697 3a19e99b Sofia Papagiannaki
        t = t - datetime.timedelta(seconds=1)
698 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
699 3a19e99b Sofia Papagiannaki
700 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
701 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
702 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
703 3a19e99b Sofia Papagiannaki
704 3a19e99b Sofia Papagiannaki
705 3a19e99b Sofia Papagiannaki
class ContainerPut(PithosAPITest):
706 3a19e99b Sofia Papagiannaki
    def test_create(self):
707 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
708 3a19e99b Sofia Papagiannaki
        self.list_containers()
709 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
710 3a19e99b Sofia Papagiannaki
711 3a19e99b Sofia Papagiannaki
    def test_create_twice(self):
712 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
713 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
714 2a194295 Sofia Papagiannaki
        r = self.create_container('c1')[-1]
715 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
716 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
717 3a19e99b Sofia Papagiannaki
718 3a19e99b Sofia Papagiannaki
719 3a19e99b Sofia Papagiannaki
class ContainerPost(PithosAPITest):
720 3a19e99b Sofia Papagiannaki
    def test_update_meta(self):
721 3a19e99b Sofia Papagiannaki
        cname = 'apples'
722 3a19e99b Sofia Papagiannaki
        self.create_container(cname)
723 3a19e99b Sofia Papagiannaki
        meta = {'test': 'test33', 'tost': 'tost22'}
724 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, meta)
725 3a19e99b Sofia Papagiannaki
        info = self.get_container_info(cname)
726 3a19e99b Sofia Papagiannaki
        for k, v in meta.items():
727 3a19e99b Sofia Papagiannaki
            k = 'x-container-meta-%s' % k
728 3a19e99b Sofia Papagiannaki
            self.assertTrue(k in info)
729 3a19e99b Sofia Papagiannaki
            self.assertEqual(info[k], v)
730 3a19e99b Sofia Papagiannaki
731 3a19e99b Sofia Papagiannaki
    def test_quota(self):
732 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
733 3a19e99b Sofia Papagiannaki
734 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
735 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='100')
736 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
737 3a19e99b Sofia Papagiannaki
738 3a19e99b Sofia Papagiannaki
        info = self.get_container_info('c1')
739 3a19e99b Sofia Papagiannaki
        self.assertTrue('x-container-policy-quota' in info)
740 3a19e99b Sofia Papagiannaki
        self.assertEqual(info['x-container-policy-quota'], '100')
741 3a19e99b Sofia Papagiannaki
742 3a19e99b Sofia Papagiannaki
        r = self.upload_object('c1', length=101, verify=False)[2]
743 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 413)
744 3a19e99b Sofia Papagiannaki
745 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
746 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='0')
747 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
748 3a19e99b Sofia Papagiannaki
749 3a19e99b Sofia Papagiannaki
        r = self.upload_object('c1', length=1)
750 3a19e99b Sofia Papagiannaki
751 3a19e99b Sofia Papagiannaki
752 3a19e99b Sofia Papagiannaki
class ContainerDelete(PithosAPITest):
753 3a19e99b Sofia Papagiannaki
    def setUp(self):
754 3a19e99b Sofia Papagiannaki
        PithosAPITest.setUp(self)
755 3a19e99b Sofia Papagiannaki
        cnames = ['c1', 'c2']
756 3a19e99b Sofia Papagiannaki
757 3a19e99b Sofia Papagiannaki
        for c in cnames:
758 3a19e99b Sofia Papagiannaki
            self.create_container(c)
759 3a19e99b Sofia Papagiannaki
760 3a19e99b Sofia Papagiannaki
    def test_delete(self):
761 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
762 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
763 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
764 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' not in self.list_containers(format=None))
765 3a19e99b Sofia Papagiannaki
766 3a19e99b Sofia Papagiannaki
    def test_delete_non_empty(self):
767 3a19e99b Sofia Papagiannaki
        self.upload_object('c1')
768 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
769 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
770 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 409)
771 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
772 3a19e99b Sofia Papagiannaki
773 3a19e99b Sofia Papagiannaki
    def test_delete_invalid(self):
774 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c3')
775 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
776 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
777 3a19e99b Sofia Papagiannaki
778 3a19e99b Sofia Papagiannaki
    def test_delete_contents(self):
779 3a19e99b Sofia Papagiannaki
        folder = self.create_folder('c1')[0]
780 3a19e99b Sofia Papagiannaki
        descendant = strnextling(folder)
781 3a19e99b Sofia Papagiannaki
        self.upload_object('c1', descendant)
782 3a19e99b Sofia Papagiannaki
        self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0]
783 3a19e99b Sofia Papagiannaki
784 3a19e99b Sofia Papagiannaki
        self.delete('%s?delimiter=/' % join_urls(
785 3a19e99b Sofia Papagiannaki
            self.pithos_path, self.user, 'c1'))
786 3a19e99b Sofia Papagiannaki
        self.assertEqual([], self.list_objects('c1'))
787 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))