Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / test / accounts.py @ 5fe43b8c

History | View | Annotate | Download (19.6 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 f3787696 Sofia Papagiannaki
from pithos.api.test import PithosAPITest, AssertMappingInvariant,\
38 f3787696 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 f3787696 Sofia Papagiannaki
46 f3787696 Sofia Papagiannaki
class AccountHead(PithosAPITest):
47 f3787696 Sofia Papagiannaki
    def test_get_account_meta(self):
48 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
49 f3787696 Sofia Papagiannaki
50 f3787696 Sofia Papagiannaki
        # create containers
51 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
52 f3787696 Sofia Papagiannaki
        for cname in cnames:
53 f3787696 Sofia Papagiannaki
            self.create_container(cname)
54 f3787696 Sofia Papagiannaki
55 f3787696 Sofia Papagiannaki
            # upload object
56 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
57 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
58 f3787696 Sofia Papagiannaki
59 f3787696 Sofia Papagiannaki
        # set account meta
60 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
61 f3787696 Sofia Papagiannaki
62 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
63 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
64 f3787696 Sofia Papagiannaki
        self.assertEqual(account_info['X-Account-Meta-Foo'], 'bar')
65 f3787696 Sofia Papagiannaki
66 f3787696 Sofia Papagiannaki
        # list containers
67 f3787696 Sofia Papagiannaki
        containers = self.list_containers()
68 f3787696 Sofia Papagiannaki
        self.assertEqual(int(account_info['X-Account-Container-Count']),
69 f3787696 Sofia Papagiannaki
                         len(containers))
70 f3787696 Sofia Papagiannaki
        usage = 0
71 f3787696 Sofia Papagiannaki
        for c in containers:
72 f3787696 Sofia Papagiannaki
            # list objects
73 f3787696 Sofia Papagiannaki
            objects = self.list_objects(c['name'])
74 f3787696 Sofia Papagiannaki
            self.assertEqual(c['count'], len(objects))
75 f3787696 Sofia Papagiannaki
            csum = sum([o['bytes'] for o in objects])
76 f3787696 Sofia Papagiannaki
            self.assertEqual(int(c['bytes']), csum)
77 f3787696 Sofia Papagiannaki
            usage += int(c['bytes'])
78 f3787696 Sofia Papagiannaki
79 f3787696 Sofia Papagiannaki
        self.assertEqual(
80 f3787696 Sofia Papagiannaki
            int(account_info['x-account-bytes-used']) + uploaded_bytes,
81 f3787696 Sofia Papagiannaki
            usage)
82 f3787696 Sofia Papagiannaki
83 f3787696 Sofia Papagiannaki
    def test_get_account_meta_until(self):
84 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
85 f3787696 Sofia Papagiannaki
86 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
87 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
88 f3787696 Sofia Papagiannaki
                                       DATE_FORMATS[2])
89 f3787696 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
90 f3787696 Sofia Papagiannaki
        until = int(_time.mktime(t1.timetuple()))
91 f3787696 Sofia Papagiannaki
92 f3787696 Sofia Papagiannaki
        _time.sleep(2)
93 f3787696 Sofia Papagiannaki
        self.update_account_meta({'quality': 'AAA'})
94 f3787696 Sofia Papagiannaki
95 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
96 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(account_info['Last-Modified'],
97 f3787696 Sofia Papagiannaki
                                       DATE_FORMATS[-1])
98 f3787696 Sofia Papagiannaki
        last_modified = int(_time.mktime(t.timetuple()))
99 f3787696 Sofia Papagiannaki
        assert until < last_modified
100 f3787696 Sofia Papagiannaki
101 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Quality' in account_info)
102 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
103 f3787696 Sofia Papagiannaki
104 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info(until=until)
105 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Quality' not in account_info)
106 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Foo' in account_info)
107 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Until-Timestamp' in account_info)
108 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(
109 f3787696 Sofia Papagiannaki
            account_info['X-Account-Until-Timestamp'], DATE_FORMATS[2])
110 f3787696 Sofia Papagiannaki
        self.assertTrue(int(_time.mktime(t1.timetuple())) <= until)
111 f3787696 Sofia Papagiannaki
112 f3787696 Sofia Papagiannaki
    def test_get_account_meta_until_invalid_date(self):
113 f3787696 Sofia Papagiannaki
        self.update_account_meta({'quality': 'AAA'})
114 f3787696 Sofia Papagiannaki
        meta = self.get_account_meta(until='-1')
