Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / pithos.py @ 39c737d4

History | View | Annotate | Download (20.1 kB)

1 24851aa5 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 c1004a00 Stavros Sachtouris
#
3 c1004a00 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 c1004a00 Stavros Sachtouris
# without modification, are permitted provided that the following
5 c1004a00 Stavros Sachtouris
# conditions are met:
6 c1004a00 Stavros Sachtouris
#
7 c1004a00 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 c1004a00 Stavros Sachtouris
#      disclaimer.
10 c1004a00 Stavros Sachtouris
#
11 c1004a00 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 c1004a00 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 c1004a00 Stavros Sachtouris
#      provided with the distribution.
15 c1004a00 Stavros Sachtouris
#
16 c1004a00 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c1004a00 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c1004a00 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c1004a00 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c1004a00 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c1004a00 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c1004a00 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c1004a00 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c1004a00 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c1004a00 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c1004a00 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c1004a00 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 c1004a00 Stavros Sachtouris
#
29 c1004a00 Stavros Sachtouris
# The views and conclusions contained in the software and
30 c1004a00 Stavros Sachtouris
# documentation are those of the authors and should not be
31 c1004a00 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 c1004a00 Stavros Sachtouris
# or implied, of GRNET S.A.
33 c1004a00 Stavros Sachtouris
34 24851aa5 Stavros Sachtouris
from unittest import TestCase
35 24851aa5 Stavros Sachtouris
from mock import patch, call, Mock
36 c1004a00 Stavros Sachtouris
37 24851aa5 Stavros Sachtouris
from kamaki.clients import ClientError
38 8c599ca2 Stavros Sachtouris
from kamaki.clients.pithos import PithosClient as PC
39 c1004a00 Stavros Sachtouris
from kamaki.clients.astakos import AstakosClient
40 24851aa5 Stavros Sachtouris
from kamaki.clients.connection.kamakicon import KamakiHTTPConnection as C
41 24851aa5 Stavros Sachtouris
42 24851aa5 Stavros Sachtouris
user_id = 'ac0un7-1d-5tr1ng'
43 24851aa5 Stavros Sachtouris
44 24851aa5 Stavros Sachtouris
account_info = {
45 24851aa5 Stavros Sachtouris
    'content-language': 'en-us',
46 24851aa5 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
47 24851aa5 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 13:25:51 GMT',
48 24851aa5 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
49 24851aa5 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
50 24851aa5 Stavros Sachtouris
    'vary': 'Accept-Language',
51 24851aa5 Stavros Sachtouris
    'x-account-bytes-used': '751615526',
52 24851aa5 Stavros Sachtouris
    'x-account-container-count': 7,
53 24851aa5 Stavros Sachtouris
    'x-account-policy-quota': 53687091200,
54 24851aa5 Stavros Sachtouris
    'x-account-policy-versioning': 'auto'}
55 d12e8569 Stavros Sachtouris
container_info = {
56 d12e8569 Stavros Sachtouris
    'content-language': 'en-us',
57 d12e8569 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
58 d12e8569 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 15:11:05 GMT',
59 d12e8569 Stavros Sachtouris
    'last-modified': 'Wed, 27 Feb 2013 15:56:13 GMT',
60 d12e8569 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
61 d12e8569 Stavros Sachtouris
    'vary': 'Accept-Language',
62 d12e8569 Stavros Sachtouris
    'x-container-block-hash': 'sha256',
63 d12e8569 Stavros Sachtouris
    'x-container-block-size': 4194304,
64 d12e8569 Stavros Sachtouris
    'x-container-bytes-used': 309528938,
65 d12e8569 Stavros Sachtouris
    'x-container-object-count': 14,
66 d12e8569 Stavros Sachtouris
    'x-container-object-meta': '',
67 d12e8569 Stavros Sachtouris
    'x-container-policy-quota': 53687091200,
68 d12e8569 Stavros Sachtouris
    'x-container-policy-versioning': 'auto'}
69 723e9d47 Stavros Sachtouris
object_info = {
70 723e9d47 Stavros Sachtouris
    'content-language': 'en-us',
71 723e9d47 Stavros Sachtouris
    'content-length': 254965,
72 723e9d47 Stavros Sachtouris
    'content-type': 'application/octet-stream',
73 723e9d47 Stavros Sachtouris
    'date': 'Thu, 07 Mar 2013 13:27:43 GMT',
74 723e9d47 Stavros Sachtouris
    'etag': '',
75 723e9d47 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
76 723e9d47 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
77 723e9d47 Stavros Sachtouris
    'vary': 'Accept-Language',
78 723e9d47 Stavros Sachtouris
    'x-object-hash': 'obj3c7h45h1s0bj3c7h45h411r34dY',
79 723e9d47 Stavros Sachtouris
    'x-object-uuid': 'd0c747ca-34bd-49e0-8e98-1d07d8b0cbc7',
80 723e9d47 Stavros Sachtouris
    'x-object-version': '525996',
81 3e2e07be Stavros Sachtouris
    'x-object-version-timestamp': 'Mon, 04 Mar 2013 18:22:31 GMT',
82 3e2e07be Stavros Sachtouris
    'x-object-meta-k1': 'v1',
83 3e2e07be Stavros Sachtouris
    'x-object-meta-k2': 'v2'}
