Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (39 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 ba402621 Sofia Papagiannaki
        shared1 = onames.pop()
202 ba402621 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 ba402621 Sofia Papagiannaki
        # share another object
207 ba402621 Sofia Papagiannaki
        shared2 = onames.pop()
208 ba402621 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared2)
209 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=*')
210 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
211 ba402621 Sofia Papagiannaki
212 ba402621 Sofia Papagiannaki
        # publish another object
213 ba402621 Sofia Papagiannaki
        public1 = onames.pop()
214 ba402621 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public1)
215 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
216 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
217 ba402621 Sofia Papagiannaki
218 f3787696 Sofia Papagiannaki
        # publish another object
219 ba402621 Sofia Papagiannaki
        public2 = onames.pop()
220 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        l = sorted([shared1, shared2])
242 ba402621 Sofia Papagiannaki
        i = 0
243 ba402621 Sofia Papagiannaki
        for name in l:
244 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
245 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
246 ba402621 Sofia Papagiannaki
                             len(self.objects[cname][name]))
247 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i])
248 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_public' not in objects[i])
249 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        i = 0
264 ba402621 Sofia Papagiannaki
        for name in l:
265 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
266 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
267 ba402621 Sofia Papagiannaki
                             len(self.objects[cname][name]))
268 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i])
269 ba402621 Sofia Papagiannaki
            if name == shared1:
270 ba402621 Sofia Papagiannaki
                self.assertTrue('x_object_public' in objects[i])
271 ba402621 Sofia Papagiannaki
            else:
272 ba402621 Sofia Papagiannaki
                self.assertTrue('x_object_public' not in objects[i])
273 ba402621 Sofia Papagiannaki
            i += 1
274 f3787696 Sofia Papagiannaki
275 f3787696 Sofia Papagiannaki
        # create child object
276 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_SHARING='read=*')
290 f3787696 Sofia Papagiannaki
        # create child object
291 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        public1 = onames.pop()
309 ba402621 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 ba402621 Sofia Papagiannaki
        # publish another
314 ba402621 Sofia Papagiannaki
        public2 = onames.pop()
315 ba402621 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, public2)
316 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
317 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
318 ba402621 Sofia Papagiannaki
319 ba402621 Sofia Papagiannaki
        # share an object
320 ba402621 Sofia Papagiannaki
        shared1 = onames.pop()
321 ba402621 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, shared1)
322 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
323 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
324 ba402621 Sofia Papagiannaki
325 f3787696 Sofia Papagiannaki
        # share another
326 ba402621 Sofia Papagiannaki
        shared2 = onames.pop()
327 ba402621 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 ba402621 Sofia Papagiannaki
        objects = r.content.split('\n')
336 ba402621 Sofia Papagiannaki
        if '' in objects:
337 ba402621 Sofia Papagiannaki
            objects.remove('')
338 ba402621 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 ba402621 Sofia Papagiannaki
        l = sorted([public1, public2])
349 ba402621 Sofia Papagiannaki
        i = 0
350 ba402621 Sofia Papagiannaki
        for name in l:
351 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
352 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
353 ba402621 Sofia Papagiannaki
                             len(self.objects[cname][name]))
354 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_sharing' not in objects[i])
355 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_public' in objects[i])
356 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        i = 0
371 ba402621 Sofia Papagiannaki
        for name in l:
372 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
373 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
374 ba402621 Sofia Papagiannaki
                             len(self.objects[cname][name]))
375 ba402621 Sofia Papagiannaki
            if name == public1:
376 ba402621 Sofia Papagiannaki
                self.assertTrue('x_object_sharing' in objects[i])
377 ba402621 Sofia Papagiannaki
            else:
378 ba402621 Sofia Papagiannaki
                self.assertTrue('x_object_sharing' not in objects[i])
379 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
        self.assertTrue(public1 in objects)
402 ba402621 Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
403 f3787696 Sofia Papagiannaki
404 f3787696 Sofia Papagiannaki
        # test folder inheritance
405 ba402621 Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
406 f3787696 Sofia Papagiannaki
        # create child object
407 ba402621 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 ba402621 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 ba402621 Sofia Papagiannaki
421 92428559 Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url)
422 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
423 92428559 Sofia Papagiannaki
        objects = json.loads(r.content)
424 92428559 Sofia Papagiannaki
        self.assertEqual(len(objects), 0)
425 92428559 Sofia Papagiannaki
426 ba402621 Sofia Papagiannaki
        # publish an object
427 ba402621 Sofia Papagiannaki
        public1 = onames.pop()
