Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (36.5 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 8b5c1106 Sofia Papagiannaki
    def test_get_container_meta_until(self):
87 8b5c1106 Sofia Papagiannaki
        self.create_container('apples')
88 8b5c1106 Sofia Papagiannaki
89 8b5c1106 Sofia Papagiannaki
        # populate with objects
90 8b5c1106 Sofia Papagiannaki
        objects = {}
91 8b5c1106 Sofia Papagiannaki
        metalist = []
92 8b5c1106 Sofia Papagiannaki
        for i in range(random.randint(1, 100)):
93 8b5c1106 Sofia Papagiannaki
            # upload object
94 8b5c1106 Sofia Papagiannaki
            metakey = 'Foo%s' % i
95 8b5c1106 Sofia Papagiannaki
            meta = {metakey: 'bar'}
96 8b5c1106 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', **meta)
97 8b5c1106 Sofia Papagiannaki
            objects[name] = data
98 e8e50dcc Ilias Tsitsimpis
            metalist.append(metakey)
99 8b5c1106 Sofia Papagiannaki
100 8b5c1106 Sofia Papagiannaki
        self.update_container_meta('apples', {'foo': 'bar'})
101 8b5c1106 Sofia Papagiannaki
102 8b5c1106 Sofia Papagiannaki
        container_info = self.get_container_info('apples')
103 8b5c1106 Sofia Papagiannaki
        t = datetime.datetime.strptime(container_info['Last-Modified'],
104 8b5c1106 Sofia Papagiannaki
                                       DATE_FORMATS[2])
105 8b5c1106 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
106 8b5c1106 Sofia Papagiannaki
        until = int(_time.mktime(t1.timetuple()))
107 8b5c1106 Sofia Papagiannaki
108 8b5c1106 Sofia Papagiannaki
        _time.sleep(2)
109 8b5c1106 Sofia Papagiannaki
110 8b5c1106 Sofia Papagiannaki
        for i in range(random.randint(1, 100)):
111 8b5c1106 Sofia Papagiannaki
            # upload object
112 8b5c1106 Sofia Papagiannaki
            meta = {'foo%s' % i: 'bar'}
113 8b5c1106 Sofia Papagiannaki
            self.upload_object('apples', **meta)
114 8b5c1106 Sofia Papagiannaki
115 8b5c1106 Sofia Papagiannaki
        self.update_container_meta('apples', {'quality': 'AAA'})
116 8b5c1106 Sofia Papagiannaki
117 8b5c1106 Sofia Papagiannaki
        container_info = self.get_container_info('apples')
118 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Meta-Quality' in container_info)
119 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Meta-Foo' in container_info)
120 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Object-Count' in container_info)
121 84c67d8e Sofia Papagiannaki
        self.assertTrue(int(container_info['X-Container-Object-Count']) >
122 84c67d8e Sofia Papagiannaki
                        len(objects))
123 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Bytes-Used' in container_info)
124 8b5c1106 Sofia Papagiannaki
125 8b5c1106 Sofia Papagiannaki
        t = datetime.datetime.strptime(container_info['Last-Modified'],
126 8b5c1106 Sofia Papagiannaki
                                       DATE_FORMATS[-1])
127 8b5c1106 Sofia Papagiannaki
        last_modified = int(_time.mktime(t.timetuple()))
128 8b5c1106 Sofia Papagiannaki
        assert until < last_modified
129 8b5c1106 Sofia Papagiannaki
130 8b5c1106 Sofia Papagiannaki
        container_info = self.get_container_info('apples', until=until)
131 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Meta-Quality' not in container_info)
132 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Meta-Foo' in container_info)
133 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Until-Timestamp' in container_info)
134 8b5c1106 Sofia Papagiannaki
        t = datetime.datetime.strptime(
135 8b5c1106 Sofia Papagiannaki
            container_info['X-Container-Until-Timestamp'], DATE_FORMATS[2])
136 8b5c1106 Sofia Papagiannaki
        self.assertTrue(int(_time.mktime(t1.timetuple())) <= until)
137 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Object-Count' in container_info)
138 84c67d8e Sofia Papagiannaki
        self.assertEqual(int(container_info['X-Container-Object-Count']),
139 84c67d8e Sofia Papagiannaki
                         len(objects))
140 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Bytes-Used' in container_info)
141 8b5c1106 Sofia Papagiannaki
        self.assertEqual(int(container_info['X-Container-Bytes-Used']),
142 8b5c1106 Sofia Papagiannaki
                         sum([len(data) for data in objects.values()]))
143 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Container-Object-Meta' in container_info)
144 84c67d8e Sofia Papagiannaki
        self.assertEqual(
145 84c67d8e Sofia Papagiannaki
            sorted(container_info['X-Container-Object-Meta'].split(',')),
146 84c67d8e Sofia Papagiannaki
            sorted(metalist))
147 8b5c1106 Sofia Papagiannaki
148 f3787696 Sofia Papagiannaki
149 f3787696 Sofia Papagiannaki
class ContainerGet(PithosAPITest):
150 f3787696 Sofia Papagiannaki
    def setUp(self):
151 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
152 f3787696 Sofia Papagiannaki
153 f3787696 Sofia Papagiannaki
        self.cnames = ['pears', 'apples']
154 f3787696 Sofia Papagiannaki
        self.objects = {}
155 f3787696 Sofia Papagiannaki
        for c in self.cnames:
156 f3787696 Sofia Papagiannaki
            self.create_container(c)
157 f3787696 Sofia Papagiannaki
158 f3787696 Sofia Papagiannaki
        self.objects['pears'] = {}
159 f3787696 Sofia Papagiannaki
        for o in o_names[:8]:
160 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('pears', o)
161 f3787696 Sofia Papagiannaki
            self.objects['pears'][name] = data
162 f3787696 Sofia Papagiannaki
        self.objects['apples'] = {}
163 f3787696 Sofia Papagiannaki
        for o in o_names[8:]:
164 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object('apples', o)
165 f3787696 Sofia Papagiannaki
            self.objects['apples'][name] = data
166 f3787696 Sofia Papagiannaki
167 8b5c1106 Sofia Papagiannaki
    def test_list_until(self):
168 8b5c1106 Sofia Papagiannaki
        account_info = self.get_account_info()
169 8b5c1106 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
170 8b5c1106 Sofia Papagiannaki
                                       DATE_FORMATS[2])