84 efaa8675 Stavros Sachtouris
container_list = [
85 efaa8675 Stavros Sachtouris
    dict(
86 efaa8675 Stavros Sachtouris
        count=2,
87 efaa8675 Stavros Sachtouris
        last_modified="2013-02-27T11:56:09.893033+00:00",
88 efaa8675 Stavros Sachtouris
        bytes=677076979,
89 efaa8675 Stavros Sachtouris
        name="pithos",
90 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto")),
91 efaa8675 Stavros Sachtouris
    dict(
92 efaa8675 Stavros Sachtouris
        count=0,
93 efaa8675 Stavros Sachtouris
        last_modified="2012-10-23T12:25:17.229187+00:00",
94 efaa8675 Stavros Sachtouris
        bytes=0,
95 efaa8675 Stavros Sachtouris
        name="trash",
96 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto"))]
97 39c737d4 Stavros Sachtouris
object_list = [
98 39c737d4 Stavros Sachtouris
    dict(hash="",
99 39c737d4 Stavros Sachtouris
        name="The_Secret_Garden.zip",
100 39c737d4 Stavros Sachtouris
        x_object_public="/public/wdp9p",
101 39c737d4 Stavros Sachtouris
        bytes=203304947,
102 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="1360237915.7027509",
103 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj0n3",
104 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
105 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
106 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
107 39c737d4 Stavros Sachtouris
        x_object_version=17737,
108 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id),
109 39c737d4 Stavros Sachtouris
    dict(hash="",
110 39c737d4 Stavros Sachtouris
        name="The_Revealed_Garden.zip",
111 39c737d4 Stavros Sachtouris
        x_object_public="/public/wpd7p",
112 39c737d4 Stavros Sachtouris
        bytes=20330947,
113 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="13602915.7027509",
114 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj70w",
115 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
116 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
117 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
118 39c737d4 Stavros Sachtouris
        x_object_version=17737,
119 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id)]
120 24851aa5 Stavros Sachtouris
121 24851aa5 Stavros Sachtouris
122 24851aa5 Stavros Sachtouris
class Pithos(TestCase):
123 24851aa5 Stavros Sachtouris
124 24851aa5 Stavros Sachtouris
    class FR(object):
125 24851aa5 Stavros Sachtouris
        """FR stands for Fake Response"""
126 24851aa5 Stavros Sachtouris
        json = dict()
127 bcbf3cf0 Stavros Sachtouris
        headers = dict()
128 24851aa5 Stavros Sachtouris
        content = json
129 24851aa5 Stavros Sachtouris
        status = None
130 8c599ca2 Stavros Sachtouris
        status_code = 200
131 24851aa5 Stavros Sachtouris
132 24851aa5 Stavros Sachtouris
        def release(self):
133 c1004a00 Stavros Sachtouris
            pass
134 c1004a00 Stavros Sachtouris
135 24851aa5 Stavros Sachtouris
    files = []
136 c1004a00 Stavros Sachtouris
137 24851aa5 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
138 24851aa5 Stavros Sachtouris
        for k, v in d1.items():
139 24851aa5 Stavros Sachtouris
            self.assertTrue(k in d2)
140 24851aa5 Stavros Sachtouris
            if isinstance(v, dict):
141 24851aa5 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
142 24851aa5 Stavros Sachtouris
            else:
143 24851aa5 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
144 c1004a00 Stavros Sachtouris
145 24851aa5 Stavros Sachtouris
    def setUp(self):
146 24851aa5 Stavros Sachtouris
        self.url = 'https://www.example.com/pithos'
147 24851aa5 Stavros Sachtouris
        self.token = 'p17h0570k3n'
148 8c599ca2 Stavros Sachtouris
        self.client = PC(self.url, self.token)
149 24851aa5 Stavros Sachtouris
        self.client.account = user_id
150 24851aa5 Stavros Sachtouris
        self.client.container = 'c0nt@1n3r_i'
151 c1004a00 Stavros Sachtouris
152 c1004a00 Stavros Sachtouris
    def tearDown(self):
153 24851aa5 Stavros Sachtouris
        self.FR.headers = dict()
154 8c599ca2 Stavros Sachtouris
        self.FR.status_code = 200
155 bcbf3cf0 Stavros Sachtouris
        self.FR.json = dict()
156 cf687343 Stavros Sachtouris
        for f in self.files:
157 cf687343 Stavros Sachtouris
            f.close()
158 24851aa5 Stavros Sachtouris
159 24851aa5 Stavros Sachtouris
    def test_get_account_info(self):
160 24851aa5 Stavros Sachtouris
        self.FR.headers = account_info
161 8c599ca2 Stavros Sachtouris
        self.FR.status_code = 204
162 24851aa5 Stavros Sachtouris
        with patch.object(C, 'perform_request', return_value=self.FR()):
163 24851aa5 Stavros Sachtouris
            r = self.client.get_account_info()
164 24851aa5 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
165 24851aa5 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/%s' % user_id)
166 24851aa5 Stavros Sachtouris
            self.assert_dicts_are_equal(r, account_info)
167 8c599ca2 Stavros Sachtouris
            PC.set_param = Mock()
168 24851aa5 Stavros Sachtouris
            untils = ['date 1', 'date 2', 'date 3']
169 24851aa5 Stavros Sachtouris
            for unt in untils:
170 24851aa5 Stavros Sachtouris
                r = self.client.get_account_info(until=unt)
171 24851aa5 Stavros Sachtouris
                self.assert_dicts_are_equal(r, account_info)
172 24851aa5 Stavros Sachtouris
            for i in range(len(untils)):
173 24851aa5 Stavros Sachtouris
                self.assertEqual(
174 8c599ca2 Stavros Sachtouris
                    PC.set_param.mock_calls[i],
175 24851aa5 Stavros Sachtouris
                    call('until', untils[i], iff=untils[i]))
176 756e9de9 Stavros Sachtouris
            self.FR.status_code = 401
177 756e9de9 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.get_account_info)
178 514f9b88 Stavros Sachtouris
179 514f9b88 Stavros Sachtouris
    def test_replace_account_meta(self):
180 514f9b88 Stavros Sachtouris
        self.FR.status_code = 202
181 514f9b88 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
182 8c599ca2 Stavros Sachtouris
        PC.set_header = Mock()
183 514f9b88 Stavros Sachtouris
        with patch.object(C, 'perform_request', return_value=self.FR()):
184 514f9b88 Stavros Sachtouris
            self.client.replace_account_meta(metas)
185 514f9b88 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
186 514f9b88 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/%s' % user_id)
187 514f9b88 Stavros Sachtouris
            prfx = 'X-Account-Meta-'
188 514f9b88 Stavros Sachtouris
            expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
189 8c599ca2 Stavros Sachtouris
            self.assertEqual(PC.set_header.mock_calls, expected)
190 8c599ca2 Stavros Sachtouris
191 8c599ca2 Stavros Sachtouris
    def test_del_account_meta(self):
192 8c599ca2 Stavros Sachtouris
        keys = ['k1', 'k2', 'k3']
193 8c599ca2 Stavros Sachtouris
        with patch.object(PC, 'account_post', return_value=self.FR()) as ap:
194 8c599ca2 Stavros Sachtouris
            expected = []
195 8c599ca2 Stavros Sachtouris
            for key in keys:
196 8c599ca2 Stavros Sachtouris
                self.client.del_account_meta(key)
197 8c599ca2 Stavros Sachtouris
                expected.append(call(update=True, metadata={key: ''}))
198 8c599ca2 Stavros Sachtouris
            self.assertEqual(ap.mock_calls, expected)
199 756e9de9 Stavros Sachtouris
200 756e9de9 Stavros Sachtouris
    def test_create_container(self):
201 756e9de9 Stavros Sachtouris
        self.FR.status_code = 201
202 756e9de9 Stavros Sachtouris
        with patch.object(PC, 'put', return_value=self.FR()) as put:
203 756e9de9 Stavros Sachtouris
            cont = 's0m3c0n731n3r'
204 756e9de9 Stavros Sachtouris
            self.client.create_container(cont)
205 756e9de9 Stavros Sachtouris
            expected = [call('/%s/%s' % (user_id, cont), success=(201, 202))]
206 756e9de9 Stavros Sachtouris
            self.assertEqual(put.mock_calls, expected)
207 756e9de9 Stavros Sachtouris
            self.FR.status_code = 202
208 756e9de9 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.create_container, cont)
209 d12e8569 Stavros Sachtouris
210 d12e8569 Stavros Sachtouris
    def test_get_container_info(self):
211 d12e8569 Stavros Sachtouris
        self.FR.headers = container_info
212 d12e8569 Stavros Sachtouris
        with patch.object(PC, 'container_head', return_value=self.FR()) as ch:
213 d12e8569 Stavros Sachtouris
            r = self.client.get_container_info()
214 d12e8569 Stavros Sachtouris
            self.assert_dicts_are_equal(r, container_info)
215 d12e8569 Stavros Sachtouris
            u = 'some date'
216 d12e8569 Stavros Sachtouris
            r = self.client.get_container_info(until=u)
217 d12e8569 Stavros Sachtouris
            self.assertEqual(ch.mock_calls, [call(until=None), call(until=u)])
218 5549c0ab Stavros Sachtouris
219 5549c0ab Stavros Sachtouris
    def test_delete_container(self):
220 5549c0ab Stavros Sachtouris
        self.FR.status_code = 204
221 5549c0ab Stavros Sachtouris
        with patch.object(PC, 'delete', return_value=self.FR()) as delete:
222 5549c0ab Stavros Sachtouris
            cont = 's0m3c0n731n3r'
223 5549c0ab Stavros Sachtouris
            self.client.delete_container(cont)
224 5549c0ab Stavros Sachtouris
            self.FR.status_code = 404
225 5549c0ab Stavros Sachtouris
            self.assertRaises(ClientError, self.client.delete_container, cont)
226 5549c0ab Stavros Sachtouris
            self.FR.status_code = 409
227 5549c0ab Stavros Sachtouris
            self.assertRaises(ClientError, self.client.delete_container, cont)
228 5549c0ab Stavros Sachtouris
            acall = call('/%s/%s' % (user_id, cont), success=(204, 404, 409))
229 5549c0ab Stavros Sachtouris
            self.assertEqual(delete.mock_calls, [acall] * 3)
230 efaa8675 Stavros Sachtouris
231 efaa8675 Stavros Sachtouris
    def test_list_containers(self):
232 efaa8675 Stavros Sachtouris
        self.FR.json = container_list
233 efaa8675 Stavros Sachtouris
        with patch.object(PC, 'account_get', return_value=self.FR()):
234 efaa8675 Stavros Sachtouris
            r = self.client.list_containers()
235 efaa8675 Stavros Sachtouris
            for i in range(len(r)):
236 efaa8675 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], container_list[i])
237 bcbf3cf0 Stavros Sachtouris
238 bcbf3cf0 Stavros Sachtouris
    def test_upload_object(self):