428 ba402621 Sofia Papagiannaki
        url = join_urls(container_url, public1)
429 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
430 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
431 3a19e99b Sofia Papagiannaki
432 92428559 Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url)
433 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
434 92428559 Sofia Papagiannaki
        objects = json.loads(r.content)
435 92428559 Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
436 92428559 Sofia Papagiannaki
        self.assertEqual(objects[0]['name'], public1)
437 92428559 Sofia Papagiannaki
        self.assertEqual(objects[0]['bytes'],
438 92428559 Sofia Papagiannaki
                         len(self.objects[cname][public1]))
439 92428559 Sofia Papagiannaki
        self.assertTrue('x_object_public' in objects[0])
440 92428559 Sofia Papagiannaki
441 ba402621 Sofia Papagiannaki
        # publish another
442 ba402621 Sofia Papagiannaki
        public2 = onames.pop()
443 ba402621 Sofia Papagiannaki
        url = join_urls(container_url, public2)
444 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
445 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
446 ba402621 Sofia Papagiannaki
447 ba402621 Sofia Papagiannaki
        # share an object
448 ba402621 Sofia Papagiannaki
        shared1 = onames.pop()
449 ba402621 Sofia Papagiannaki
        url = join_urls(container_url, shared1)
450 ba402621 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
451 ba402621 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
452 ba402621 Sofia Papagiannaki
453 3a19e99b Sofia Papagiannaki
        # share another
454 ba402621 Sofia Papagiannaki
        shared2 = onames.pop()
455 ba402621 Sofia Papagiannaki
        url = join_urls(container_url, shared2)
456 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
457 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
458 3a19e99b Sofia Papagiannaki
459 3a19e99b Sofia Papagiannaki
        # list shared and public objects and assert object is listed
460 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url)
461 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
462 3a19e99b Sofia Papagiannaki
        objects = json.loads(r.content)
463 ba402621 Sofia Papagiannaki
        l = sorted([public1, public2, shared1, shared2])
464 ba402621 Sofia Papagiannaki
        i = 0
465 ba402621 Sofia Papagiannaki
        for name in l:
466 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['name'], name)
467 ba402621 Sofia Papagiannaki
            self.assertEqual(objects[i]['bytes'],
468 ba402621 Sofia Papagiannaki
                             len(self.objects[cname][name]))
469 ba402621 Sofia Papagiannaki
            self.assertTrue('x_object_sharing' in objects[i] or
470 ba402621 Sofia Papagiannaki
                            'x_object_public' in objects[i])
471 ba402621 Sofia Papagiannaki
            i += 1
472 3a19e99b Sofia Papagiannaki
473 3a19e99b Sofia Papagiannaki
        # assert not listing shared and public to a not shared user
474 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
475 3a19e99b Sofia Papagiannaki
                     user='bob')
476 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
477 3a19e99b Sofia Papagiannaki
478 3a19e99b Sofia Papagiannaki
        # assert not listing public to a shared user
479 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=&format=json' % container_url,
480 3a19e99b Sofia Papagiannaki
                     user='alice')
481 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
482 3a19e99b Sofia Papagiannaki
483 3a19e99b Sofia Papagiannaki
        # create child object
484 ba402621 Sofia Papagiannaki
        descendant = strnextling(public1)
485 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
486 92428559 Sofia Papagiannaki
        # request public and assert child object is not listed
487 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
488 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
489 3a19e99b Sofia Papagiannaki
        if '' in objects:
490 3a19e99b Sofia Papagiannaki
            objects.remove('')
491 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
492 ba402621 Sofia Papagiannaki
        self.assertEqual(objects, l)
493 3a19e99b Sofia Papagiannaki
494 3a19e99b Sofia Papagiannaki
        # test folder inheritance
495 ba402621 Sofia Papagiannaki
        folder, _ = self.create_folder(cname, HTTP_X_OBJECT_PUBLIC='true')
496 3a19e99b Sofia Papagiannaki
        # create child object
497 ba402621 Sofia Papagiannaki
        descendant = '%s/%s' % (folder, get_random_name())
498 3a19e99b Sofia Papagiannaki
        self.upload_object(cname, descendant)
499 3a19e99b Sofia Papagiannaki
        # request public
500 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
501 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
502 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
503 3a19e99b Sofia Papagiannaki
        if '' in objects:
504 3a19e99b Sofia Papagiannaki
            objects.remove('')
505 ba402621 Sofia Papagiannaki
        self.assertTrue(folder in objects)