171 8b5c1106 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
172 8b5c1106 Sofia Papagiannaki
        until = int(_time.mktime(t1.timetuple()))
173 8b5c1106 Sofia Papagiannaki
174 8b5c1106 Sofia Papagiannaki
        _time.sleep(2)
175 8b5c1106 Sofia Papagiannaki
176 8b5c1106 Sofia Papagiannaki
        cname = self.cnames[0]
177 8b5c1106 Sofia Papagiannaki
        self.upload_object(cname)
178 8b5c1106 Sofia Papagiannaki
179 8b5c1106 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
180 8b5c1106 Sofia Papagiannaki
        r = self.get('%s?until=%s' % (url, until))
181 8b5c1106 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
182 8b5c1106 Sofia Papagiannaki
        objects = r.content.split('\n')
183 8b5c1106 Sofia Papagiannaki
        if '' in objects:
184 8b5c1106 Sofia Papagiannaki
            objects.remove('')
185 8b5c1106 Sofia Papagiannaki
        self.assertEqual(objects,
186 8b5c1106 Sofia Papagiannaki
                         sorted(self.objects[cname].keys()))
187 8b5c1106 Sofia Papagiannaki
188 8b5c1106 Sofia Papagiannaki
        r = self.get('%s?until=%s&format=json' % (url, until))
189 8b5c1106 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
190 8b5c1106 Sofia Papagiannaki
        try:
191 8b5c1106 Sofia Papagiannaki
            objects = json.loads(r.content)
192 8b5c1106 Sofia Papagiannaki
        except:
193 8b5c1106 Sofia Papagiannaki
            self.fail('json format expected')
194 8b5c1106 Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects],
195 8b5c1106 Sofia Papagiannaki
                         sorted(self.objects[cname].keys()))
196 8b5c1106 Sofia Papagiannaki
197 f3787696 Sofia Papagiannaki
    def test_list_shared(self):
198 f3787696 Sofia Papagiannaki
        # share an object
199 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
200 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
201 2c2513fc Sofia Papagiannaki
        shared1 = onames.pop()
202 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared1)
203 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*')
204 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
205 f3787696 Sofia Papagiannaki
206 2c2513fc Sofia Papagiannaki
        # share another object
207 2c2513fc Sofia Papagiannaki
        shared2 = onames.pop()
208 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared2)
209 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*')
210 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
211 2c2513fc Sofia Papagiannaki
212 2c2513fc Sofia Papagiannaki
        # publish another object
213 2c2513fc Sofia Papagiannaki
        public1 = onames.pop()
214 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public1)
215 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
216 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
217 2c2513fc Sofia Papagiannaki
218 f3787696 Sofia Papagiannaki
        # publish another object
219 2c2513fc Sofia Papagiannaki
        public2 = onames.pop()
220 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public2)
221 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
222 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
223 f3787696 Sofia Papagiannaki
224 f3787696 Sofia Papagiannaki
        # list shared and assert only the shared object is returned
225 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
226 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
227 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
228 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
229 3a19e99b Sofia Papagiannaki
        if '' in objects:
230 3a19e99b Sofia Papagiannaki
            objects.remove('')
231 2c2513fc Sofia Papagiannaki
        self.assertEqual(sorted([shared1, shared2]), objects)
232 f3787696 Sofia Papagiannaki
233 f3787696 Sofia Papagiannaki
        # list detailed shared and assert only the shared object is returned
234 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
235 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
236 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
237 f3787696 Sofia Papagiannaki
        try:
238 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
239 f3787696 Sofia Papagiannaki
        except:
240 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
241 2c2513fc Sofia Papagiannaki
        l = sorted([shared1, shared2])
242 2c2513fc Sofia Papagiannaki
        i = 0
243 2c2513fc Sofia Papagiannaki
        for name in l:
244 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
245 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
246 2c2513fc Sofia Papagiannaki
                             len(self.objects[cname][name]))
247 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i])
248 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_public' not in objects[i])
249 2c2513fc Sofia Papagiannaki
            i += 1
250 f3787696 Sofia Papagiannaki
251 f3787696 Sofia Papagiannaki
        # publish the shared object and assert it is still listed in the
252 f3787696 Sofia Papagiannaki
        # shared objects