239 bcbf3cf0 Stavros Sachtouris
        PC.get_container_info = Mock(return_value=container_info)
240 bcbf3cf0 Stavros Sachtouris
        PC.container_post = Mock(return_value=self.FR())
241 bcbf3cf0 Stavros Sachtouris
        PC.object_put = Mock(return_value=self.FR())
242 bcbf3cf0 Stavros Sachtouris
        from tempfile import NamedTemporaryFile
243 bcbf3cf0 Stavros Sachtouris
        from os import urandom
244 cf687343 Stavros Sachtouris
        self.files.append(NamedTemporaryFile())
245 cf687343 Stavros Sachtouris
        tmpFile = self.files[-1]
246 bcbf3cf0 Stavros Sachtouris
        num_of_blocks = 8
247 bcbf3cf0 Stavros Sachtouris
        file_size = num_of_blocks * 4 * 1024 * 1024
248 bcbf3cf0 Stavros Sachtouris
        print('\n\tCreate tmp file')
249 bcbf3cf0 Stavros Sachtouris
        tmpFile.write(urandom(file_size))
250 bcbf3cf0 Stavros Sachtouris
        tmpFile.flush()
251 bcbf3cf0 Stavros Sachtouris
        tmpFile.seek(0)
252 bcbf3cf0 Stavros Sachtouris
        print('\t\tDone')