506 3a19e99b Sofia Papagiannaki
        self.assertTrue(descendant not in objects)
507 3a19e99b Sofia Papagiannaki
508 92428559 Sofia Papagiannaki
        # unpublish public1
509 92428559 Sofia Papagiannaki
        url = join_urls(container_url, public1)
510 92428559 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false')
511 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
512 92428559 Sofia Papagiannaki
513 92428559 Sofia Papagiannaki
        # unpublish public2
514 92428559 Sofia Papagiannaki
        url = join_urls(container_url, public2)
515 92428559 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false')
516 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
517 92428559 Sofia Papagiannaki
518 92428559 Sofia Papagiannaki
        # unpublish folder
519 92428559 Sofia Papagiannaki
        url = join_urls(container_url, folder)
520 92428559 Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='false')
521 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
522 92428559 Sofia Papagiannaki
523 92428559 Sofia Papagiannaki
        r = self.get('%s?shared=&public=' % container_url)
524 92428559 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
525 92428559 Sofia Papagiannaki
        objects = r.content.split('\n')
526 92428559 Sofia Papagiannaki
        if '' in objects:
527 92428559 Sofia Papagiannaki
            objects.remove('')
528 92428559 Sofia Papagiannaki
        l = sorted([shared1, shared2])
529 92428559 Sofia Papagiannaki
        self.assertEqual(objects, l)
530 92428559 Sofia Papagiannaki
531 f3787696 Sofia Papagiannaki
    def test_list_objects(self):
532 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
533 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
534 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
535 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code, 200)
536 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
537 f3787696 Sofia Papagiannaki
        if '' in objects:
538 f3787696 Sofia Papagiannaki
            objects.remove('')
539 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, sorted(self.objects[cname].keys()))
540 f3787696 Sofia Papagiannaki
541 f3787696 Sofia Papagiannaki
    def test_list_objects_containing_slash(self):
542 f3787696 Sofia Papagiannaki
        self.create_container('test')
543 3a19e99b Sofia Papagiannaki
        self.upload_object('test', quote('/objectname', ''))
544 f3787696 Sofia Papagiannaki
545 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'test')
546 d6a92fa0 Sofia Papagiannaki
547 d6a92fa0 Sofia Papagiannaki
        r = self.get(url)
548 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
549 f3787696 Sofia Papagiannaki
        if '' in objects:
550 f3787696 Sofia Papagiannaki
            objects.remove('')
551 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, ['/objectname'])
552 f3787696 Sofia Papagiannaki
553 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
554 f3787696 Sofia Papagiannaki
        try:
555 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
556 f3787696 Sofia Papagiannaki
        except:
557 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
558 f3787696 Sofia Papagiannaki
        self.assertEqual([o['name'] for o in objects], ['/objectname'])
559 f3787696 Sofia Papagiannaki
560 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=xml' % url)
561 f3787696 Sofia Papagiannaki
        try:
562 f3787696 Sofia Papagiannaki
            objects = minidom.parseString(r.content)
563 f3787696 Sofia Papagiannaki
        except:
564 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
565 f3787696 Sofia Papagiannaki
        self.assertEqual(
566 f3787696 Sofia Papagiannaki
            [n.firstChild.data for n in objects.getElementsByTagName('name')],
567 f3787696 Sofia Papagiannaki
            ['/objectname'])
568 f3787696 Sofia Papagiannaki
569 f3787696 Sofia Papagiannaki
    def test_list_objects_with_limit_marker(self):
570 f3787696 Sofia Papagiannaki
        cname = self.cnames[0]
571 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
572 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=qwert' % url)
573 f3787696 Sofia Papagiannaki
        self.assertTrue(r.status_code != 500)
574 f3787696 Sofia Papagiannaki
575 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?limit=2' % url)
576 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
577 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
578 f3787696 Sofia Papagiannaki
        if '' in objects:
579 f3787696 Sofia Papagiannaki
            objects.remove('')
580 f3787696 Sofia Papagiannaki
581 f3787696 Sofia Papagiannaki
        onames = sorted(self.objects[cname].keys())
582 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, onames[:2])
583 f3787696 Sofia Papagiannaki
584 f3787696 Sofia Papagiannaki
        markers = ['How To Win Friends And Influence People.pdf',
585 f3787696 Sofia Papagiannaki
                   'moms_birthday.jpg']
586 f3787696 Sofia Papagiannaki
        limit = 4
587 f3787696 Sofia Papagiannaki
        for m in markers:
588 d6a92fa0 Sofia Papagiannaki
            r = self.get('%s?limit=%s&marker=%s' % (url, limit, m))
