Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (33.9 kB)

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