253 bcbf3cf0 Stavros Sachtouris
        obj = 'objectName'
254 cf687343 Stavros Sachtouris
255 cf687343 Stavros Sachtouris
        # No special args
256 bcbf3cf0 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile)
257 bcbf3cf0 Stavros Sachtouris
        self.assertEqual(PC.get_container_info.mock_calls, [call()])
258 bcbf3cf0 Stavros Sachtouris
        [call1, call2] = PC.object_put.mock_calls
259 bcbf3cf0 Stavros Sachtouris
260 cf687343 Stavros Sachtouris
        (args1, kwargs1) = call1[1:3]
261 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
262 cf687343 Stavros Sachtouris
        self.assertEqual(args1, (obj,))
263 cf687343 Stavros Sachtouris
        expected1 = dict(
264 bcbf3cf0 Stavros Sachtouris
            hashmap=True,
265 bcbf3cf0 Stavros Sachtouris
            success=(201, 409),
266 bcbf3cf0 Stavros Sachtouris
            format='json',
267 bcbf3cf0 Stavros Sachtouris
            json=dict(
268 bcbf3cf0 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
269 bcbf3cf0 Stavros Sachtouris
                bytes=file_size),
270 bcbf3cf0 Stavros Sachtouris
            etag=None,
271 bcbf3cf0 Stavros Sachtouris
            content_encoding=None,
272 bcbf3cf0 Stavros Sachtouris
            content_type='application/octet-stream',
273 bcbf3cf0 Stavros Sachtouris
            content_disposition=None,
274 bcbf3cf0 Stavros Sachtouris
            public=None,
275 bcbf3cf0 Stavros Sachtouris
            permissions=None)