253 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared1)
254 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
255 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
256 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
257 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=&format=json' % url)
258 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
259 f3787696 Sofia Papagiannaki
        try:
260 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
261 f3787696 Sofia Papagiannaki
        except:
262 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
263 2c2513fc Sofia Papagiannaki
        i = 0
264 2c2513fc Sofia Papagiannaki
        for name in l:
265 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
266 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
267 2c2513fc Sofia Papagiannaki
                             len(self.objects[cname][name]))
268 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i])
269 2c2513fc Sofia Papagiannaki
            if name == shared1:
270 2c2513fc Sofia Papagiannaki
                self.assertTrue('x_object_public' in objects[i])
271 2c2513fc Sofia Papagiannaki
            else:
272 2c2513fc Sofia Papagiannaki
                self.assertTrue('x_object_public' not in objects[i])
273 2c2513fc Sofia Papagiannaki
            i += 1
274 f3787696 Sofia Papagiannaki
275 f3787696 Sofia Papagiannaki
        # create child object
276 2c2513fc Sofia Papagiannaki
        descendant = strnextling(shared1)
277 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
278 f3787696 Sofia Papagiannaki
        # request shared and assert child obejct is not listed
279 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
280 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
281 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
282 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
283 3a19e99b Sofia Papagiannaki
        if '' in objects:
284 3a19e99b Sofia Papagiannaki
            objects.remove('')
285 2c2513fc Sofia Papagiannaki
        self.assertTrue(shared1 in objects)
286 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
287 f3787696 Sofia Papagiannaki
288 f3787696 Sofia Papagiannaki
        # check folder inheritance
289 2c2513fc Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*')
290 f3787696 Sofia Papagiannaki
        # create child object
291 2c2513fc Sofia Papagiannaki
        descendant = '%s/%s' % (folder, get_random_name())
292 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
293 f3787696 Sofia Papagiannaki
        # request shared
294 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
295 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
296 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
297 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
298 3a19e99b Sofia Papagiannaki
        if '' in objects:
299 3a19e99b Sofia Papagiannaki
            objects.remove('')
300 2c2513fc Sofia Papagiannaki
        self.assertTrue(folder in objects)
301 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant in objects)
302 f3787696 Sofia Papagiannaki
303 f3787696 Sofia Papagiannaki
    def test_list_public(self):
304 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
305 f3787696 Sofia Papagiannaki
        onames = self.objects[cname].keys()
306 3a19e99b Sofia Papagiannaki
307 3a19e99b Sofia Papagiannaki
        # publish an object
308 2c2513fc Sofia Papagiannaki
        public1 = onames.pop()
309 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public1)
310 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
311 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
312 f3787696 Sofia Papagiannaki
313 2c2513fc Sofia Papagiannaki
        # publish another
314 2c2513fc Sofia Papagiannaki
        public2 = onames.pop()
315 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public2)
316 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
317 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
318 2c2513fc Sofia Papagiannaki
319 2c2513fc Sofia Papagiannaki
        # share an object
320 2c2513fc Sofia Papagiannaki
        shared1 = onames.pop()
321 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared1)
322 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
323 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
324 2c2513fc Sofia Papagiannaki
325 f3787696 Sofia Papagiannaki
        # share another
326 2c2513fc Sofia Papagiannaki
        shared2 = onames.pop()
327 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared2)
328 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
329 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
330 f3787696 Sofia Papagiannaki
331 f3787696 Sofia Papagiannaki
        # list public and assert only the public object is returned
332 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
333 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
334 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
335 2c2513fc Sofia Papagiannaki
        objects = r.content.split('\n')
336 2c2513fc Sofia Papagiannaki
        if '' in objects:
337 2c2513fc Sofia Papagiannaki
            objects.remove('')
338 2c2513fc Sofia Papagiannaki
        self.assertEqual(sorted([public1, public2]), objects)
339 f3787696 Sofia Papagiannaki
340 f3787696 Sofia Papagiannaki
        # list detailed public and assert only the public object is returned
341 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
342 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
343 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
344 f3787696 Sofia Papagiannaki
        try:
345 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
346 f3787696 Sofia Papagiannaki
        except:
347 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
348 2c2513fc Sofia Papagiannaki
        l = sorted([public1, public2])
349 2c2513fc Sofia Papagiannaki
        i = 0
350 2c2513fc Sofia Papagiannaki
        for name in l:
351 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
352 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
353 2c2513fc Sofia Papagiannaki
                             len(self.objects[cname][name]))
354 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_sharing' not in objects[i])
355 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_public' in objects[i])
356 2c2513fc Sofia Papagiannaki
            i += 1
357 f3787696 Sofia Papagiannaki
358 f3787696 Sofia Papagiannaki
        # share the public object and assert it is still listed in the
359 f3787696 Sofia Papagiannaki
        # public objects
360 2c2513fc Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public1)
361 d6a92fa0 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
362 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
363 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
364 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url)
365 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
366 f3787696 Sofia Papagiannaki
        try:
367 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
368 f3787696 Sofia Papagiannaki
        except:
369 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
370 2c2513fc Sofia Papagiannaki
        i = 0
371 2c2513fc Sofia Papagiannaki
        for name in l:
372 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
373 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
374 2c2513fc Sofia Papagiannaki
                             len(self.objects[cname][name]))
375 2c2513fc Sofia Papagiannaki
            if name == public1:
376 2c2513fc Sofia Papagiannaki
                self.assertTrue('x_object_sharing' in objects[i])
377 2c2513fc Sofia Papagiannaki
            else:
378 2c2513fc Sofia Papagiannaki
                self.assertTrue('x_object_sharing' not in objects[i])
379 2c2513fc Sofia Papagiannaki
            i += 1
380 f3787696 Sofia Papagiannaki
381 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
382 d6a92fa0 Sofia Papagiannaki
383 f3787696 Sofia Papagiannaki
        # Assert listing the container public contents is forbidden to not
384 f3787696 Sofia Papagiannaki
        # shared users
385 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='bob')
386 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
387 f3787696 Sofia Papagiannaki
388 3a19e99b Sofia Papagiannaki
        # Assert forbidden public object listing to shared users
389 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=&format=json' % url, user='alice')
390 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
391 f3787696 Sofia Papagiannaki
392 f3787696 Sofia Papagiannaki
        # create child object
393 2c2513fc Sofia Papagiannaki
        descendant = strnextling(public1)
394 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
395 f3787696 Sofia Papagiannaki
        # request public and assert child obejct is not listed
396 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
397 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
398 3a19e99b Sofia Papagiannaki
        if '' in objects:
399 3a19e99b Sofia Papagiannaki
            objects.remove('')
400 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
401 2c2513fc Sofia Papagiannaki
        self.assertTrue(public1 in objects)
402 2c2513fc Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
403 f3787696 Sofia Papagiannaki
404 f3787696 Sofia Papagiannaki
        # test folder inheritance
405 2c2513fc Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
406 f3787696 Sofia Papagiannaki
        # create child object
407 2c2513fc Sofia Papagiannaki
        descendant = '%s/%s' % (folder, get_random_name())
408 f3787696 Sofia Papagiannaki
        self.upload_object(cname, descendant)
409 f3787696 Sofia Papagiannaki
        # request public
410 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?public=' % url)
411 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
412 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
413 2c2513fc Sofia Papagiannaki
        self.assertTrue(folder in objects)
414 f3787696 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
415 f3787696 Sofia Papagiannaki
416 3a19e99b Sofia Papagiannaki
    def test_list_shared_public(self):
417 3a19e99b Sofia Papagiannaki
        cname = self.cnames[0]
418 3a19e99b Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
419 3a19e99b Sofia Papagiannaki
        onames = self.objects[cname].keys()
420 2c2513fc Sofia Papagiannaki
421 2c2513fc Sofia Papagiannaki
        # publish an object
422 2c2513fc Sofia Papagiannaki
        public1 = onames.pop()
423 2c2513fc Sofia Papagiannaki
        url = join_urls(container_url, public1)
424 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
425 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
426 3a19e99b Sofia Papagiannaki
427 2c2513fc Sofia Papagiannaki
        # publish another
428 2c2513fc Sofia Papagiannaki
        public2 = onames.pop()
429 2c2513fc Sofia Papagiannaki
        url = join_urls(container_url, public2)
430 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
431 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
432 2c2513fc Sofia Papagiannaki
433 2c2513fc Sofia Papagiannaki
        # share an object
434 2c2513fc Sofia Papagiannaki
        shared1 = onames.pop()
435 2c2513fc Sofia Papagiannaki
        url = join_urls(container_url, shared1)
436 2c2513fc Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
437 2c2513fc Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
438 2c2513fc Sofia Papagiannaki
439 3a19e99b Sofia Papagiannaki
        # share another
440 2c2513fc Sofia Papagiannaki
        shared2 = onames.pop()
441 2c2513fc Sofia Papagiannaki
        url = join_urls(container_url, shared2)
442 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
443 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
444 3a19e99b Sofia Papagiannaki
445 3a19e99b Sofia Papagiannaki
        # list shared and public objects and assert object is listed
446 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url)
447 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
448 3a19e99b Sofia Papagiannaki
        objects = json.loads(r.content)
449 2c2513fc Sofia Papagiannaki
        l = sorted([public1, public2, shared1, shared2])
450 2c2513fc Sofia Papagiannaki
        i = 0
451 2c2513fc Sofia Papagiannaki
        for name in l:
452 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
453 2c2513fc Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
454 2c2513fc Sofia Papagiannaki
                             len(self.objects[cname][name]))
455 2c2513fc Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i] or
456 2c2513fc Sofia Papagiannaki
                            'x_object_public' in objects[i])
457 2c2513fc Sofia Papagiannaki
            i += 1
458 3a19e99b Sofia Papagiannaki
459 3a19e99b Sofia Papagiannaki
        # assert not listing shared and public to a not shared user
460 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
461 3a19e99b Sofia Papagiannaki
                     user='bob')
462 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
463 3a19e99b Sofia Papagiannaki
464 3a19e99b Sofia Papagiannaki
        # assert not listing public to a shared user
465 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
466 3a19e99b Sofia Papagiannaki
                     user='alice')
467 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
468 3a19e99b Sofia Papagiannaki
469 3a19e99b Sofia Papagiannaki
        # create child object
470 2c2513fc Sofia Papagiannaki
        descendant = strnextling(public1)
471 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
472 3a19e99b Sofia Papagiannaki
        # request public and assert child obejct is not listed
473 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
474 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
475 3a19e99b Sofia Papagiannaki
        if '' in objects:
476 3a19e99b Sofia Papagiannaki
            objects.remove('')
477 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
478 2c2513fc Sofia Papagiannaki
        self.assertEqual(objects, l)
479 3a19e99b Sofia Papagiannaki
480 3a19e99b Sofia Papagiannaki
        # test folder inheritance
481 2c2513fc Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
482 3a19e99b Sofia Papagiannaki
        # create child object
483 2c2513fc Sofia Papagiannaki
        descendant = '%s/%s' % (folder, get_random_name())
484 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
485 3a19e99b Sofia Papagiannaki
        # request public
486 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
487 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
488 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
489 3a19e99b Sofia Papagiannaki
        if '' in objects:
490 3a19e99b Sofia Papagiannaki
            objects.remove('')
491 2c2513fc Sofia Papagiannaki
        self.assertTrue(folder in objects)
492 3a19e99b Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
493 3a19e99b Sofia Papagiannaki
494 f3787696 Sofia Papagiannaki
    def test_list_objects(self):
495 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
496 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
497 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
498 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
499 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
500 f3787696 Sofia Papagiannaki
        if '' in objects:
501 f3787696 Sofia Papagiannaki
            objects.remove('')
502 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, sorted(self.objects[cname].keys()))
503 f3787696 Sofia Papagiannaki
504 f3787696 Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
505 f3787696 Sofia Papagiannaki
        self.create_container('test')
506 3a19e99b Sofia Papagiannaki
        self.upload_object('test', quote('/objectname', ''))
507 f3787696 Sofia Papagiannaki
508 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'test')
509 d6a92fa0 Sofia Papagiannaki
510 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
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.assertEqual(objects, ['/objectname'])
515 f3787696 Sofia Papagiannaki
516 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
517 f3787696 Sofia Papagiannaki
        try:
518 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
519 f3787696 Sofia Papagiannaki
        except:
520 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
521 f3787696 Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects], ['/objectname'])
522 f3787696 Sofia Papagiannaki
523 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=xml' % url)
524 f3787696 Sofia Papagiannaki
        try:
525 f3787696 Sofia Papagiannaki
            objects = minidom.parseString(r.content)
526 f3787696 Sofia Papagiannaki
        except:
527 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
528 f3787696 Sofia Papagiannaki
        self.assertEqual(
529 f3787696 Sofia Papagiannaki
            [n.firstChild.data for n in objects.getElementsByTagName('name')],
530 f3787696 Sofia Papagiannaki
            ['/objectname'])
531 f3787696 Sofia Papagiannaki
532 f3787696 Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
533 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
534 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
535 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=qwert' % url)
536 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code != 500)
537 f3787696 Sofia Papagiannaki
538 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=2' % url)
539 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
540 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
541 f3787696 Sofia Papagiannaki
        if '' in objects:
542 f3787696 Sofia Papagiannaki
            objects.remove('')
543 f3787696 Sofia Papagiannaki
544 f3787696 Sofia Papagiannaki
        onames = sorted(self.objects[cname].keys())
545 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, onames[:2])
546 f3787696 Sofia Papagiannaki
547 f3787696 Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
548 f3787696 Sofia Papagiannaki
                   'moms_birthday.jpg']
549 f3787696 Sofia Papagiannaki
        limit = 4
550 f3787696 Sofia Papagiannaki
        for m in markers:
551 d6a92fa0 Sofia Papagiannaki
            r = self.get('%s?limit=%s&marker=%s' % (url, limit, m))
552 f3787696 Sofia Papagiannaki
            objects = r.content.split('\n')
553 f3787696 Sofia Papagiannaki
            if '' in objects:
554 f3787696 Sofia Papagiannaki
                objects.remove('')
555 f3787696 Sofia Papagiannaki
            start = onames.index(m) + 1
556 f3787696 Sofia Papagiannaki
            end = start + limit
557 f3787696 Sofia Papagiannaki
            end = end if len(onames) >= end else len(onames)
558 f3787696 Sofia Papagiannaki
            self.assertEqual(objects, onames[start:end])
559 f3787696 Sofia Papagiannaki
560 f3787696 Sofia Papagiannaki
    @pithos_test_settings(API_LIST_LIMIT=10)
561 f3787696 Sofia Papagiannaki
    def test_list_limit_exceeds(self):
562 f3787696 Sofia Papagiannaki
        self.create_container('container')
563 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'container')
564 f3787696 Sofia Papagiannaki
565 f3787696 Sofia Papagiannaki
        for _ in range(pithos_settings.API_LIST_LIMIT + 1):
566 f3787696 Sofia Papagiannaki
            self.upload_object('container')
567 f3787696 Sofia Papagiannaki
568 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
569 f3787696 Sofia Papagiannaki
        try:
570 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
571 f3787696 Sofia Papagiannaki
        except:
572 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
573 f3787696 Sofia Papagiannaki
        self.assertEqual(pithos_settings.API_LIST_LIMIT,
574 f3787696 Sofia Papagiannaki
                         len(objects))
575 f3787696 Sofia Papagiannaki
576 f3787696 Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
577 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
578 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos&delimiter=/' % url)
579 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
580 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
581 f3787696 Sofia Papagiannaki
        if '' in objects:
582 f3787696 Sofia Papagiannaki
            objects.remove('')
