Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / pithos.py @ 20387cd4

History | View | Annotate | Download (40.5 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 c6da1ccc Stavros Sachtouris
from mock import patch, call
36 2a7292f1 Stavros Sachtouris
from tempfile import NamedTemporaryFile
37 2a7292f1 Stavros Sachtouris
from os import urandom
38 c1004a00 Stavros Sachtouris
39 24851aa5 Stavros Sachtouris
from kamaki.clients import ClientError
40 8c599ca2 Stavros Sachtouris
from kamaki.clients.pithos import PithosClient as PC
41 24851aa5 Stavros Sachtouris
from kamaki.clients.connection.kamakicon import KamakiHTTPConnection as C
42 24851aa5 Stavros Sachtouris
43 f847a0cc Stavros Sachtouris
client_pkg = 'kamaki.clients.Client'
44 f847a0cc Stavros Sachtouris
pithos_pkg = 'kamaki.clients.pithos.PithosClient'
45 f847a0cc Stavros Sachtouris
46 24851aa5 Stavros Sachtouris
user_id = 'ac0un7-1d-5tr1ng'
47 cb65588d Stavros Sachtouris
obj = 'obj3c7N4m3'
48 24851aa5 Stavros Sachtouris
49 24851aa5 Stavros Sachtouris
account_info = {
50 24851aa5 Stavros Sachtouris
    'content-language': 'en-us',
51 24851aa5 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
52 24851aa5 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 13:25:51 GMT',
53 24851aa5 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
54 24851aa5 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
55 24851aa5 Stavros Sachtouris
    'vary': 'Accept-Language',
56 24851aa5 Stavros Sachtouris
    'x-account-bytes-used': '751615526',
57 24851aa5 Stavros Sachtouris
    'x-account-container-count': 7,
58 24851aa5 Stavros Sachtouris
    'x-account-policy-quota': 53687091200,
59 24851aa5 Stavros Sachtouris
    'x-account-policy-versioning': 'auto'}
60 d12e8569 Stavros Sachtouris
container_info = {
61 d12e8569 Stavros Sachtouris
    'content-language': 'en-us',
62 d12e8569 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
63 d12e8569 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 15:11:05 GMT',
64 d12e8569 Stavros Sachtouris
    'last-modified': 'Wed, 27 Feb 2013 15:56:13 GMT',
65 d12e8569 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
66 d12e8569 Stavros Sachtouris
    'vary': 'Accept-Language',
67 d12e8569 Stavros Sachtouris
    'x-container-block-hash': 'sha256',
68 d12e8569 Stavros Sachtouris
    'x-container-block-size': 4194304,
69 d12e8569 Stavros Sachtouris
    'x-container-bytes-used': 309528938,
70 d12e8569 Stavros Sachtouris
    'x-container-object-count': 14,
71 d12e8569 Stavros Sachtouris
    'x-container-object-meta': '',
72 d12e8569 Stavros Sachtouris
    'x-container-policy-quota': 53687091200,
73 d12e8569 Stavros Sachtouris
    'x-container-policy-versioning': 'auto'}
74 723e9d47 Stavros Sachtouris
object_info = {
75 723e9d47 Stavros Sachtouris
    'content-language': 'en-us',
76 723e9d47 Stavros Sachtouris
    'content-length': 254965,
77 723e9d47 Stavros Sachtouris
    'content-type': 'application/octet-stream',
78 723e9d47 Stavros Sachtouris
    'date': 'Thu, 07 Mar 2013 13:27:43 GMT',
79 723e9d47 Stavros Sachtouris
    'etag': '',
80 723e9d47 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
81 723e9d47 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
82 723e9d47 Stavros Sachtouris
    'vary': 'Accept-Language',
83 723e9d47 Stavros Sachtouris
    'x-object-hash': 'obj3c7h45h1s0bj3c7h45h411r34dY',
84 723e9d47 Stavros Sachtouris
    'x-object-uuid': 'd0c747ca-34bd-49e0-8e98-1d07d8b0cbc7',
85 723e9d47 Stavros Sachtouris
    'x-object-version': '525996',
86 3e2e07be Stavros Sachtouris
    'x-object-version-timestamp': 'Mon, 04 Mar 2013 18:22:31 GMT',
87 3e2e07be Stavros Sachtouris
    'x-object-meta-k1': 'v1',
88 3e2e07be Stavros Sachtouris
    'x-object-meta-k2': 'v2'}
89 efaa8675 Stavros Sachtouris
container_list = [
90 efaa8675 Stavros Sachtouris
    dict(
91 efaa8675 Stavros Sachtouris
        count=2,
92 efaa8675 Stavros Sachtouris
        last_modified="2013-02-27T11:56:09.893033+00:00",
93 efaa8675 Stavros Sachtouris
        bytes=677076979,
94 efaa8675 Stavros Sachtouris
        name="pithos",
95 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto")),
96 efaa8675 Stavros Sachtouris
    dict(
97 efaa8675 Stavros Sachtouris
        count=0,
98 efaa8675 Stavros Sachtouris
        last_modified="2012-10-23T12:25:17.229187+00:00",
99 efaa8675 Stavros Sachtouris
        bytes=0,
100 efaa8675 Stavros Sachtouris
        name="trash",
101 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto"))]
102 39c737d4 Stavros Sachtouris
object_list = [
103 39c737d4 Stavros Sachtouris
    dict(hash="",
104 39c737d4 Stavros Sachtouris
        name="The_Secret_Garden.zip",
105 39c737d4 Stavros Sachtouris
        x_object_public="/public/wdp9p",
106 39c737d4 Stavros Sachtouris
        bytes=203304947,
107 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="1360237915.7027509",
108 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj0n3",
109 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
110 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
111 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
112 39c737d4 Stavros Sachtouris
        x_object_version=17737,
113 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id),
114 39c737d4 Stavros Sachtouris
    dict(hash="",
115 39c737d4 Stavros Sachtouris
        name="The_Revealed_Garden.zip",
116 39c737d4 Stavros Sachtouris
        x_object_public="/public/wpd7p",
117 39c737d4 Stavros Sachtouris
        bytes=20330947,
118 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="13602915.7027509",
119 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj70w",
120 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
121 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
122 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
123 39c737d4 Stavros Sachtouris
        x_object_version=17737,
124 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id)]
125 b4e29772 Stavros Sachtouris
object_hashmap = dict(
126 b4e29772 Stavros Sachtouris
    block_hash="sha256", block_size=4194304, bytes=33554432,
127 b4e29772 Stavros Sachtouris
    hashes=[
128 b4e29772 Stavros Sachtouris
        "4988438cc1c0292c085d289649b28cf547ba3db71c6efaac9f2df7e193d4d0af",
129 b4e29772 Stavros Sachtouris
        "b214244aa56df7d1df7c6cac066e7cef268d9c2beb4dcf7ce68af667b0626f91",
130 b4e29772 Stavros Sachtouris
        "17f365f25e0682565ded30576066bb13377a3d306967e4d74e06bb6bbc20f75f",
131 b4e29772 Stavros Sachtouris
        "2524ae208932669fff89adf8a2fc0df3b67736ca0d3aadce7a2ce640f142af37",
132 b4e29772 Stavros Sachtouris
        "5d807a2129d2fcd3c221c3da418ed52af3fc48d0817b62e0bb437acffccd3514",
133 b4e29772 Stavros Sachtouris
        "609de22ce842d997f645fc49d5f14e0e3766dd51a6cbe66383b2bab82c8dfcd0",
134 b4e29772 Stavros Sachtouris
        "3102851ac168c78be70e35ff5178c7b1ebebd589e5106d565ca1094d1ca8ff59",
135 b4e29772 Stavros Sachtouris
        "bfe306dd24e92a8d85caf7055643f250fd319e8c4cdd4755ddabbf3ff97e83c7"])
136 24851aa5 Stavros Sachtouris
137 24851aa5 Stavros Sachtouris
138 c6da1ccc Stavros Sachtouris
class FR(object):
139 c6da1ccc Stavros Sachtouris
    """FR stands for Fake Response"""
140 c6da1ccc Stavros Sachtouris
    json = dict()
141 c6da1ccc Stavros Sachtouris
    headers = dict()
142 c6da1ccc Stavros Sachtouris
    content = json
143 c6da1ccc Stavros Sachtouris
    status = None
144 c6da1ccc Stavros Sachtouris
    status_code = 200
145 c6da1ccc Stavros Sachtouris
146 c6da1ccc Stavros Sachtouris
    def release(self):
147 c6da1ccc Stavros Sachtouris
        pass
148 24851aa5 Stavros Sachtouris
149 24851aa5 Stavros Sachtouris
150 c6da1ccc Stavros Sachtouris
class Pithos(TestCase):
151 c1004a00 Stavros Sachtouris
152 24851aa5 Stavros Sachtouris
    files = []
153 c1004a00 Stavros Sachtouris
154 cb65588d Stavros Sachtouris
    def _create_temp_file(self, num_of_blocks):
155 2a7292f1 Stavros Sachtouris
        self.files.append(NamedTemporaryFile())
156 2a7292f1 Stavros Sachtouris
        tmpFile = self.files[-1]
157 2a7292f1 Stavros Sachtouris
        file_size = num_of_blocks * 4 * 1024 * 1024
158 2a7292f1 Stavros Sachtouris
        print('\n\tCreate tmp file')
159 2a7292f1 Stavros Sachtouris
        tmpFile.write(urandom(file_size))
160 2a7292f1 Stavros Sachtouris
        tmpFile.flush()
161 2a7292f1 Stavros Sachtouris
        tmpFile.seek(0)
162 2a7292f1 Stavros Sachtouris
        print('\t\tDone')
163 2a7292f1 Stavros Sachtouris
        return tmpFile
164 2a7292f1 Stavros Sachtouris
165 24851aa5 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
166 24851aa5 Stavros Sachtouris
        for k, v in d1.items():
167 24851aa5 Stavros Sachtouris
            self.assertTrue(k in d2)
168 24851aa5 Stavros Sachtouris
            if isinstance(v, dict):
169 24851aa5 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
170 24851aa5 Stavros Sachtouris
            else:
171 24851aa5 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
172 c1004a00 Stavros Sachtouris
173 24851aa5 Stavros Sachtouris
    def setUp(self):
174 24851aa5 Stavros Sachtouris
        self.url = 'https://www.example.com/pithos'
175 24851aa5 Stavros Sachtouris
        self.token = 'p17h0570k3n'
176 8c599ca2 Stavros Sachtouris
        self.client = PC(self.url, self.token)
177 24851aa5 Stavros Sachtouris
        self.client.account = user_id
178 24851aa5 Stavros Sachtouris
        self.client.container = 'c0nt@1n3r_i'
179 c1004a00 Stavros Sachtouris
180 c1004a00 Stavros Sachtouris
    def tearDown(self):
181 c6da1ccc Stavros Sachtouris
        FR.headers = dict()
182 c6da1ccc Stavros Sachtouris
        FR.status_code = 200
183 c6da1ccc Stavros Sachtouris
        FR.json = dict()
184 c6da1ccc Stavros Sachtouris
        FR.content = FR.json
185 cf687343 Stavros Sachtouris
        for f in self.files:
186 cf687343 Stavros Sachtouris
            f.close()
187 24851aa5 Stavros Sachtouris
188 2a7292f1 Stavros Sachtouris
    #  Pithos+ methods that extend storage API
189 2a7292f1 Stavros Sachtouris
190 f847a0cc Stavros Sachtouris
    @patch('%s.set_param' % client_pkg)
191 c6da1ccc Stavros Sachtouris
    def test_get_account_info(self, SP):
192 c6da1ccc Stavros Sachtouris
        FR.headers = account_info
193 c6da1ccc Stavros Sachtouris
        FR.status_code = 204
194 c6da1ccc Stavros Sachtouris
        with patch.object(C, 'perform_request', return_value=FR()):
195 24851aa5 Stavros Sachtouris
            r = self.client.get_account_info()
196 24851aa5 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
197 24851aa5 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/%s' % user_id)
198 24851aa5 Stavros Sachtouris
            self.assert_dicts_are_equal(r, account_info)
199 24851aa5 Stavros Sachtouris
            untils = ['date 1', 'date 2', 'date 3']
200 24851aa5 Stavros Sachtouris
            for unt in untils:
201 24851aa5 Stavros Sachtouris
                r = self.client.get_account_info(until=unt)
202 24851aa5 Stavros Sachtouris
                self.assert_dicts_are_equal(r, account_info)
203 24851aa5 Stavros Sachtouris
            for i in range(len(untils)):
204 24851aa5 Stavros Sachtouris
                self.assertEqual(
205 c6da1ccc Stavros Sachtouris
                    PC.set_param.mock_calls[i + 1],
206 24851aa5 Stavros Sachtouris
                    call('until', untils[i], iff=untils[i]))
207 c6da1ccc Stavros Sachtouris
            FR.status_code = 401
208 756e9de9 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.get_account_info)
209 514f9b88 Stavros Sachtouris
210 f847a0cc Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
211 c6da1ccc Stavros Sachtouris
    def test_replace_account_meta(self, SH):
212 c6da1ccc Stavros Sachtouris
        FR.status_code = 202
213 514f9b88 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
214 c6da1ccc Stavros Sachtouris
        with patch.object(C, 'perform_request', return_value=FR()):
215 514f9b88 Stavros Sachtouris
            self.client.replace_account_meta(metas)
216 514f9b88 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
217 514f9b88 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/%s' % user_id)
218 514f9b88 Stavros Sachtouris
            prfx = 'X-Account-Meta-'
219 514f9b88 Stavros Sachtouris
            expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
220 8c599ca2 Stavros Sachtouris
            self.assertEqual(PC.set_header.mock_calls, expected)
221 8c599ca2 Stavros Sachtouris
222 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
223 20387cd4 Stavros Sachtouris
    def test_del_account_meta(self, ap):
224 8c599ca2 Stavros Sachtouris
        keys = ['k1', 'k2', 'k3']
225 20387cd4 Stavros Sachtouris
        expected = []
226 20387cd4 Stavros Sachtouris
        for key in keys:
227 20387cd4 Stavros Sachtouris
            self.client.del_account_meta(key)
228 20387cd4 Stavros Sachtouris
            expected.append(call(update=True, metadata={key: ''}))
229 20387cd4 Stavros Sachtouris
        self.assertEqual(ap.mock_calls, expected)
230 20387cd4 Stavros Sachtouris
231 20387cd4 Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
232 20387cd4 Stavros Sachtouris
    def test_create_container(self, put):
233 c6da1ccc Stavros Sachtouris
        FR.status_code = 201
234 20387cd4 Stavros Sachtouris
        cont = 's0m3c0n731n3r'
235 20387cd4 Stavros Sachtouris
        self.client.create_container(cont)
236 20387cd4 Stavros Sachtouris
        expected = [call('/%s/%s' % (user_id, cont), success=(201, 202))]
237 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls, expected)
238 20387cd4 Stavros Sachtouris
        FR.status_code = 202
239 20387cd4 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.create_container, cont)
240 20387cd4 Stavros Sachtouris
241 20387cd4 Stavros Sachtouris
    @patch('%s.container_head' % pithos_pkg, return_value=FR())
242 20387cd4 Stavros Sachtouris
    def test_get_container_info(self, ch):
243 c6da1ccc Stavros Sachtouris
        FR.headers = container_info
244 20387cd4 Stavros Sachtouris
        r = self.client.get_container_info()
245 20387cd4 Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
246 20387cd4 Stavros Sachtouris
        u = 'some date'
247 20387cd4 Stavros Sachtouris
        r = self.client.get_container_info(until=u)
248 20387cd4 Stavros Sachtouris
        self.assertEqual(ch.mock_calls, [call(until=None), call(until=u)])
249 20387cd4 Stavros Sachtouris
250 20387cd4 Stavros Sachtouris
    @patch('%s.delete' % pithos_pkg, return_value=FR())
251 20387cd4 Stavros Sachtouris
    def test_delete_container(self, delete):
252 c6da1ccc Stavros Sachtouris
        FR.status_code = 204
253 20387cd4 Stavros Sachtouris
        cont = 's0m3c0n731n3r'
254 20387cd4 Stavros Sachtouris
        self.client.delete_container(cont)
255 20387cd4 Stavros Sachtouris
        for err_code in (404, 409):
256 20387cd4 Stavros Sachtouris
            FR.status_code = err_code
257 5549c0ab Stavros Sachtouris
            self.assertRaises(ClientError, self.client.delete_container, cont)
258 20387cd4 Stavros Sachtouris
        acall = call('/%s/%s' % (user_id, cont), success=(204, 404, 409))
259 20387cd4 Stavros Sachtouris
        self.assertEqual(delete.mock_calls, [acall] * 3)
260 efaa8675 Stavros Sachtouris
261 20387cd4 Stavros Sachtouris
    @patch('%s.account_get' % pithos_pkg, return_value=FR())
262 20387cd4 Stavros Sachtouris
    def test_list_containers(self, get):
263 c6da1ccc Stavros Sachtouris
        FR.json = container_list
264 20387cd4 Stavros Sachtouris
        r = self.client.list_containers()
265 20387cd4 Stavros Sachtouris
        for i in range(len(r)):
266 20387cd4 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], container_list[i])
267 bcbf3cf0 Stavros Sachtouris
268 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
269 f847a0cc Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
270 f847a0cc Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
271 c6da1ccc Stavros Sachtouris
    def test_upload_object(self, CI, CP, OP):