276 cf687343 Stavros Sachtouris
        for k, v in expected1.items():
277 cf687343 Stavros Sachtouris
            if k == 'json':
278 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs1[k]['hashes']))
279 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs1[k]['bytes'])
280 cf687343 Stavros Sachtouris
            else:
281 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs1[k])
282 cf687343 Stavros Sachtouris
283 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
284 cf687343 Stavros Sachtouris
        self.assertEqual(args2, (obj,))
285 cf687343 Stavros Sachtouris
        expected2 = dict(
286 cf687343 Stavros Sachtouris
            json=dict(
287 cf687343 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
288 cf687343 Stavros Sachtouris
                bytes=file_size),
289 cf687343 Stavros Sachtouris
            content_type='application/octet-stream',
290 cf687343 Stavros Sachtouris
            hashmap=True,
291 cf687343 Stavros Sachtouris
            success=201,
292 cf687343 Stavros Sachtouris
            format='json')
293 cf687343 Stavros Sachtouris
        for k, v in expected2.items():
294 bcbf3cf0 Stavros Sachtouris
            if k == 'json':
295 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs2[k]['hashes']))
296 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs2[k]['bytes'])
297 bcbf3cf0 Stavros Sachtouris
            else:
298 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs2[k])
299 cf687343 Stavros Sachtouris
300 cf687343 Stavros Sachtouris
        OP = PC.object_put
301 cf687343 Stavros Sachtouris
        mock_offset = 2
302 cf687343 Stavros Sachtouris
303 cf687343 Stavros Sachtouris
        #  With progress bars
304 cf687343 Stavros Sachtouris
        try:
305 cf687343 Stavros Sachtouris
            from progress.bar import ShadyBar
306 cf687343 Stavros Sachtouris
            blck_bar = ShadyBar('Mock blck calc.')
307 cf687343 Stavros Sachtouris
            upld_bar = ShadyBar('Mock uplds')
308 cf687343 Stavros Sachtouris
        except ImportError:
309 cf687343 Stavros Sachtouris
            blck_bar = None
310 cf687343 Stavros Sachtouris
            upld_bar = None
311 cf687343 Stavros Sachtouris
312 cf687343 Stavros Sachtouris
        if blck_bar and upld_bar:
313 cf687343 Stavros Sachtouris
314 cf687343 Stavros Sachtouris
            def blck_gen(n):
315 cf687343 Stavros Sachtouris
                for i in blck_bar.iter(range(n)):
316 cf687343 Stavros Sachtouris
                    yield
317 cf687343 Stavros Sachtouris
                yield
318 cf687343 Stavros Sachtouris
319 cf687343 Stavros Sachtouris
            def upld_gen(n):
320 cf687343 Stavros Sachtouris
                for i in upld_bar.iter(range(n)):
321 cf687343 Stavros Sachtouris
                    yield
322 cf687343 Stavros Sachtouris
                yield
323 cf687343 Stavros Sachtouris
324 cf687343 Stavros Sachtouris
            tmpFile.seek(0)
325 cf687343 Stavros Sachtouris
            self.client.upload_object(
326 cf687343 Stavros Sachtouris
                obj, tmpFile,
327 cf687343 Stavros Sachtouris
                hash_cb=blck_gen, upload_cb=upld_gen)
328 cf687343 Stavros Sachtouris
329 cf687343 Stavros Sachtouris
            for i, c in enumerate(OP.mock_calls[-mock_offset:]):
330 cf687343 Stavros Sachtouris
                self.assertEqual(OP.mock_calls[i], c)
331 cf687343 Stavros Sachtouris
332 cf687343 Stavros Sachtouris
        #  With content-type
333 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
334 cf687343 Stavros Sachtouris
        ctype = 'video/mpeg'
335 cf687343 Stavros Sachtouris
        sharing = dict(read=['u1', 'g1', 'u2'], write=['u1'])
336 cf687343 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile,
337 cf687343 Stavros Sachtouris
            content_type=ctype, sharing=sharing)
338 cf687343 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['content_type'], ctype)
339 cf687343 Stavros Sachtouris
        self.assert_dicts_are_equal(
340 cf687343 Stavros Sachtouris
            OP.mock_calls[-2][2]['permissions'],
341 cf687343 Stavros Sachtouris
            sharing)
342 cf687343 Stavros Sachtouris
343 cf687343 Stavros Sachtouris
        # With other args