583 f3787696 Sofia Papagiannaki
        self.assertEquals(
584 f3787696 Sofia Papagiannaki
            ['photos/animals/', 'photos/me.jpg', 'photos/plants/'],
585 f3787696 Sofia Papagiannaki
            objects)
586 f3787696 Sofia Papagiannaki
587 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos/animals&delimiter=/' % url)
588 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
589 f3787696 Sofia Papagiannaki
        if '' in objects:
590 f3787696 Sofia Papagiannaki
            objects.remove('')
591 f3787696 Sofia Papagiannaki
        self.assertEquals(
592 f3787696 Sofia Papagiannaki
            ['photos/animals/cats/', 'photos/animals/dogs/'], objects)
593 f3787696 Sofia Papagiannaki
594 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?path=photos' % url)
595 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
596 f3787696 Sofia Papagiannaki
        if '' in objects:
597 f3787696 Sofia Papagiannaki
            objects.remove('')
598 f3787696 Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
599 f3787696 Sofia Papagiannaki
600 f3787696 Sofia Papagiannaki
    def test_extended_list_json(self):
601 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
602 f3787696 Sofia Papagiannaki
        params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals',
603 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
604 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
605 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
606 f3787696 Sofia Papagiannaki
        try:
607 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
608 f3787696 Sofia Papagiannaki
        except:
609 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
610 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
611 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
612 f3787696 Sofia Papagiannaki
613 f3787696 Sofia Papagiannaki
    def test_extended_list_xml(self):
614 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
615 f3787696 Sofia Papagiannaki
        params = {'format': 'xml', 'limit': 4, 'prefix': 'photos',
616 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
617 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
618 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
619 f3787696 Sofia Papagiannaki
        try:
620 f3787696 Sofia Papagiannaki
            xml = minidom.parseString(r.content)
621 f3787696 Sofia Papagiannaki
        except:
622 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
623 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
624 f3787696 Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
625 f3787696 Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
626 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
627 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
628 f3787696 Sofia Papagiannaki
629 f3787696 Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
630 f3787696 Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
631 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
632 f3787696 Sofia Papagiannaki
633 f3787696 Sofia Papagiannaki
    def test_list_meta_double_matching(self):
634 f3787696 Sofia Papagiannaki
        # update object meta
635 f3787696 Sofia Papagiannaki
        cname = 'apples'
636 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
637 f3787696 Sofia Papagiannaki
        oname = self.objects[cname].keys().pop()
638 f3787696 Sofia Papagiannaki
        meta = {'quality': 'aaa', 'stock': 'true'}
639 f3787696 Sofia Papagiannaki
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
640 f3787696 Sofia Papagiannaki
                       for k, v in meta.iteritems())
641 d6a92fa0 Sofia Papagiannaki
        object_url = join_urls(container_url, oname)
642 d6a92fa0 Sofia Papagiannaki
        self.post(object_url, content_type='', **headers)
643 f3787696 Sofia Papagiannaki
644 f3787696 Sofia Papagiannaki
        # list objects that satisfy the criteria
645 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
646 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
647 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
648 f3787696 Sofia Papagiannaki
        if '' in objects:
649 f3787696 Sofia Papagiannaki
            objects.remove('')
650 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, [oname])
651 f3787696 Sofia Papagiannaki
652 f3787696 Sofia Papagiannaki
    def test_list_using_meta(self):
653 f3787696 Sofia Papagiannaki
        # update object meta
654 f3787696 Sofia Papagiannaki
        cname = 'apples'
655 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
656 d6a92fa0 Sofia Papagiannaki
657 3a19e99b Sofia Papagiannaki
        onames = self.objects[cname].keys()
658 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[0])
659 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa')
660 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
661 d6a92fa0 Sofia Papagiannaki
662 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[1])
663 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab')
664 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
665 f3787696 Sofia Papagiannaki
666 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[2])
667 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100')
668 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
669 d6a92fa0 Sofia Papagiannaki
670 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[3])
671 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200')
672 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
673 f3787696 Sofia Papagiannaki
674 f3787696 Sofia Papagiannaki
        # test multiple existence criteria matches
675 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
676 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
677 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
678 f3787696 Sofia Papagiannaki
        if '' in objects:
679 f3787696 Sofia Papagiannaki
            objects.remove('')
680 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames))
681 f3787696 Sofia Papagiannaki
682 f3787696 Sofia Papagiannaki
        # list objects that satisfy the existence criteria
683 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Stock' % container_url)
684 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
685 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
686 f3787696 Sofia Papagiannaki
        if '' in objects:
687 f3787696 Sofia Papagiannaki
            objects.remove('')
688 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[2:]))
689 f3787696 Sofia Papagiannaki
690 f3787696 Sofia Papagiannaki
        # test case insensitive existence criteria matching
691 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=quality' % container_url)
692 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
693 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
694 f3787696 Sofia Papagiannaki
        if '' in objects:
695 f3787696 Sofia Papagiannaki
            objects.remove('')
696 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
697 f3787696 Sofia Papagiannaki
698 f3787696 Sofia Papagiannaki
        # test do not all existencecriteria match
699 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Foo' % container_url)
700 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
701 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
702 f3787696 Sofia Papagiannaki
        if '' in objects:
703 f3787696 Sofia Papagiannaki
            objects.remove('')
704 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
705 f3787696 Sofia Papagiannaki
706 f3787696 Sofia Papagiannaki
        # test equals criteria