272 cb65588d Stavros Sachtouris
        num_of_blocks = 8
273 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
274 cf687343 Stavros Sachtouris
275 2a7292f1 Stavros Sachtouris
        # Without kwargs
276 bcbf3cf0 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile)
277 bcbf3cf0 Stavros Sachtouris
        self.assertEqual(PC.get_container_info.mock_calls, [call()])
278 bcbf3cf0 Stavros Sachtouris
        [call1, call2] = PC.object_put.mock_calls
279 bcbf3cf0 Stavros Sachtouris
280 cf687343 Stavros Sachtouris
        (args1, kwargs1) = call1[1:3]
281 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
282 cf687343 Stavros Sachtouris
        self.assertEqual(args1, (obj,))
283 cf687343 Stavros Sachtouris
        expected1 = dict(
284 bcbf3cf0 Stavros Sachtouris
            hashmap=True,
285 bcbf3cf0 Stavros Sachtouris
            success=(201, 409),
286 bcbf3cf0 Stavros Sachtouris
            format='json',
287 bcbf3cf0 Stavros Sachtouris
            json=dict(
288 bcbf3cf0 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
289 cb65588d Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
290 bcbf3cf0 Stavros Sachtouris
            etag=None,
291 bcbf3cf0 Stavros Sachtouris
            content_encoding=None,
292 bcbf3cf0 Stavros Sachtouris
            content_type='application/octet-stream',
293 bcbf3cf0 Stavros Sachtouris
            content_disposition=None,
294 bcbf3cf0 Stavros Sachtouris
            public=None,
295 bcbf3cf0 Stavros Sachtouris
            permissions=None)
296 cf687343 Stavros Sachtouris
        for k, v in expected1.items():
297 cf687343 Stavros Sachtouris
            if k == 'json':
298 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs1[k]['hashes']))
299 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs1[k]['bytes'])
300 cf687343 Stavros Sachtouris
            else:
301 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs1[k])
302 cf687343 Stavros Sachtouris
303 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
304 cf687343 Stavros Sachtouris
        self.assertEqual(args2, (obj,))
305 cf687343 Stavros Sachtouris
        expected2 = dict(
306 cf687343 Stavros Sachtouris
            json=dict(
307 cf687343 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
308 cb65588d Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
309 cf687343 Stavros Sachtouris
            content_type='application/octet-stream',
310 cf687343 Stavros Sachtouris
            hashmap=True,
311 cf687343 Stavros Sachtouris
            success=201,
312 cf687343 Stavros Sachtouris
            format='json')
313 cf687343 Stavros Sachtouris
        for k, v in expected2.items():
314 bcbf3cf0 Stavros Sachtouris
            if k == 'json':
315 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs2[k]['hashes']))
316 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs2[k]['bytes'])
317 bcbf3cf0 Stavros Sachtouris
            else:
318 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs2[k])
319 cf687343 Stavros Sachtouris
320 cf687343 Stavros Sachtouris
        OP = PC.object_put
321 cf687343 Stavros Sachtouris
        mock_offset = 2
322 cf687343 Stavros Sachtouris
323 cf687343 Stavros Sachtouris
        #  With progress bars
324 cf687343 Stavros Sachtouris
        try:
325 cf687343 Stavros Sachtouris
            from progress.bar import ShadyBar
326 cf687343 Stavros Sachtouris
            blck_bar = ShadyBar('Mock blck calc.')
327 cf687343 Stavros Sachtouris
            upld_bar = ShadyBar('Mock uplds')
328 cf687343 Stavros Sachtouris
        except ImportError:
329 cf687343 Stavros Sachtouris
            blck_bar = None
330 cf687343 Stavros Sachtouris
            upld_bar = None
331 cf687343 Stavros Sachtouris
332 cf687343 Stavros Sachtouris
        if blck_bar and upld_bar:
333 cf687343 Stavros Sachtouris
334 cf687343 Stavros Sachtouris
            def blck_gen(n):
335 cf687343 Stavros Sachtouris
                for i in blck_bar.iter(range(n)):
336 cf687343 Stavros Sachtouris
                    yield
337 cf687343 Stavros Sachtouris
                yield
338 cf687343 Stavros Sachtouris
339 cf687343 Stavros Sachtouris
            def upld_gen(n):
340 cf687343 Stavros Sachtouris
                for i in upld_bar.iter(range(n)):
341 cf687343 Stavros Sachtouris
                    yield
342 cf687343 Stavros Sachtouris
                yield
343 cf687343 Stavros Sachtouris
344 cf687343 Stavros Sachtouris
            tmpFile.seek(0)
345 cf687343 Stavros Sachtouris
            self.client.upload_object(
346 cf687343 Stavros Sachtouris
                obj, tmpFile,
347 cf687343 Stavros Sachtouris
                hash_cb=blck_gen, upload_cb=upld_gen)
348 cf687343 Stavros Sachtouris
349 cf687343 Stavros Sachtouris
            for i, c in enumerate(OP.mock_calls[-mock_offset:]):
350 cf687343 Stavros Sachtouris
                self.assertEqual(OP.mock_calls[i], c)
351 cf687343 Stavros Sachtouris
352 cf687343 Stavros Sachtouris
        #  With content-type
353 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
354 cf687343 Stavros Sachtouris
        ctype = 'video/mpeg'
355 cf687343 Stavros Sachtouris
        sharing = dict(read=['u1', 'g1', 'u2'], write=['u1'])
356 cf687343 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile,
357 cf687343 Stavros Sachtouris
            content_type=ctype, sharing=sharing)
358 cf687343 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['content_type'], ctype)
359 cf687343 Stavros Sachtouris
        self.assert_dicts_are_equal(
360 cf687343 Stavros Sachtouris
            OP.mock_calls[-2][2]['permissions'],
361 cf687343 Stavros Sachtouris
            sharing)
362 cf687343 Stavros Sachtouris
363 cf687343 Stavros Sachtouris
        # With other args
364 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
365 cf687343 Stavros Sachtouris
        kwargs = dict(
366 cf687343 Stavros Sachtouris
            etag='s0m3E74g',
367 cf687343 Stavros Sachtouris
            content_type=ctype,
368 cf687343 Stavros Sachtouris
            content_disposition=ctype + 'd15p051710n',
369 cf687343 Stavros Sachtouris
            public=True,
370 cf687343 Stavros Sachtouris
            content_encoding='802.11')
371 cf687343 Stavros Sachtouris
        self.client.upload_object(obj, tmpFile, **kwargs)
372 cf687343 Stavros Sachtouris
        for arg, val in kwargs.items():
373 cf687343 Stavros Sachtouris
            self.assertEqual(OP.mock_calls[-2][2][arg], val)
374 b4780663 Stavros Sachtouris
375 20387cd4 Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
376 f847a0cc Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
377 20387cd4 Stavros Sachtouris
    def test_create_object(self, SH, put):
378 b4780663 Stavros Sachtouris
        cont = self.client.container
379 b4780663 Stavros Sachtouris
        ctype = 'c0n73n7/typ3'
380 b4780663 Stavros Sachtouris
        exp_shd = [
381 b4780663 Stavros Sachtouris
            call('Content-Type', 'application/octet-stream'),
382 b4780663 Stavros Sachtouris
            call('Content-length', '0'),
383 b4780663 Stavros Sachtouris
            call('Content-Type', ctype), call('Content-length', '42')]
384 b4780663 Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)] * 2
385 20387cd4 Stavros Sachtouris
        self.client.create_object(obj)
386 20387cd4 Stavros Sachtouris
        self.client.create_object(obj, content_type=ctype, content_length=42)
387 20387cd4 Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, exp_shd)
388 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls, exp_put)
389 4227e4be Stavros Sachtouris
390 20387cd4 Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
391 f847a0cc Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
392 20387cd4 Stavros Sachtouris
    def test_create_directory(self, SH, put):
393 4227e4be Stavros Sachtouris
        cont = self.client.container
394 4227e4be Stavros Sachtouris
        exp_shd = [
395 4227e4be Stavros Sachtouris
            call('Content-Type', 'application/directory'),
396 4227e4be Stavros Sachtouris
            call('Content-length', '0')]
397 4227e4be Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)]
398 20387cd4 Stavros Sachtouris
        self.client.create_directory(obj)
399 20387cd4 Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, exp_shd)
400 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls, exp_put)
401 723e9d47 Stavros Sachtouris
402 723e9d47 Stavros Sachtouris
    def test_get_object_info(self):
403 c6da1ccc Stavros Sachtouris
        FR.headers = object_info
404 723e9d47 Stavros Sachtouris
        version = 'v3r510n'
405 c6da1ccc Stavros Sachtouris
        with patch.object(PC, 'object_head', return_value=FR()) as head:
406 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj)
407 723e9d47 Stavros Sachtouris
            self.assertEqual(r, object_info)
408 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj, version=version)
409 723e9d47 Stavros Sachtouris
            self.assertEqual(head.mock_calls, [
410 723e9d47 Stavros Sachtouris
                call(obj, version=None),
411 723e9d47 Stavros Sachtouris
                call(obj, version=version)])
412 723e9d47 Stavros Sachtouris
        with patch.object(
413 723e9d47 Stavros Sachtouris
                PC,
414 723e9d47 Stavros Sachtouris
                'object_head',
415 723e9d47 Stavros Sachtouris
                side_effect=ClientError('Obj not found', 404)):
416 723e9d47 Stavros Sachtouris
            self.assertRaises(
417 723e9d47 Stavros Sachtouris
                ClientError,
418 723e9d47 Stavros Sachtouris
                self.client.get_object_info,
419 723e9d47 Stavros Sachtouris
                obj, version=version)
420 3e2e07be Stavros Sachtouris
421 20387cd4 Stavros Sachtouris
    @patch('%s.get_object_info' % pithos_pkg, return_value=object_info)
422 20387cd4 Stavros Sachtouris
    def test_get_object_meta(self, GOI):