344 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
345 cf687343 Stavros Sachtouris
        kwargs = dict(
346 cf687343 Stavros Sachtouris
            etag='s0m3E74g',
347 cf687343 Stavros Sachtouris
            content_type=ctype,
348 cf687343 Stavros Sachtouris
            content_disposition=ctype + 'd15p051710n',
349 cf687343 Stavros Sachtouris
            public=True,
350 cf687343 Stavros Sachtouris
            content_encoding='802.11')
351 cf687343 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile, **kwargs)
352 cf687343 Stavros Sachtouris
        for arg, val in kwargs.items():
353 cf687343 Stavros Sachtouris
            self.assertEqual(OP.mock_calls[-2][2][arg], val)
354 b4780663 Stavros Sachtouris
355 b4780663 Stavros Sachtouris
    def test_create_object(self):
356 bd3a524f Stavros Sachtouris
        PC.set_header = Mock()
357 b4780663 Stavros Sachtouris
        obj = 'r4nd0m0bj3c7'
358 b4780663 Stavros Sachtouris
        cont = self.client.container
359 b4780663 Stavros Sachtouris
        ctype = 'c0n73n7/typ3'
360 b4780663 Stavros Sachtouris
        exp_shd = [
361 b4780663 Stavros Sachtouris
            call('Content-Type', 'application/octet-stream'),
362 b4780663 Stavros Sachtouris
            call('Content-length', '0'),
363 b4780663 Stavros Sachtouris
            call('Content-Type', ctype), call('Content-length', '42')]
364 b4780663 Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)] * 2
365 b4780663 Stavros Sachtouris
        with patch.object(PC, 'put', return_value=self.FR()) as put:
366 b4780663 Stavros Sachtouris
            self.client.create_object(obj)
367 b4780663 Stavros Sachtouris
            self.client.create_object(obj,
368 b4780663 Stavros Sachtouris
                content_type=ctype, content_length=42)
369 b4780663 Stavros Sachtouris
            self.assertEqual(PC.set_header.mock_calls, exp_shd)
370 b4780663 Stavros Sachtouris
            self.assertEqual(put.mock_calls, exp_put)
371 4227e4be Stavros Sachtouris
372 4227e4be Stavros Sachtouris
    def test_create_directory(self):
373 bd3a524f Stavros Sachtouris
        PC.set_header = Mock()
374 4227e4be Stavros Sachtouris
        obj = 'r4nd0m0bj3c7'
375 4227e4be Stavros Sachtouris
        cont = self.client.container
376 4227e4be Stavros Sachtouris
        exp_shd = [
377 4227e4be Stavros Sachtouris
            call('Content-Type', 'application/directory'),
378 4227e4be Stavros Sachtouris
            call('Content-length', '0')]
379 4227e4be Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)]
380 4227e4be Stavros Sachtouris
        with patch.object(PC, 'put', return_value=self.FR()) as put:
381 4227e4be Stavros Sachtouris
            self.client.create_directory(obj)
382 4227e4be Stavros Sachtouris
            self.assertEqual(PC.set_header.mock_calls, exp_shd)
383 4227e4be Stavros Sachtouris
            self.assertEqual(put.mock_calls, exp_put)
384 723e9d47 Stavros Sachtouris
385 723e9d47 Stavros Sachtouris
    def test_get_object_info(self):
386 723e9d47 Stavros Sachtouris
        self.FR.headers = object_info
387 723e9d47 Stavros Sachtouris
        obj = 'r4nd0m0bj3c7'
388 723e9d47 Stavros Sachtouris
        version = 'v3r510n'
389 723e9d47 Stavros Sachtouris
        with patch.object(PC, 'object_head', return_value=self.FR()) as head:
390 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj)
391 723e9d47 Stavros Sachtouris
            self.assertEqual(r, object_info)
392 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj, version=version)
393 723e9d47 Stavros Sachtouris
            self.assertEqual(head.mock_calls, [
394 723e9d47 Stavros Sachtouris
                call(obj, version=None),
395 723e9d47 Stavros Sachtouris
                call(obj, version=version)])
396 723e9d47 Stavros Sachtouris
        with patch.object(
397 723e9d47 Stavros Sachtouris
                PC,
398 723e9d47 Stavros Sachtouris
                'object_head',
399 723e9d47 Stavros Sachtouris
                side_effect=ClientError('Obj not found', 404)):
400 723e9d47 Stavros Sachtouris
            self.assertRaises(
401 723e9d47 Stavros Sachtouris
                ClientError,
402 723e9d47 Stavros Sachtouris
                self.client.get_object_info,
403 723e9d47 Stavros Sachtouris
                obj, version=version)
404 3e2e07be Stavros Sachtouris
405 3e2e07be Stavros Sachtouris
    def test_get_object_meta(self):
