Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / test / accounts.py @ 474e609a

History | View | Annotate | Download (20.9 kB)

1 f3787696 Sofia Papagiannaki
#!/usr/bin/env python
2 f3787696 Sofia Papagiannaki
#coding=utf8
3 f3787696 Sofia Papagiannaki
4 f3787696 Sofia Papagiannaki
# Copyright 2011-2013 GRNET S.A. All rights reserved.
5 f3787696 Sofia Papagiannaki
#
6 f3787696 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
7 f3787696 Sofia Papagiannaki
# without modification, are permitted provided that the following
8 f3787696 Sofia Papagiannaki
# conditions are met:
9 f3787696 Sofia Papagiannaki
#
10 f3787696 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
11 f3787696 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
12 f3787696 Sofia Papagiannaki
#      disclaimer.
13 f3787696 Sofia Papagiannaki
#
14 f3787696 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
15 f3787696 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
16 f3787696 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
17 f3787696 Sofia Papagiannaki
#      provided with the distribution.
18 f3787696 Sofia Papagiannaki
#
19 f3787696 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 f3787696 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 f3787696 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 f3787696 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 f3787696 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 f3787696 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 f3787696 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 f3787696 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 f3787696 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 f3787696 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 f3787696 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 f3787696 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
31 f3787696 Sofia Papagiannaki
#
32 f3787696 Sofia Papagiannaki
# The views and conclusions contained in the software and
33 f3787696 Sofia Papagiannaki
# documentation are those of the authors and should not be
34 f3787696 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
35 f3787696 Sofia Papagiannaki
# or implied, of GRNET S.A.
36 f3787696 Sofia Papagiannaki
37 bc4f25c0 Sofia Papagiannaki
from pithos.api.test import (PithosAPITest, AssertMappingInvariant,
38 bc4f25c0 Sofia Papagiannaki
                             DATE_FORMATS)
39 f3787696 Sofia Papagiannaki
40 d6a92fa0 Sofia Papagiannaki
from synnefo.lib import join_urls
41 d6a92fa0 Sofia Papagiannaki
42 f3787696 Sofia Papagiannaki
import time as _time
43 f3787696 Sofia Papagiannaki
import datetime
44 f3787696 Sofia Papagiannaki
45 8b5c1106 Sofia Papagiannaki
import django.utils.simplejson as json
46 f3787696 Sofia Papagiannaki
47 f3787696 Sofia Papagiannaki
class AccountHead(PithosAPITest):
48 f3787696 Sofia Papagiannaki
    def test_get_account_meta(self):
49 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
50 f3787696 Sofia Papagiannaki
51 f3787696 Sofia Papagiannaki
        # create containers
52 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
53 f3787696 Sofia Papagiannaki
        for cname in cnames:
54 f3787696 Sofia Papagiannaki
            self.create_container(cname)
55 f3787696 Sofia Papagiannaki
56 f3787696 Sofia Papagiannaki
            # upload object
57 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
58 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
59 f3787696 Sofia Papagiannaki
60 f3787696 Sofia Papagiannaki
        # set account meta
61 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
62 f3787696 Sofia Papagiannaki
63 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
64 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
65 f3787696 Sofia Papagiannaki
        self.assertEqual(account_info['X-Account-Meta-Foo'], 'bar')
66 f3787696 Sofia Papagiannaki
67 f3787696 Sofia Papagiannaki
        # list containers
68 f3787696 Sofia Papagiannaki
        containers = self.list_containers()
69 f3787696 Sofia Papagiannaki
        self.assertEqual(int(account_info['X-Account-Container-Count']),
70 f3787696 Sofia Papagiannaki
                         len(containers))
71 f3787696 Sofia Papagiannaki
        usage = 0
72 f3787696 Sofia Papagiannaki
        for c in containers:
73 f3787696 Sofia Papagiannaki
            # list objects
74 f3787696 Sofia Papagiannaki
            objects = self.list_objects(c['name'])
75 f3787696 Sofia Papagiannaki
            self.assertEqual(c['count'], len(objects))