589 f3787696 Sofia Papagiannaki
            objects = r.content.split('\n')
590 f3787696 Sofia Papagiannaki
            if '' in objects:
591 f3787696 Sofia Papagiannaki
                objects.remove('')
592 f3787696 Sofia Papagiannaki
            start = onames.index(m) + 1
593 f3787696 Sofia Papagiannaki
            end = start + limit
594 f3787696 Sofia Papagiannaki
            end = end if len(onames) >= end else len(onames)
595 f3787696 Sofia Papagiannaki
            self.assertEqual(objects, onames[start:end])
596 f3787696 Sofia Papagiannaki
597 f3787696 Sofia Papagiannaki
    @pithos_test_settings(API_LIST_LIMIT=10)
598 f3787696 Sofia Papagiannaki
    def test_list_limit_exceeds(self):
599 f3787696 Sofia Papagiannaki
        self.create_container('container')
600 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'container')
601 f3787696 Sofia Papagiannaki
602 f3787696 Sofia Papagiannaki
        for _ in range(pithos_settings.API_LIST_LIMIT + 1):
603 f3787696 Sofia Papagiannaki
            self.upload_object('container')
604 f3787696 Sofia Papagiannaki
605 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?format=json' % url)
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(pithos_settings.API_LIST_LIMIT,
611 f3787696 Sofia Papagiannaki
                         len(objects))
612 f3787696 Sofia Papagiannaki
613 f3787696 Sofia Papagiannaki
    def test_list_pseudo_hierarchical_folders(self):
614 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
615 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos&delimiter=/' % url)
616 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
617 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
618 f3787696 Sofia Papagiannaki
        if '' in objects:
619 f3787696 Sofia Papagiannaki
            objects.remove('')
620 f3787696 Sofia Papagiannaki
        self.assertEquals(
621 f3787696 Sofia Papagiannaki
            ['photos/animals/', 'photos/me.jpg', 'photos/plants/'],
622 f3787696 Sofia Papagiannaki
            objects)
623 f3787696 Sofia Papagiannaki
624 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?prefix=photos/animals&delimiter=/' % url)
625 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
626 f3787696 Sofia Papagiannaki
        if '' in objects:
627 f3787696 Sofia Papagiannaki
            objects.remove('')
628 f3787696 Sofia Papagiannaki
        self.assertEquals(
629 f3787696 Sofia Papagiannaki
            ['photos/animals/cats/', 'photos/animals/dogs/'], objects)
630 f3787696 Sofia Papagiannaki
631 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?path=photos' % url)
632 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
633 f3787696 Sofia Papagiannaki
        if '' in objects:
634 f3787696 Sofia Papagiannaki
            objects.remove('')
635 f3787696 Sofia Papagiannaki
        self.assertEquals(['photos/me.jpg'], objects)
636 f3787696 Sofia Papagiannaki
637 f3787696 Sofia Papagiannaki
    def test_extended_list_json(self):
638 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
639 f3787696 Sofia Papagiannaki
        params = {'format': 'json', 'limit': 2, 'prefix': 'photos/animals',
640 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
641 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
642 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
643 f3787696 Sofia Papagiannaki
        try:
644 f3787696 Sofia Papagiannaki
            objects = json.loads(r.content)
645 f3787696 Sofia Papagiannaki
        except:
646 f3787696 Sofia Papagiannaki
            self.fail('json format expected')
647 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0]['subdir'], 'photos/animals/cats/')
648 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[1]['subdir'], 'photos/animals/dogs/')
649 f3787696 Sofia Papagiannaki
650 f3787696 Sofia Papagiannaki
    def test_extended_list_xml(self):
651 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples')
652 f3787696 Sofia Papagiannaki
        params = {'format': 'xml', 'limit': 4, 'prefix': 'photos',
653 f3787696 Sofia Papagiannaki
                  'delimiter': '/'}
654 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?%s' % (url, urlencode(params)))
655 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
656 f3787696 Sofia Papagiannaki
        try:
657 f3787696 Sofia Papagiannaki
            xml = minidom.parseString(r.content)
658 f3787696 Sofia Papagiannaki
        except:
659 f3787696 Sofia Papagiannaki
            self.fail('xml format expected')
660 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'object', size=4)
661 f3787696 Sofia Papagiannaki
        dirs = xml.getElementsByTagName('subdir')
662 f3787696 Sofia Papagiannaki
        self.assertEqual(len(dirs), 2)