115 f3787696 Sofia Papagiannaki
        self.assertTrue('X-Account-Meta-Quality' in meta)
116 f3787696 Sofia Papagiannaki
117 f3787696 Sofia Papagiannaki
118 f3787696 Sofia Papagiannaki
class AccountGet(PithosAPITest):
119 f3787696 Sofia Papagiannaki
    def setUp(self):
120 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
121 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
122 f3787696 Sofia Papagiannaki
123 f3787696 Sofia Papagiannaki
        # create containers
124 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
125 f3787696 Sofia Papagiannaki
        for cname in cnames:
126 f3787696 Sofia Papagiannaki
            self.create_container(cname)
127 f3787696 Sofia Papagiannaki
128 f3787696 Sofia Papagiannaki
            # upload object
129 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
130 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
131 f3787696 Sofia Papagiannaki
132 f3787696 Sofia Papagiannaki
    def test_list(self):
133 f3787696 Sofia Papagiannaki
        #list containers: row format
134 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None)
135 f3787696 Sofia Papagiannaki
        self.assertEquals(containers,
136 f3787696 Sofia Papagiannaki
                          ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
137 f3787696 Sofia Papagiannaki
138 3a19e99b Sofia Papagiannaki
    def test_list_shared(self):
139 3a19e99b Sofia Papagiannaki
        # upload and publish object
140 3a19e99b Sofia Papagiannaki
        oname, data, resp = self.upload_object('apples')
141 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'apples', oname)
142 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true')
143 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
144 3a19e99b Sofia Papagiannaki
145 3a19e99b Sofia Papagiannaki
        # upload and share object
146 3a19e99b Sofia Papagiannaki
        other, data, resp = self.upload_object('bananas')
147 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, 'bananas', other)
148 3a19e99b Sofia Papagiannaki
        r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice')
149 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
150 3a19e99b Sofia Papagiannaki
151 3a19e99b Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
152 3a19e99b Sofia Papagiannaki
153 3a19e99b Sofia Papagiannaki
        # list shared containers
154 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=' % url)
155 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
156 3a19e99b Sofia Papagiannaki
        if '' in objects:
157 3a19e99b Sofia Papagiannaki
            objects.remove('')
158 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['apples'])
159 3a19e99b Sofia Papagiannaki
160 3a19e99b Sofia Papagiannaki
        # list shared containers
161 3a19e99b Sofia Papagiannaki
        r = self.get('%s?shared=' % url)
162 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
163 3a19e99b Sofia Papagiannaki
        if '' in objects:
164 3a19e99b Sofia Papagiannaki
            objects.remove('')
165 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['bananas'])
166 3a19e99b Sofia Papagiannaki
167 3a19e99b Sofia Papagiannaki
        # list public and shared containers
168 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=&shared=' % url)
169 3a19e99b Sofia Papagiannaki
        objects = r.content.split('\n')
170 3a19e99b Sofia Papagiannaki
        if '' in objects:
171 3a19e99b Sofia Papagiannaki
            objects.remove('')
172 3a19e99b Sofia Papagiannaki
        self.assertEqual(objects, ['apples', 'bananas'])
173 3a19e99b Sofia Papagiannaki
174 3a19e99b Sofia Papagiannaki
        # assert forbidden public container listing
175 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=' % url, user='alice')
176 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
177 3a19e99b Sofia Papagiannaki
178 3a19e99b Sofia Papagiannaki
        # assert forbidden shared & public container listing
179 3a19e99b Sofia Papagiannaki
        r = self.get('%s?public=&shared=' % url, user='alice')
180 3a19e99b Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
181 3a19e99b Sofia Papagiannaki
182 f3787696 Sofia Papagiannaki
    def test_list_with_limit(self):
183 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2)
184 f3787696 Sofia Papagiannaki
        self.assertEquals(len(containers), 2)
185 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['apples', 'bananas'])
186 f3787696 Sofia Papagiannaki
187 f3787696 Sofia Papagiannaki
    def test_list_with_marker(self):
188 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2,
189 f3787696 Sofia Papagiannaki
                                          marker='bananas')
190 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['kiwis', 'oranges'])
191 f3787696 Sofia Papagiannaki
192 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format=None, limit=2,
193 f3787696 Sofia Papagiannaki
                                          marker='oranges')
194 f3787696 Sofia Papagiannaki
        self.assertEquals(containers, ['pears'])
195 f3787696 Sofia Papagiannaki
196 f3787696 Sofia Papagiannaki
    def test_list_json_with_marker(self):