76 f3787696 Sofia Papagiannaki
            csum = sum([o['bytes'] for o in objects])
77 f3787696 Sofia Papagiannaki
            self.assertEqual(int(c['bytes']), csum)
78 f3787696 Sofia Papagiannaki
            usage += int(c['bytes'])
79 f3787696 Sofia Papagiannaki
80 f3787696 Sofia Papagiannaki
        self.assertEqual(
81 f3787696 Sofia Papagiannaki
            int(account_info['x-account-bytes-used']) + uploaded_bytes,
82 f3787696 Sofia Papagiannaki
            usage)
83 f3787696 Sofia Papagiannaki
84 f3787696 Sofia Papagiannaki
    def test_get_account_meta_until(self):
85 8b5c1106 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis']
86 8b5c1106 Sofia Papagiannaki
87 8b5c1106 Sofia Papagiannaki
        # create containers
88 8b5c1106 Sofia Papagiannaki
        uploaded_bytes = 0
89 8b5c1106 Sofia Papagiannaki
        for cname in cnames:
90 8b5c1106 Sofia Papagiannaki
            self.create_container(cname)
91 8b5c1106 Sofia Papagiannaki
92 8b5c1106 Sofia Papagiannaki
            # upload object
93 8b5c1106 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
94 8b5c1106 Sofia Papagiannaki
            uploaded_bytes += len(data)
95 8b5c1106 Sofia Papagiannaki
96 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
97 f3787696 Sofia Papagiannaki
98 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
99 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
100 f3787696 Sofia Papagiannaki
                                       DATE_FORMATS[2])
101 f3787696 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
102 f3787696 Sofia Papagiannaki
        until = int(_time.mktime(t1.timetuple()))
103 f3787696 Sofia Papagiannaki
104 f3787696 Sofia Papagiannaki
        _time.sleep(2)
105 8b5c1106 Sofia Papagiannaki
106 8b5c1106 Sofia Papagiannaki
        # add containers
107 8b5c1106 Sofia Papagiannaki
        cnames = ['oranges', 'pears']
108 8b5c1106 Sofia Papagiannaki
        for cname in cnames:
109 8b5c1106 Sofia Papagiannaki
            self.create_container(cname)
110 8b5c1106 Sofia Papagiannaki
111 8b5c1106 Sofia Papagiannaki
            # upload object
112 8b5c1106 Sofia Papagiannaki
            self.upload_object(cname)
113 8b5c1106 Sofia Papagiannaki
114 f3787696 Sofia Papagiannaki
        self.update_account_meta({'quality': 'AAA'})
115 f3787696 Sofia Papagiannaki
116 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
117 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
118 f3787696 Sofia Papagiannaki
                                       DATE_FORMATS[-1])
119 f3787696 Sofia Papagiannaki
        last_modified = int(_time.mktime(t.timetuple()))
120 f3787696 Sofia Papagiannaki
        assert until < last_modified
121 f3787696 Sofia Papagiannaki
122 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Quality' in account_info)
123 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
124 f3787696 Sofia Papagiannaki
125 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info(until=until)
126 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Quality' not in account_info)
127 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
128 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Until-Timestamp' in account_info)
129 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(
130 f3787696 Sofia Papagiannaki
            account_info['X-Account-Until-Timestamp'], DATE_FORMATS[2])
131 f3787696 Sofia Papagiannaki
        self.assertTrue(int(_time.mktime(t1.timetuple())) <= until)
132 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Account-Container-Count' in account_info)
133 8b5c1106 Sofia Papagiannaki
        self.assertEqual(int(account_info['X-Account-Container-Count']), 3)
134 8b5c1106 Sofia Papagiannaki
        self.assertTrue('X-Account-Bytes-Used' in account_info)
135 f3787696 Sofia Papagiannaki
136 f3787696 Sofia Papagiannaki
    def test_get_account_meta_until_invalid_date(self):
137 f3787696 Sofia Papagiannaki
        self.update_account_meta({'quality': 'AAA'})
138 f3787696 Sofia Papagiannaki
        meta = self.get_account_meta(until='-1')