707 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa')))
708 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
709 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
710 f3787696 Sofia Papagiannaki
        if '' in objects:
711 f3787696 Sofia Papagiannaki
            objects.remove('')
712 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[0]])
713 f3787696 Sofia Papagiannaki
714 f3787696 Sofia Papagiannaki
        # test not equals criteria
715 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality!=aaa')))
716 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
717 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
718 f3787696 Sofia Papagiannaki
        if '' in objects:
719 3a19e99b Sofia Papagiannaki
            objects.remove('')
720 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[1]])
721 f3787696 Sofia Papagiannaki
722 f3787696 Sofia Papagiannaki
        # test lte criteria
723 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock<=120')))
724 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
725 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
726 f3787696 Sofia Papagiannaki
        if '' in objects:
727 f3787696 Sofia Papagiannaki
            objects.remove('')
728 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[2]])
729 f3787696 Sofia Papagiannaki
730 f3787696 Sofia Papagiannaki
        # test gte criteria
731 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock>=200')))
732 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
733 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
734 f3787696 Sofia Papagiannaki
        if '' in objects:
735 f3787696 Sofia Papagiannaki
            objects.remove('')
736 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[3]])
737 f3787696 Sofia Papagiannaki
738 3a19e99b Sofia Papagiannaki
    def test_if_modified_since(self):
739 3a19e99b Sofia Papagiannaki
        cname = 'apples'
740 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
741 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
742 3a19e99b Sofia Papagiannaki
        t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
743 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
744 3a19e99b Sofia Papagiannaki
745 3a19e99b Sofia Papagiannaki
        # Check not modified
746 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
747 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
748 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
749 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
750 3a19e99b Sofia Papagiannaki
751 3a19e99b Sofia Papagiannaki
        # modify account: add container
752 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
753 3a19e99b Sofia Papagiannaki
        oname = self.upload_object(cname)[0]
754 3a19e99b Sofia Papagiannaki
755 3a19e99b Sofia Papagiannaki
        # Check modified
756 3a19e99b Sofia Papagiannaki
        objects = self.objects[cname].keys()
757 3a19e99b Sofia Papagiannaki
        objects.append(oname)
758 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
759 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
760 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
761 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
762 3a19e99b Sofia Papagiannaki
763 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
764 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
765 3a19e99b Sofia Papagiannaki
        t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
766 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
767 3a19e99b Sofia Papagiannaki
768 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
769 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
770 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
771 3a19e99b Sofia Papagiannaki
772 3a19e99b Sofia Papagiannaki
        # Check modified
773 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
774 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
775 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
776 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
777 3a19e99b Sofia Papagiannaki
778 3a19e99b Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
779 3a19e99b Sofia Papagiannaki
        cname = 'apples'
780 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
781 3a19e99b Sofia Papagiannaki
        r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday')
782 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
783 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.content.split('\n')[:-1],
784 3a19e99b Sofia Papagiannaki
                         sorted(self.objects['apples'].keys()))
785 3a19e99b Sofia Papagiannaki
786 3a19e99b Sofia Papagiannaki
    def test_if_not_modified_since(self):
787 3a19e99b Sofia Papagiannaki
        cname = 'apples'
788 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
789 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
790 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
791 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
792 3a19e99b Sofia Papagiannaki
793 3a19e99b Sofia Papagiannaki
        # Check unmodified