423 3e2e07be Stavros Sachtouris
        expected = dict()
424 3e2e07be Stavros Sachtouris
        for k, v in object_info.items():
425 3e2e07be Stavros Sachtouris
            expected[k] = v
426 20387cd4 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
427 20387cd4 Stavros Sachtouris
        self.assert_dicts_are_equal(r, expected)
428 da1597b9 Stavros Sachtouris
429 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
430 20387cd4 Stavros Sachtouris
    def test_del_object_meta(self, post):
431 da1597b9 Stavros Sachtouris
        metakey = '50m3m3t4k3y'
432 20387cd4 Stavros Sachtouris
        self.client.del_object_meta(obj, metakey)
433 20387cd4 Stavros Sachtouris
        expected = call(obj, update=True, metadata={metakey: ''})
434 20387cd4 Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], expected)
435 bd3a524f Stavros Sachtouris
436 20387cd4 Stavros Sachtouris
    @patch('%s.post' % client_pkg, return_value=FR())
437 f847a0cc Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
438 20387cd4 Stavros Sachtouris
    def test_replace_object_meta(self, SH, post):
439 bd3a524f Stavros Sachtouris
        metas = dict(k1='new1', k2='new2', k3='new3')
440 bd3a524f Stavros Sachtouris
        cont = self.client.container
441 20387cd4 Stavros Sachtouris
        self.client.replace_object_meta(metas)
442 20387cd4 Stavros Sachtouris
        expected = call('/%s/%s' % (user_id, cont), success=202)
443 20387cd4 Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], expected)
444 20387cd4 Stavros Sachtouris
        prfx = 'X-Object-Meta-'
445 20387cd4 Stavros Sachtouris
        expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
446 20387cd4 Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, expected)
447 33487500 Stavros Sachtouris
448 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
449 20387cd4 Stavros Sachtouris
    def test_copy_object(self, put):
450 33487500 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
451 33487500 Stavros Sachtouris
        src_obj = 'src-0bj'
452 33487500 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
453 33487500 Stavros Sachtouris
        dst_obj = 'dst-0bj'
454 33487500 Stavros Sachtouris
        expected = call(
455 33487500 Stavros Sachtouris
            src_obj,
456 33487500 Stavros Sachtouris
            content_length=0,
457 33487500 Stavros Sachtouris
            source_account=None,
458 33487500 Stavros Sachtouris
            success=201,
459 33487500 Stavros Sachtouris
            copy_from='/%s/%s' % (src_cont, src_obj),
460 33487500 Stavros Sachtouris
            delimiter=None,
461 33487500 Stavros Sachtouris
            content_type=None,
462 33487500 Stavros Sachtouris
            source_version=None,
463 33487500 Stavros Sachtouris
            public=False)
464 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont)
465 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
466 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, dst_obj)
467 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
468 20387cd4 Stavros Sachtouris
        kwargs = dict(
469 20387cd4 Stavros Sachtouris
            source_version='src-v3r510n',
470 20387cd4 Stavros Sachtouris
            source_account='src-4cc0un7',
471 20387cd4 Stavros Sachtouris
            public=True,
472 20387cd4 Stavros Sachtouris
            content_type='c0n73n7Typ3',
473 20387cd4 Stavros Sachtouris
            delimiter='5')
474 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, **kwargs)
475 20387cd4 Stavros Sachtouris
        for k, v in kwargs.items():
476 20387cd4 Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
477 898e6fb7 Stavros Sachtouris
478 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
479 20387cd4 Stavros Sachtouris
    def test_move_object(self, put):
480 898e6fb7 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
481 898e6fb7 Stavros Sachtouris
        src_obj = 'src-0bj'
482 898e6fb7 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
483 898e6fb7 Stavros Sachtouris
        dst_obj = 'dst-0bj'
484 898e6fb7 Stavros Sachtouris
        expected = call(
485 898e6fb7 Stavros Sachtouris
            src_obj,
486 898e6fb7 Stavros Sachtouris
            content_length=0,
487 898e6fb7 Stavros Sachtouris
            source_account=None,
488 898e6fb7 Stavros Sachtouris
            success=201,
489 898e6fb7 Stavros Sachtouris
            move_from='/%s/%s' % (src_cont, src_obj),
490 898e6fb7 Stavros Sachtouris
            delimiter=None,
491 898e6fb7 Stavros Sachtouris
            content_type=None,
492 898e6fb7 Stavros Sachtouris
            source_version=None,
493 898e6fb7 Stavros Sachtouris
            public=False)
494 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont)
495 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
496 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, dst_obj)
497 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
498 20387cd4 Stavros Sachtouris
        kwargs = dict(
499 20387cd4 Stavros Sachtouris
            source_version='src-v3r510n',
500 20387cd4 Stavros Sachtouris
            source_account='src-4cc0un7',
501 20387cd4 Stavros Sachtouris
            public=True,
502 20387cd4 Stavros Sachtouris
            content_type='c0n73n7Typ3',
503 20387cd4 Stavros Sachtouris
            delimiter='5')
504 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, **kwargs)
505 20387cd4 Stavros Sachtouris
        for k, v in kwargs.items():
506 20387cd4 Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
507 39c737d4 Stavros Sachtouris
508 20387cd4 Stavros Sachtouris
    @patch('%s.delete' % client_pkg, return_value=FR())
509 20387cd4 Stavros Sachtouris
    def test_delete_object(self, delete):
510 39c737d4 Stavros Sachtouris
        cont = self.client.container
511 20387cd4 Stavros Sachtouris
        self.client.delete_object(obj)
512 20387cd4 Stavros Sachtouris
        self.assertEqual(
513 20387cd4 Stavros Sachtouris
            delete.mock_calls[-1],
514 20387cd4 Stavros Sachtouris
            call('/%s/%s/%s' % (user_id, cont, obj), success=(204, 404)))
515 20387cd4 Stavros Sachtouris
        FR.status_code = 404
516 20387cd4 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.delete_object, obj)
517 39c737d4 Stavros Sachtouris
518 20387cd4 Stavros Sachtouris
    @patch('%s.get' % client_pkg, return_value=FR())
519 f847a0cc Stavros Sachtouris
    @patch('%s.set_param' % client_pkg)
520 20387cd4 Stavros Sachtouris
    def test_list_objects(self, SP, get):
521 c6da1ccc Stavros Sachtouris
        FR.json = object_list
522 39c737d4 Stavros Sachtouris
        acc = self.client.account
523 39c737d4 Stavros Sachtouris
        cont = self.client.container
524 39c737d4 Stavros Sachtouris
        SP = PC.set_param
525 20387cd4 Stavros Sachtouris
        r = self.client.list_objects()
526 20387cd4 Stavros Sachtouris
        for i in range(len(r)):
527 20387cd4 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], object_list[i])
528 20387cd4 Stavros Sachtouris
        self.assertEqual(get.mock_calls, [
529 20387cd4 Stavros Sachtouris
            call('/%s/%s' % (acc, cont), success=(200, 204, 304, 404))])
530 20387cd4 Stavros Sachtouris
        self.assertEqual(SP.mock_calls, [call('format', 'json')])
531 20387cd4 Stavros Sachtouris
        FR.status_code = 304
532 20387cd4 Stavros Sachtouris
        self.assertEqual(self.client.list_objects(), [])
533 20387cd4 Stavros Sachtouris
        FR.status_code = 404
534 20387cd4 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.list_objects)
535 20387cd4 Stavros Sachtouris
536 20387cd4 Stavros Sachtouris
    @patch('%s.get' % client_pkg, return_value=FR())
537 f847a0cc Stavros Sachtouris
    @patch('%s.set_param' % client_pkg)
538 20387cd4 Stavros Sachtouris
    def test_list_objects_in_path(self, SP, get):
539 c6da1ccc Stavros Sachtouris
        FR.json = object_list
540 5ffdab56 Stavros Sachtouris
        path = '/some/awsome/path'
541 5ffdab56 Stavros Sachtouris
        acc = self.client.account
542 5ffdab56 Stavros Sachtouris
        cont = self.client.container
543 5ffdab56 Stavros Sachtouris
        SP = PC.set_param
544 20387cd4 Stavros Sachtouris
        self.client.list_objects_in_path(path)
545 20387cd4 Stavros Sachtouris
        self.assertEqual(get.mock_calls, [
546 20387cd4 Stavros Sachtouris
            call('/%s/%s' % (acc, cont), success=(200, 204, 404))])
547 20387cd4 Stavros Sachtouris
        self.assertEqual(SP.mock_calls, [
548 20387cd4 Stavros Sachtouris
            call('format', 'json'), call('path', path)])
549 20387cd4 Stavros Sachtouris
        FR.status_code = 404
550 20387cd4 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.list_objects)
551 2a7292f1 Stavros Sachtouris
552 2a7292f1 Stavros Sachtouris
    #  Pithos+ only methods
553 2a7292f1 Stavros Sachtouris
554 20387cd4 Stavros Sachtouris
    @patch('%s.container_delete' % pithos_pkg, return_value=FR())
555 20387cd4 Stavros Sachtouris
    def test_purge_container(self, cd):
556 20387cd4 Stavros Sachtouris
        self.client.purge_container()