139 6ee6677e Sofia Papagiannaki
        self.assertTrue('Quality' in meta)
140 f3787696 Sofia Papagiannaki
141 f3787696 Sofia Papagiannaki
142 f3787696 Sofia Papagiannaki
class AccountGet(PithosAPITest):
143 f3787696 Sofia Papagiannaki
    def setUp(self):
144 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
145 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
146 f3787696 Sofia Papagiannaki
147 f3787696 Sofia Papagiannaki
        # create containers
148 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
149 f3787696 Sofia Papagiannaki
        for cname in cnames:
150 f3787696 Sofia Papagiannaki
            self.create_container(cname)
151 f3787696 Sofia Papagiannaki
152 f3787696 Sofia Papagiannaki
            # upload object
153 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
154 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
155 f3787696 Sofia Papagiannaki
156 f3787696 Sofia Papagiannaki
    def test_list(self):
157 f3787696 Sofia Papagiannaki
        #list containers: row format
158 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None)
159 f3787696 Sofia Papagiannaki
        self.assertEquals(containers,
160 f3787696 Sofia Papagiannaki
                          ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
161 f3787696 Sofia Papagiannaki
162 8b5c1106 Sofia Papagiannaki
    def test_list_until(self):
163 8b5c1106 Sofia Papagiannaki
        account_info = self.get_account_info()
164 8b5c1106 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
165 8b5c1106 Sofia Papagiannaki
                                       DATE_FORMATS[2])
166 8b5c1106 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
167 8b5c1106 Sofia Papagiannaki
        until = int(_time.mktime(t1.timetuple()))
168 8b5c1106 Sofia Papagiannaki
169 8b5c1106 Sofia Papagiannaki
        _time.sleep(2)
170 8b5c1106 Sofia Papagiannaki
171 8b5c1106 Sofia Papagiannaki
        self.create_container()
172 8b5c1106 Sofia Papagiannaki
        
173 8b5c1106 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
174 8b5c1106 Sofia Papagiannaki
        r = self.get('%s?until=%s' % (url, until))
175 8b5c1106 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
176 8b5c1106 Sofia Papagiannaki
        containers = r.content.split('\n')
177 8b5c1106 Sofia Papagiannaki
        if '' in containers:
178 8b5c1106 Sofia Papagiannaki
            containers.remove('')
179 8b5c1106 Sofia Papagiannaki
        self.assertEqual(containers,
180 8b5c1106 Sofia Papagiannaki
                         ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
181 8b5c1106 Sofia Papagiannaki
182 8b5c1106 Sofia Papagiannaki
        
183 8b5c1106 Sofia Papagiannaki
        r = self.get('%s?until=%s&format=json' % (url, until))
184 8b5c1106 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
185 8b5c1106 Sofia Papagiannaki
        try:
186 8b5c1106 Sofia Papagiannaki
            containers = json.loads(r.content)
187 8b5c1106 Sofia Papagiannaki
        except:
188 8b5c1106 Sofia Papagiannaki
            self.fail('json format expected')
189 8b5c1106 Sofia Papagiannaki
        self.assertEqual([c['name'] for c in containers],
190 8b5c1106 Sofia Papagiannaki
                         ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) 
191 8b5c1106 Sofia Papagiannaki
192 3a19e99b Sofia Papagiannaki
    def test_list_shared(self):
193 3a19e99b Sofia Papagiannaki
        # upload and publish object
194 3a19e99b Sofia Papagiannaki
        oname, data, resp = self.upload_object('apples')
195 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples', oname)
196 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
197 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
198 3a19e99b Sofia Papagiannaki
199 3a19e99b Sofia Papagiannaki
        # upload and share object
200 3a19e99b Sofia Papagiannaki
        other, data, resp = self.upload_object('bananas')
201 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'bananas', other)
202 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
203 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
204 3a19e99b Sofia Papagiannaki
205 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
206 3a19e99b Sofia Papagiannaki
207 3a19e99b Sofia Papagiannaki
        # list shared containers