663 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/')
664 f3787696 Sofia Papagiannaki
        self.assertEqual(dirs[1].attributes['name'].value, 'photos/plants/')
665 f3787696 Sofia Papagiannaki
666 f3787696 Sofia Papagiannaki
        objects = xml.getElementsByTagName('name')
667 f3787696 Sofia Papagiannaki
        self.assertEqual(len(objects), 1)
668 f3787696 Sofia Papagiannaki
        self.assertEqual(objects[0].childNodes[0].data, 'photos/me.jpg')
669 f3787696 Sofia Papagiannaki
670 f3787696 Sofia Papagiannaki
    def test_list_meta_double_matching(self):
671 f3787696 Sofia Papagiannaki
        # update object meta
672 f3787696 Sofia Papagiannaki
        cname = 'apples'
673 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
674 f3787696 Sofia Papagiannaki
        oname = self.objects[cname].keys().pop()
675 f3787696 Sofia Papagiannaki
        meta = {'quality': 'aaa', 'stock': 'true'}
676 f3787696 Sofia Papagiannaki
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
677 f3787696 Sofia Papagiannaki
                       for k, v in meta.iteritems())
678 d6a92fa0 Sofia Papagiannaki
        object_url = join_urls(container_url, oname)
679 d6a92fa0 Sofia Papagiannaki
        self.post(object_url, content_type='', **headers)
680 f3787696 Sofia Papagiannaki
681 f3787696 Sofia Papagiannaki
        # list objects that satisfy the criteria
682 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
683 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
684 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
685 f3787696 Sofia Papagiannaki
        if '' in objects:
686 f3787696 Sofia Papagiannaki
            objects.remove('')
687 f3787696 Sofia Papagiannaki
        self.assertEqual(objects, [oname])
688 f3787696 Sofia Papagiannaki
689 f3787696 Sofia Papagiannaki
    def test_list_using_meta(self):
690 f3787696 Sofia Papagiannaki
        # update object meta
691 f3787696 Sofia Papagiannaki
        cname = 'apples'
692 d6a92fa0 Sofia Papagiannaki
        container_url = join_urls(self.pithos_path, self.user, cname)
693 d6a92fa0 Sofia Papagiannaki
694 3a19e99b Sofia Papagiannaki
        onames = self.objects[cname].keys()
695 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[0])
696 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='aaa')
697 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
698 d6a92fa0 Sofia Papagiannaki
699 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[1])
700 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_QUALITY='ab')
701 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
702 f3787696 Sofia Papagiannaki
703 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[2])
704 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='100')
705 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
706 d6a92fa0 Sofia Papagiannaki
707 3a19e99b Sofia Papagiannaki
        url = join_urls(container_url, onames[3])
708 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_META_STOCK='200')
709 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
710 f3787696 Sofia Papagiannaki
711 f3787696 Sofia Papagiannaki
        # test multiple existence criteria matches
712 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Stock' % container_url)
713 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
714 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
715 f3787696 Sofia Papagiannaki
        if '' in objects:
716 f3787696 Sofia Papagiannaki
            objects.remove('')
717 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames))
718 f3787696 Sofia Papagiannaki
719 f3787696 Sofia Papagiannaki
        # list objects that satisfy the existence criteria
720 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Stock' % container_url)
721 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
722 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
723 f3787696 Sofia Papagiannaki
        if '' in objects:
724 f3787696 Sofia Papagiannaki
            objects.remove('')
725 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[2:]))
726 f3787696 Sofia Papagiannaki
727 f3787696 Sofia Papagiannaki
        # test case insensitive existence criteria matching
728 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=quality' % container_url)
729 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
730 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
731 f3787696 Sofia Papagiannaki
        if '' in objects:
732 f3787696 Sofia Papagiannaki
            objects.remove('')
733 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
734 f3787696 Sofia Papagiannaki
735 f3787696 Sofia Papagiannaki
        # test do not all existencecriteria match
736 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=Quality,Foo' % container_url)
737 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
738 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
739 f3787696 Sofia Papagiannaki
        if '' in objects:
740 f3787696 Sofia Papagiannaki
            objects.remove('')
741 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, sorted(onames[:2]))
742 f3787696 Sofia Papagiannaki
743 f3787696 Sofia Papagiannaki
        # test equals criteria
744 d6a92fa0 Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality=aaa')))
745 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
746 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
747 f3787696 Sofia Papagiannaki
        if '' in objects:
748 f3787696 Sofia Papagiannaki
            objects.remove('')
749 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[0]])
750 f3787696 Sofia Papagiannaki
751 f3787696 Sofia Papagiannaki
        # test not equals criteria