557 20387cd4 Stavros Sachtouris
        self.assertTrue('until' in cd.mock_calls[-1][2])
558 20387cd4 Stavros Sachtouris
        cont = self.client.container
559 20387cd4 Stavros Sachtouris
        self.client.purge_container('another-container')
560 20387cd4 Stavros Sachtouris
        self.assertEqual(self.client.container, cont)
561 2a7292f1 Stavros Sachtouris
562 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
563 20387cd4 Stavros Sachtouris
    def test_upload_object_unchunked(self, put):
564 cb65588d Stavros Sachtouris
        num_of_blocks = 8
565 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
566 2a7292f1 Stavros Sachtouris
        expected = dict(
567 2a7292f1 Stavros Sachtouris
                success=201,
568 cb65588d Stavros Sachtouris
                data=num_of_blocks * 4 * 1024 * 1024,
569 2a7292f1 Stavros Sachtouris
                etag='some-etag',
570 2a7292f1 Stavros Sachtouris
                content_encoding='some content_encoding',
571 2a7292f1 Stavros Sachtouris
                content_type='some content-type',
572 2a7292f1 Stavros Sachtouris
                content_disposition='some content_disposition',
573 2a7292f1 Stavros Sachtouris
                public=True,
574 2a7292f1 Stavros Sachtouris
                permissions=dict(read=['u1', 'g1', 'u2'], write=['u1']))
575 20387cd4 Stavros Sachtouris
        self.client.upload_object_unchunked(obj, tmpFile)
576 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (obj,))
577 20387cd4 Stavros Sachtouris
        self.assertEqual(
578 20387cd4 Stavros Sachtouris
            sorted(put.mock_calls[-1][2].keys()),
579 20387cd4 Stavros Sachtouris
            sorted(expected.keys()))
580 20387cd4 Stavros Sachtouris
        kwargs = dict(expected)
581 20387cd4 Stavros Sachtouris
        kwargs.pop('success')
582 20387cd4 Stavros Sachtouris
        kwargs['size'] = kwargs.pop('data')
583 20387cd4 Stavros Sachtouris
        kwargs['sharing'] = kwargs.pop('permissions')
584 20387cd4 Stavros Sachtouris
        tmpFile.seek(0)
585 20387cd4 Stavros Sachtouris
        self.client.upload_object_unchunked(obj, tmpFile, **kwargs)
586 20387cd4 Stavros Sachtouris
        pmc = put.mock_calls[-1][2]
587 20387cd4 Stavros Sachtouris
        for k, v in expected.items():
588 20387cd4 Stavros Sachtouris
            if k == 'data':
589 20387cd4 Stavros Sachtouris
                self.assertEqual(len(pmc[k]), v)
590 20387cd4 Stavros Sachtouris
            else:
591 20387cd4 Stavros Sachtouris
                self.assertEqual(pmc[k], v)
592 20387cd4 Stavros Sachtouris
        self.assertRaises(
593 20387cd4 Stavros Sachtouris
            ClientError,
594 20387cd4 Stavros Sachtouris
            self.client.upload_object_unchunked,
595 20387cd4 Stavros Sachtouris
            obj, tmpFile, withHashFile=True)
596 e82edbb0 Stavros Sachtouris
597 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
598 20387cd4 Stavros Sachtouris
    def test_create_object_by_manifestation(self, put):
599 e82edbb0 Stavros Sachtouris
        manifest = '%s/%s' % (self.client.container, obj)
600 e82edbb0 Stavros Sachtouris
        kwargs = dict(
601 e82edbb0 Stavros Sachtouris
                etag='some-etag',
602 e82edbb0 Stavros Sachtouris
                content_encoding='some content_encoding',
603 e82edbb0 Stavros Sachtouris
                content_type='some content-type',
604 e82edbb0 Stavros Sachtouris
                content_disposition='some content_disposition',
605 e82edbb0 Stavros Sachtouris
                public=True,
606 e82edbb0 Stavros Sachtouris
                sharing=dict(read=['u1', 'g1', 'u2'], write=['u1']))
607 20387cd4 Stavros Sachtouris
        self.client.create_object_by_manifestation(obj)
608 20387cd4 Stavros Sachtouris
        expected = dict(content_length=0, manifest=manifest)
609 20387cd4 Stavros Sachtouris
        for k in kwargs:
610 20387cd4 Stavros Sachtouris
            expected['permissions' if k == 'sharing' else k] = None
611 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], call(obj, **expected))
612 20387cd4 Stavros Sachtouris
        self.client.create_object_by_manifestation(obj, **kwargs)
613 20387cd4 Stavros Sachtouris
        expected.update(kwargs)
614 20387cd4 Stavros Sachtouris
        expected['permissions'] = expected.pop('sharing')
615 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], call(obj, **expected))
616 b4e29772 Stavros Sachtouris
617 f847a0cc Stavros Sachtouris
    @patch('%s.get_object_hashmap' % pithos_pkg, return_value=object_hashmap)
618 f847a0cc Stavros Sachtouris
    @patch('%s.object_get' % pithos_pkg, return_value=FR())
619 c6da1ccc Stavros Sachtouris
    def test_download_object(self, GOH, GET):
620 cb65588d Stavros Sachtouris
        num_of_blocks = 8
621 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
622 c6da1ccc Stavros Sachtouris
        FR.content = tmpFile.read(4 * 1024 * 1024)
623 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
624 b4e29772 Stavros Sachtouris
        GET = PC.object_get
625 b4e29772 Stavros Sachtouris
        num_of_blocks = len(object_hashmap['hashes'])
626 b4e29772 Stavros Sachtouris
        kwargs = dict(
627 b4e29772 Stavros Sachtouris
            resume=True,
628 cb65588d Stavros Sachtouris
            version='version',
629 b4e29772 Stavros Sachtouris
            range_str='10-20',
630 b4e29772 Stavros Sachtouris
            if_match='if and only if',
631 b4e29772 Stavros Sachtouris
            if_none_match='if and only not',
632 b4e29772 Stavros Sachtouris
            if_modified_since='what if not?',
633 b4e29772 Stavros Sachtouris
            if_unmodified_since='this happens if not!',
634 b4e29772 Stavros Sachtouris
            async_headers=dict(Range='bytes=0-88888888'))
635 b4e29772 Stavros Sachtouris
636 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile)
637 b4e29772 Stavros Sachtouris
        self.assertEqual(len(GET.mock_calls), num_of_blocks)
638 b4e29772 Stavros Sachtouris
        self.assertEqual(GET.mock_calls[-1][1], (obj,))
639 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
640 b4e29772 Stavros Sachtouris
            if k == 'async_headers':
641 b4e29772 Stavros Sachtouris
                self.assertTrue('Range' in GET.mock_calls[-1][2][k])
642 b4e29772 Stavros Sachtouris
            elif k in ('resume', 'range_str'):
643 b4e29772 Stavros Sachtouris
                continue
644 b4e29772 Stavros Sachtouris
            else:
645 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], None)
646 b4e29772 Stavros Sachtouris
647 b4e29772 Stavros Sachtouris
        #  Check ranges are consecutive
648 b4e29772 Stavros Sachtouris
        starts = []
649 b4e29772 Stavros Sachtouris
        ends = []
650 b4e29772 Stavros Sachtouris
        for c in GET.mock_calls:
651 b4e29772 Stavros Sachtouris
            rng_str = c[2]['async_headers']['Range']
652 b4e29772 Stavros Sachtouris
            (start, rng_str) = rng_str.split('=')
653 b4e29772 Stavros Sachtouris
            (start, end) = rng_str.split('-')
654 b4e29772 Stavros Sachtouris
            starts.append(start)
655 b4e29772 Stavros Sachtouris
            ends.append(end)
656 b4e29772 Stavros Sachtouris
        ends = sorted(ends)
657 b4e29772 Stavros Sachtouris
        for i, start in enumerate(sorted(starts)):
658 b4e29772 Stavros Sachtouris
            if i:
659 b4e29772 Stavros Sachtouris
                int(ends[i - 1]) == int(start) - 1
660 b4e29772 Stavros Sachtouris
661 b4e29772 Stavros Sachtouris
        #  With progress bars
662 b4e29772 Stavros Sachtouris
        try:
663 b4e29772 Stavros Sachtouris
            from progress.bar import ShadyBar
664 b4e29772 Stavros Sachtouris
            dl_bar = ShadyBar('Mock dl')
665 b4e29772 Stavros Sachtouris
        except ImportError:
666 b4e29772 Stavros Sachtouris
            dl_bar = None
667 b4e29772 Stavros Sachtouris
668 b4e29772 Stavros Sachtouris
        if dl_bar:
669 b4e29772 Stavros Sachtouris
670 b4e29772 Stavros Sachtouris
            def blck_gen(n):
671 b4e29772 Stavros Sachtouris
                for i in dl_bar.iter(range(n)):
672 b4e29772 Stavros Sachtouris
                    yield
673 b4e29772 Stavros Sachtouris
                yield
674 b4e29772 Stavros Sachtouris
675 b4e29772 Stavros Sachtouris
            tmpFile.seek(0)
676 b4e29772 Stavros Sachtouris
            self.client.download_object(obj, tmpFile, download_cb=blck_gen)