208 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=' % url)
209 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
210 3a19e99b Sofia Papagiannaki
        if '' in objects:
211 3a19e99b Sofia Papagiannaki
            objects.remove('')
212 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['apples'])
213 3a19e99b Sofia Papagiannaki
214 3a19e99b Sofia Papagiannaki
        # list shared containers
215 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
216 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
217 3a19e99b Sofia Papagiannaki
        if '' in objects:
218 3a19e99b Sofia Papagiannaki
            objects.remove('')
219 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['bananas'])
220 3a19e99b Sofia Papagiannaki
221 3a19e99b Sofia Papagiannaki
        # list public and shared containers
222 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=&shared=' % url)
223 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
224 3a19e99b Sofia Papagiannaki
        if '' in objects:
225 3a19e99b Sofia Papagiannaki
            objects.remove('')
226 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['apples', 'bananas'])
227 3a19e99b Sofia Papagiannaki
228 3a19e99b Sofia Papagiannaki
        # assert forbidden public container listing
229 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=' % url, user='alice')
230 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
231 3a19e99b Sofia Papagiannaki
232 3a19e99b Sofia Papagiannaki
        # assert forbidden shared & public container listing
233 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=&shared=' % url, user='alice')
234 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
235 3a19e99b Sofia Papagiannaki
236 f3787696 Sofia Papagiannaki
    def test_list_with_limit(self):
237 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2)
238 f3787696 Sofia Papagiannaki
        self.assertEquals(len(containers), 2)
239 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['apples', 'bananas'])
240 f3787696 Sofia Papagiannaki
241 f3787696 Sofia Papagiannaki
    def test_list_with_marker(self):
242 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2,
243 f3787696 Sofia Papagiannaki
                                          marker='bananas')
244 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['kiwis', 'oranges'])
245 f3787696 Sofia Papagiannaki
246 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2,
247 f3787696 Sofia Papagiannaki
                                          marker='oranges')
248 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['pears'])
249 f3787696 Sofia Papagiannaki
250 f3787696 Sofia Papagiannaki
    def test_list_json_with_marker(self):
251 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format='json', limit=2,
252 f3787696 Sofia Papagiannaki
                                          marker='bananas')
253 f3787696 Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', 2)
254 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'kiwis')
255 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[1]['name'], 'oranges')
256 f3787696 Sofia Papagiannaki
257 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format='json', limit=2,
258 f3787696 Sofia Papagiannaki
                                          marker='oranges')
259 f3787696 Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', 1)
260 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'pears')
261 f3787696 Sofia Papagiannaki
262 f3787696 Sofia Papagiannaki
    def test_list_xml_with_marker(self):
263 f3787696 Sofia Papagiannaki
        xml = self.list_containers(format='xml', limit=2, marker='bananas')
264 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', 2)
265 f3787696 Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
266 f3787696 Sofia Papagiannaki
        self.assertTrue(len(nodes) <= 2)
267 f3787696 Sofia Papagiannaki
        names = [n.childNodes[0].data for n in nodes]
268 f3787696 Sofia Papagiannaki
        self.assertEqual(names, ['kiwis', 'oranges'])
269 f3787696 Sofia Papagiannaki
270 f3787696 Sofia Papagiannaki
        xml = self.list_containers(format='xml', limit=2, marker='oranges')
271 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', 1)
272 f3787696 Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
273 f3787696 Sofia Papagiannaki
        self.assertTrue(len(nodes) <= 2)
274 f3787696 Sofia Papagiannaki
        names = [n.childNodes[0].data for n in nodes]
275 f3787696 Sofia Papagiannaki
        self.assertEqual(names, ['pears'])
276 f3787696 Sofia Papagiannaki
277 f3787696 Sofia Papagiannaki
    def test_if_modified_since(self):
278 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
279 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
280 f3787696 Sofia Papagiannaki
        t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
281 f3787696 Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
282 f3787696 Sofia Papagiannaki
283 f3787696 Sofia Papagiannaki
        # Check not modified
284 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
285 f3787696 Sofia Papagiannaki
        for t in t1_formats:
286 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
287 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
288 f3787696 Sofia Papagiannaki
289 f3787696 Sofia Papagiannaki
        # modify account: add container
290 f3787696 Sofia Papagiannaki
        _time.sleep(1)
291 f3787696 Sofia Papagiannaki
        self.create_container('c1')
292 f3787696 Sofia Papagiannaki
293 f3787696 Sofia Papagiannaki
        # Check modified
294 f3787696 Sofia Papagiannaki
        for t in t1_formats:
295 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
296 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
297 f3787696 Sofia Papagiannaki
            self.assertEqual(
298 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
299 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears'])
300 f3787696 Sofia Papagiannaki
301 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
302 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
303 f3787696 Sofia Papagiannaki
        t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
304 f3787696 Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
305 f3787696 Sofia Papagiannaki
306 f3787696 Sofia Papagiannaki
        # modify account: update account meta
307 f3787696 Sofia Papagiannaki
        _time.sleep(1)
308 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
309 f3787696 Sofia Papagiannaki
310 f3787696 Sofia Papagiannaki
        # Check modified
311 f3787696 Sofia Papagiannaki
        for t in t2_formats:
312 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
313 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
314 f3787696 Sofia Papagiannaki
            self.assertEqual(
315 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
316 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears'])
317 f3787696 Sofia Papagiannaki
318 f3787696 Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
319 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
320 3a19e99b Sofia Papagiannaki
        r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday')
321 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
322 f3787696 Sofia Papagiannaki
        self.assertEqual(
323 f3787696 Sofia Papagiannaki
            r.content.split('\n')[:-1],
324 f3787696 Sofia Papagiannaki
            ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
325 f3787696 Sofia Papagiannaki
326 f3787696 Sofia Papagiannaki
    def test_if_not_modified_since(self):
327 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
328 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
329 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
330 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
331 f3787696 Sofia Papagiannaki
332 f3787696 Sofia Papagiannaki
        # Check unmodified
333 f3787696 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
334 f3787696 Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
335 f3787696 Sofia Papagiannaki
        for t in t1_formats:
336 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
337 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
338 f3787696 Sofia Papagiannaki
            self.assertEqual(
339 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
340 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
341 f3787696 Sofia Papagiannaki
342 f3787696 Sofia Papagiannaki
        # modify account: add container
343 f3787696 Sofia Papagiannaki
        _time.sleep(2)
344 f3787696 Sofia Papagiannaki
        self.create_container('c1')
345 f3787696 Sofia Papagiannaki
346 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
347 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
348 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
349 f3787696 Sofia Papagiannaki
        t2 = t - datetime.timedelta(seconds=1)
350 f3787696 Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
351 f3787696 Sofia Papagiannaki
352 f3787696 Sofia Papagiannaki
        # Check modified
353 f3787696 Sofia Papagiannaki
        for t in t2_formats:
354 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
355 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
356 f3787696 Sofia Papagiannaki
357 f3787696 Sofia Papagiannaki
        # modify account: update account meta
358 f3787696 Sofia Papagiannaki
        _time.sleep(1)
359 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
360 f3787696 Sofia Papagiannaki
361 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
362 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
363 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
364 f3787696 Sofia Papagiannaki
        t3 = t - datetime.timedelta(seconds=1)
365 f3787696 Sofia Papagiannaki
        t3_formats = map(t3.strftime, DATE_FORMATS)
366 f3787696 Sofia Papagiannaki
367 f3787696 Sofia Papagiannaki
        # Check modified
368 f3787696 Sofia Papagiannaki
        for t in t3_formats:
369 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
370 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
371 f3787696 Sofia Papagiannaki
372 f3787696 Sofia Papagiannaki
    def test_if_unmodified_since_invalid_date(self):
373 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
374 d6a92fa0 Sofia Papagiannaki
        r = self.get(url, HTTP_IF_UNMODIFIED_SINCE='Monday')
375 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
376 f3787696 Sofia Papagiannaki
        self.assertEqual(
377 f3787696 Sofia Papagiannaki
            r.content.split('\n')[:-1],
378 f3787696 Sofia Papagiannaki
            ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
379 f3787696 Sofia Papagiannaki
380 f3787696 Sofia Papagiannaki
381 f3787696 Sofia Papagiannaki
class AccountPost(PithosAPITest):
382 f3787696 Sofia Papagiannaki
    def setUp(self):
383 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
384 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
385 f3787696 Sofia Papagiannaki
386 f3787696 Sofia Papagiannaki
        # create containers
387 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
388 f3787696 Sofia Papagiannaki
        for cname in cnames:
389 f3787696 Sofia Papagiannaki
            self.create_container(cname)
390 f3787696 Sofia Papagiannaki
391 f3787696 Sofia Papagiannaki
            # upload object
392 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
393 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
394 f3787696 Sofia Papagiannaki
395 f3787696 Sofia Papagiannaki
        # set account meta
396 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
397 f3787696 Sofia Papagiannaki
398 f3787696 Sofia Papagiannaki
    def test_update_meta(self):
399 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
400 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
401 f3787696 Sofia Papagiannaki
            initial = self.get_account_meta()
402 f3787696 Sofia Papagiannaki
403 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
404 f3787696 Sofia Papagiannaki
            kwargs = dict(('HTTP_X_ACCOUNT_META_%s' % k, str(v))
405 f3787696 Sofia Papagiannaki
                          for k, v in meta.items())
406 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
407 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
408 f3787696 Sofia Papagiannaki
409 f3787696 Sofia Papagiannaki
            meta.update(initial)
410 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
411 6ee6677e Sofia Papagiannaki
            (self.assertTrue(k in account_meta) for k in meta.keys())
412 6ee6677e Sofia Papagiannaki
            (self.assertEqual(account_meta[k], v) for k, v in meta.items())
413 f3787696 Sofia Papagiannaki
414 f3787696 Sofia Papagiannaki
    def test_reset_meta(self):
415 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
416 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
417 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
418 f3787696 Sofia Papagiannaki
            self.update_account_meta(meta)
419 f3787696 Sofia Papagiannaki
420 f3787696 Sofia Papagiannaki
            new_meta = {'test': 'test33'}
421 f3787696 Sofia Papagiannaki
            kwargs = dict((
422 f3787696 Sofia Papagiannaki
                'HTTP_X_ACCOUNT_META_%s' % k, str(v)
423 f3787696 Sofia Papagiannaki
            ) for k, v in new_meta.items())
424 d6a92fa0 Sofia Papagiannaki
            r = self.post(url, **kwargs)
425 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
426 f3787696 Sofia Papagiannaki
427 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
428 6ee6677e Sofia Papagiannaki
            (self.assertTrue(k in account_meta) for k in new_meta.keys())
429 6ee6677e Sofia Papagiannaki
            (self.assertEqual(account_meta[k], v) for k, v in new_meta.items())
430 f3787696 Sofia Papagiannaki
431 6ee6677e Sofia Papagiannaki
            (self.assertTrue(k not in account_meta) for k in meta.keys())
432 f3787696 Sofia Papagiannaki
433 f3787696 Sofia Papagiannaki
    def test_delete_meta(self):
434 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
435 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
436 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
437 f3787696 Sofia Papagiannaki
            self.update_account_meta(meta)
438 f3787696 Sofia Papagiannaki
439 f3787696 Sofia Papagiannaki
            kwargs = dict(
440 f3787696 Sofia Papagiannaki
                ('HTTP_X_ACCOUNT_META_%s' % k, '') for k, v in meta.items())
441 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
442 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
443 f3787696 Sofia Papagiannaki
444 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
445 f3787696 Sofia Papagiannaki
446 6ee6677e Sofia Papagiannaki
            (self.assertTrue(k not in account_meta) for k in meta.keys())
447 f3787696 Sofia Papagiannaki
448 f3787696 Sofia Papagiannaki
    def test_set_account_groups(self):
449 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
450 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
451 f3787696 Sofia Papagiannaki
            pithosdevs = ['verigak', 'gtsouk', 'chazapis']
452 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
453 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_PITHOSDEV=','.join(pithosdevs))
454 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
455 f3787696 Sofia Papagiannaki
456 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
457 6ee6677e Sofia Papagiannaki
            self.assertTrue('Pithosdev' in self.get_account_groups())
458 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Pithosdev'],
459 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(pithosdevs)))
460 f3787696 Sofia Papagiannaki
461 f3787696 Sofia Papagiannaki
            clientdevs = ['pkanavos', 'mvasilak']
462 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
463 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=','.join(clientdevs))
464 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
465 f3787696 Sofia Papagiannaki
466 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
467 6ee6677e Sofia Papagiannaki
            self.assertTrue('Pithosdev' in account_groups)
468 6ee6677e Sofia Papagiannaki
            self.assertTrue('Clientsdev' in account_groups)
469 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Pithosdev'],
470 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(pithosdevs)))
471 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Clientsdev'],
472 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(clientdevs)))
473 f3787696 Sofia Papagiannaki
474 f3787696 Sofia Papagiannaki
            clientdevs = ['mvasilak']