752 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Quality!=aaa')))
753 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
754 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
755 f3787696 Sofia Papagiannaki
        if '' in objects:
756 3a19e99b Sofia Papagiannaki
            objects.remove('')
757 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[1]])
758 f3787696 Sofia Papagiannaki
759 f3787696 Sofia Papagiannaki
        # test lte criteria
760 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock<=120')))
761 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
762 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
763 f3787696 Sofia Papagiannaki
        if '' in objects:
764 f3787696 Sofia Papagiannaki
            objects.remove('')
765 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[2]])
766 f3787696 Sofia Papagiannaki
767 f3787696 Sofia Papagiannaki
        # test gte criteria
768 3a19e99b Sofia Papagiannaki
        r = self.get('%s?meta=%s' % (container_url, quote('Stock>=200')))
769 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
770 f3787696 Sofia Papagiannaki
        objects = r.content.split('\n')
771 f3787696 Sofia Papagiannaki
        if '' in objects:
772 f3787696 Sofia Papagiannaki
            objects.remove('')
773 3a19e99b Sofia Papagiannaki
        self.assertTrue(objects, [onames[3]])
774 f3787696 Sofia Papagiannaki
775 3a19e99b Sofia Papagiannaki
    def test_if_modified_since(self):
776 3a19e99b Sofia Papagiannaki
        cname = 'apples'
777 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
778 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
779 3a19e99b Sofia Papagiannaki
        t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
780 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
781 3a19e99b Sofia Papagiannaki
782 3a19e99b Sofia Papagiannaki
        # Check not modified
783 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
784 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
785 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
786 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
787 3a19e99b Sofia Papagiannaki
788 3a19e99b Sofia Papagiannaki
        # modify account: add container
789 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
790 3a19e99b Sofia Papagiannaki
        oname = self.upload_object(cname)[0]
791 3a19e99b Sofia Papagiannaki
792 3a19e99b Sofia Papagiannaki
        # Check modified
793 3a19e99b Sofia Papagiannaki
        objects = self.objects[cname].keys()
794 3a19e99b Sofia Papagiannaki
        objects.append(oname)
795 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
796 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
797 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
798 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
799 3a19e99b Sofia Papagiannaki
800 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
801 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
802 3a19e99b Sofia Papagiannaki
        t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
803 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
804 3a19e99b Sofia Papagiannaki
805 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
806 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
807 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
808 3a19e99b Sofia Papagiannaki
809 3a19e99b Sofia Papagiannaki
        # Check modified
810 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
811 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
812 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
813 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.content.split('\n')[:-1], sorted(objects))
814 3a19e99b Sofia Papagiannaki
815 3a19e99b Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
816 3a19e99b Sofia Papagiannaki
        cname = 'apples'
817 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
818 3a19e99b Sofia Papagiannaki
        r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday')
819 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
820 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.content.split('\n')[:-1],
821 3a19e99b Sofia Papagiannaki
                         sorted(self.objects['apples'].keys()))
822 3a19e99b Sofia Papagiannaki
823 3a19e99b Sofia Papagiannaki
    def test_if_not_modified_since(self):
824 3a19e99b Sofia Papagiannaki
        cname = 'apples'
825 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
826 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
827 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
828 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
829 3a19e99b Sofia Papagiannaki
830 3a19e99b Sofia Papagiannaki
        # Check unmodified
831 3a19e99b Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
832 3a19e99b Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
833 3a19e99b Sofia Papagiannaki
        for t in t1_formats:
834 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
835 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
836 3a19e99b Sofia Papagiannaki
            self.assertEqual(
837 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
838 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
839 3a19e99b Sofia Papagiannaki
840 3a19e99b Sofia Papagiannaki
        # modify account: add container
841 3a19e99b Sofia Papagiannaki
        _time.sleep(2)
842 3a19e99b Sofia Papagiannaki
        self.upload_object(cname)
843 3a19e99b Sofia Papagiannaki
844 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
845 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
846 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
847 3a19e99b Sofia Papagiannaki
        t2 = t - datetime.timedelta(seconds=1)
848 3a19e99b Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
849 3a19e99b Sofia Papagiannaki
850 3a19e99b Sofia Papagiannaki
        # Check modified
851 3a19e99b Sofia Papagiannaki
        for t in t2_formats:
852 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
853 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
854 3a19e99b Sofia Papagiannaki
855 3a19e99b Sofia Papagiannaki
        # modify account: update account meta
856 3a19e99b Sofia Papagiannaki
        _time.sleep(1)
857 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, {'foo': 'bar'})
858 3a19e99b Sofia Papagiannaki
859 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
860 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
861 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
862 3a19e99b Sofia Papagiannaki
        t3 = t - datetime.timedelta(seconds=1)