677 b4e29772 Stavros Sachtouris
            self.assertEqual(len(GET.mock_calls), 2 * num_of_blocks)
678 b4e29772 Stavros Sachtouris
679 b4e29772 Stavros Sachtouris
        tmpFile.seek(0)
680 b4e29772 Stavros Sachtouris
        kwargs.pop('async_headers')
681 b4e29772 Stavros Sachtouris
        kwargs.pop('resume')
682 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile, **kwargs)
683 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
684 b4e29772 Stavros Sachtouris
            if k == 'range_str':
685 b4e29772 Stavros Sachtouris
                self.assertEqual(
686 b4e29772 Stavros Sachtouris
                    GET.mock_calls[-1][2]['data_range'],
687 b4e29772 Stavros Sachtouris
                    'bytes=%s' % v)
688 b4e29772 Stavros Sachtouris
            else:
689 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], v)
690 b4e29772 Stavros Sachtouris
691 b4e29772 Stavros Sachtouris
        #  ALl options on no tty
692 b4e29772 Stavros Sachtouris
693 b4e29772 Stavros Sachtouris
        def foo():
694 b4e29772 Stavros Sachtouris
            return True
695 b4e29772 Stavros Sachtouris
696 b4e29772 Stavros Sachtouris
        tmpFile.seek(0)
697 b4e29772 Stavros Sachtouris
        tmpFile.isatty = foo
698 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile, **kwargs)
699 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
700 b4e29772 Stavros Sachtouris
            if k == 'range_str':
701 b4e29772 Stavros Sachtouris
                self.assertTrue('data_range' in GET.mock_calls[-1][2])
702 b4e29772 Stavros Sachtouris
            else:
703 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], v)
704 cb65588d Stavros Sachtouris
705 cb65588d Stavros Sachtouris
    def test_get_object_hashmap(self):
706 c6da1ccc Stavros Sachtouris
        FR.json = object_hashmap
707 cb65588d Stavros Sachtouris
        for empty in (304, 412):
708 cb65588d Stavros Sachtouris
            with patch.object(
709 cb65588d Stavros Sachtouris
                    PC, 'object_get',
710 cb65588d Stavros Sachtouris
                    side_effect=ClientError('Empty', status=empty)):
711 cb65588d Stavros Sachtouris
                r = self.client.get_object_hashmap(obj)
712 cb65588d Stavros Sachtouris
                self.assertEqual(r, {})
713 cb65588d Stavros Sachtouris
        exp_args = dict(
714 cb65588d Stavros Sachtouris
            hashmap=True,
715 cb65588d Stavros Sachtouris
            data_range=None,
716 cb65588d Stavros Sachtouris
            version=None,
717 cb65588d Stavros Sachtouris
            if_etag_match=None,
718 cb65588d Stavros Sachtouris
            if_etag_not_match=None,
719 cb65588d Stavros Sachtouris
            if_modified_since=None,
720 cb65588d Stavros Sachtouris
            if_unmodified_since=None)
721 cb65588d Stavros Sachtouris
        kwargs = dict(
722 cb65588d Stavros Sachtouris
            version='s0m3v3r51on',
723 cb65588d Stavros Sachtouris
            if_match='if match',
724 cb65588d Stavros Sachtouris
            if_none_match='if non match',
725 cb65588d Stavros Sachtouris
            if_modified_since='some date here',
726 cb65588d Stavros Sachtouris
            if_unmodified_since='some date here',
727 cb65588d Stavros Sachtouris
            data_range='10-20')
728 c6da1ccc Stavros Sachtouris
        with patch.object(PC, 'object_get', return_value=FR()) as get:
729 cb65588d Stavros Sachtouris
            r = self.client.get_object_hashmap(obj)
730 cb65588d Stavros Sachtouris
            self.assertEqual(r, object_hashmap)
731 cb65588d Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(obj, **exp_args))
732 cb65588d Stavros Sachtouris
            r = self.client.get_object_hashmap(obj, **kwargs)
733 cb65588d Stavros Sachtouris
            exp_args['if_etag_match'] = kwargs.pop('if_match')
734 cb65588d Stavros Sachtouris
            exp_args['if_etag_not_match'] = kwargs.pop('if_none_match')
735 cb65588d Stavros Sachtouris
            exp_args.update(kwargs)
736 cb65588d Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(obj, **exp_args))
737 8b71426c Stavros Sachtouris
738 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
739 20387cd4 Stavros Sachtouris
    def test_set_account_group(self, post):
740 20387cd4 Stavros Sachtouris
        (group, usernames) = ('aU53rGr0up', ['u1', 'u2', 'u3'])
741 20387cd4 Stavros Sachtouris
        self.client.set_account_group(group, usernames)
742 20387cd4 Stavros Sachtouris
        self.assertEqual(
743 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
744 20387cd4 Stavros Sachtouris
            call(update=True, groups={group: usernames}))
745 419fa6c4 Stavros Sachtouris
746 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
747 20387cd4 Stavros Sachtouris
    def test_del_account_group(self, post):
748 419fa6c4 Stavros Sachtouris
        group = 'aU53rGr0up'
749 20387cd4 Stavros Sachtouris
        self.client.del_account_group(group)
750 20387cd4 Stavros Sachtouris
        self.assertEqual(
751 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
752 20387cd4 Stavros Sachtouris
            call(update=True, groups={group: []}))
753 34f48ce0 Stavros Sachtouris
754 20387cd4 Stavros Sachtouris
    @patch('%s.get_account_info' % pithos_pkg, return_value=account_info)
755 20387cd4 Stavros Sachtouris
    def test_get_account_quota(self, GAI):
756 34f48ce0 Stavros Sachtouris
        key = 'x-account-policy-quota'
757 20387cd4 Stavros Sachtouris
        r = self.client.get_account_quota()
758 20387cd4 Stavros Sachtouris
        self.assertEqual(r[key], account_info[key])
759 16b77981 Stavros Sachtouris
760 20387cd4 Stavros Sachtouris
    @patch('%s.get_account_info' % pithos_pkg, return_value=account_info)
761 20387cd4 Stavros Sachtouris
    def test_get_account_versioning(self, GAI):
762 16b77981 Stavros Sachtouris
        key = 'x-account-policy-versioning'
763 20387cd4 Stavros Sachtouris
        r = self.client.get_account_versioning()
764 20387cd4 Stavros Sachtouris
        self.assertEqual(r[key], account_info[key])
765 de27950a Stavros Sachtouris
766 de27950a Stavros Sachtouris
    def test_get_account_meta(self):
767 e78922d9 Stavros Sachtouris
        key = 'x-account-meta-'
768 de27950a Stavros Sachtouris
        with patch.object(PC, 'get_account_info', return_value=account_info):
769 de27950a Stavros Sachtouris
            r = self.client.get_account_meta()
770 e78922d9 Stavros Sachtouris
            keys = [k for k in r if k.startswith(key)]
771 e78922d9 Stavros Sachtouris
            self.assertFalse(keys)
772 de27950a Stavros Sachtouris
        acc_info = dict(account_info)
773 e78922d9 Stavros Sachtouris
        acc_info['%sk1' % key] = 'v1'
774 e78922d9 Stavros Sachtouris
        acc_info['%sk2' % key] = 'v2'
775 e78922d9 Stavros Sachtouris
        acc_info['%sk3' % key] = 'v3'
776 de27950a Stavros Sachtouris
        with patch.object(PC, 'get_account_info', return_value=acc_info):
777 de27950a Stavros Sachtouris
            r = self.client.get_account_meta()
778 e78922d9 Stavros Sachtouris
            for k in [k for k in acc_info if k.startswith(key)]:
779 e78922d9 Stavros Sachtouris
                self.assertEqual(r[k], acc_info[k])
780 e78922d9 Stavros Sachtouris
781 e78922d9 Stavros Sachtouris
    def test_get_account_group(self):
782 e78922d9 Stavros Sachtouris
        key = 'x-account-group-'
783 e78922d9 Stavros Sachtouris
        with patch.object(PC, 'get_account_info', return_value=account_info):
784 e78922d9 Stavros Sachtouris
            r = self.client.get_account_group()
785 e78922d9 Stavros Sachtouris
            keys = [k for k in r if k.startswith(key)]
786 e78922d9 Stavros Sachtouris
            self.assertFalse(keys)
787 e78922d9 Stavros Sachtouris
        acc_info = dict(account_info)
788 e78922d9 Stavros Sachtouris
        acc_info['%sk1' % key] = 'g1'
789 e78922d9 Stavros Sachtouris
        acc_info['%sk2' % key] = 'g2'
790 e78922d9 Stavros Sachtouris
        acc_info['%sk3' % key] = 'g3'
791 e78922d9 Stavros Sachtouris
        with patch.object(PC, 'get_account_info', return_value=acc_info):
792 e78922d9 Stavros Sachtouris
            r = self.client.get_account_group()
793 e78922d9 Stavros Sachtouris
            for k in [k for k in acc_info if k.startswith(key)]:
794 e78922d9 Stavros Sachtouris
                self.assertEqual(r[k], acc_info[k])
795 84817ae5 Stavros Sachtouris
796 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
797 20387cd4 Stavros Sachtouris
    def test_set_account_meta(self, post):