475 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
476 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=''.join(clientdevs))
477 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
478 f3787696 Sofia Papagiannaki
479 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
480 6ee6677e Sofia Papagiannaki
            self.assertTrue('Pithosdev' in account_groups)
481 6ee6677e Sofia Papagiannaki
            self.assertTrue('Clientsdev' in account_groups)
482 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Pithosdev'],
483 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(pithosdevs)))
484 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Clientsdev'],
485 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(clientdevs)))
486 f3787696 Sofia Papagiannaki
487 f3787696 Sofia Papagiannaki
    def test_reset_account_groups(self):
488 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
489 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
490 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'],
491 f3787696 Sofia Papagiannaki
                      'clientsdev': ['pkanavos', 'mvasilak']}
492 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
493 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
494 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **headers)
495 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
496 f3787696 Sofia Papagiannaki
497 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak',
498 f3787696 Sofia Papagiannaki
                                    'gtsouk',
499 f3787696 Sofia Papagiannaki
                                    'chazapis',
500 f3787696 Sofia Papagiannaki
                                    'papagian']}
501 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
502 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
503 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
504 6ee6677e Sofia Papagiannaki
            headers.update(dict(('HTTP_X_ACCOUNT_META_%s' %
505 6ee6677e Sofia Papagiannaki
                                k.upper().replace('-', '_'), v) for
506 6ee6677e Sofia Papagiannaki
                                k, v in account_meta.iteritems()))