863 3a19e99b Sofia Papagiannaki
        t3_formats = map(t3.strftime, DATE_FORMATS)
864 3a19e99b Sofia Papagiannaki
865 3a19e99b Sofia Papagiannaki
        # Check modified
866 3a19e99b Sofia Papagiannaki
        for t in t3_formats:
867 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
868 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
869 3a19e99b Sofia Papagiannaki
870 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since(self):
871 3a19e99b Sofia Papagiannaki
        cname = 'apples'
872 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
873 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
874 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
875 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
876 3a19e99b Sofia Papagiannaki
        t = t + datetime.timedelta(seconds=1)
877 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
878 3a19e99b Sofia Papagiannaki
879 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
880 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
881 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
882 3a19e99b Sofia Papagiannaki
            self.assertEqual(
883 3a19e99b Sofia Papagiannaki
                r.content.split('\n')[:-1],
884 3a19e99b Sofia Papagiannaki
                sorted(self.objects['apples']))
885 3a19e99b Sofia Papagiannaki
886 3a19e99b Sofia Papagiannaki
    def test_if_unmodified_since_precondition_failed(self):
887 3a19e99b Sofia Papagiannaki
        cname = 'apples'
888 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
889 3a19e99b Sofia Papagiannaki
        container_info = self.get_container_info(cname)
890 3a19e99b Sofia Papagiannaki
        last_modified = container_info['Last-Modified']
891 3a19e99b Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
892 3a19e99b Sofia Papagiannaki
        t = t - datetime.timedelta(seconds=1)
893 3a19e99b Sofia Papagiannaki
        t_formats = map(t.strftime, DATE_FORMATS)
894 3a19e99b Sofia Papagiannaki
895 3a19e99b Sofia Papagiannaki
        for tf in t_formats:
896 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=tf)
897 3a19e99b Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
898 3a19e99b Sofia Papagiannaki
899 3a19e99b Sofia Papagiannaki
900 3a19e99b Sofia Papagiannaki
class ContainerPut(PithosAPITest):
901 3a19e99b Sofia Papagiannaki
    def test_create(self):
902 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
903 3a19e99b Sofia Papagiannaki
        self.list_containers()
904 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
905 3a19e99b Sofia Papagiannaki
906 3a19e99b Sofia Papagiannaki
    def test_create_twice(self):
907 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
908 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
909 2a194295 Sofia Papagiannaki
        r = self.create_container('c1')[-1]
910 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
911 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
912 3a19e99b Sofia Papagiannaki
913 3a19e99b Sofia Papagiannaki
914 3a19e99b Sofia Papagiannaki
class ContainerPost(PithosAPITest):
915 3a19e99b Sofia Papagiannaki
    def test_update_meta(self):
916 3a19e99b Sofia Papagiannaki
        cname = 'apples'
917 3a19e99b Sofia Papagiannaki
        self.create_container(cname)
918 3a19e99b Sofia Papagiannaki
        meta = {'test': 'test33', 'tost': 'tost22'}
919 3a19e99b Sofia Papagiannaki
        self.update_container_meta(cname, meta)
920 3a19e99b Sofia Papagiannaki
        info = self.get_container_info(cname)
921 3a19e99b Sofia Papagiannaki
        for k, v in meta.items():
922 3a19e99b Sofia Papagiannaki
            k = 'x-container-meta-%s' % k
923 3a19e99b Sofia Papagiannaki
            self.assertTrue(k in info)
924 3a19e99b Sofia Papagiannaki
            self.assertEqual(info[k], v)
925 3a19e99b Sofia Papagiannaki
926 3a19e99b Sofia Papagiannaki
    def test_quota(self):
927 3a19e99b Sofia Papagiannaki
        self.create_container('c1')
928 3a19e99b Sofia Papagiannaki
929 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
930 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='100')
931 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
932 3a19e99b Sofia Papagiannaki
933 3a19e99b Sofia Papagiannaki
        info = self.get_container_info('c1')
934 3a19e99b Sofia Papagiannaki
        self.assertTrue('x-container-policy-quota' in info)
935 3a19e99b Sofia Papagiannaki
        self.assertEqual(info['x-container-policy-quota'], '100')
936 3a19e99b Sofia Papagiannaki
937 c977b0b6 Sofia Papagiannaki
        r = self.upload_object('c1', length=101, verify_status=False)[2]