798 84817ae5 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
799 20387cd4 Stavros Sachtouris
        self.client.set_account_meta(metas)
800 20387cd4 Stavros Sachtouris
        self.assertEqual(
801 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
802 20387cd4 Stavros Sachtouris
            call(update=True, metadata=metas))
803 edd209d3 Stavros Sachtouris
804 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
805 20387cd4 Stavros Sachtouris
    def test_set_account_quota(self, post):
806 edd209d3 Stavros Sachtouris
        qu = 1024
807 20387cd4 Stavros Sachtouris
        self.client.set_account_quota(qu)
808 20387cd4 Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], call(update=True, quota=qu))
809 a6439733 Stavros Sachtouris
810 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
811 20387cd4 Stavros Sachtouris
    def test_set_account_versioning(self, post):
812 a6439733 Stavros Sachtouris
        vrs = 'n3wV3r51on1ngTyp3'
813 20387cd4 Stavros Sachtouris
        self.client.set_account_versioning(vrs)
814 20387cd4 Stavros Sachtouris
        self.assertEqual(
815 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
816 20387cd4 Stavros Sachtouris
            call(update=True, versioning=vrs))
817 20387cd4 Stavros Sachtouris
818 20387cd4 Stavros Sachtouris
    @patch('%s.container_delete' % pithos_pkg, return_value=FR())
819 20387cd4 Stavros Sachtouris
    def test_del_container(self, delete):
820 20387cd4 Stavros Sachtouris
        for kwarg in (
821 20387cd4 Stavros Sachtouris
                dict(delimiter=None, until=None),
822 20387cd4 Stavros Sachtouris
                dict(delimiter='X', until='50m3d473')):
823 20387cd4 Stavros Sachtouris
            self.client.del_container(**kwarg)
824 20387cd4 Stavros Sachtouris
            expected = dict(kwarg)
825 20387cd4 Stavros Sachtouris
            expected['success'] = (204, 404, 409)
826 20387cd4 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(**expected))
827 20387cd4 Stavros Sachtouris
        for status_code in (404, 409):
828 20387cd4 Stavros Sachtouris
            FR.status_code = status_code
829 20387cd4 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.del_container)
830 bae347d3 Stavros Sachtouris
831 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
832 d85e02c5 Stavros Sachtouris
    def test_get_container_versioning(self, GCI):
833 bae347d3 Stavros Sachtouris
        key = 'x-container-policy-versioning'
834 bae347d3 Stavros Sachtouris
        cont = 'c0n7-417'
835 1879e310 Stavros Sachtouris
        bu_cnt = self.client.container
836 d85e02c5 Stavros Sachtouris
        for container in (None, cont):
837 d85e02c5 Stavros Sachtouris
            r = self.client.get_container_versioning(container=container)
838 d85e02c5 Stavros Sachtouris
            self.assertEqual(r[key], container_info[key])
839 d85e02c5 Stavros Sachtouris
            self.assertEqual(GCI.mock_calls[-1], call())
840 d85e02c5 Stavros Sachtouris
            self.assertEqual(bu_cnt, self.client.container)
841 d85e02c5 Stavros Sachtouris
842 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
843 d85e02c5 Stavros Sachtouris
    def test_get_container_quota(self, GCI):
844 1879e310 Stavros Sachtouris
        key = 'x-container-policy-quota'
845 1879e310 Stavros Sachtouris
        cont = 'c0n7-417'
846 1879e310 Stavros Sachtouris
        bu_cnt = self.client.container
847 d85e02c5 Stavros Sachtouris
        for container in (None, cont):
848 d85e02c5 Stavros Sachtouris
            r = self.client.get_container_quota(container=container)
849 d85e02c5 Stavros Sachtouris
            self.assertEqual(r[key], container_info[key])
850 d85e02c5 Stavros Sachtouris
            self.assertEqual(GCI.mock_calls[-1], call())
851 d85e02c5 Stavros Sachtouris
            self.assertEqual(bu_cnt, self.client.container)
852 c297102c Stavros Sachtouris
853 c297102c Stavros Sachtouris
    def test_get_container_meta(self):
854 c297102c Stavros Sachtouris
        somedate = '50m3d473'
855 c297102c Stavros Sachtouris
        key = 'x-container-meta'
856 c297102c Stavros Sachtouris
        metaval = '50m3m374v41'
857 c297102c Stavros Sachtouris
        container_plus = dict(container_info)
858 c297102c Stavros Sachtouris
        container_plus[key] = metaval
859 c297102c Stavros Sachtouris
        for ret in ((container_info, {}), (container_plus, {key: metaval})):
860 c297102c Stavros Sachtouris
            with patch.object(
861 c297102c Stavros Sachtouris
                    PC,
862 c297102c Stavros Sachtouris
                    'get_container_info',
863 c297102c Stavros Sachtouris
                    return_value=ret[0]) as gci:
864 c297102c Stavros Sachtouris
                for until in (None, somedate):
865 c297102c Stavros Sachtouris
                    r = self.client.get_container_meta(until=until)
866 c297102c Stavros Sachtouris
                    self.assertEqual(r, ret[1])
867 c297102c Stavros Sachtouris
                    self.assertEqual(gci.mock_calls[-1], call(until=until))
868 a8f0a8e2 Stavros Sachtouris
869 a8f0a8e2 Stavros Sachtouris
    def test_get_container_object_meta(self):
870 a8f0a8e2 Stavros Sachtouris
        somedate = '50m3d473'
871 a8f0a8e2 Stavros Sachtouris
        key = 'x-container-object-meta'
872 a8f0a8e2 Stavros Sachtouris
        metaval = '50m3m374v41'
873 a8f0a8e2 Stavros Sachtouris
        container_plus = dict(container_info)
874 a8f0a8e2 Stavros Sachtouris
        container_plus[key] = metaval
875 a8f0a8e2 Stavros Sachtouris
        for ret in (
876 a8f0a8e2 Stavros Sachtouris
                (container_info, {key: ''}),
877 a8f0a8e2 Stavros Sachtouris
                (container_plus, {key: metaval})):
878 a8f0a8e2 Stavros Sachtouris
            with patch.object(
879 a8f0a8e2 Stavros Sachtouris
                    PC,
880 a8f0a8e2 Stavros Sachtouris
                    'get_container_info',
881 a8f0a8e2 Stavros Sachtouris
                    return_value=ret[0]) as gci:
882 a8f0a8e2 Stavros Sachtouris
                for until in (None, somedate):
883 a8f0a8e2 Stavros Sachtouris
                    r = self.client.get_container_object_meta(until=until)
884 a8f0a8e2 Stavros Sachtouris
                    self.assertEqual(r, ret[1])
885 a8f0a8e2 Stavros Sachtouris
                    self.assertEqual(gci.mock_calls[-1], call(until=until))
886 c1b21988 Stavros Sachtouris
887 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
888 20387cd4 Stavros Sachtouris
    def test_set_container_meta(self, post):
889 c1b21988 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
890 20387cd4 Stavros Sachtouris
        self.client.set_container_meta(metas)
891 20387cd4 Stavros Sachtouris
        self.assertEqual(
892 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
893 20387cd4 Stavros Sachtouris
            call(update=True, metadata=metas))
894 e9a2925f Stavros Sachtouris
895 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
896 20387cd4 Stavros Sachtouris
    def test_del_container_meta(self, ap):
897 20387cd4 Stavros Sachtouris
        self.client.del_container_meta('somekey')
898 20387cd4 Stavros Sachtouris
        expected = [call(update=True, metadata={'somekey': ''})]
899 20387cd4 Stavros Sachtouris
        self.assertEqual(ap.mock_calls, expected)
900 ec1d0bbe Stavros Sachtouris
901 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
902 20387cd4 Stavros Sachtouris
    def test_set_container_quota(self, post):
903 ec1d0bbe Stavros Sachtouris
        qu = 1024
904 20387cd4 Stavros Sachtouris
        self.client.set_container_quota(qu)
905 20387cd4 Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], call(update=True, quota=qu))
906 ec1d0bbe Stavros Sachtouris
907 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
908 20387cd4 Stavros Sachtouris
    def test_set_container_versioning(self, post):
909 ec1d0bbe Stavros Sachtouris
        vrs = 'n3wV3r51on1ngTyp3'
910 20387cd4 Stavros Sachtouris
        self.client.set_container_versioning(vrs)
911 20387cd4 Stavros Sachtouris
        self.assertEqual(
912 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
913 20387cd4 Stavros Sachtouris
            call(update=True, versioning=vrs))
914 20387cd4 Stavros Sachtouris
915 20387cd4 Stavros Sachtouris
    @patch('%s.object_delete' % pithos_pkg, return_value=FR())
916 20387cd4 Stavros Sachtouris
    def test_del_object(self, delete):
917 20387cd4 Stavros Sachtouris
        for kwarg in (
918 20387cd4 Stavros Sachtouris
                dict(delimiter=None, until=None),
919 20387cd4 Stavros Sachtouris
                dict(delimiter='X', until='50m3d473')):
920 20387cd4 Stavros Sachtouris
            self.client.del_object(obj, **kwarg)