197 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format='json', limit=2,
198 f3787696 Sofia Papagiannaki
                                          marker='bananas')
199 f3787696 Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', 2)
200 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'kiwis')
201 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[1]['name'], 'oranges')
202 f3787696 Sofia Papagiannaki
203 f3787696 Sofia Papagiannaki
        containers = self.list_containers(format='json', limit=2,
204 f3787696 Sofia Papagiannaki
                                          marker='oranges')
205 f3787696 Sofia Papagiannaki
        self.assert_extended(containers, 'json', 'container', 1)
206 f3787696 Sofia Papagiannaki
        self.assertEqual(containers[0]['name'], 'pears')
207 f3787696 Sofia Papagiannaki
208 f3787696 Sofia Papagiannaki
    def test_list_xml_with_marker(self):
209 f3787696 Sofia Papagiannaki
        xml = self.list_containers(format='xml', limit=2, marker='bananas')
210 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', 2)
211 f3787696 Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
212 f3787696 Sofia Papagiannaki
        self.assertTrue(len(nodes) <= 2)
213 f3787696 Sofia Papagiannaki
        names = [n.childNodes[0].data for n in nodes]
214 f3787696 Sofia Papagiannaki
        self.assertEqual(names, ['kiwis', 'oranges'])
215 f3787696 Sofia Papagiannaki
216 f3787696 Sofia Papagiannaki
        xml = self.list_containers(format='xml', limit=2, marker='oranges')
217 f3787696 Sofia Papagiannaki
        self.assert_extended(xml, 'xml', 'container', 1)
218 f3787696 Sofia Papagiannaki
        nodes = xml.getElementsByTagName('name')
219 f3787696 Sofia Papagiannaki
        self.assertTrue(len(nodes) <= 2)
220 f3787696 Sofia Papagiannaki
        names = [n.childNodes[0].data for n in nodes]
221 f3787696 Sofia Papagiannaki
        self.assertEqual(names, ['pears'])
222 f3787696 Sofia Papagiannaki
223 f3787696 Sofia Papagiannaki
    def test_if_modified_since(self):
224 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
225 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
226 f3787696 Sofia Papagiannaki
        t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
227 f3787696 Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
228 f3787696 Sofia Papagiannaki
229 f3787696 Sofia Papagiannaki
        # Check not modified
230 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
231 f3787696 Sofia Papagiannaki
        for t in t1_formats:
232 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
233 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 304)
234 f3787696 Sofia Papagiannaki
235 f3787696 Sofia Papagiannaki
        # modify account: add container
236 f3787696 Sofia Papagiannaki
        _time.sleep(1)
237 f3787696 Sofia Papagiannaki
        self.create_container('c1')
238 f3787696 Sofia Papagiannaki
239 f3787696 Sofia Papagiannaki
        # Check modified
240 f3787696 Sofia Papagiannaki
        for t in t1_formats:
241 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
242 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
243 f3787696 Sofia Papagiannaki
            self.assertEqual(
244 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
245 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears'])
246 f3787696 Sofia Papagiannaki
247 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
248 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
249 f3787696 Sofia Papagiannaki
        t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
250 f3787696 Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
251 f3787696 Sofia Papagiannaki
252 f3787696 Sofia Papagiannaki
        # modify account: update account meta
253 f3787696 Sofia Papagiannaki
        _time.sleep(1)
254 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
255 f3787696 Sofia Papagiannaki
256 f3787696 Sofia Papagiannaki
        # Check modified
257 f3787696 Sofia Papagiannaki
        for t in t2_formats:
258 3a19e99b Sofia Papagiannaki
            r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
259 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
260 f3787696 Sofia Papagiannaki
            self.assertEqual(
261 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
262 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears'])
263 f3787696 Sofia Papagiannaki
264 f3787696 Sofia Papagiannaki
    def test_if_modified_since_invalid_date(self):
265 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
266 3a19e99b Sofia Papagiannaki
        r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday')
267 f3787696 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
268 f3787696 Sofia Papagiannaki
        self.assertEqual(
269 f3787696 Sofia Papagiannaki
            r.content.split('\n')[:-1],
270 f3787696 Sofia Papagiannaki
            ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
271 f3787696 Sofia Papagiannaki
272 f3787696 Sofia Papagiannaki
    def test_if_not_modified_since(self):
273 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
274 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
275 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
276 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
277 f3787696 Sofia Papagiannaki
278 f3787696 Sofia Papagiannaki
        # Check unmodified
279 f3787696 Sofia Papagiannaki
        t1 = t + datetime.timedelta(seconds=1)
280 f3787696 Sofia Papagiannaki
        t1_formats = map(t1.strftime, DATE_FORMATS)
281 f3787696 Sofia Papagiannaki
        for t in t1_formats:
282 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
283 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 200)
284 f3787696 Sofia Papagiannaki
            self.assertEqual(
285 f3787696 Sofia Papagiannaki
                r.content.split('\n')[:-1],
286 f3787696 Sofia Papagiannaki
                ['apples', 'bananas', 'kiwis', 'oranges', 'pears'])
287 f3787696 Sofia Papagiannaki
288 f3787696 Sofia Papagiannaki
        # modify account: add container
289 f3787696 Sofia Papagiannaki
        _time.sleep(2)
290 f3787696 Sofia Papagiannaki
        self.create_container('c1')
291 f3787696 Sofia Papagiannaki
292 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
293 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
294 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
295 f3787696 Sofia Papagiannaki
        t2 = t - datetime.timedelta(seconds=1)
296 f3787696 Sofia Papagiannaki
        t2_formats = map(t2.strftime, DATE_FORMATS)
297 f3787696 Sofia Papagiannaki
298 f3787696 Sofia Papagiannaki
        # Check modified
299 f3787696 Sofia Papagiannaki
        for t in t2_formats:
300 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
301 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
302 f3787696 Sofia Papagiannaki
303 f3787696 Sofia Papagiannaki
        # modify account: update account meta
304 f3787696 Sofia Papagiannaki
        _time.sleep(1)
305 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
306 f3787696 Sofia Papagiannaki
307 f3787696 Sofia Papagiannaki
        account_info = self.get_account_info()
308 f3787696 Sofia Papagiannaki
        last_modified = account_info['Last-Modified']
309 f3787696 Sofia Papagiannaki
        t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
310 f3787696 Sofia Papagiannaki
        t3 = t - datetime.timedelta(seconds=1)
311 f3787696 Sofia Papagiannaki
        t3_formats = map(t3.strftime, DATE_FORMATS)
312 f3787696 Sofia Papagiannaki
313 f3787696 Sofia Papagiannaki
        # Check modified
314 f3787696 Sofia Papagiannaki
        for t in t3_formats:
315 d6a92fa0 Sofia Papagiannaki
            r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
316 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 412)
317 f3787696 Sofia Papagiannaki
318 f3787696 Sofia Papagiannaki
    def test_if_unmodified_since_invalid_date(self):
319 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
320 d6a92fa0 Sofia Papagiannaki
        r = self.get(url, HTTP_IF_UNMODIFIED_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
327 f3787696 Sofia Papagiannaki
class AccountPost(PithosAPITest):
328 f3787696 Sofia Papagiannaki
    def setUp(self):
329 f3787696 Sofia Papagiannaki
        PithosAPITest.setUp(self)
330 f3787696 Sofia Papagiannaki
        cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
331 f3787696 Sofia Papagiannaki
332 f3787696 Sofia Papagiannaki
        # create containers
333 f3787696 Sofia Papagiannaki
        uploaded_bytes = 0
334 f3787696 Sofia Papagiannaki
        for cname in cnames:
335 f3787696 Sofia Papagiannaki
            self.create_container(cname)
336 f3787696 Sofia Papagiannaki
337 f3787696 Sofia Papagiannaki
            # upload object
338 f3787696 Sofia Papagiannaki
            name, data, resp = self.upload_object(cname)
339 f3787696 Sofia Papagiannaki
            uploaded_bytes += len(data)
340 f3787696 Sofia Papagiannaki
341 f3787696 Sofia Papagiannaki
        # set account meta
342 f3787696 Sofia Papagiannaki
        self.update_account_meta({'foo': 'bar'})
343 f3787696 Sofia Papagiannaki
344 f3787696 Sofia Papagiannaki
    def test_update_meta(self):
345 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
346 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
347 f3787696 Sofia Papagiannaki
            initial = self.get_account_meta()
348 f3787696 Sofia Papagiannaki
349 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
350 f3787696 Sofia Papagiannaki
            kwargs = dict(('HTTP_X_ACCOUNT_META_%s' % k, str(v))
351 f3787696 Sofia Papagiannaki
                          for k, v in meta.items())
352 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
353 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
354 f3787696 Sofia Papagiannaki
355 f3787696 Sofia Papagiannaki
            meta.update(initial)
356 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
357 f3787696 Sofia Papagiannaki
            (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
358 f3787696 Sofia Papagiannaki
                k in meta.keys())
359 f3787696 Sofia Papagiannaki
            (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
360 f3787696 Sofia Papagiannaki
                k, v in meta.items())
361 f3787696 Sofia Papagiannaki
362 f3787696 Sofia Papagiannaki
    def test_reset_meta(self):
363 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
364 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
365 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
366 f3787696 Sofia Papagiannaki
            self.update_account_meta(meta)
367 f3787696 Sofia Papagiannaki
368 f3787696 Sofia Papagiannaki
            new_meta = {'test': 'test33'}
369 f3787696 Sofia Papagiannaki
            kwargs = dict((
370 f3787696 Sofia Papagiannaki
                'HTTP_X_ACCOUNT_META_%s' % k, str(v)
371 f3787696 Sofia Papagiannaki
            ) for k, v in new_meta.items())
372 d6a92fa0 Sofia Papagiannaki
            r = self.post(url, **kwargs)
373 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
374 f3787696 Sofia Papagiannaki
375 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
376 f3787696 Sofia Papagiannaki
            (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
377 f3787696 Sofia Papagiannaki
                k in new_meta.keys())
378 f3787696 Sofia Papagiannaki
            (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
379 f3787696 Sofia Papagiannaki
                k, v in new_meta.items())
380 f3787696 Sofia Papagiannaki
381 f3787696 Sofia Papagiannaki
            (self.assertTrue('X-Account-Meta-%s' % k not in account_meta) for
382 f3787696 Sofia Papagiannaki
                k in meta.keys())
383 f3787696 Sofia Papagiannaki
384 f3787696 Sofia Papagiannaki
    def test_delete_meta(self):
385 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
386 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_groups):
387 f3787696 Sofia Papagiannaki
            meta = {'test': 'tost', 'ping': 'pong'}
388 f3787696 Sofia Papagiannaki
            self.update_account_meta(meta)
389 f3787696 Sofia Papagiannaki
390 f3787696 Sofia Papagiannaki
            kwargs = dict(
391 f3787696 Sofia Papagiannaki
                ('HTTP_X_ACCOUNT_META_%s' % k, '') for k, v in meta.items())
392 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
393 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
394 f3787696 Sofia Papagiannaki
395 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
396 f3787696 Sofia Papagiannaki
397 f3787696 Sofia Papagiannaki
            (self.assertTrue('X-Account-Meta-%s' % k not in account_meta) for
398 f3787696 Sofia Papagiannaki
                k in meta.keys())
399 f3787696 Sofia Papagiannaki
400 f3787696 Sofia Papagiannaki
    def test_set_account_groups(self):
401 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
402 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
403 f3787696 Sofia Papagiannaki
            pithosdevs = ['verigak', 'gtsouk', 'chazapis']
404 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
405 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_PITHOSDEV=','.join(pithosdevs))
406 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
407 f3787696 Sofia Papagiannaki
408 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
409 f3787696 Sofia Papagiannaki
            self.assertTrue(
410 f3787696 Sofia Papagiannaki
                'X-Account-Group-Pithosdev' in self.get_account_groups())