794 3a19e99b Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
795 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
796 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
797 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
798 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
799 3a19e99b Sofia Papagiannaki
            self.assertEqual(
800 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
801 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
802 3a19e99b Sofia Papagiannaki
803 3a19e99b Sofia Papagiannaki
        # modify account: add container
804 3a19e99b Sofia Papagiannaki
        _time.sleep(2)
805 3a19e99b Sofia Papagiannaki
        self.upload_object(cname)
806 3a19e99b Sofia Papagiannaki
807 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
808 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
809 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
810 3a19e99b Sofia Papagiannaki
        t2 = t - datetime.timedelta(seconds=1)
811 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
812 3a19e99b Sofia Papagiannaki
813 3a19e99b Sofia Papagiannaki
        # Check modified
814 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
815 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
816 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
817 3a19e99b Sofia Papagiannaki
818 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
819 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
820 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
821 3a19e99b Sofia Papagiannaki
822 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
823 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
824 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
825 3a19e99b Sofia Papagiannaki
        t3 = t - datetime.timedelta(seconds=1)
826 3a19e99b Sofia Papagiannaki
        t3_formats = map(t3.strftime, DATE_FORMATS)
827 3a19e99b Sofia Papagiannaki
828 3a19e99b Sofia Papagiannaki
        # Check modified
829 3a19e99b Sofia Papagiannaki
        for t in t3_formats:
830 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
831 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
832 3a19e99b Sofia Papagiannaki
833 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since(self):
834 3a19e99b Sofia Papagiannaki
        cname = 'apples'
835 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
836 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
837 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
838 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
839 3a19e99b Sofia Papagiannaki
        t = t + datetime.timedelta(seconds=1)
840 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
841 3a19e99b Sofia Papagiannaki
842 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
843 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
844 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
845 3a19e99b Sofia Papagiannaki
            self.assertEqual(
846 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
847 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
848 3a19e99b Sofia Papagiannaki
849 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
850 3a19e99b Sofia Papagiannaki
        cname = 'apples'
851 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
852 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
853 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
854 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
855 3a19e99b Sofia Papagiannaki
        t = t - datetime.timedelta(seconds=1)
856 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
857 3a19e99b Sofia Papagiannaki
858 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
859 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
860 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
861 3a19e99b Sofia Papagiannaki
862 3a19e99b Sofia Papagiannaki
863 3a19e99b Sofia Papagiannaki
class ContainerPut(PithosAPITest):
864 3a19e99b Sofia Papagiannaki
    def test_create(self):
865 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
866 3a19e99b Sofia Papagiannaki
        self.list_containers()
867 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
868 3a19e99b Sofia Papagiannaki
869 3a19e99b Sofia Papagiannaki
    def test_create_twice(self):
870 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
871 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
872 2a194295 Sofia Papagiannaki
        r = self.create_container('c1')[-1]
873 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
874 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
875 3a19e99b Sofia Papagiannaki
876 3a19e99b Sofia Papagiannaki
877 3a19e99b Sofia Papagiannaki
class ContainerPost(PithosAPITest):
878 3a19e99b Sofia Papagiannaki
    def test_update_meta(self):
879 3a19e99b Sofia Papagiannaki
        cname = 'apples'
880 3a19e99b Sofia Papagiannaki
        self.create_container(cname)
881 3a19e99b Sofia Papagiannaki
        meta = {'test': 'test33', 'tost': 'tost22'}
882 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, meta)
883 3a19e99b Sofia Papagiannaki
        info = self.get_container_info(cname)
884 3a19e99b Sofia Papagiannaki
        for k, v in meta.items():
885 3a19e99b Sofia Papagiannaki
            k = 'x-container-meta-%s' % k
886 3a19e99b Sofia Papagiannaki
            self.assertTrue(k in info)
887 3a19e99b Sofia Papagiannaki
            self.assertEqual(info[k], v)
888 3a19e99b Sofia Papagiannaki
889 3a19e99b Sofia Papagiannaki
    def test_quota(self):
890 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
891 3a19e99b Sofia Papagiannaki
892 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
893 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='100')
894 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
895 3a19e99b Sofia Papagiannaki
896 3a19e99b Sofia Papagiannaki
        info = self.get_container_info('c1')
897 3a19e99b Sofia Papagiannaki
        self.assertTrue('x-container-policy-quota' in info)
898 3a19e99b Sofia Papagiannaki
        self.assertEqual(info['x-container-policy-quota'], '100')
899 3a19e99b Sofia Papagiannaki
900 c977b0b6 Sofia Papagiannaki
        r = self.upload_object('c1', length=101, verify_status=False)[2]
901 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 413)
902 3a19e99b Sofia Papagiannaki
903 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
904 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='0')
905 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
906 3a19e99b Sofia Papagiannaki
907 3a19e99b Sofia Papagiannaki
        r = self.upload_object('c1', length=1)
908 3a19e99b Sofia Papagiannaki
909 3a19e99b Sofia Papagiannaki
910 3a19e99b Sofia Papagiannaki
class ContainerDelete(PithosAPITest):
911 3a19e99b Sofia Papagiannaki
    def setUp(self):
912 3a19e99b Sofia Papagiannaki
        PithosAPITest.setUp(self)
913 3a19e99b Sofia Papagiannaki
        cnames = ['c1', 'c2']
914 3a19e99b Sofia Papagiannaki
915 3a19e99b Sofia Papagiannaki
        for c in cnames:
916 3a19e99b Sofia Papagiannaki
            self.create_container(c)
917 3a19e99b Sofia Papagiannaki
918 3a19e99b Sofia Papagiannaki
    def test_delete(self):
919 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
920 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
921 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
922 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' not in self.list_containers(format=None))
923 3a19e99b Sofia Papagiannaki
924 3a19e99b Sofia Papagiannaki
    def test_delete_non_empty(self):
925 3a19e99b Sofia Papagiannaki
        self.upload_object('c1')
926 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
927 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
928 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 409)
929 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
930 3a19e99b Sofia Papagiannaki
931 3a19e99b Sofia Papagiannaki
    def test_delete_invalid(self):
932 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c3')
933 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
934 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
935 3a19e99b Sofia Papagiannaki
936 0c6ab9df Sofia Papagiannaki
    @pithos_test_settings(API_LIST_LIMIT=10)
937 3a19e99b Sofia Papagiannaki
    def test_delete_contents(self):
938 3a19e99b Sofia Papagiannaki
        folder = self.create_folder('c1')[0]
939 0c6ab9df Sofia Papagiannaki
        for i in range(11):
940 0c6ab9df Sofia Papagiannaki
            descendant = '%s_%d' % (strnextling(folder), i)
941 0c6ab9df Sofia Papagiannaki
            self.upload_object('c1', descendant)
942 3a19e99b Sofia Papagiannaki
        self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0]
943 3a19e99b Sofia Papagiannaki
944 0c6ab9df Sofia Papagiannaki
        r = self.delete('%s?delimiter=/' % join_urls(
945 3a19e99b Sofia Papagiannaki
            self.pithos_path, self.user, 'c1'))
946 0c6ab9df Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
947 3a19e99b Sofia Papagiannaki
        self.assertEqual([], self.list_objects('c1'))
948 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))