921 20387cd4 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(obj, **kwarg))
922 20387cd4 Stavros Sachtouris
923 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
924 20387cd4 Stavros Sachtouris
    def test_set_object_meta(self, post):
925 d85e02c5 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
926 20387cd4 Stavros Sachtouris
        self.assertRaises(
927 20387cd4 Stavros Sachtouris
            AssertionError,
928 20387cd4 Stavros Sachtouris
            self.client.set_object_meta,
929 20387cd4 Stavros Sachtouris
            obj, 'Non dict arg')
930 20387cd4 Stavros Sachtouris
        self.client.set_object_meta(obj, metas)
931 20387cd4 Stavros Sachtouris
        self.assertEqual(
932 20387cd4 Stavros Sachtouris
            post.mock_calls[-1],
933 20387cd4 Stavros Sachtouris
            call(obj, update=True, metadata=metas))
934 f847a0cc Stavros Sachtouris
935 f847a0cc Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
936 f847a0cc Stavros Sachtouris
    def test_publish_object(self, post):
937 f847a0cc Stavros Sachtouris
        oinfo = dict(object_info)
938 f847a0cc Stavros Sachtouris
        val = 'pubL1c'
939 f847a0cc Stavros Sachtouris
        oinfo['x-object-public'] = val
940 f847a0cc Stavros Sachtouris
        with patch.object(PC, 'get_object_info', return_value=oinfo) as gof:
941 f847a0cc Stavros Sachtouris
            r = self.client.publish_object(obj)
942 f847a0cc Stavros Sachtouris
            self.assertEqual(
943 f847a0cc Stavros Sachtouris
                post.mock_calls[-1],
944 f847a0cc Stavros Sachtouris
                call(obj, public=True, update=True))
945 f847a0cc Stavros Sachtouris
            self.assertEqual(gof.mock_calls[-1], call(obj))
946 f847a0cc Stavros Sachtouris
            self.assertEqual(r, '%s%s' % (self.url[:-6], val))
947 aa67b8e5 Stavros Sachtouris
948 aa67b8e5 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
949 aa67b8e5 Stavros Sachtouris
    def test_unpublish_object(self, post):
950 aa67b8e5 Stavros Sachtouris
        self.client.unpublish_object(obj)
951 aa67b8e5 Stavros Sachtouris
        self.assertEqual(
952 aa67b8e5 Stavros Sachtouris
            post.mock_calls[-1],
953 aa67b8e5 Stavros Sachtouris
            call(obj, public=False, update=True))
954 8d4b8387 Stavros Sachtouris
955 8d4b8387 Stavros Sachtouris
    def test_get_object_sharing(self):
956 8d4b8387 Stavros Sachtouris
        info = dict(object_info)
957 8d4b8387 Stavros Sachtouris
        expected = dict(read='u1,g1,u2', write='u1')
958 8d4b8387 Stavros Sachtouris
        info['x-object-sharing'] = '; '.join(
959 8d4b8387 Stavros Sachtouris
            ['%s=%s' % (k, v) for k, v in expected.items()])
960 8d4b8387 Stavros Sachtouris
        with patch.object(PC, 'get_object_info', return_value=info) as GOF:
961 8d4b8387 Stavros Sachtouris
            r = self.client.get_object_sharing(obj)
962 8d4b8387 Stavros Sachtouris
            self.assertEqual(GOF.mock_calls[-1], call(obj))
963 8d4b8387 Stavros Sachtouris
            self.assert_dicts_are_equal(r, expected)
964 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = '//'.join(
965 8d4b8387 Stavros Sachtouris
                ['%s=%s' % (k, v) for k, v in expected.items()])
966 8d4b8387 Stavros Sachtouris
            self.assertRaises(
967 8d4b8387 Stavros Sachtouris
                ValueError,
968 8d4b8387 Stavros Sachtouris
                self.client.get_object_sharing,
969 8d4b8387 Stavros Sachtouris
                obj)
970 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = '; '.join(
971 8d4b8387 Stavros Sachtouris
                ['%s:%s' % (k, v) for k, v in expected.items()])
972 8d4b8387 Stavros Sachtouris
            self.assertRaises(
973 8d4b8387 Stavros Sachtouris
                ClientError,
974 8d4b8387 Stavros Sachtouris
                self.client.get_object_sharing,
975 8d4b8387 Stavros Sachtouris
                obj)
976 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = 'read=%s' % expected['read']
977 8d4b8387 Stavros Sachtouris
            r = self.client.get_object_sharing(obj)
978 8d4b8387 Stavros Sachtouris
            expected.pop('write')
979 8d4b8387 Stavros Sachtouris
            self.assert_dicts_are_equal(r, expected)
980 221820b8 Stavros Sachtouris
981 221820b8 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
982 221820b8 Stavros Sachtouris
    def test_set_object_sharing(self, POST):
983 221820b8 Stavros Sachtouris
        read_perms = ['u1', 'g1', 'u2', 'g2']
984 221820b8 Stavros Sachtouris
        write_perms = ['u1', 'g1']
985 221820b8 Stavros Sachtouris
        for kwargs in (
986 e73b65dd Stavros Sachtouris
                dict(read_permition=read_perms, write_permition=write_perms),
987 221820b8 Stavros Sachtouris
                dict(read_permition=read_perms),
988 e73b65dd Stavros Sachtouris
                dict(write_permition=write_perms),
989 e73b65dd Stavros Sachtouris
                dict()):
990 221820b8 Stavros Sachtouris
            self.client.set_object_sharing(obj, **kwargs)
991 e73b65dd Stavros Sachtouris
            kwargs['read'] = kwargs.pop('read_permition', '')
992 e73b65dd Stavros Sachtouris
            kwargs['write'] = kwargs.pop('write_permition', '')
993 221820b8 Stavros Sachtouris
            self.assertEqual(
994 221820b8 Stavros Sachtouris
                POST.mock_calls[-1],
995 e73b65dd Stavros Sachtouris
                call(obj, update=True, permissions=kwargs))
996 221820b8 Stavros Sachtouris
997 e73b65dd Stavros Sachtouris
    @patch('%s.set_object_sharing' % pithos_pkg)
998 e73b65dd Stavros Sachtouris
    def test_del_object_sharing(self, SOS):
999 e73b65dd Stavros Sachtouris
        self.client.del_object_sharing(obj)
1000 e73b65dd Stavros Sachtouris
        self.assertEqual(SOS.mock_calls[-1], call(obj))
1001 20387cd4 Stavros Sachtouris
1002 20387cd4 Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
1003 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1004 20387cd4 Stavros Sachtouris
    def test_append_object(self, post, GCI):
1005 20387cd4 Stavros Sachtouris
        num_of_blocks = 4
1006 20387cd4 Stavros Sachtouris
        tmpFile = self._create_temp_file(4)
1007 20387cd4 Stavros Sachtouris
        tmpFile.seek(0, 2)
1008 20387cd4 Stavros Sachtouris
        file_size = tmpFile.tell()
1009 20387cd4 Stavros Sachtouris
        for turn in range(2):
1010 20387cd4 Stavros Sachtouris
            tmpFile.seek(0, 0)
1011 20387cd4 Stavros Sachtouris
1012 20387cd4 Stavros Sachtouris
            try:
1013 20387cd4 Stavros Sachtouris
                from progress.bar import ShadyBar
1014 20387cd4 Stavros Sachtouris
                apn_bar = ShadyBar('Mock append')
1015 20387cd4 Stavros Sachtouris
            except ImportError:
1016 20387cd4 Stavros Sachtouris
                apn_bar = None
1017 20387cd4 Stavros Sachtouris
1018 20387cd4 Stavros Sachtouris
            if apn_bar:
1019 20387cd4 Stavros Sachtouris
1020 20387cd4 Stavros Sachtouris
                def append_gen(n):
1021 20387cd4 Stavros Sachtouris
                    for i in apn_bar.iter(range(n)):
1022 20387cd4 Stavros Sachtouris
                        yield
1023 20387cd4 Stavros Sachtouris
                    yield
1024 20387cd4 Stavros Sachtouris
1025 20387cd4 Stavros Sachtouris
            else:
1026 20387cd4 Stavros Sachtouris
                append_gen = None
1027 20387cd4 Stavros Sachtouris
1028 20387cd4 Stavros Sachtouris
            self.client.append_object(
1029 20387cd4 Stavros Sachtouris
                obj, tmpFile,
1030 20387cd4 Stavros Sachtouris
                upload_cb=append_gen if turn else None)
1031 20387cd4 Stavros Sachtouris
            self.assertEqual((turn + 1) * num_of_blocks, len(post.mock_calls))
1032 20387cd4 Stavros Sachtouris
            (args, kwargs) = post.mock_calls[-1][1:3]
1033 20387cd4 Stavros Sachtouris
            self.assertEqual(args, (obj,))
1034 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_length'], len(kwargs['data']))
1035 20387cd4 Stavros Sachtouris
            fsize = num_of_blocks * int(kwargs['content_length'])
1036 20387cd4 Stavros Sachtouris
            self.assertEqual(fsize, file_size)
1037 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_range'], 'bytes */*')
1038 20387cd4 Stavros Sachtouris
            exp = 'application/octet-stream'
1039 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_type'], exp)
1040 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['update'], True)