411 f3787696 Sofia Papagiannaki
            self.assertEqual(
412 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Pithosdev'],
413 f3787696 Sofia Papagiannaki
                ','.join(sorted(pithosdevs)))
414 f3787696 Sofia Papagiannaki
415 f3787696 Sofia Papagiannaki
            clientdevs = ['pkanavos', 'mvasilak']
416 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
417 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=','.join(clientdevs))
418 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
419 f3787696 Sofia Papagiannaki
420 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
421 f3787696 Sofia Papagiannaki
            self.assertTrue(
422 f3787696 Sofia Papagiannaki
                'X-Account-Group-Pithosdev' in account_groups)
423 f3787696 Sofia Papagiannaki
            self.assertTrue(
424 f3787696 Sofia Papagiannaki
                'X-Account-Group-Clientsdev' in account_groups)
425 f3787696 Sofia Papagiannaki
            self.assertEqual(
426 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Pithosdev'],
427 f3787696 Sofia Papagiannaki
                ','.join(sorted(pithosdevs)))
428 f3787696 Sofia Papagiannaki
            self.assertEqual(
429 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Clientsdev'],
430 f3787696 Sofia Papagiannaki
                ','.join(sorted(clientdevs)))
431 f3787696 Sofia Papagiannaki
432 f3787696 Sofia Papagiannaki
            clientdevs = ['mvasilak']