938 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 413)
939 3a19e99b Sofia Papagiannaki
940 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
941 3a19e99b Sofia Papagiannaki
        r = self.post(url, HTTP_X_CONTAINER_POLICY_QUOTA='0')
942 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
943 3a19e99b Sofia Papagiannaki
944 3a19e99b Sofia Papagiannaki
        r = self.upload_object('c1', length=1)
945 3a19e99b Sofia Papagiannaki
946 2560c061 Sofia Papagiannaki
    def test_upload_blocks(self):
947 2560c061 Sofia Papagiannaki
        cname = self.create_container()[0]
948 2560c061 Sofia Papagiannaki
949 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
950 2560c061 Sofia Papagiannaki
        r = self.post(url, data=get_random_data())
951 2560c061 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
952 2560c061 Sofia Papagiannaki
953 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, 'chuck', cname)
954 2560c061 Sofia Papagiannaki
        r = self.post(url, data=get_random_data())
955 2560c061 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
956 2560c061 Sofia Papagiannaki
957 2560c061 Sofia Papagiannaki
        # share object for read only
958 2560c061 Sofia Papagiannaki
        oname = self.upload_object(cname)[0]
959 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
960 2560c061 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
961 2560c061 Sofia Papagiannaki
                  HTTP_X_OBJECT_SHARING='read=*')
962 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, 'chuck', cname)
963 2560c061 Sofia Papagiannaki
        r = self.post(url, data=get_random_data())
964 2560c061 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
965 2560c061 Sofia Papagiannaki
966 2560c061 Sofia Papagiannaki
        # share object for write only
967 2560c061 Sofia Papagiannaki
        oname = self.upload_object(cname)[0]
968 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
969 2560c061 Sofia Papagiannaki
        self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
970 2560c061 Sofia Papagiannaki
                  HTTP_X_OBJECT_SHARING='write=*')
971 2560c061 Sofia Papagiannaki
        url = join_urls(self.pithos_path, 'chuck', cname)
972 2560c061 Sofia Papagiannaki
        r = self.post(url, data=get_random_data())
973 2560c061 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
974 2560c061 Sofia Papagiannaki
975 3a19e99b Sofia Papagiannaki
976 3a19e99b Sofia Papagiannaki
class ContainerDelete(PithosAPITest):
977 3a19e99b Sofia Papagiannaki
    def setUp(self):
978 3a19e99b Sofia Papagiannaki
        PithosAPITest.setUp(self)
979 3a19e99b Sofia Papagiannaki
        cnames = ['c1', 'c2']
980 3a19e99b Sofia Papagiannaki
981 3a19e99b Sofia Papagiannaki
        for c in cnames:
982 3a19e99b Sofia Papagiannaki
            self.create_container(c)
983 3a19e99b Sofia Papagiannaki
984 3a19e99b Sofia Papagiannaki
    def test_delete(self):
985 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
986 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
987 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 204)
988 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' not in self.list_containers(format=None))
989 3a19e99b Sofia Papagiannaki
990 3a19e99b Sofia Papagiannaki
    def test_delete_non_empty(self):
991 3a19e99b Sofia Papagiannaki
        self.upload_object('c1')
992 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c1')
993 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
994 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 409)
995 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))
996 3a19e99b Sofia Papagiannaki
997 3a19e99b Sofia Papagiannaki
    def test_delete_invalid(self):
998 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'c3')
999 3a19e99b Sofia Papagiannaki
        r = self.delete(url)
1000 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
1001 3a19e99b Sofia Papagiannaki
1002 3a19e99b Sofia Papagiannaki
    def test_delete_contents(self):
1003 3a19e99b Sofia Papagiannaki
        folder = self.create_folder('c1')[0]
1004 3a19e99b Sofia Papagiannaki
        descendant = strnextling(folder)
1005 3a19e99b Sofia Papagiannaki
        self.upload_object('c1', descendant)
1006 3a19e99b Sofia Papagiannaki
        self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0]
1007 3a19e99b Sofia Papagiannaki
1008 3a19e99b Sofia Papagiannaki
        self.delete('%s?delimiter=/' % join_urls(
1009 3a19e99b Sofia Papagiannaki
            self.pithos_path, self.user, 'c1'))
1010 3a19e99b Sofia Papagiannaki
        self.assertEqual([], self.list_objects('c1'))
1011 3a19e99b Sofia Papagiannaki
        self.assertTrue('c1' in self.list_containers(format=None))