507 d6a92fa0 Sofia Papagiannaki
            r = self.post(url, **headers)
508 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
509 f3787696 Sofia Papagiannaki
510 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
511 6ee6677e Sofia Papagiannaki
            self.assertTrue('Pithosdev' in account_groups)
512 6ee6677e Sofia Papagiannaki
            self.assertTrue('Clientsdev' not in account_groups)
513 6ee6677e Sofia Papagiannaki
            self.assertEqual(account_groups['Pithosdev'],
514 6ee6677e Sofia Papagiannaki
                             ','.join(sorted(groups['pithosdev'])))
515 f3787696 Sofia Papagiannaki
516 f3787696 Sofia Papagiannaki
    def test_delete_account_groups(self):
517 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
518 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
519 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'],
520 f3787696 Sofia Papagiannaki
                      'clientsdev': ['pkanavos', 'mvasilak']}
521 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
522 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
523 d6a92fa0 Sofia Papagiannaki
            self.post('%s?update=' % url, **headers)
524 f3787696 Sofia Papagiannaki
525 f3787696 Sofia Papagiannaki
            kwargs = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, '')
526 f3787696 Sofia Papagiannaki
                          for k, v in groups.items())
527 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
528 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
529 f3787696 Sofia Papagiannaki
530 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
531 6ee6677e Sofia Papagiannaki
            self.assertTrue('Pithosdev' not in account_groups)
532 6ee6677e Sofia Papagiannaki
            self.assertTrue('Clientsdev' not in account_groups)