406 3e2e07be Stavros Sachtouris
        obj = 'r4nd0m0bj3c7'
407 3e2e07be Stavros Sachtouris
        expected = dict()
408 3e2e07be Stavros Sachtouris
        for k, v in object_info.items():
409 3e2e07be Stavros Sachtouris
            expected[k] = v
410 3e2e07be Stavros Sachtouris
        with patch.object(
411 3e2e07be Stavros Sachtouris
                PC,
412 3e2e07be Stavros Sachtouris
                'get_object_info',
413 3e2e07be Stavros Sachtouris
                return_value=object_info):
414 3e2e07be Stavros Sachtouris
            r = self.client.get_object_meta(obj)
415 3e2e07be Stavros Sachtouris
            self.assert_dicts_are_equal(r, expected)
416 da1597b9 Stavros Sachtouris
417 da1597b9 Stavros Sachtouris
    def test_del_object_meta(self):
418 da1597b9 Stavros Sachtouris
        obj = 'r4nd0m0bj3c7'
419 da1597b9 Stavros Sachtouris
        metakey = '50m3m3t4k3y'
420 da1597b9 Stavros Sachtouris
        with patch.object(PC, 'object_post', return_value=self.FR()) as post:
421 da1597b9 Stavros Sachtouris
            self.client.del_object_meta(obj, metakey)
422 da1597b9 Stavros Sachtouris
            self.assertEqual(
423 da1597b9 Stavros Sachtouris
                post.mock_calls,
424 da1597b9 Stavros Sachtouris
                [call(obj, update=True, metadata={metakey: ''})])
425 bd3a524f Stavros Sachtouris
426 bd3a524f Stavros Sachtouris
    def test_replace_object_meta(self):
427 bd3a524f Stavros Sachtouris
        PC.set_header = Mock()
428 bd3a524f Stavros Sachtouris
        metas = dict(k1='new1', k2='new2', k3='new3')
429 bd3a524f Stavros Sachtouris
        cont = self.client.container
430 bd3a524f Stavros Sachtouris
        with patch.object(PC, 'post', return_value=self.FR()) as post:
431 bd3a524f Stavros Sachtouris
            self.client.replace_object_meta(metas)
432 bd3a524f Stavros Sachtouris
            self.assertEqual(post.mock_calls, [
433 bd3a524f Stavros Sachtouris
                call('/%s/%s' % (user_id, cont),
434 bd3a524f Stavros Sachtouris
                success=202)])
435 bd3a524f Stavros Sachtouris
            prfx = 'X-Object-Meta-'
436 bd3a524f Stavros Sachtouris
            expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
437 bd3a524f Stavros Sachtouris
            self.assertEqual(PC.set_header.mock_calls, expected)
438 33487500 Stavros Sachtouris
439 33487500 Stavros Sachtouris
    def test_copy_object(self):
440 33487500 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
441 33487500 Stavros Sachtouris
        src_obj = 'src-0bj'
442 33487500 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
443 33487500 Stavros Sachtouris
        dst_obj = 'dst-0bj'
444 33487500 Stavros Sachtouris
        expected = call(
445 33487500 Stavros Sachtouris
            src_obj,
446 33487500 Stavros Sachtouris
            content_length=0,
447 33487500 Stavros Sachtouris
            source_account=None,
448 33487500 Stavros Sachtouris
            success=201,
449 33487500 Stavros Sachtouris
            copy_from='/%s/%s' % (src_cont, src_obj),
450 33487500 Stavros Sachtouris
            delimiter=None,
451 33487500 Stavros Sachtouris
            content_type=None,
452 33487500 Stavros Sachtouris
            source_version=None,
453 33487500 Stavros Sachtouris
            public=False)
454 33487500 Stavros Sachtouris
        with patch.object(PC, 'object_put', return_value=self.FR()) as put:
455 33487500 Stavros Sachtouris
            self.client.copy_object(src_cont, src_obj, dst_cont)
456 33487500 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], expected)
457 33487500 Stavros Sachtouris
            self.client.copy_object(src_cont, src_obj, dst_cont, dst_obj)
458 33487500 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
459 33487500 Stavros Sachtouris
            kwargs = dict(
460 33487500 Stavros Sachtouris
                source_version='src-v3r510n',
461 33487500 Stavros Sachtouris
                source_account='src-4cc0un7',
462 33487500 Stavros Sachtouris
                public=True,
463 33487500 Stavros Sachtouris
                content_type='c0n73n7Typ3',
464 33487500 Stavros Sachtouris
                delimiter='5')
465 33487500 Stavros Sachtouris
            self.client.copy_object(src_cont, src_obj, dst_cont, **kwargs)
466 33487500 Stavros Sachtouris
            for k, v in kwargs.items():
