Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / pithos / test.py @ 98a7195e

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