433 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url,
434 d6a92fa0 Sofia Papagiannaki
                          HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=''.join(clientdevs))
435 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
436 f3787696 Sofia Papagiannaki
437 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
438 f3787696 Sofia Papagiannaki
            self.assertTrue(
439 f3787696 Sofia Papagiannaki
                'X-Account-Group-Pithosdev' in account_groups)
440 f3787696 Sofia Papagiannaki
            self.assertTrue(
441 f3787696 Sofia Papagiannaki
                'X-Account-Group-Clientsdev' in account_groups)
442 f3787696 Sofia Papagiannaki
            self.assertEqual(
443 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Pithosdev'],
444 f3787696 Sofia Papagiannaki
                ','.join(sorted(pithosdevs)))
445 f3787696 Sofia Papagiannaki
            self.assertEqual(
446 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Clientsdev'],
447 f3787696 Sofia Papagiannaki
                ','.join(sorted(clientdevs)))
448 f3787696 Sofia Papagiannaki
449 f3787696 Sofia Papagiannaki
    def test_reset_account_groups(self):
450 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
451 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
452 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'],
453 f3787696 Sofia Papagiannaki
                      'clientsdev': ['pkanavos', 'mvasilak']}
454 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
455 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
456 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **headers)
457 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
458 f3787696 Sofia Papagiannaki
459 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak',
460 f3787696 Sofia Papagiannaki
                                    'gtsouk',
461 f3787696 Sofia Papagiannaki
                                    'chazapis',
462 f3787696 Sofia Papagiannaki
                                    'papagian']}
463 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
464 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
465 f3787696 Sofia Papagiannaki
            account_meta = self.get_account_meta()
466 f3787696 Sofia Papagiannaki
            headers.update(dict(('HTTP_%s' % k.upper().replace('-', '_'), v)
467 f3787696 Sofia Papagiannaki
                           for k, v in account_meta.iteritems()))
468 d6a92fa0 Sofia Papagiannaki
            r = self.post(url, **headers)
469 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
470 f3787696 Sofia Papagiannaki
471 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
472 f3787696 Sofia Papagiannaki
            self.assertTrue(
473 f3787696 Sofia Papagiannaki
                'X-Account-Group-Pithosdev' in account_groups)
474 f3787696 Sofia Papagiannaki
            self.assertTrue(
475 f3787696 Sofia Papagiannaki
                'X-Account-Group-Clientsdev' not in account_groups)
476 f3787696 Sofia Papagiannaki
            self.assertEqual(
477 f3787696 Sofia Papagiannaki
                account_groups['X-Account-Group-Pithosdev'],
478 f3787696 Sofia Papagiannaki
                ','.join(sorted(groups['pithosdev'])))
479 f3787696 Sofia Papagiannaki
480 f3787696 Sofia Papagiannaki
    def test_delete_account_groups(self):
481 d6a92fa0 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
482 f3787696 Sofia Papagiannaki
        with AssertMappingInvariant(self.get_account_meta):
483 f3787696 Sofia Papagiannaki
            groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'],
484 f3787696 Sofia Papagiannaki
                      'clientsdev': ['pkanavos', 'mvasilak']}
485 f3787696 Sofia Papagiannaki
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
486 f3787696 Sofia Papagiannaki
                           for k, v in groups.iteritems())
487 d6a92fa0 Sofia Papagiannaki
            self.post('%s?update=' % url, **headers)
488 f3787696 Sofia Papagiannaki
489 f3787696 Sofia Papagiannaki
            kwargs = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, '')
490 f3787696 Sofia Papagiannaki
                          for k, v in groups.items())
491 d6a92fa0 Sofia Papagiannaki
            r = self.post('%s?update=' % url, **kwargs)
492 f3787696 Sofia Papagiannaki
            self.assertEqual(r.status_code, 202)
493 f3787696 Sofia Papagiannaki
494 f3787696 Sofia Papagiannaki
            account_groups = self.get_account_groups()
495 f3787696 Sofia Papagiannaki
            self.assertTrue(
496 f3787696 Sofia Papagiannaki
                'X-Account-Group-Pithosdev' not in account_groups)
497 f3787696 Sofia Papagiannaki
            self.assertTrue(
498 f3787696 Sofia Papagiannaki
                'X-Account-Group-Clientsdev' not in account_groups)