467 33487500 Stavros Sachtouris
                self.assertEqual(v, put.mock_calls[-1][2][k])
468 898e6fb7 Stavros Sachtouris
469 898e6fb7 Stavros Sachtouris
    def test_move_object(self):
470 898e6fb7 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
471 898e6fb7 Stavros Sachtouris
        src_obj = 'src-0bj'
472 898e6fb7 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
473 898e6fb7 Stavros Sachtouris
        dst_obj = 'dst-0bj'
474 898e6fb7 Stavros Sachtouris
        expected = call(
475 898e6fb7 Stavros Sachtouris
            src_obj,
476 898e6fb7 Stavros Sachtouris
            content_length=0,
477 898e6fb7 Stavros Sachtouris
            source_account=None,
478 898e6fb7 Stavros Sachtouris
            success=201,
479 898e6fb7 Stavros Sachtouris
            move_from='/%s/%s' % (src_cont, src_obj),
480 898e6fb7 Stavros Sachtouris
            delimiter=None,
481 898e6fb7 Stavros Sachtouris
            content_type=None,
482 898e6fb7 Stavros Sachtouris
            source_version=None,
483 898e6fb7 Stavros Sachtouris
            public=False)
484 898e6fb7 Stavros Sachtouris
        with patch.object(PC, 'object_put', return_value=self.FR()) as put:
485 898e6fb7 Stavros Sachtouris
            self.client.move_object(src_cont, src_obj, dst_cont)
486 898e6fb7 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], expected)
487 898e6fb7 Stavros Sachtouris
            self.client.move_object(src_cont, src_obj, dst_cont, dst_obj)
488 898e6fb7 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
489 898e6fb7 Stavros Sachtouris
            kwargs = dict(
490 898e6fb7 Stavros Sachtouris
                source_version='src-v3r510n',
491 898e6fb7 Stavros Sachtouris
                source_account='src-4cc0un7',
492 898e6fb7 Stavros Sachtouris
                public=True,
493 898e6fb7 Stavros Sachtouris
                content_type='c0n73n7Typ3',
494 898e6fb7 Stavros Sachtouris
                delimiter='5')
495 898e6fb7 Stavros Sachtouris
            self.client.move_object(src_cont, src_obj, dst_cont, **kwargs)
496 898e6fb7 Stavros Sachtouris
            for k, v in kwargs.items():
497 898e6fb7 Stavros Sachtouris
                self.assertEqual(v, put.mock_calls[-1][2][k])
498 39c737d4 Stavros Sachtouris
499 39c737d4 Stavros Sachtouris
    def test_delete_object(self):
500 39c737d4 Stavros Sachtouris
        obj = 's0m30bj3c7'
501 39c737d4 Stavros Sachtouris
        cont = self.client.container
502 39c737d4 Stavros Sachtouris
        with patch.object(PC, 'delete', return_value=self.FR()) as delete:
503 39c737d4 Stavros Sachtouris
            self.client.delete_object(obj)
504 39c737d4 Stavros Sachtouris
            self.assertEqual(delete.mock_calls, [
505 39c737d4 Stavros Sachtouris
                call('/%s/%s/%s' % (user_id, cont, obj), success=(204, 404))])
506 39c737d4 Stavros Sachtouris
            self.FR.status_code = 404
507 39c737d4 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.delete_object, obj)
508 39c737d4 Stavros Sachtouris
509 39c737d4 Stavros Sachtouris
    def test_list_objects(self):
510 39c737d4 Stavros Sachtouris
        self.FR.json = object_list
511 39c737d4 Stavros Sachtouris
        acc = self.client.account
512 39c737d4 Stavros Sachtouris
        cont = self.client.container
513 39c737d4 Stavros Sachtouris
        PC.set_param = Mock()
514 39c737d4 Stavros Sachtouris
        SP = PC.set_param
515 39c737d4 Stavros Sachtouris
        with patch.object(PC, 'get', return_value=self.FR()) as get:
516 39c737d4 Stavros Sachtouris
            r = self.client.list_objects()
517 39c737d4 Stavros Sachtouris
            for i in range(len(r)):
518 39c737d4 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], object_list[i])
519 39c737d4 Stavros Sachtouris
            self.assertEqual(get.mock_calls, [
520 39c737d4 Stavros Sachtouris
                call('/%s/%s' % (acc, cont), success=(200, 204, 304, 404))])
521 39c737d4 Stavros Sachtouris
            self.assertEqual(SP.mock_calls, [call('format', 'json')])
522 39c737d4 Stavros Sachtouris
            self.FR.status_code = 304
523 39c737d4 Stavros Sachtouris
            self.assertEqual(self.client.list_objects(), [])
524 39c737d4 Stavros Sachtouris
            self.FR.status_code = 404
525 39c737d4 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.list_objects)