Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / pithos / test.py @ 75e73aab

History | View | Annotate | Download (73.7 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 bdbca529 Stavros Sachtouris
from itertools import product
39 6cd86652 Stavros Sachtouris
from random import randint
40 bdbca529 Stavros Sachtouris
41 bdbca529 Stavros Sachtouris
try:
42 bdbca529 Stavros Sachtouris
    from collections import OrderedDict
43 bdbca529 Stavros Sachtouris
except ImportError:
44 1792ed1d Stavros Sachtouris
    from kamaki.clients.utils.ordereddict import OrderedDict
45 c1004a00 Stavros Sachtouris
46 3c50df2e Stavros Sachtouris
from kamaki.clients import pithos, ClientError
47 24851aa5 Stavros Sachtouris
48 bdbca529 Stavros Sachtouris
49 bdbca529 Stavros Sachtouris
rest_pkg = 'kamaki.clients.pithos.rest_api.PithosRestClient'
50 f847a0cc Stavros Sachtouris
pithos_pkg = 'kamaki.clients.pithos.PithosClient'
51 f847a0cc Stavros Sachtouris
52 24851aa5 Stavros Sachtouris
user_id = 'ac0un7-1d-5tr1ng'
53 cb65588d Stavros Sachtouris
obj = 'obj3c7N4m3'
54 24851aa5 Stavros Sachtouris
55 24851aa5 Stavros Sachtouris
account_info = {
56 24851aa5 Stavros Sachtouris
    'content-language': 'en-us',
57 24851aa5 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
58 24851aa5 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 13:25:51 GMT',
59 24851aa5 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
60 24851aa5 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
61 24851aa5 Stavros Sachtouris
    'vary': 'Accept-Language',
62 24851aa5 Stavros Sachtouris
    'x-account-bytes-used': '751615526',
63 24851aa5 Stavros Sachtouris
    'x-account-container-count': 7,
64 24851aa5 Stavros Sachtouris
    'x-account-policy-quota': 53687091200,
65 24851aa5 Stavros Sachtouris
    'x-account-policy-versioning': 'auto'}
66 d12e8569 Stavros Sachtouris
container_info = {
67 d12e8569 Stavros Sachtouris
    'content-language': 'en-us',
68 d12e8569 Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
69 d12e8569 Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 15:11:05 GMT',
70 d12e8569 Stavros Sachtouris
    'last-modified': 'Wed, 27 Feb 2013 15:56:13 GMT',
71 d12e8569 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
72 d12e8569 Stavros Sachtouris
    'vary': 'Accept-Language',
73 d12e8569 Stavros Sachtouris
    'x-container-block-hash': 'sha256',
74 d12e8569 Stavros Sachtouris
    'x-container-block-size': 4194304,
75 d12e8569 Stavros Sachtouris
    'x-container-bytes-used': 309528938,
76 d12e8569 Stavros Sachtouris
    'x-container-object-count': 14,
77 d12e8569 Stavros Sachtouris
    'x-container-object-meta': '',
78 d12e8569 Stavros Sachtouris
    'x-container-policy-quota': 53687091200,
79 d12e8569 Stavros Sachtouris
    'x-container-policy-versioning': 'auto'}
80 723e9d47 Stavros Sachtouris
object_info = {
81 723e9d47 Stavros Sachtouris
    'content-language': 'en-us',
82 723e9d47 Stavros Sachtouris
    'content-length': 254965,
83 723e9d47 Stavros Sachtouris
    'content-type': 'application/octet-stream',
84 723e9d47 Stavros Sachtouris
    'date': 'Thu, 07 Mar 2013 13:27:43 GMT',
85 723e9d47 Stavros Sachtouris
    'etag': '',
86 723e9d47 Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
87 723e9d47 Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
88 723e9d47 Stavros Sachtouris
    'vary': 'Accept-Language',
89 723e9d47 Stavros Sachtouris
    'x-object-hash': 'obj3c7h45h1s0bj3c7h45h411r34dY',
90 723e9d47 Stavros Sachtouris
    'x-object-uuid': 'd0c747ca-34bd-49e0-8e98-1d07d8b0cbc7',
91 723e9d47 Stavros Sachtouris
    'x-object-version': '525996',
92 3e2e07be Stavros Sachtouris
    'x-object-version-timestamp': 'Mon, 04 Mar 2013 18:22:31 GMT',
93 3e2e07be Stavros Sachtouris
    'x-object-meta-k1': 'v1',
94 3e2e07be Stavros Sachtouris
    'x-object-meta-k2': 'v2'}
95 efaa8675 Stavros Sachtouris
container_list = [
96 efaa8675 Stavros Sachtouris
    dict(
97 efaa8675 Stavros Sachtouris
        count=2,
98 efaa8675 Stavros Sachtouris
        last_modified="2013-02-27T11:56:09.893033+00:00",
99 efaa8675 Stavros Sachtouris
        bytes=677076979,
100 efaa8675 Stavros Sachtouris
        name="pithos",
101 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto")),
102 efaa8675 Stavros Sachtouris
    dict(
103 efaa8675 Stavros Sachtouris
        count=0,
104 efaa8675 Stavros Sachtouris
        last_modified="2012-10-23T12:25:17.229187+00:00",
105 efaa8675 Stavros Sachtouris
        bytes=0,
106 efaa8675 Stavros Sachtouris
        name="trash",
107 efaa8675 Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto"))]
108 39c737d4 Stavros Sachtouris
object_list = [
109 39c737d4 Stavros Sachtouris
    dict(hash="",
110 39c737d4 Stavros Sachtouris
        name="The_Secret_Garden.zip",
111 39c737d4 Stavros Sachtouris
        x_object_public="/public/wdp9p",
112 39c737d4 Stavros Sachtouris
        bytes=203304947,
113 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="1360237915.7027509",
114 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj0n3",
115 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
116 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
117 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
118 39c737d4 Stavros Sachtouris
        x_object_version=17737,
119 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id),
120 39c737d4 Stavros Sachtouris
    dict(hash="",
121 39c737d4 Stavros Sachtouris
        name="The_Revealed_Garden.zip",
122 39c737d4 Stavros Sachtouris
        x_object_public="/public/wpd7p",
123 39c737d4 Stavros Sachtouris
        bytes=20330947,
124 39c737d4 Stavros Sachtouris
        x_object_version_timestamp="13602915.7027509",
125 39c737d4 Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj70w",
126 39c737d4 Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
127 39c737d4 Stavros Sachtouris
        content_type="application/octet-stream",
128 39c737d4 Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
129 39c737d4 Stavros Sachtouris
        x_object_version=17737,
130 39c737d4 Stavros Sachtouris
        x_object_modified_by=user_id)]
131 b4e29772 Stavros Sachtouris
object_hashmap = dict(
132 b4e29772 Stavros Sachtouris
    block_hash="sha256", block_size=4194304, bytes=33554432,
133 b4e29772 Stavros Sachtouris
    hashes=[
134 b4e29772 Stavros Sachtouris
        "4988438cc1c0292c085d289649b28cf547ba3db71c6efaac9f2df7e193d4d0af",
135 b4e29772 Stavros Sachtouris
        "b214244aa56df7d1df7c6cac066e7cef268d9c2beb4dcf7ce68af667b0626f91",
136 b4e29772 Stavros Sachtouris
        "17f365f25e0682565ded30576066bb13377a3d306967e4d74e06bb6bbc20f75f",
137 b4e29772 Stavros Sachtouris
        "2524ae208932669fff89adf8a2fc0df3b67736ca0d3aadce7a2ce640f142af37",
138 b4e29772 Stavros Sachtouris
        "5d807a2129d2fcd3c221c3da418ed52af3fc48d0817b62e0bb437acffccd3514",
139 b4e29772 Stavros Sachtouris
        "609de22ce842d997f645fc49d5f14e0e3766dd51a6cbe66383b2bab82c8dfcd0",
140 b4e29772 Stavros Sachtouris
        "3102851ac168c78be70e35ff5178c7b1ebebd589e5106d565ca1094d1ca8ff59",
141 b4e29772 Stavros Sachtouris
        "bfe306dd24e92a8d85caf7055643f250fd319e8c4cdd4755ddabbf3ff97e83c7"])
142 23be9656 Stavros Sachtouris
sharers = [
143 23be9656 Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="0b1a-82d5"),
144 23be9656 Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="0b2a-f2d5"),
145 23be9656 Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="2b1a-82d6")]
146 24851aa5 Stavros Sachtouris
147 402b6f48 Stavros Sachtouris
148 c6da1ccc Stavros Sachtouris
class FR(object):
149 c6da1ccc Stavros Sachtouris
    """FR stands for Fake Response"""
150 c6da1ccc Stavros Sachtouris
    json = dict()
151 c6da1ccc Stavros Sachtouris
    headers = dict()
152 c6da1ccc Stavros Sachtouris
    content = json
153 c6da1ccc Stavros Sachtouris
    status = None
154 c6da1ccc Stavros Sachtouris
    status_code = 200
155 c6da1ccc Stavros Sachtouris
156 24851aa5 Stavros Sachtouris
157 3c50df2e Stavros Sachtouris
class PithosRestClient(TestCase):
158 55faa0bc Stavros Sachtouris
159 55faa0bc Stavros Sachtouris
    def setUp(self):
160 55faa0bc Stavros Sachtouris
        self.url = 'https://www.example.com/pithos'
161 55faa0bc Stavros Sachtouris
        self.token = 'p17h0570k3n'
162 3c50df2e Stavros Sachtouris
        self.client = pithos.PithosRestClient(self.url, self.token)
163 55faa0bc Stavros Sachtouris
        self.client.account = user_id
164 55faa0bc Stavros Sachtouris
        self.client.container = 'c0nt@1n3r_i'
165 55faa0bc Stavros Sachtouris
166 55faa0bc Stavros Sachtouris
    def tearDown(self):
167 55faa0bc Stavros Sachtouris
        FR.headers = dict()
168 55faa0bc Stavros Sachtouris
        FR.json = dict()
169 55faa0bc Stavros Sachtouris
        FR.content = FR.json
170 bdbca529 Stavros Sachtouris
171 bdbca529 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
172 bdbca529 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
173 bdbca529 Stavros Sachtouris
    @patch('%s.head' % rest_pkg, return_value=FR())
174 bdbca529 Stavros Sachtouris
    def test_account_head(self, head, SH, SP):
175 bdbca529 Stavros Sachtouris
        for params in product(
176 bdbca529 Stavros Sachtouris
                (None, '50m3-d473'),
177 bdbca529 Stavros Sachtouris
                (None, '50m3-07h3r-d473'),
178 bdbca529 Stavros Sachtouris
                (None, 'y37-4n7h3r-d473'),
179 bdbca529 Stavros Sachtouris
                ((), ('someval',), ('v1', 'v2',)),
180 bdbca529 Stavros Sachtouris
                (dict(), dict(success=200), dict(k='v', v='k'))):
181 bdbca529 Stavros Sachtouris
            args, kwargs = params[-2], params[-1]
182 bdbca529 Stavros Sachtouris
            params = params[:-2]
183 bdbca529 Stavros Sachtouris
            self.client.account_head(*(params + args), **kwargs)
184 bdbca529 Stavros Sachtouris
            unt = params[0]
185 bdbca529 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call('until', unt, iff=unt))
186 bdbca529 Stavros Sachtouris
            IMS, IUS = params[1], params[2]
187 bdbca529 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-2:], [
188 bdbca529 Stavros Sachtouris
                call('If-Modified-Since', IMS),
189 bdbca529 Stavros Sachtouris
                call('If-Unmodified-Since', IUS)])
190 bdbca529 Stavros Sachtouris
            self.assertEqual(head.mock_calls[-1], call(
191 bdbca529 Stavros Sachtouris
                '/%s' % self.client.account,
192 bdbca529 Stavros Sachtouris
                *args,
193 bdbca529 Stavros Sachtouris
                success=kwargs.pop('success', 204),
194 bdbca529 Stavros Sachtouris
                **kwargs))
195 55faa0bc Stavros Sachtouris
196 1b4629c6 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
197 1b4629c6 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
198 1b4629c6 Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
199 1b4629c6 Stavros Sachtouris
    def test_account_get(self, get, SH, SP):
200 7a3c66e1 Stavros Sachtouris
        keys = ('limit', 'marker', 'format', 'shared', 'public', 'until')
201 1b4629c6 Stavros Sachtouris
        for params in product(
202 1b4629c6 Stavros Sachtouris
                (None, 42),
203 1b4629c6 Stavros Sachtouris
                (None, 'X'),
204 1b4629c6 Stavros Sachtouris
                ('json', 'xml'),
205 1b4629c6 Stavros Sachtouris
                (False, True),
206 7a3c66e1 Stavros Sachtouris
                (False, True),
207 1b4629c6 Stavros Sachtouris
                (None, '50m3-d473'),
208 1b4629c6 Stavros Sachtouris
                (None, '50m3-07h3r-d473'),
209 1b4629c6 Stavros Sachtouris
                (None, 'y37-4n7h3r-d473'),
210 1b4629c6 Stavros Sachtouris
                ((), ('someval',), ('v1', 'v2',)),
211 1b4629c6 Stavros Sachtouris
                (dict(), dict(success=200), dict(k='v', v='k'))):
212 1b4629c6 Stavros Sachtouris
            args, kwargs = params[-2], params[-1]
213 1b4629c6 Stavros Sachtouris
            params = params[:-2]
214 1b4629c6 Stavros Sachtouris
            self.client.account_get(*(params + args), **kwargs)
215 7a3c66e1 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-6:],
216 7a3c66e1 Stavros Sachtouris
                [call(keys[i], iff=X) if (i in (3, 4)) else call(
217 7a3c66e1 Stavros Sachtouris
                    keys[i], X, iff=X) for i, X in enumerate(params[:6])])
218 7a3c66e1 Stavros Sachtouris
            IMS, IUS = params[6], params[7]
219 1b4629c6 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-2:], [
220 1b4629c6 Stavros Sachtouris
                call('If-Modified-Since', IMS),
221 1b4629c6 Stavros Sachtouris
                call('If-Unmodified-Since', IUS)])
222 1b4629c6 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
223 1b4629c6 Stavros Sachtouris
                '/%s' % self.client.account,
224 1b4629c6 Stavros Sachtouris
                *args,
225 1b4629c6 Stavros Sachtouris
                success=kwargs.pop('success', (200, 204)),
226 1b4629c6 Stavros Sachtouris
                **kwargs))
227 1b4629c6 Stavros Sachtouris
228 da657652 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
229 da657652 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
230 da657652 Stavros Sachtouris
    @patch('%s.post' % rest_pkg, return_value=FR())
231 da657652 Stavros Sachtouris
    def test_account_post(self, post, SH, SP):
232 da657652 Stavros Sachtouris
        #keys = ('update', 'groups', 'metadata', 'quota', 'versioning')
233 da657652 Stavros Sachtouris
        for pm in product(
234 da657652 Stavros Sachtouris
                (True, False),
235 da657652 Stavros Sachtouris
                ({}, dict(g=['u1', 'u2']), dict(g1=[], g2=['u1', 'u2'])),
236 da657652 Stavros Sachtouris
                (None, dict(k1='v1', k2='v2', k3='v2'), dict(k='v')),
237 da657652 Stavros Sachtouris
                (None, 42),
238 da657652 Stavros Sachtouris
                (None, 'v3r510n1ng'),
239 da657652 Stavros Sachtouris
                ((), ('someval',), ('v1', 'v2',)),
240 da657652 Stavros Sachtouris
                (dict(), dict(success=200), dict(k='v', v='k'))):
241 bbf5dddd Stavros Sachtouris
            args, kwargs = pm[-2:]
242 da657652 Stavros Sachtouris
            pm = pm[:-2]
243 da657652 Stavros Sachtouris
            self.client.account_post(*(pm + args), **kwargs)
244 da657652 Stavros Sachtouris
            upd = pm[0]
245 776b275c Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call('update', '', iff=upd))
246 da657652 Stavros Sachtouris
            expected = []
247 da657652 Stavros Sachtouris
            if pm[1]:
248 da657652 Stavros Sachtouris
                expected += [
249 da657652 Stavros Sachtouris
                call('X-Account-Group-%s' % k, v) for k, v in pm[1].items()]
250 da657652 Stavros Sachtouris
            if pm[2]:
251 da657652 Stavros Sachtouris
                expected = [
252 da657652 Stavros Sachtouris
                call('X-Account-Meta-%s' % k, v) for k, v in pm[2].items()]
253 da657652 Stavros Sachtouris
            expected = [
254 da657652 Stavros Sachtouris
                call('X-Account-Policy-Quota', pm[3]),
255 da657652 Stavros Sachtouris
                call('X-Account-Policy-Versioning', pm[4])]
256 da657652 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(expected):], expected)
257 da657652 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(
258 da657652 Stavros Sachtouris
                '/%s' % self.client.account,
259 da657652 Stavros Sachtouris
                *args,
260 da657652 Stavros Sachtouris
                success=kwargs.pop('success', 202),
261 da657652 Stavros Sachtouris
                **kwargs))
262 da657652 Stavros Sachtouris
263 bbf5dddd Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
264 bbf5dddd Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
265 bbf5dddd Stavros Sachtouris
    @patch('%s.head' % rest_pkg, return_value=FR())
266 bbf5dddd Stavros Sachtouris
    def test_container_head(self, head, SH, SP):
267 bbf5dddd Stavros Sachtouris
        for pm in product(
268 bbf5dddd Stavros Sachtouris
                (None, '4-d473'),
269 bbf5dddd Stavros Sachtouris
                (None, '47h3r-d473'),
270 bbf5dddd Stavros Sachtouris
                (None, 'y37-4n47h3r'),
271 bbf5dddd Stavros Sachtouris
                ((), ('someval',)),
272 bbf5dddd Stavros Sachtouris
                (dict(), dict(success=200), dict(k='v', v='k'))):
273 bbf5dddd Stavros Sachtouris
            args, kwargs = pm[-2:]
274 bbf5dddd Stavros Sachtouris
            pm = pm[:-2]
275 bbf5dddd Stavros Sachtouris
            self.client.container_head(*(pm + args), **kwargs)
276 bbf5dddd Stavros Sachtouris
            unt, ims, ius = pm[0:3]
277 bbf5dddd Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call('until', unt, iff=unt))
278 bbf5dddd Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-2:], [
279 bbf5dddd Stavros Sachtouris
                call('If-Modified-Since', ims),
280 bbf5dddd Stavros Sachtouris
                call('If-Unmodified-Since', ius)])
281 bbf5dddd Stavros Sachtouris
            self.assertEqual(head.mock_calls[-1], call(
282 bbf5dddd Stavros Sachtouris
                '/%s/%s' % (self.client.account, self.client.container),
283 bbf5dddd Stavros Sachtouris
                *args,
284 bbf5dddd Stavros Sachtouris
                success=kwargs.pop('success', 204),
285 bbf5dddd Stavros Sachtouris
                **kwargs))
286 bbf5dddd Stavros Sachtouris
287 c7e9c644 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
288 c7e9c644 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
289 c7e9c644 Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
290 c7e9c644 Stavros Sachtouris
    def test_container_get(self, get, SH, SP):
291 c7e9c644 Stavros Sachtouris
        for pm in product(
292 c7e9c644 Stavros Sachtouris
                (None, 42),
293 c7e9c644 Stavros Sachtouris
                (None, 'X'),
294 c7e9c644 Stavros Sachtouris
                (None, 'some/prefix'),
295 c7e9c644 Stavros Sachtouris
                (None, 'delimiter'),
296 c7e9c644 Stavros Sachtouris
                (None, '/some/path'),
297 c7e9c644 Stavros Sachtouris
                ('json', 'some-format'),
298 c7e9c644 Stavros Sachtouris
                ([], ['k1', 'k2', 'k3']),
299 c7e9c644 Stavros Sachtouris
                (False, True),
300 7a3c66e1 Stavros Sachtouris
                (False, True),
301 c7e9c644 Stavros Sachtouris
                (None, 'unt1l-d473'),
302 c7e9c644 Stavros Sachtouris
                (None, 'y37-4n47h3r'),
303 c7e9c644 Stavros Sachtouris
                (None, '4n47h3r-d473'),
304 c7e9c644 Stavros Sachtouris
                ((), ('someval',)),
305 c7e9c644 Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
306 c7e9c644 Stavros Sachtouris
            args, kwargs = pm[-2:]
307 c7e9c644 Stavros Sachtouris
            pm = pm[:-2]
308 c7e9c644 Stavros Sachtouris
            self.client.container_get(*(pm + args), **kwargs)
309 7a3c66e1 Stavros Sachtouris
            lmt, mrk, prfx, dlm, path, frmt, meta, shr, pbl, unt = pm[:-2]
310 c7e9c644 Stavros Sachtouris
            exp = [call('limit', lmt, iff=lmt), call('marker', mrk, iff=mrk)]
311 c7e9c644 Stavros Sachtouris
            exp += [call('path', path)] if path else [
312 c7e9c644 Stavros Sachtouris
                call('prefix', prfx, iff=prfx),
313 c7e9c644 Stavros Sachtouris
                call('delimiter', dlm, iff=dlm)]
314 7a3c66e1 Stavros Sachtouris
            exp += [
315 7a3c66e1 Stavros Sachtouris
                call('format', frmt, iff=frmt),
316 7a3c66e1 Stavros Sachtouris
                call('shared', iff=shr),
317 7a3c66e1 Stavros Sachtouris
                call('public', iff=pbl)]
318 c7e9c644 Stavros Sachtouris
            if meta:
319 c7e9c644 Stavros Sachtouris
                exp += [call('meta', ','.join(meta))]
320 c7e9c644 Stavros Sachtouris
            exp += [call('until', unt, iff=unt)]
321 c7e9c644 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[- len(exp):], exp)
322 c7e9c644 Stavros Sachtouris
            ims, ius = pm[-2:]
323 c7e9c644 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-2:], [
324 c7e9c644 Stavros Sachtouris
                call('If-Modified-Since', ims),
325 c7e9c644 Stavros Sachtouris
                call('If-Unmodified-Since', ius)])
326 c7e9c644 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
327 c7e9c644 Stavros Sachtouris
                '/%s/%s' % (self.client.account, self.client.container),
328 c7e9c644 Stavros Sachtouris
                *args,
329 c7e9c644 Stavros Sachtouris
                success=kwargs.pop('success', 200),
330 c7e9c644 Stavros Sachtouris
                **kwargs))
331 c7e9c644 Stavros Sachtouris
332 1df0b0aa Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
333 1df0b0aa Stavros Sachtouris
    @patch('%s.put' % rest_pkg, return_value=FR())
334 1df0b0aa Stavros Sachtouris
    def test_container_put(self, put, SH):
335 1df0b0aa Stavros Sachtouris
        for pm in product(
336 1df0b0aa Stavros Sachtouris
                (None, 42),
337 1df0b0aa Stavros Sachtouris
                (None, 'v3r51on1ng'),
338 1df0b0aa Stavros Sachtouris
                (dict(), dict(k1='v2'), dict(k2='v2', k3='v3')),
339 1df0b0aa Stavros Sachtouris
                ((), ('someval',)),
340 1df0b0aa Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
341 1df0b0aa Stavros Sachtouris
            args, kwargs = pm[-2:]
342 1df0b0aa Stavros Sachtouris
            pm = pm[:-2]
343 1df0b0aa Stavros Sachtouris
            self.client.container_put(*(pm + args), **kwargs)
344 1df0b0aa Stavros Sachtouris
            quota, versioning, metas = pm[-3:]
345 1df0b0aa Stavros Sachtouris
            exp = [
346 1df0b0aa Stavros Sachtouris
                call('X-Container-Policy-Quota', quota),
347 1df0b0aa Stavros Sachtouris
                call('X-Container-Policy-Versioning', versioning)] + [
348 1df0b0aa Stavros Sachtouris
                call('X-Container-Meta-%s' % k, v) for k, v in metas.items()]
349 1df0b0aa Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
350 1df0b0aa Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], call(
351 1df0b0aa Stavros Sachtouris
                '/%s/%s' % (self.client.account, self.client.container),
352 1df0b0aa Stavros Sachtouris
                *args,
353 1df0b0aa Stavros Sachtouris
                success=kwargs.pop('success', (201, 202)),
354 1df0b0aa Stavros Sachtouris
                **kwargs))
355 1df0b0aa Stavros Sachtouris
356 7702c429 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
357 7702c429 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
358 7702c429 Stavros Sachtouris
    @patch('%s.post' % rest_pkg, return_value=FR())
359 7702c429 Stavros Sachtouris
    def test_container_post(self, post, SH, SP):
360 7702c429 Stavros Sachtouris
        for pm in product(
361 7702c429 Stavros Sachtouris
                (True, False),
362 7702c429 Stavros Sachtouris
                ('json', 'some-format'),
363 7702c429 Stavros Sachtouris
                (None, 'quota'),
364 7702c429 Stavros Sachtouris
                (None, 'v3r51on1ng'),
365 7702c429 Stavros Sachtouris
                (dict(), dict(k1='v2'), dict(k2='v2', k3='v3')),
366 7702c429 Stavros Sachtouris
                (None, 'content-type'),
367 7702c429 Stavros Sachtouris
                (None, 42),
368 7702c429 Stavros Sachtouris
                (None, 'transfer-encoding'),
369 7702c429 Stavros Sachtouris
                ((), ('someval',)),
370 7702c429 Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
371 7702c429 Stavros Sachtouris
            args, kwargs = pm[-2:]
372 7702c429 Stavros Sachtouris
            pm = pm[:-2]
373 7702c429 Stavros Sachtouris
            self.client.container_post(*(pm + args), **kwargs)
374 7702c429 Stavros Sachtouris
            upd, frmt = pm[:2]
375 7702c429 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
376 776b275c Stavros Sachtouris
                call('update', '', iff=upd),
377 7702c429 Stavros Sachtouris
                call('format', frmt, iff=frmt)])
378 7702c429 Stavros Sachtouris
            qta, vrs, metas, ctype, clen, trenc = pm[2:]
379 7702c429 Stavros Sachtouris
            prfx = 'X-Container-Meta-'
380 7702c429 Stavros Sachtouris
            exp = [
381 7702c429 Stavros Sachtouris
                call('X-Container-Policy-Quota', qta),
382 7702c429 Stavros Sachtouris
                call('X-Container-Policy-Versioning', vrs)] + [
383 7702c429 Stavros Sachtouris
                call('%s%s' % (prfx, k), v) for k, v in metas.items()] + [
384 7702c429 Stavros Sachtouris
                call('Content-Type', ctype),
385 7702c429 Stavros Sachtouris
                call('Content-Length', clen),
386 7702c429 Stavros Sachtouris
                call('Transfer-Encoding', trenc)]
387 7702c429 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
388 7702c429 Stavros Sachtouris
            ims, ius = pm[-2:]
389 7702c429 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(
390 7702c429 Stavros Sachtouris
                '/%s/%s' % (self.client.account, self.client.container),
391 7702c429 Stavros Sachtouris
                *args,
392 7702c429 Stavros Sachtouris
                success=kwargs.pop('success', 202),
393 7702c429 Stavros Sachtouris
                **kwargs))
394 7702c429 Stavros Sachtouris
395 faa4a3ea Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
396 faa4a3ea Stavros Sachtouris
    @patch('%s.delete' % rest_pkg, return_value=FR())
397 faa4a3ea Stavros Sachtouris
    def test_container_delete(self, delete, SP):
398 faa4a3ea Stavros Sachtouris
        for pm in product(
399 faa4a3ea Stavros Sachtouris
                (None, 'd473'),
400 faa4a3ea Stavros Sachtouris
                (None, 'd3l1m'),
401 faa4a3ea Stavros Sachtouris
                ((), ('someval',)),
402 faa4a3ea Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
403 faa4a3ea Stavros Sachtouris
            args, kwargs = pm[-2:]
404 faa4a3ea Stavros Sachtouris
            pm = pm[:-2]
405 faa4a3ea Stavros Sachtouris
            self.client.container_delete(*(pm + args), **kwargs)
406 faa4a3ea Stavros Sachtouris
            unt, dlm = pm[-2:]
407 faa4a3ea Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
408 faa4a3ea Stavros Sachtouris
                call('until', unt, iff=unt),
409 faa4a3ea Stavros Sachtouris
                call('delimiter', dlm, iff=dlm)])
410 faa4a3ea Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(
411 faa4a3ea Stavros Sachtouris
                '/%s/%s' % (self.client.account, self.client.container),
412 faa4a3ea Stavros Sachtouris
                *args,
413 faa4a3ea Stavros Sachtouris
                success=kwargs.pop('success', 204),
414 faa4a3ea Stavros Sachtouris
                **kwargs))
415 faa4a3ea Stavros Sachtouris
416 fa27f71a Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
417 fa27f71a Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
418 fa27f71a Stavros Sachtouris
    @patch('%s.head' % rest_pkg, return_value=FR())
419 fa27f71a Stavros Sachtouris
    def test_object_head(self, head, SH, SP):
420 fa27f71a Stavros Sachtouris
        for pm in product(
421 fa27f71a Stavros Sachtouris
                (None, 'v3r510n'),
422 fa27f71a Stavros Sachtouris
                (None, '1f-374g'),
423 fa27f71a Stavros Sachtouris
                (None, '1f-n0-74g'),
424 fa27f71a Stavros Sachtouris
                (None, '1f-m0d-51nc3'),
425 fa27f71a Stavros Sachtouris
                (None, '1f-unm0d-51nc3'),
426 fa27f71a Stavros Sachtouris
                ((), ('someval',)),
427 fa27f71a Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
428 fa27f71a Stavros Sachtouris
            args, kwargs = pm[-2:]
429 fa27f71a Stavros Sachtouris
            pm = pm[:-2]
430 fa27f71a Stavros Sachtouris
            self.client.object_head(obj, *(pm + args), **kwargs)
431 fa27f71a Stavros Sachtouris
            vrs, etag, netag, ims, ius = pm[:5]
432 fa27f71a Stavros Sachtouris
            self.assertEqual(
433 fa27f71a Stavros Sachtouris
                SP.mock_calls[-1],
434 fa27f71a Stavros Sachtouris
                call('version', vrs, iff=vrs))
435 fa27f71a Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-4:], [
436 fa27f71a Stavros Sachtouris
                call('If-Match', etag),
437 fa27f71a Stavros Sachtouris
                call('If-None-Match', netag),
438 fa27f71a Stavros Sachtouris
                call('If-Modified-Since', ims),
439 fa27f71a Stavros Sachtouris
                call('If-Unmodified-Since', ius)])
440 fa27f71a Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
441 fa27f71a Stavros Sachtouris
            self.assertEqual(head.mock_calls[-1], call(
442 fa27f71a Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
443 fa27f71a Stavros Sachtouris
                *args,
444 fa27f71a Stavros Sachtouris
                success=kwargs.pop('success', 200),
445 1b80cb25 Stavros Sachtouris
                **kwargs))
446 1b80cb25 Stavros Sachtouris
447 1b80cb25 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
448 1b80cb25 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
449 1b80cb25 Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
450 1b80cb25 Stavros Sachtouris
    def test_object_get(self, get, SH, SP):
451 1b80cb25 Stavros Sachtouris
        for pm in product(
452 1b80cb25 Stavros Sachtouris
                ('json', 'f0rm47'),
453 1b80cb25 Stavros Sachtouris
                (False, True),
454 1b80cb25 Stavros Sachtouris
                (None, 'v3r510n'),
455 1b80cb25 Stavros Sachtouris
                (None, 'range=74-63'),
456 1b80cb25 Stavros Sachtouris
                (False, True),
457 1b80cb25 Stavros Sachtouris
                (None, '3746'),
458 1b80cb25 Stavros Sachtouris
                (None, 'non-3746'),
459 1b80cb25 Stavros Sachtouris
                (None, '1f-m0d'),
460 1b80cb25 Stavros Sachtouris
                (None, '1f-unm0d'),
461 1b80cb25 Stavros Sachtouris
                ((), ('someval',)),
462 1b80cb25 Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
463 1b80cb25 Stavros Sachtouris
            args, kwargs = pm[-2:]
464 1b80cb25 Stavros Sachtouris
            pm = pm[:-2]
465 1b80cb25 Stavros Sachtouris
            self.client.object_get(obj, *(pm + args), **kwargs)
466 1b80cb25 Stavros Sachtouris
            format, hashmap, version = pm[:3]
467 1b80cb25 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-3:], [
468 1b80cb25 Stavros Sachtouris
                call('format', format, iff=format),
469 1b80cb25 Stavros Sachtouris
                call('hashmap', hashmap, iff=hashmap),
470 1b80cb25 Stavros Sachtouris
                call('version', version, iff=version)])
471 1b80cb25 Stavros Sachtouris
            rng, ifrng, im, inm, ims, ius = pm[-6:]
472 1b80cb25 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[-6:], [
473 1b80cb25 Stavros Sachtouris
                call('Range', rng),
474 1b80cb25 Stavros Sachtouris
                call('If-Range', '', ifrng and rng),
475 1b80cb25 Stavros Sachtouris
                call('If-Match', im),
476 1b80cb25 Stavros Sachtouris
                call('If-None-Match', inm),
477 1b80cb25 Stavros Sachtouris
                call('If-Modified-Since', ims),
478 1b80cb25 Stavros Sachtouris
                call('If-Unmodified-Since', ius)])
479 1b80cb25 Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
480 1b80cb25 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
481 1b80cb25 Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
482 1b80cb25 Stavros Sachtouris
                *args,
483 1b80cb25 Stavros Sachtouris
                success=kwargs.pop('success', 200),
484 fa27f71a Stavros Sachtouris
                **kwargs))
485 fa27f71a Stavros Sachtouris
486 6cd86652 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
487 6cd86652 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
488 6cd86652 Stavros Sachtouris
    @patch('%s.put' % rest_pkg, return_value=FR())
489 6cd86652 Stavros Sachtouris
    def test_object_put(self, put, SH, SP):
490 6cd86652 Stavros Sachtouris
        for pm in product(
491 6cd86652 Stavros Sachtouris
                ('json', 'f0rm47'),
492 6cd86652 Stavros Sachtouris
                (False, True),
493 6cd86652 Stavros Sachtouris
                (None, 'delim',),
494 6cd86652 Stavros Sachtouris
                (dict(), dict(read=['u1', 'g2'], write=['u1'])),
495 6cd86652 Stavros Sachtouris
                (False, True),
496 6cd86652 Stavros Sachtouris
                (dict(), dict(k2='v2', k3='v3')),
497 6cd86652 Stavros Sachtouris
                ((), ('someval',)),
498 6cd86652 Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
499 6cd86652 Stavros Sachtouris
            args, kwargs = pm[-2:]
500 6cd86652 Stavros Sachtouris
            pm = pm[:-2]
501 6cd86652 Stavros Sachtouris
            terms = [None] * 13
502 6cd86652 Stavros Sachtouris
            for i in range(len(terms)):
503 6cd86652 Stavros Sachtouris
                if randint(0, 2):
504 6cd86652 Stavros Sachtouris
                    terms[i] = 'val_%s' % randint(13, 1024)
505 6cd86652 Stavros Sachtouris
            self.client.object_put(
506 6cd86652 Stavros Sachtouris
                obj,
507 6cd86652 Stavros Sachtouris
                *(pm[:3] + tuple(terms) + pm[3:] + args),
508 6cd86652 Stavros Sachtouris
                **kwargs)
509 6cd86652 Stavros Sachtouris
            format, hashmap, delimiter = pm[:3]
510 6cd86652 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-3:], [
511 6cd86652 Stavros Sachtouris
                call('format', format, iff=format),
512 6cd86652 Stavros Sachtouris
                call('hashmap', hashmap, iff=hashmap),
513 6cd86652 Stavros Sachtouris
                call('delimiter', delimiter, iff=delimiter)])
514 6cd86652 Stavros Sachtouris
            (
515 6cd86652 Stavros Sachtouris
                im, inm, etag, clen, ctype, trenc,
516 6cd86652 Stavros Sachtouris
                cp, mv, srcacc, srcvrs, conenc, condis, mnf) = terms
517 6cd86652 Stavros Sachtouris
            perms, public, metas = pm[3:]
518 6cd86652 Stavros Sachtouris
            exp = [
519 6cd86652 Stavros Sachtouris
                call('If-Match', im),
520 6cd86652 Stavros Sachtouris
                call('If-None-Match', inm),
521 6cd86652 Stavros Sachtouris
                call('ETag', etag),
522 6cd86652 Stavros Sachtouris
                call('Content-Length', clen),
523 6cd86652 Stavros Sachtouris
                call('Content-Type', ctype),
524 6cd86652 Stavros Sachtouris
                call('Transfer-Encoding', trenc),
525 6cd86652 Stavros Sachtouris
                call('X-Copy-From', cp),
526 6cd86652 Stavros Sachtouris
                call('X-Move-From', mv),
527 6cd86652 Stavros Sachtouris
                call('X-Source-Account', srcacc),
528 6cd86652 Stavros Sachtouris
                call('X-Source-Version', srcvrs),
529 6cd86652 Stavros Sachtouris
                call('Content-Encoding', conenc),
530 6cd86652 Stavros Sachtouris
                call('Content-Disposition', condis),
531 6cd86652 Stavros Sachtouris
                call('X-Object-Manifest', mnf)]
532 6cd86652 Stavros Sachtouris
            if perms:
533 6cd86652 Stavros Sachtouris
                perm_str = ''
534 6cd86652 Stavros Sachtouris
                for ptype, pval in perms.items():
535 6cd86652 Stavros Sachtouris
                    if pval:
536 6cd86652 Stavros Sachtouris
                        perm_str += ';' if perm_str else ''
537 6cd86652 Stavros Sachtouris
                        perm_str += '%s=%s' % (ptype, ','.join(pval))
538 6cd86652 Stavros Sachtouris
                exp += [call('X-Object-Sharing', perm_str)]
539 13c02904 Stavros Sachtouris
            exp += [call('X-Object-Public', public, public is not None)]
540 6cd86652 Stavros Sachtouris
            for k, v in metas.items():
541 6cd86652 Stavros Sachtouris
                exp += [call('X-Object-Meta-%s' % k, v)]
542 6cd86652 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
543 6cd86652 Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
544 6cd86652 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], call(
545 6cd86652 Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
546 6cd86652 Stavros Sachtouris
                *args,
547 6cd86652 Stavros Sachtouris
                success=kwargs.pop('success', 201),
548 49886c59 Stavros Sachtouris
                **kwargs))
549 49886c59 Stavros Sachtouris
550 49886c59 Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
551 49886c59 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
552 49886c59 Stavros Sachtouris
    @patch('%s.copy' % rest_pkg, return_value=FR())
553 49886c59 Stavros Sachtouris
    def test_object_copy(self, copy, SH, SP):
554 49886c59 Stavros Sachtouris
        dest = 'dest1n4710n'
555 49886c59 Stavros Sachtouris
        for pm in product(
556 49886c59 Stavros Sachtouris
                ('json', 'f0rm47'),
557 49886c59 Stavros Sachtouris
                (False, True),
558 49886c59 Stavros Sachtouris
                (None, 'ifmatch'),
559 49886c59 Stavros Sachtouris
                (None, 'ifnonematch'),
560 49886c59 Stavros Sachtouris
                (None, 'destinationaccount'),
561 49886c59 Stavros Sachtouris
                (None, 'content-type'),
562 49886c59 Stavros Sachtouris
                (None, 'content-encoding'),
563 49886c59 Stavros Sachtouris
                (None, 'content-disp'),
564 49886c59 Stavros Sachtouris
                (None, 'source-version'),
565 49886c59 Stavros Sachtouris
                (dict(), dict(read=['u1', 'g2'], write=['u1'])),
566 49886c59 Stavros Sachtouris
                (False, True),
567 49886c59 Stavros Sachtouris
                (dict(), dict(k2='v2', k3='v3')),
568 49886c59 Stavros Sachtouris
                ((), ('someval',)),
569 49886c59 Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
570 49886c59 Stavros Sachtouris
            args, kwargs = pm[-2:]
571 49886c59 Stavros Sachtouris
            pm = pm[:-2]
572 49886c59 Stavros Sachtouris
            self.client.object_copy(obj, dest, *(pm + args), **kwargs)
573 49886c59 Stavros Sachtouris
            format, ict = pm[:2]
574 49886c59 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
575 49886c59 Stavros Sachtouris
                call('format', format, iff=format),
576 49886c59 Stavros Sachtouris
                call('ignore_content_type', iff=ict)])
577 49886c59 Stavros Sachtouris
            im, inm, da, ct, ce, cd, sv, perms, public, metas = pm[2:]
578 49886c59 Stavros Sachtouris
            exp = [call('If-Match', im),
579 49886c59 Stavros Sachtouris
                call('If-None-Match', inm),
580 49886c59 Stavros Sachtouris
                call('Destination', dest),
581 49886c59 Stavros Sachtouris
                call('Destination-Account', da),
582 49886c59 Stavros Sachtouris
                call('Content-Type', ct),
583 49886c59 Stavros Sachtouris
                call('Content-Encoding', ce),
584 49886c59 Stavros Sachtouris
                call('Content-Disposition', cd),
585 49886c59 Stavros Sachtouris
                call('X-Source-Version', sv)]
586 49886c59 Stavros Sachtouris
            if perms:
587 49886c59 Stavros Sachtouris
                perm_str = ''
588 49886c59 Stavros Sachtouris
                for ptype, pval in perms.items():
589 49886c59 Stavros Sachtouris
                    if pval:
590 49886c59 Stavros Sachtouris
                        perm_str += ';' if perm_str else ''
591 49886c59 Stavros Sachtouris
                        perm_str += '%s=%s' % (ptype, ','.join(pval))
592 49886c59 Stavros Sachtouris
                exp += [call('X-Object-Sharing', perm_str)]
593 13c02904 Stavros Sachtouris
            exp += [call('X-Object-Public', public, public is not None)]
594 49886c59 Stavros Sachtouris
            for k, v in metas.items():
595 49886c59 Stavros Sachtouris
                exp += [call('X-Object-Meta-%s' % k, v)]
596 49886c59 Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
597 49886c59 Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
598 49886c59 Stavros Sachtouris
            self.assertEqual(copy.mock_calls[-1], call(
599 49886c59 Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
600 49886c59 Stavros Sachtouris
                *args,
601 49886c59 Stavros Sachtouris
                success=kwargs.pop('success', 201),
602 1a8bfa4f Stavros Sachtouris
                **kwargs))
603 1a8bfa4f Stavros Sachtouris
604 1a8bfa4f Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
605 1a8bfa4f Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
606 1a8bfa4f Stavros Sachtouris
    @patch('%s.move' % rest_pkg, return_value=FR())
607 1a8bfa4f Stavros Sachtouris
    def test_object_move(self, move, SH, SP):
608 1a8bfa4f Stavros Sachtouris
        for pm in product(
609 1a8bfa4f Stavros Sachtouris
                ('json', 'f0rm47'),
610 1a8bfa4f Stavros Sachtouris
                (False, True),
611 1a8bfa4f Stavros Sachtouris
                (None, 'ifmatch'),
612 1a8bfa4f Stavros Sachtouris
                (None, 'ifnonematch'),
613 1a8bfa4f Stavros Sachtouris
                (None, 'destination'),
614 1a8bfa4f Stavros Sachtouris
                (None, 'destinationaccount'),
615 1a8bfa4f Stavros Sachtouris
                (None, 'content-type'),
616 1a8bfa4f Stavros Sachtouris
                (None, 'content-encoding'),
617 1a8bfa4f Stavros Sachtouris
                (None, 'content-disp'),
618 1a8bfa4f Stavros Sachtouris
                (dict(), dict(read=['u1', 'g2'], write=['u1'])),
619 1a8bfa4f Stavros Sachtouris
                (False, True),
620 1a8bfa4f Stavros Sachtouris
                (dict(), dict(k2='v2', k3='v3')),
621 1a8bfa4f Stavros Sachtouris
                ((), ('someval',)),
622 1a8bfa4f Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
623 1a8bfa4f Stavros Sachtouris
            args, kwargs = pm[-2:]
624 1a8bfa4f Stavros Sachtouris
            pm = pm[:-2]
625 1a8bfa4f Stavros Sachtouris
            self.client.object_move(obj, *(pm + args), **kwargs)
626 1a8bfa4f Stavros Sachtouris
            format, ict = pm[:2]
627 1a8bfa4f Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
628 1a8bfa4f Stavros Sachtouris
                call('format', format, iff=format),
629 1a8bfa4f Stavros Sachtouris
                call('ignore_content_type', iff=ict)])
630 1a8bfa4f Stavros Sachtouris
            im, inm, d, da, ct, ce, cd, perms, public, metas = pm[2:]
631 1a8bfa4f Stavros Sachtouris
            exp = [call('If-Match', im),
632 1a8bfa4f Stavros Sachtouris
                call('If-None-Match', inm),
633 1a8bfa4f Stavros Sachtouris
                call('Destination', d),
634 1a8bfa4f Stavros Sachtouris
                call('Destination-Account', da),
635 1a8bfa4f Stavros Sachtouris
                call('Content-Type', ct),
636 1a8bfa4f Stavros Sachtouris
                call('Content-Encoding', ce),
637 1a8bfa4f Stavros Sachtouris
                call('Content-Disposition', cd)]
638 1a8bfa4f Stavros Sachtouris
            if perms:
639 1a8bfa4f Stavros Sachtouris
                perm_str = ''
640 1a8bfa4f Stavros Sachtouris
                for ptype, pval in perms.items():
641 1a8bfa4f Stavros Sachtouris
                    if pval:
642 1a8bfa4f Stavros Sachtouris
                        perm_str += ';' if perm_str else ''
643 1a8bfa4f Stavros Sachtouris
                        perm_str += '%s=%s' % (ptype, ','.join(pval))
644 776b275c Stavros Sachtouris
                exp += [call('X-Object-Sharing', perm_str, iff=perms)]
645 776b275c Stavros Sachtouris
            else:
646 776b275c Stavros Sachtouris
                exp += [call('X-Object-Sharing', '', iff={})]
647 13c02904 Stavros Sachtouris
            exp += [call('X-Object-Public', public, public is not None)]
648 1a8bfa4f Stavros Sachtouris
            for k, v in metas.items():
649 1a8bfa4f Stavros Sachtouris
                exp += [call('X-Object-Meta-%s' % k, v)]
650 1a8bfa4f Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
651 1a8bfa4f Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
652 1a8bfa4f Stavros Sachtouris
            self.assertEqual(move.mock_calls[-1], call(
653 1a8bfa4f Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
654 1a8bfa4f Stavros Sachtouris
                *args,
655 1a8bfa4f Stavros Sachtouris
                success=kwargs.pop('success', 201),
656 6cd86652 Stavros Sachtouris
                **kwargs))
657 6cd86652 Stavros Sachtouris
658 c639293b Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
659 c639293b Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
660 c639293b Stavros Sachtouris
    @patch('%s.post' % rest_pkg, return_value=FR())
661 c639293b Stavros Sachtouris
    def test_object_post(self, post, SH, SP):
662 c639293b Stavros Sachtouris
        for pm in product(
663 c639293b Stavros Sachtouris
                ('json', 'f0rm47'),
664 c639293b Stavros Sachtouris
                (False, True),
665 c639293b Stavros Sachtouris
                (dict(), dict(read=['u1', 'g2'], write=['u1'])),
666 c639293b Stavros Sachtouris
                (False, True),
667 c639293b Stavros Sachtouris
                (dict(), dict(k2='v2', k3='v3')),
668 c639293b Stavros Sachtouris
                ((), ('someval',)),
669 c639293b Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
670 c639293b Stavros Sachtouris
            args, kwargs = pm[-2:]
671 c639293b Stavros Sachtouris
            pm = pm[:-2]
672 c639293b Stavros Sachtouris
            terms = [None] * 13
673 c639293b Stavros Sachtouris
            for i in range(len(terms)):
674 c639293b Stavros Sachtouris
                if randint(0, 2):
675 c639293b Stavros Sachtouris
                    terms[i] = 'val_%s' % randint(13, 1024)
676 c639293b Stavros Sachtouris
            self.client.object_post(
677 c639293b Stavros Sachtouris
                obj,
678 c639293b Stavros Sachtouris
                *(pm[:2] + tuple(terms) + pm[2:] + args),
679 c639293b Stavros Sachtouris
                **kwargs)
680 c639293b Stavros Sachtouris
            format, update = pm[:2]
681 c639293b Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
682 c639293b Stavros Sachtouris
                call('format', format, iff=format),
683 776b275c Stavros Sachtouris
                call('update', '', iff=update)])
684 c639293b Stavros Sachtouris
            (
685 c639293b Stavros Sachtouris
                im, inm, clen, ctype, crng, trenc, cenc,
686 c639293b Stavros Sachtouris
                condis, srcobj, srcacc, srcvrs, obytes, mnfs) = terms
687 c639293b Stavros Sachtouris
            exp = [
688 c639293b Stavros Sachtouris
                call('If-Match', im),
689 c639293b Stavros Sachtouris
                call('If-None-Match', inm),
690 c639293b Stavros Sachtouris
                call('Content-Length', clen, iff=not trenc),
691 c639293b Stavros Sachtouris
                call('Content-Type', ctype),
692 c639293b Stavros Sachtouris
                call('Content-Range', crng),
693 c639293b Stavros Sachtouris
                call('Transfer-Encoding', trenc),
694 c639293b Stavros Sachtouris
                call('Content-Encoding', cenc),
695 c639293b Stavros Sachtouris
                call('Content-Disposition', condis),
696 c639293b Stavros Sachtouris
                call('X-Source-Object', srcobj),
697 c639293b Stavros Sachtouris
                call('X-Source-Account', srcacc),
698 c639293b Stavros Sachtouris
                call('X-Source-Version', srcvrs),
699 c639293b Stavros Sachtouris
                call('X-Object-Bytes', obytes),
700 c639293b Stavros Sachtouris
                call('X-Object-Manifest', mnfs)]
701 c639293b Stavros Sachtouris
            perms, public, metas = pm[2:]
702 c639293b Stavros Sachtouris
            if perms:
703 c639293b Stavros Sachtouris
                perm_str = ''
704 c639293b Stavros Sachtouris
                for ptype, pval in perms.items():
705 c639293b Stavros Sachtouris
                    if pval:
706 c639293b Stavros Sachtouris
                        perm_str += ';' if perm_str else ''
707 c639293b Stavros Sachtouris
                        perm_str += '%s=%s' % (ptype, ','.join(pval))
708 776b275c Stavros Sachtouris
                exp += [call('X-Object-Sharing', perm_str, iff=perms)]
709 776b275c Stavros Sachtouris
            else:
710 776b275c Stavros Sachtouris
                exp += [call('X-Object-Sharing', '', iff={})]
711 13c02904 Stavros Sachtouris
            exp += [call('X-Object-Public', public, public is not None)]
712 c639293b Stavros Sachtouris
            for k, v in metas.items():
713 c639293b Stavros Sachtouris
                exp += [call('X-Object-Meta-%s' % k, v)]
714 c639293b Stavros Sachtouris
            self.assertEqual(SH.mock_calls[- len(exp):], exp)
715 c639293b Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
716 c639293b Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(
717 c639293b Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
718 c639293b Stavros Sachtouris
                *args,
719 c639293b Stavros Sachtouris
                success=kwargs.pop('success', (202, 204)),
720 c639293b Stavros Sachtouris
                **kwargs))
721 c639293b Stavros Sachtouris
722 61c7a05f Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
723 61c7a05f Stavros Sachtouris
    @patch('%s.delete' % rest_pkg, return_value=FR())
724 61c7a05f Stavros Sachtouris
    def test_object_delete(self, delete, SP):
725 61c7a05f Stavros Sachtouris
        for pm in product(
726 61c7a05f Stavros Sachtouris
                (None, 'until'),
727 61c7a05f Stavros Sachtouris
                (None, 'delim'),
728 61c7a05f Stavros Sachtouris
                ((), ('someval',)),
729 61c7a05f Stavros Sachtouris
                (dict(), dict(success=400), dict(k='v', v='k'))):
730 61c7a05f Stavros Sachtouris
            args, kwargs = pm[-2:]
731 61c7a05f Stavros Sachtouris
            pm = pm[:-2]
732 61c7a05f Stavros Sachtouris
            self.client.object_delete(
733 61c7a05f Stavros Sachtouris
                obj,
734 61c7a05f Stavros Sachtouris
                *(pm + args),
735 61c7a05f Stavros Sachtouris
                **kwargs)
736 61c7a05f Stavros Sachtouris
            until, dlm = pm[-2:]
737 61c7a05f Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2:], [
738 61c7a05f Stavros Sachtouris
                call('until', until, iff=until),
739 61c7a05f Stavros Sachtouris
                call('delimiter', dlm, iff=dlm)])
740 61c7a05f Stavros Sachtouris
            acc, cont = self.client.account, self.client.container
741 61c7a05f Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(
742 61c7a05f Stavros Sachtouris
                '/%s/%s/%s' % (acc, cont, obj),
743 61c7a05f Stavros Sachtouris
                *args,
744 61c7a05f Stavros Sachtouris
                success=kwargs.pop('success', 204),
745 61c7a05f Stavros Sachtouris
                **kwargs))
746 61c7a05f Stavros Sachtouris
747 55faa0bc Stavros Sachtouris
748 776b275c Stavros Sachtouris
class PithosMethods(TestCase):
749 776b275c Stavros Sachtouris
750 776b275c Stavros Sachtouris
    def test__range_up(self):
751 776b275c Stavros Sachtouris
        from kamaki.clients.pithos import _range_up
752 776b275c Stavros Sachtouris
        for args, expected in (
753 776b275c Stavros Sachtouris
                ((0, 100, 1000, '10'), '0-10'),
754 776b275c Stavros Sachtouris
                ((0, 100, 1000, '-10'), ''),
755 776b275c Stavros Sachtouris
                ((900, 1000, 1000, '-10'), '990-1000'),
756 776b275c Stavros Sachtouris
                ((150, 250, 1000, '10'), ''),
757 776b275c Stavros Sachtouris
                ((10, 200, 1000, '130-170'), '130-170'),
758 776b275c Stavros Sachtouris
                ((150, 200, 1000, '130-170'), '150-170'),
759 776b275c Stavros Sachtouris
                ((100, 150, 1000, '130-170'), '130-150'),
760 776b275c Stavros Sachtouris
                ((200, 250, 1000, '130-170'), ''),
761 776b275c Stavros Sachtouris
                ((100, 250, 1000, '30-170,200-270'), '100-170,200-250'),
762 776b275c Stavros Sachtouris
                ((40, 950, 1000, '-170,200-270,50',), '830-950,200-270,40-50'),
763 776b275c Stavros Sachtouris
                ((740, 900, 1000, '-170,200-270,50',), '830-900'),
764 776b275c Stavros Sachtouris
                ((42, 333, 800, '100,50-200,-600',), '42-100,50-200,200-333')):
765 776b275c Stavros Sachtouris
            self.assertEqual(_range_up(*args), expected)
766 776b275c Stavros Sachtouris
767 776b275c Stavros Sachtouris
768 3c50df2e Stavros Sachtouris
class PithosClient(TestCase):
769 c1004a00 Stavros Sachtouris
770 24851aa5 Stavros Sachtouris
    files = []
771 c1004a00 Stavros Sachtouris
772 cb65588d Stavros Sachtouris
    def _create_temp_file(self, num_of_blocks):
773 2a7292f1 Stavros Sachtouris
        self.files.append(NamedTemporaryFile())
774 2a7292f1 Stavros Sachtouris
        tmpFile = self.files[-1]
775 2a7292f1 Stavros Sachtouris
        file_size = num_of_blocks * 4 * 1024 * 1024
776 2a7292f1 Stavros Sachtouris
        print('\n\tCreate tmp file')
777 2a7292f1 Stavros Sachtouris
        tmpFile.write(urandom(file_size))
778 2a7292f1 Stavros Sachtouris
        tmpFile.flush()
779 2a7292f1 Stavros Sachtouris
        tmpFile.seek(0)
780 2a7292f1 Stavros Sachtouris
        print('\t\tDone')
781 2a7292f1 Stavros Sachtouris
        return tmpFile
782 2a7292f1 Stavros Sachtouris
783 24851aa5 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
784 24851aa5 Stavros Sachtouris
        for k, v in d1.items():
785 24851aa5 Stavros Sachtouris
            self.assertTrue(k in d2)
786 24851aa5 Stavros Sachtouris
            if isinstance(v, dict):
787 24851aa5 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
788 24851aa5 Stavros Sachtouris
            else:
789 24851aa5 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
790 c1004a00 Stavros Sachtouris
791 24851aa5 Stavros Sachtouris
    def setUp(self):
792 24851aa5 Stavros Sachtouris
        self.url = 'https://www.example.com/pithos'
793 24851aa5 Stavros Sachtouris
        self.token = 'p17h0570k3n'
794 3c50df2e Stavros Sachtouris
        self.client = pithos.PithosClient(self.url, self.token)
795 24851aa5 Stavros Sachtouris
        self.client.account = user_id
796 24851aa5 Stavros Sachtouris
        self.client.container = 'c0nt@1n3r_i'
797 c1004a00 Stavros Sachtouris
798 c1004a00 Stavros Sachtouris
    def tearDown(self):
799 c6da1ccc Stavros Sachtouris
        FR.headers = dict()
800 c6da1ccc Stavros Sachtouris
        FR.status_code = 200
801 c6da1ccc Stavros Sachtouris
        FR.json = dict()
802 c6da1ccc Stavros Sachtouris
        FR.content = FR.json
803 cf687343 Stavros Sachtouris
        for f in self.files:
804 cf687343 Stavros Sachtouris
            f.close()
805 24851aa5 Stavros Sachtouris
806 2a7292f1 Stavros Sachtouris
    #  Pithos+ methods that extend storage API
807 2a7292f1 Stavros Sachtouris
808 b1738762 Stavros Sachtouris
    @patch('%s.account_head' % pithos_pkg, return_value=FR())
809 ceb84616 Stavros Sachtouris
    def test_get_account_info(self, AH):
810 c6da1ccc Stavros Sachtouris
        FR.headers = account_info
811 98a7195e Stavros Sachtouris
        for until in (None, 'un71L-d473'):
812 98a7195e Stavros Sachtouris
            r = self.client.get_account_info(until=until)
813 98a7195e Stavros Sachtouris
            self.assert_dicts_are_equal(r, account_info)
814 98a7195e Stavros Sachtouris
            self.assertEqual(AH.mock_calls[-1], call(until=until))
815 b1738762 Stavros Sachtouris
        FR.status_code = 401
816 b1738762 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.get_account_info)
817 514f9b88 Stavros Sachtouris
818 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
819 98a7195e Stavros Sachtouris
    def test_del_account_meta(self, AP):
820 8c599ca2 Stavros Sachtouris
        keys = ['k1', 'k2', 'k3']
821 20387cd4 Stavros Sachtouris
        for key in keys:
822 20387cd4 Stavros Sachtouris
            self.client.del_account_meta(key)
823 98a7195e Stavros Sachtouris
            self.assertEqual(
824 98a7195e Stavros Sachtouris
                AP.mock_calls[-1],
825 98a7195e Stavros Sachtouris
                call(update=True, metadata={key: ''}))
826 20387cd4 Stavros Sachtouris
827 20387cd4 Stavros Sachtouris
    @patch('%s.container_head' % pithos_pkg, return_value=FR())
828 98a7195e Stavros Sachtouris
    def test_get_container_info(self, CH):
829 c6da1ccc Stavros Sachtouris
        FR.headers = container_info
830 20387cd4 Stavros Sachtouris
        r = self.client.get_container_info()
831 20387cd4 Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
832 20387cd4 Stavros Sachtouris
        u = 'some date'
833 20387cd4 Stavros Sachtouris
        r = self.client.get_container_info(until=u)
834 98a7195e Stavros Sachtouris
        self.assertEqual(CH.mock_calls, [call(until=None), call(until=u)])
835 20387cd4 Stavros Sachtouris
836 20387cd4 Stavros Sachtouris
    @patch('%s.account_get' % pithos_pkg, return_value=FR())
837 20387cd4 Stavros Sachtouris
    def test_list_containers(self, get):
838 c6da1ccc Stavros Sachtouris
        FR.json = container_list
839 20387cd4 Stavros Sachtouris
        r = self.client.list_containers()
840 98a7195e Stavros Sachtouris
        get.assert_called_once_with()
841 20387cd4 Stavros Sachtouris
        for i in range(len(r)):
842 20387cd4 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], container_list[i])
843 bcbf3cf0 Stavros Sachtouris
844 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
845 f847a0cc Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
846 f847a0cc Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
847 98a7195e Stavros Sachtouris
    def test_upload_object(self, OP, CP, GCI):
848 cb65588d Stavros Sachtouris
        num_of_blocks = 8
849 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
850 cf687343 Stavros Sachtouris
851 2a7292f1 Stavros Sachtouris
        # Without kwargs
852 3c216009 Stavros Sachtouris
        exp_headers = dict(id='container id', name='container name')
853 3c216009 Stavros Sachtouris
        FR.headers = dict(exp_headers)
854 3c216009 Stavros Sachtouris
        r = self.client.upload_object(obj, tmpFile)
855 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
856 98a7195e Stavros Sachtouris
        self.assertEqual(GCI.mock_calls[-1], call())
857 dcfe7455 Stavros Sachtouris
858 98a7195e Stavros Sachtouris
        [call1, call2] = OP.mock_calls
859 dcfe7455 Stavros Sachtouris
        (args1, kwargs1) = call1[1:3]
860 dcfe7455 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
861 dcfe7455 Stavros Sachtouris
        self.assertEqual(args1, (obj,))
862 dcfe7455 Stavros Sachtouris
        expected1 = dict(
863 dcfe7455 Stavros Sachtouris
            hashmap=True,
864 dcfe7455 Stavros Sachtouris
            success=(201, 409),
865 dcfe7455 Stavros Sachtouris
            format='json',
866 dcfe7455 Stavros Sachtouris
            json=dict(
867 dcfe7455 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
868 dcfe7455 Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
869 dcfe7455 Stavros Sachtouris
            content_encoding=None,
870 dcfe7455 Stavros Sachtouris
            content_type='application/octet-stream',
871 dcfe7455 Stavros Sachtouris
            content_disposition=None,
872 dcfe7455 Stavros Sachtouris
            public=None,
873 dcfe7455 Stavros Sachtouris
            permissions=None)
874 dcfe7455 Stavros Sachtouris
        for k, v in expected1.items():
875 dcfe7455 Stavros Sachtouris
            if k == 'json':
876 dcfe7455 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs1[k]['hashes']))
877 dcfe7455 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs1[k]['bytes'])
878 dcfe7455 Stavros Sachtouris
            else:
879 dcfe7455 Stavros Sachtouris
                self.assertEqual(v, kwargs1[k])
880 bcbf3cf0 Stavros Sachtouris
881 dcfe7455 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
882 dcfe7455 Stavros Sachtouris
        self.assertEqual(args2, (obj,))
883 dcfe7455 Stavros Sachtouris
        expected2 = dict(
884 dcfe7455 Stavros Sachtouris
            json=dict(
885 dcfe7455 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
886 dcfe7455 Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
887 dcfe7455 Stavros Sachtouris
            content_type='application/octet-stream',
888 dcfe7455 Stavros Sachtouris
            hashmap=True,
889 dcfe7455 Stavros Sachtouris
            success=201,
890 dcfe7455 Stavros Sachtouris
            format='json')
891 dcfe7455 Stavros Sachtouris
        for k, v in expected2.items():
892 dcfe7455 Stavros Sachtouris
            if k == 'json':
893 dcfe7455 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs2[k]['hashes']))
894 dcfe7455 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs2[k]['bytes'])
895 dcfe7455 Stavros Sachtouris
            else:
896 dcfe7455 Stavros Sachtouris
                self.assertEqual(v, kwargs2[k])
897 dcfe7455 Stavros Sachtouris
898 dcfe7455 Stavros Sachtouris
        mock_offset = 2
899 dcfe7455 Stavros Sachtouris
900 dcfe7455 Stavros Sachtouris
        #  With progress bars
901 dcfe7455 Stavros Sachtouris
        try:
902 dcfe7455 Stavros Sachtouris
            from progress.bar import ShadyBar
903 dcfe7455 Stavros Sachtouris
            blck_bar = ShadyBar('Mock blck calc.')
904 dcfe7455 Stavros Sachtouris
            upld_bar = ShadyBar('Mock uplds')
905 dcfe7455 Stavros Sachtouris
        except ImportError:
906 dcfe7455 Stavros Sachtouris
            blck_bar = None
907 dcfe7455 Stavros Sachtouris
            upld_bar = None
908 dcfe7455 Stavros Sachtouris
909 dcfe7455 Stavros Sachtouris
        if blck_bar and upld_bar:
910 dcfe7455 Stavros Sachtouris
911 dcfe7455 Stavros Sachtouris
            def blck_gen(n):
912 dcfe7455 Stavros Sachtouris
                for i in blck_bar.iter(range(n)):
913 dcfe7455 Stavros Sachtouris
                    yield
914 dcfe7455 Stavros Sachtouris
                yield
915 dcfe7455 Stavros Sachtouris
916 dcfe7455 Stavros Sachtouris
            def upld_gen(n):
917 dcfe7455 Stavros Sachtouris
                for i in upld_bar.iter(range(n)):
918 dcfe7455 Stavros Sachtouris
                    yield
919 dcfe7455 Stavros Sachtouris
                yield
920 dcfe7455 Stavros Sachtouris
921 dcfe7455 Stavros Sachtouris
            tmpFile.seek(0)
922 dcfe7455 Stavros Sachtouris
            r = self.client.upload_object(
923 dcfe7455 Stavros Sachtouris
                obj, tmpFile,
924 dcfe7455 Stavros Sachtouris
                hash_cb=blck_gen, upload_cb=upld_gen)
925 dcfe7455 Stavros Sachtouris
            self.assert_dicts_are_equal(r, exp_headers)
926 dcfe7455 Stavros Sachtouris
927 dcfe7455 Stavros Sachtouris
            for i, c in enumerate(OP.mock_calls[-mock_offset:]):
928 dcfe7455 Stavros Sachtouris
                self.assertEqual(OP.mock_calls[i], c)
929 dcfe7455 Stavros Sachtouris
930 dcfe7455 Stavros Sachtouris
        #  With content-type
931 dcfe7455 Stavros Sachtouris
        tmpFile.seek(0)
932 dcfe7455 Stavros Sachtouris
        ctype = 'video/mpeg'
933 dcfe7455 Stavros Sachtouris
        sharing = dict(read=['u1', 'g1', 'u2'], write=['u1'])
934 dcfe7455 Stavros Sachtouris
        r = self.client.upload_object(obj, tmpFile,
935 dcfe7455 Stavros Sachtouris
            content_type=ctype, sharing=sharing)
936 dcfe7455 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
937 dcfe7455 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['content_type'], ctype)
938 dcfe7455 Stavros Sachtouris
        self.assert_dicts_are_equal(
939 dcfe7455 Stavros Sachtouris
            OP.mock_calls[-2][2]['permissions'],
940 dcfe7455 Stavros Sachtouris
            sharing)
941 dcfe7455 Stavros Sachtouris
942 dcfe7455 Stavros Sachtouris
        # With other args
943 dcfe7455 Stavros Sachtouris
        tmpFile.seek(0)
944 dcfe7455 Stavros Sachtouris
        kwargs = dict(
945 dcfe7455 Stavros Sachtouris
            etag='s0m3E74g',
946 dcfe7455 Stavros Sachtouris
            if_etag_match='if etag match',
947 dcfe7455 Stavros Sachtouris
            if_not_exist=True,
948 dcfe7455 Stavros Sachtouris
            content_type=ctype,
949 dcfe7455 Stavros Sachtouris
            content_disposition=ctype + 'd15p051710n',
950 dcfe7455 Stavros Sachtouris
            public=True,
951 dcfe7455 Stavros Sachtouris
            content_encoding='802.11',
952 dcfe7455 Stavros Sachtouris
            container_info_cache={})
953 dcfe7455 Stavros Sachtouris
        r = self.client.upload_object(obj, tmpFile, **kwargs)
954 dcfe7455 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
955 dcfe7455 Stavros Sachtouris
956 dcfe7455 Stavros Sachtouris
        kwargs.pop('if_not_exist')
957 dcfe7455 Stavros Sachtouris
        ematch = kwargs.pop('if_etag_match')
958 dcfe7455 Stavros Sachtouris
        etag = kwargs.pop('etag')
959 dcfe7455 Stavros Sachtouris
        self.assert_dicts_are_equal(
960 dcfe7455 Stavros Sachtouris
            kwargs.pop('container_info_cache'),
961 dcfe7455 Stavros Sachtouris
            {self.client.container: container_info})
962 dcfe7455 Stavros Sachtouris
        for arg, val in kwargs.items():
963 dcfe7455 Stavros Sachtouris
            self.assertEqual(OP.mock_calls[-2][2][arg], val)
964 dcfe7455 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['if_etag_match'], ematch)
965 dcfe7455 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['if_etag_not_match'], '*')
966 dcfe7455 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['etag'], etag)
967 dcfe7455 Stavros Sachtouris
968 dcfe7455 Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
969 dcfe7455 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
970 dcfe7455 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
971 dcfe7455 Stavros Sachtouris
    def test_upload_from_string(self, OP, CP, GCI):
972 dcfe7455 Stavros Sachtouris
        num_of_blocks = 2
973 dcfe7455 Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
974 dcfe7455 Stavros Sachtouris
        tmpFile.seek(0)
975 dcfe7455 Stavros Sachtouris
        src_str = tmpFile.read()
976 dcfe7455 Stavros Sachtouris
977 dcfe7455 Stavros Sachtouris
        exp_headers = dict(id='container id', name='container name')
978 dcfe7455 Stavros Sachtouris
        FR.headers = dict(exp_headers)
979 dcfe7455 Stavros Sachtouris
        r = self.client.upload_from_string(obj, src_str)
980 dcfe7455 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
981 dcfe7455 Stavros Sachtouris
        self.assertEqual(GCI.mock_calls[-1], call())
982 dcfe7455 Stavros Sachtouris
983 dcfe7455 Stavros Sachtouris
        [call1, call2] = OP.mock_calls
984 cf687343 Stavros Sachtouris
        (args1, kwargs1) = call1[1:3]
985 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
986 cf687343 Stavros Sachtouris
        self.assertEqual(args1, (obj,))
987 cf687343 Stavros Sachtouris
        expected1 = dict(
988 bcbf3cf0 Stavros Sachtouris
            hashmap=True,
989 bcbf3cf0 Stavros Sachtouris
            success=(201, 409),
990 bcbf3cf0 Stavros Sachtouris
            format='json',
991 bcbf3cf0 Stavros Sachtouris
            json=dict(
992 bcbf3cf0 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
993 cb65588d Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
994 bcbf3cf0 Stavros Sachtouris
            content_encoding=None,
995 bcbf3cf0 Stavros Sachtouris
            content_type='application/octet-stream',
996 bcbf3cf0 Stavros Sachtouris
            content_disposition=None,
997 bcbf3cf0 Stavros Sachtouris
            public=None,
998 bcbf3cf0 Stavros Sachtouris
            permissions=None)
999 cf687343 Stavros Sachtouris
        for k, v in expected1.items():
1000 cf687343 Stavros Sachtouris
            if k == 'json':
1001 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs1[k]['hashes']))
1002 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs1[k]['bytes'])
1003 cf687343 Stavros Sachtouris
            else:
1004 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs1[k])
1005 cf687343 Stavros Sachtouris
1006 cf687343 Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
1007 cf687343 Stavros Sachtouris
        self.assertEqual(args2, (obj,))
1008 cf687343 Stavros Sachtouris
        expected2 = dict(
1009 cf687343 Stavros Sachtouris
            json=dict(
1010 cf687343 Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
1011 cb65588d Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
1012 cf687343 Stavros Sachtouris
            content_type='application/octet-stream',
1013 cf687343 Stavros Sachtouris
            hashmap=True,
1014 cf687343 Stavros Sachtouris
            success=201,
1015 cf687343 Stavros Sachtouris
            format='json')
1016 cf687343 Stavros Sachtouris
        for k, v in expected2.items():
1017 bcbf3cf0 Stavros Sachtouris
            if k == 'json':
1018 cf687343 Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs2[k]['hashes']))
1019 cf687343 Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs2[k]['bytes'])
1020 bcbf3cf0 Stavros Sachtouris
            else:
1021 cf687343 Stavros Sachtouris
                self.assertEqual(v, kwargs2[k])
1022 cf687343 Stavros Sachtouris
1023 cf687343 Stavros Sachtouris
        mock_offset = 2
1024 cf687343 Stavros Sachtouris
1025 cf687343 Stavros Sachtouris
        #  With progress bars
1026 cf687343 Stavros Sachtouris
        try:
1027 cf687343 Stavros Sachtouris
            from progress.bar import ShadyBar
1028 cf687343 Stavros Sachtouris
            blck_bar = ShadyBar('Mock blck calc.')
1029 cf687343 Stavros Sachtouris
            upld_bar = ShadyBar('Mock uplds')
1030 cf687343 Stavros Sachtouris
        except ImportError:
1031 cf687343 Stavros Sachtouris
            blck_bar = None
1032 cf687343 Stavros Sachtouris
            upld_bar = None
1033 cf687343 Stavros Sachtouris
1034 cf687343 Stavros Sachtouris
        if blck_bar and upld_bar:
1035 cf687343 Stavros Sachtouris
1036 cf687343 Stavros Sachtouris
            def blck_gen(n):
1037 cf687343 Stavros Sachtouris
                for i in blck_bar.iter(range(n)):
1038 cf687343 Stavros Sachtouris
                    yield
1039 cf687343 Stavros Sachtouris
                yield
1040 cf687343 Stavros Sachtouris
1041 cf687343 Stavros Sachtouris
            def upld_gen(n):
1042 cf687343 Stavros Sachtouris
                for i in upld_bar.iter(range(n)):
1043 cf687343 Stavros Sachtouris
                    yield
1044 cf687343 Stavros Sachtouris
                yield
1045 cf687343 Stavros Sachtouris
1046 cf687343 Stavros Sachtouris
            tmpFile.seek(0)
1047 3c216009 Stavros Sachtouris
            r = self.client.upload_object(
1048 cf687343 Stavros Sachtouris
                obj, tmpFile,
1049 cf687343 Stavros Sachtouris
                hash_cb=blck_gen, upload_cb=upld_gen)
1050 3c216009 Stavros Sachtouris
            self.assert_dicts_are_equal(r, exp_headers)
1051 cf687343 Stavros Sachtouris
1052 cf687343 Stavros Sachtouris
            for i, c in enumerate(OP.mock_calls[-mock_offset:]):
1053 cf687343 Stavros Sachtouris
                self.assertEqual(OP.mock_calls[i], c)
1054 cf687343 Stavros Sachtouris
1055 cf687343 Stavros Sachtouris
        #  With content-type
1056 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
1057 cf687343 Stavros Sachtouris
        ctype = 'video/mpeg'
1058 cf687343 Stavros Sachtouris
        sharing = dict(read=['u1', 'g1', 'u2'], write=['u1'])
1059 5c2058e7 Stavros Sachtouris
        r = self.client.upload_object(
1060 5c2058e7 Stavros Sachtouris
            obj, tmpFile,
1061 cf687343 Stavros Sachtouris
            content_type=ctype, sharing=sharing)
1062 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
1063 cf687343 Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['content_type'], ctype)
1064 cf687343 Stavros Sachtouris
        self.assert_dicts_are_equal(
1065 cf687343 Stavros Sachtouris
            OP.mock_calls[-2][2]['permissions'],
1066 cf687343 Stavros Sachtouris
            sharing)
1067 cf687343 Stavros Sachtouris
1068 cf687343 Stavros Sachtouris
        # With other args
1069 cf687343 Stavros Sachtouris
        tmpFile.seek(0)
1070 cf687343 Stavros Sachtouris
        kwargs = dict(
1071 cf687343 Stavros Sachtouris
            etag='s0m3E74g',
1072 e9ac514e Stavros Sachtouris
            if_etag_match='if etag match',
1073 524d9cdd Stavros Sachtouris
            if_not_exist=True,
1074 cf687343 Stavros Sachtouris
            content_type=ctype,
1075 cf687343 Stavros Sachtouris
            content_disposition=ctype + 'd15p051710n',
1076 cf687343 Stavros Sachtouris
            public=True,
1077 0ef0db9f Stavros Sachtouris
            content_encoding='802.11',
1078 0ef0db9f Stavros Sachtouris
            container_info_cache={})
1079 3c216009 Stavros Sachtouris
        r = self.client.upload_object(obj, tmpFile, **kwargs)
1080 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, exp_headers)
1081 3c216009 Stavros Sachtouris
1082 524d9cdd Stavros Sachtouris
        kwargs.pop('if_not_exist')
1083 e9ac514e Stavros Sachtouris
        ematch = kwargs.pop('if_etag_match')
1084 524d9cdd Stavros Sachtouris
        etag = kwargs.pop('etag')
1085 0ef0db9f Stavros Sachtouris
        self.assert_dicts_are_equal(
1086 0ef0db9f Stavros Sachtouris
            kwargs.pop('container_info_cache'),
1087 0ef0db9f Stavros Sachtouris
            {self.client.container: container_info})
1088 cf687343 Stavros Sachtouris
        for arg, val in kwargs.items():
1089 cf687343 Stavros Sachtouris
            self.assertEqual(OP.mock_calls[-2][2][arg], val)
1090 e9ac514e Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['if_etag_match'], ematch)
1091 524d9cdd Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['if_etag_not_match'], '*')
1092 524d9cdd Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['etag'], etag)
1093 b4780663 Stavros Sachtouris
1094 723e9d47 Stavros Sachtouris
    def test_get_object_info(self):
1095 c6da1ccc Stavros Sachtouris
        FR.headers = object_info
1096 723e9d47 Stavros Sachtouris
        version = 'v3r510n'
1097 55faa0bc Stavros Sachtouris
        with patch.object(
1098 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'object_head',
1099 55faa0bc Stavros Sachtouris
                return_value=FR()) as head:
1100 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj)
1101 723e9d47 Stavros Sachtouris
            self.assertEqual(r, object_info)
1102 723e9d47 Stavros Sachtouris
            r = self.client.get_object_info(obj, version=version)
1103 723e9d47 Stavros Sachtouris
            self.assertEqual(head.mock_calls, [
1104 723e9d47 Stavros Sachtouris
                call(obj, version=None),
1105 723e9d47 Stavros Sachtouris
                call(obj, version=version)])
1106 723e9d47 Stavros Sachtouris
        with patch.object(
1107 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'object_head',
1108 723e9d47 Stavros Sachtouris
                side_effect=ClientError('Obj not found', 404)):
1109 723e9d47 Stavros Sachtouris
            self.assertRaises(
1110 723e9d47 Stavros Sachtouris
                ClientError,
1111 723e9d47 Stavros Sachtouris
                self.client.get_object_info,
1112 723e9d47 Stavros Sachtouris
                obj, version=version)
1113 3e2e07be Stavros Sachtouris
1114 20387cd4 Stavros Sachtouris
    @patch('%s.get_object_info' % pithos_pkg, return_value=object_info)
1115 20387cd4 Stavros Sachtouris
    def test_get_object_meta(self, GOI):
1116 5ea1e2ac Stavros Sachtouris
        for version in (None, 'v3r510n'):
1117 5ea1e2ac Stavros Sachtouris
            r = self.client.get_object_meta(obj, version)
1118 5ea1e2ac Stavros Sachtouris
            for k in [k for k in object_info if k.startswith('x-object-meta')]:
1119 5ea1e2ac Stavros Sachtouris
                self.assertEqual(r.pop(k), object_info[k])
1120 5ea1e2ac Stavros Sachtouris
            self.assertFalse(len(r))
1121 5ea1e2ac Stavros Sachtouris
            self.assertEqual(GOI.mock_calls[-1], call(obj, version=version))
1122 da1597b9 Stavros Sachtouris
1123 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1124 20387cd4 Stavros Sachtouris
    def test_del_object_meta(self, post):
1125 da1597b9 Stavros Sachtouris
        metakey = '50m3m3t4k3y'
1126 20387cd4 Stavros Sachtouris
        self.client.del_object_meta(obj, metakey)
1127 98a7195e Stavros Sachtouris
        post.assert_called_once_with(obj, update=True, metadata={metakey: ''})
1128 bd3a524f Stavros Sachtouris
1129 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
1130 20387cd4 Stavros Sachtouris
    def test_copy_object(self, put):
1131 33487500 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
1132 33487500 Stavros Sachtouris
        src_obj = 'src-0bj'
1133 33487500 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
1134 33487500 Stavros Sachtouris
        dst_obj = 'dst-0bj'
1135 33487500 Stavros Sachtouris
        expected = call(
1136 33487500 Stavros Sachtouris
            src_obj,
1137 33487500 Stavros Sachtouris
            content_length=0,
1138 33487500 Stavros Sachtouris
            source_account=None,
1139 33487500 Stavros Sachtouris
            success=201,
1140 33487500 Stavros Sachtouris
            copy_from='/%s/%s' % (src_cont, src_obj),
1141 33487500 Stavros Sachtouris
            delimiter=None,
1142 33487500 Stavros Sachtouris
            content_type=None,
1143 33487500 Stavros Sachtouris
            source_version=None,
1144 33487500 Stavros Sachtouris
            public=False)
1145 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont)
1146 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
1147 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, dst_obj)
1148 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
1149 20387cd4 Stavros Sachtouris
        kwargs = dict(
1150 20387cd4 Stavros Sachtouris
            source_version='src-v3r510n',
1151 20387cd4 Stavros Sachtouris
            source_account='src-4cc0un7',
1152 20387cd4 Stavros Sachtouris
            public=True,
1153 20387cd4 Stavros Sachtouris
            content_type='c0n73n7Typ3',
1154 20387cd4 Stavros Sachtouris
            delimiter='5')
1155 20387cd4 Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, **kwargs)
1156 20387cd4 Stavros Sachtouris
        for k, v in kwargs.items():
1157 20387cd4 Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
1158 898e6fb7 Stavros Sachtouris
1159 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
1160 20387cd4 Stavros Sachtouris
    def test_move_object(self, put):
1161 898e6fb7 Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
1162 898e6fb7 Stavros Sachtouris
        src_obj = 'src-0bj'
1163 898e6fb7 Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
1164 898e6fb7 Stavros Sachtouris
        dst_obj = 'dst-0bj'
1165 898e6fb7 Stavros Sachtouris
        expected = call(
1166 898e6fb7 Stavros Sachtouris
            src_obj,
1167 898e6fb7 Stavros Sachtouris
            content_length=0,
1168 898e6fb7 Stavros Sachtouris
            source_account=None,
1169 898e6fb7 Stavros Sachtouris
            success=201,
1170 898e6fb7 Stavros Sachtouris
            move_from='/%s/%s' % (src_cont, src_obj),
1171 898e6fb7 Stavros Sachtouris
            delimiter=None,
1172 898e6fb7 Stavros Sachtouris
            content_type=None,
1173 898e6fb7 Stavros Sachtouris
            source_version=None,
1174 898e6fb7 Stavros Sachtouris
            public=False)
1175 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont)
1176 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
1177 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, dst_obj)
1178 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
1179 20387cd4 Stavros Sachtouris
        kwargs = dict(
1180 20387cd4 Stavros Sachtouris
            source_version='src-v3r510n',
1181 20387cd4 Stavros Sachtouris
            source_account='src-4cc0un7',
1182 20387cd4 Stavros Sachtouris
            public=True,
1183 20387cd4 Stavros Sachtouris
            content_type='c0n73n7Typ3',
1184 20387cd4 Stavros Sachtouris
            delimiter='5')
1185 20387cd4 Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, **kwargs)
1186 20387cd4 Stavros Sachtouris
        for k, v in kwargs.items():
1187 20387cd4 Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
1188 39c737d4 Stavros Sachtouris
1189 2a7292f1 Stavros Sachtouris
    #  Pithos+ only methods
1190 2a7292f1 Stavros Sachtouris
1191 5655d560 Stavros Sachtouris
    @patch('%s.container_put' % pithos_pkg, return_value=FR())
1192 5655d560 Stavros Sachtouris
    def test_create_container(self, CP):
1193 5655d560 Stavros Sachtouris
        FR.headers = container_info
1194 5655d560 Stavros Sachtouris
        cont = 'an0th3r_c0n741n3r'
1195 5655d560 Stavros Sachtouris
1196 5655d560 Stavros Sachtouris
        r = self.client.create_container()
1197 5655d560 Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
1198 5655d560 Stavros Sachtouris
        CP.assert_called_once_with(quota=None, versioning=None, metadata=None)
1199 5655d560 Stavros Sachtouris
1200 5655d560 Stavros Sachtouris
        bu_cont = self.client.container
1201 5655d560 Stavros Sachtouris
        r = self.client.create_container(cont)
1202 5655d560 Stavros Sachtouris
        self.assertEqual(self.client.container, bu_cont)
1203 5655d560 Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
1204 5655d560 Stavros Sachtouris
        self.assertEqual(
1205 5655d560 Stavros Sachtouris
            CP.mock_calls[-1],
1206 5655d560 Stavros Sachtouris
            call(quota=None, versioning=None, metadata=None))
1207 5655d560 Stavros Sachtouris
1208 5655d560 Stavros Sachtouris
        meta = dict(k1='v1', k2='v2')
1209 5655d560 Stavros Sachtouris
        r = self.client.create_container(cont, 42, 'auto', meta)
1210 5655d560 Stavros Sachtouris
        self.assertEqual(self.client.container, bu_cont)
1211 5655d560 Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
1212 5655d560 Stavros Sachtouris
        self.assertEqual(
1213 5655d560 Stavros Sachtouris
            CP.mock_calls[-1],
1214 5655d560 Stavros Sachtouris
            call(quota=42, versioning='auto', metadata=meta))
1215 5655d560 Stavros Sachtouris
1216 20387cd4 Stavros Sachtouris
    @patch('%s.container_delete' % pithos_pkg, return_value=FR())
1217 98a7195e Stavros Sachtouris
    def test_purge_container(self, CD):
1218 20387cd4 Stavros Sachtouris
        self.client.purge_container()
1219 98a7195e Stavros Sachtouris
        self.assertTrue('until' in CD.mock_calls[-1][2])
1220 20387cd4 Stavros Sachtouris
        cont = self.client.container
1221 20387cd4 Stavros Sachtouris
        self.client.purge_container('another-container')
1222 20387cd4 Stavros Sachtouris
        self.assertEqual(self.client.container, cont)
1223 2a7292f1 Stavros Sachtouris
1224 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
1225 20387cd4 Stavros Sachtouris
    def test_upload_object_unchunked(self, put):
1226 cb65588d Stavros Sachtouris
        num_of_blocks = 8
1227 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
1228 2a7292f1 Stavros Sachtouris
        expected = dict(
1229 2a7292f1 Stavros Sachtouris
                success=201,
1230 cb65588d Stavros Sachtouris
                data=num_of_blocks * 4 * 1024 * 1024,
1231 2a7292f1 Stavros Sachtouris
                etag='some-etag',
1232 2a7292f1 Stavros Sachtouris
                content_encoding='some content_encoding',
1233 2a7292f1 Stavros Sachtouris
                content_type='some content-type',
1234 2a7292f1 Stavros Sachtouris
                content_disposition='some content_disposition',
1235 2a7292f1 Stavros Sachtouris
                public=True,
1236 2a7292f1 Stavros Sachtouris
                permissions=dict(read=['u1', 'g1', 'u2'], write=['u1']))
1237 3c216009 Stavros Sachtouris
        r = self.client.upload_object_unchunked(obj, tmpFile)
1238 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, FR.headers)
1239 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (obj,))
1240 20387cd4 Stavros Sachtouris
        self.assertEqual(
1241 20387cd4 Stavros Sachtouris
            sorted(put.mock_calls[-1][2].keys()),
1242 20387cd4 Stavros Sachtouris
            sorted(expected.keys()))
1243 20387cd4 Stavros Sachtouris
        kwargs = dict(expected)
1244 20387cd4 Stavros Sachtouris
        kwargs.pop('success')
1245 20387cd4 Stavros Sachtouris
        kwargs['size'] = kwargs.pop('data')
1246 20387cd4 Stavros Sachtouris
        kwargs['sharing'] = kwargs.pop('permissions')
1247 20387cd4 Stavros Sachtouris
        tmpFile.seek(0)
1248 3c216009 Stavros Sachtouris
        r = self.client.upload_object_unchunked(obj, tmpFile, **kwargs)
1249 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, FR.headers)
1250 20387cd4 Stavros Sachtouris
        pmc = put.mock_calls[-1][2]
1251 20387cd4 Stavros Sachtouris
        for k, v in expected.items():
1252 20387cd4 Stavros Sachtouris
            if k == 'data':
1253 20387cd4 Stavros Sachtouris
                self.assertEqual(len(pmc[k]), v)
1254 20387cd4 Stavros Sachtouris
            else:
1255 20387cd4 Stavros Sachtouris
                self.assertEqual(pmc[k], v)
1256 20387cd4 Stavros Sachtouris
        self.assertRaises(
1257 20387cd4 Stavros Sachtouris
            ClientError,
1258 20387cd4 Stavros Sachtouris
            self.client.upload_object_unchunked,
1259 20387cd4 Stavros Sachtouris
            obj, tmpFile, withHashFile=True)
1260 e82edbb0 Stavros Sachtouris
1261 20387cd4 Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
1262 20387cd4 Stavros Sachtouris
    def test_create_object_by_manifestation(self, put):
1263 e82edbb0 Stavros Sachtouris
        manifest = '%s/%s' % (self.client.container, obj)
1264 e82edbb0 Stavros Sachtouris
        kwargs = dict(
1265 e82edbb0 Stavros Sachtouris
                etag='some-etag',
1266 e82edbb0 Stavros Sachtouris
                content_encoding='some content_encoding',
1267 e82edbb0 Stavros Sachtouris
                content_type='some content-type',
1268 e82edbb0 Stavros Sachtouris
                content_disposition='some content_disposition',
1269 e82edbb0 Stavros Sachtouris
                public=True,
1270 e82edbb0 Stavros Sachtouris
                sharing=dict(read=['u1', 'g1', 'u2'], write=['u1']))
1271 3c216009 Stavros Sachtouris
        r = self.client.create_object_by_manifestation(obj)
1272 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, FR.headers)
1273 20387cd4 Stavros Sachtouris
        expected = dict(content_length=0, manifest=manifest)
1274 20387cd4 Stavros Sachtouris
        for k in kwargs:
1275 20387cd4 Stavros Sachtouris
            expected['permissions' if k == 'sharing' else k] = None
1276 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], call(obj, **expected))
1277 3c216009 Stavros Sachtouris
        r = self.client.create_object_by_manifestation(obj, **kwargs)
1278 3c216009 Stavros Sachtouris
        self.assert_dicts_are_equal(r, FR.headers)
1279 20387cd4 Stavros Sachtouris
        expected.update(kwargs)
1280 20387cd4 Stavros Sachtouris
        expected['permissions'] = expected.pop('sharing')
1281 20387cd4 Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], call(obj, **expected))
1282 b4e29772 Stavros Sachtouris
1283 f847a0cc Stavros Sachtouris
    @patch('%s.get_object_hashmap' % pithos_pkg, return_value=object_hashmap)
1284 f847a0cc Stavros Sachtouris
    @patch('%s.object_get' % pithos_pkg, return_value=FR())
1285 49cc29b2 Stavros Sachtouris
    def test_download_to_string(self, GET, GOH):
1286 49cc29b2 Stavros Sachtouris
        FR.content = 'some sample content'
1287 49cc29b2 Stavros Sachtouris
        num_of_blocks = len(object_hashmap['hashes'])
1288 49cc29b2 Stavros Sachtouris
        r = self.client.download_to_string(obj)
1289 49cc29b2 Stavros Sachtouris
        expected_content = FR.content * num_of_blocks
1290 49cc29b2 Stavros Sachtouris
        self.assertEqual(expected_content, r)
1291 49cc29b2 Stavros Sachtouris
        self.assertEqual(len(GET.mock_calls), num_of_blocks)
1292 49cc29b2 Stavros Sachtouris
        self.assertEqual(GET.mock_calls[-1][1], (obj,))
1293 49cc29b2 Stavros Sachtouris
1294 49cc29b2 Stavros Sachtouris
        kwargs = dict(
1295 49cc29b2 Stavros Sachtouris
            version='version',
1296 49cc29b2 Stavros Sachtouris
            range_str='10-20',
1297 49cc29b2 Stavros Sachtouris
            if_match='if and only if',
1298 49cc29b2 Stavros Sachtouris
            if_none_match='if and only not',
1299 49cc29b2 Stavros Sachtouris
            if_modified_since='what if not?',
1300 49cc29b2 Stavros Sachtouris
            if_unmodified_since='this happens if not!')
1301 49cc29b2 Stavros Sachtouris
        expargs = dict(kwargs)
1302 49cc29b2 Stavros Sachtouris
        expargs.pop('range_str')
1303 49cc29b2 Stavros Sachtouris
        for k in expargs:
1304 49cc29b2 Stavros Sachtouris
            expargs[k] = None
1305 49cc29b2 Stavros Sachtouris
        GOH.assert_called_once_with(obj, **expargs)
1306 49cc29b2 Stavros Sachtouris
1307 49cc29b2 Stavros Sachtouris
        r = self.client.download_to_string(obj, **kwargs)
1308 49cc29b2 Stavros Sachtouris
        expargs['data_range'] = 'bytes=%s' % kwargs['range_str']
1309 49cc29b2 Stavros Sachtouris
        for k, v in expargs.items():
1310 49cc29b2 Stavros Sachtouris
            self.assertEqual(
1311 49cc29b2 Stavros Sachtouris
                GET.mock_calls[-1][2][k],
1312 49cc29b2 Stavros Sachtouris
                v or kwargs.get(k))
1313 49cc29b2 Stavros Sachtouris
1314 49cc29b2 Stavros Sachtouris
    @patch('%s.get_object_hashmap' % pithos_pkg, return_value=object_hashmap)
1315 49cc29b2 Stavros Sachtouris
    @patch('%s.object_get' % pithos_pkg, return_value=FR())
1316 98a7195e Stavros Sachtouris
    def test_download_object(self, GET, GOH):
1317 cb65588d Stavros Sachtouris
        num_of_blocks = 8
1318 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
1319 c6da1ccc Stavros Sachtouris
        FR.content = tmpFile.read(4 * 1024 * 1024)
1320 cb65588d Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
1321 b4e29772 Stavros Sachtouris
        num_of_blocks = len(object_hashmap['hashes'])
1322 b4e29772 Stavros Sachtouris
        kwargs = dict(
1323 b4e29772 Stavros Sachtouris
            resume=True,
1324 cb65588d Stavros Sachtouris
            version='version',
1325 b4e29772 Stavros Sachtouris
            range_str='10-20',
1326 b4e29772 Stavros Sachtouris
            if_match='if and only if',
1327 b4e29772 Stavros Sachtouris
            if_none_match='if and only not',
1328 b4e29772 Stavros Sachtouris
            if_modified_since='what if not?',
1329 b4e29772 Stavros Sachtouris
            if_unmodified_since='this happens if not!',
1330 b4e29772 Stavros Sachtouris
            async_headers=dict(Range='bytes=0-88888888'))
1331 b4e29772 Stavros Sachtouris
1332 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile)
1333 b4e29772 Stavros Sachtouris
        self.assertEqual(len(GET.mock_calls), num_of_blocks)
1334 b4e29772 Stavros Sachtouris
        self.assertEqual(GET.mock_calls[-1][1], (obj,))
1335 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
1336 b4e29772 Stavros Sachtouris
            if k == 'async_headers':
1337 b4e29772 Stavros Sachtouris
                self.assertTrue('Range' in GET.mock_calls[-1][2][k])
1338 b4e29772 Stavros Sachtouris
            elif k in ('resume', 'range_str'):
1339 b4e29772 Stavros Sachtouris
                continue
1340 b4e29772 Stavros Sachtouris
            else:
1341 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], None)
1342 b4e29772 Stavros Sachtouris
1343 b4e29772 Stavros Sachtouris
        #  Check ranges are consecutive
1344 b4e29772 Stavros Sachtouris
        starts = []
1345 b4e29772 Stavros Sachtouris
        ends = []
1346 b4e29772 Stavros Sachtouris
        for c in GET.mock_calls:
1347 b4e29772 Stavros Sachtouris
            rng_str = c[2]['async_headers']['Range']
1348 b4e29772 Stavros Sachtouris
            (start, rng_str) = rng_str.split('=')
1349 b4e29772 Stavros Sachtouris
            (start, end) = rng_str.split('-')
1350 b4e29772 Stavros Sachtouris
            starts.append(start)
1351 b4e29772 Stavros Sachtouris
            ends.append(end)
1352 b4e29772 Stavros Sachtouris
        ends = sorted(ends)
1353 b4e29772 Stavros Sachtouris
        for i, start in enumerate(sorted(starts)):
1354 b4e29772 Stavros Sachtouris
            if i:
1355 b4e29772 Stavros Sachtouris
                int(ends[i - 1]) == int(start) - 1
1356 b4e29772 Stavros Sachtouris
1357 b4e29772 Stavros Sachtouris
        #  With progress bars
1358 b4e29772 Stavros Sachtouris
        try:
1359 b4e29772 Stavros Sachtouris
            from progress.bar import ShadyBar
1360 b4e29772 Stavros Sachtouris
            dl_bar = ShadyBar('Mock dl')
1361 b4e29772 Stavros Sachtouris
        except ImportError:
1362 b4e29772 Stavros Sachtouris
            dl_bar = None
1363 b4e29772 Stavros Sachtouris
1364 b4e29772 Stavros Sachtouris
        if dl_bar:
1365 b4e29772 Stavros Sachtouris
1366 b4e29772 Stavros Sachtouris
            def blck_gen(n):
1367 b4e29772 Stavros Sachtouris
                for i in dl_bar.iter(range(n)):
1368 b4e29772 Stavros Sachtouris
                    yield
1369 b4e29772 Stavros Sachtouris
                yield
1370 b4e29772 Stavros Sachtouris
1371 b4e29772 Stavros Sachtouris
            tmpFile.seek(0)
1372 b4e29772 Stavros Sachtouris
            self.client.download_object(obj, tmpFile, download_cb=blck_gen)
1373 b4e29772 Stavros Sachtouris
            self.assertEqual(len(GET.mock_calls), 2 * num_of_blocks)
1374 b4e29772 Stavros Sachtouris
1375 b4e29772 Stavros Sachtouris
        tmpFile.seek(0)
1376 b4e29772 Stavros Sachtouris
        kwargs.pop('async_headers')
1377 b4e29772 Stavros Sachtouris
        kwargs.pop('resume')
1378 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile, **kwargs)
1379 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
1380 b4e29772 Stavros Sachtouris
            if k == 'range_str':
1381 b4e29772 Stavros Sachtouris
                self.assertEqual(
1382 b4e29772 Stavros Sachtouris
                    GET.mock_calls[-1][2]['data_range'],
1383 b4e29772 Stavros Sachtouris
                    'bytes=%s' % v)
1384 b4e29772 Stavros Sachtouris
            else:
1385 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], v)
1386 b4e29772 Stavros Sachtouris
1387 b4e29772 Stavros Sachtouris
        #  ALl options on no tty
1388 b4e29772 Stavros Sachtouris
        def foo():
1389 b4e29772 Stavros Sachtouris
            return True
1390 b4e29772 Stavros Sachtouris
1391 b4e29772 Stavros Sachtouris
        tmpFile.seek(0)
1392 b4e29772 Stavros Sachtouris
        tmpFile.isatty = foo
1393 b4e29772 Stavros Sachtouris
        self.client.download_object(obj, tmpFile, **kwargs)
1394 b4e29772 Stavros Sachtouris
        for k, v in kwargs.items():
1395 b4e29772 Stavros Sachtouris
            if k == 'range_str':
1396 b4e29772 Stavros Sachtouris
                self.assertTrue('data_range' in GET.mock_calls[-1][2])
1397 b4e29772 Stavros Sachtouris
            else:
1398 b4e29772 Stavros Sachtouris
                self.assertEqual(GET.mock_calls[-1][2][k], v)
1399 cb65588d Stavros Sachtouris
1400 cb65588d Stavros Sachtouris
    def test_get_object_hashmap(self):
1401 c6da1ccc Stavros Sachtouris
        FR.json = object_hashmap
1402 cb65588d Stavros Sachtouris
        for empty in (304, 412):
1403 cb65588d Stavros Sachtouris
            with patch.object(
1404 3c50df2e Stavros Sachtouris
                    pithos.PithosClient, 'object_get',
1405 cb65588d Stavros Sachtouris
                    side_effect=ClientError('Empty', status=empty)):
1406 cb65588d Stavros Sachtouris
                r = self.client.get_object_hashmap(obj)
1407 cb65588d Stavros Sachtouris
                self.assertEqual(r, {})
1408 cb65588d Stavros Sachtouris
        exp_args = dict(
1409 cb65588d Stavros Sachtouris
            hashmap=True,
1410 cb65588d Stavros Sachtouris
            version=None,
1411 cb65588d Stavros Sachtouris
            if_etag_match=None,
1412 cb65588d Stavros Sachtouris
            if_etag_not_match=None,
1413 cb65588d Stavros Sachtouris
            if_modified_since=None,
1414 cb65588d Stavros Sachtouris
            if_unmodified_since=None)
1415 cb65588d Stavros Sachtouris
        kwargs = dict(
1416 cb65588d Stavros Sachtouris
            version='s0m3v3r51on',
1417 cb65588d Stavros Sachtouris
            if_match='if match',
1418 cb65588d Stavros Sachtouris
            if_none_match='if non match',
1419 cb65588d Stavros Sachtouris
            if_modified_since='some date here',
1420 776b275c Stavros Sachtouris
            if_unmodified_since='some date here')
1421 55faa0bc Stavros Sachtouris
        with patch.object(
1422 776b275c Stavros Sachtouris
                pithos.PithosClient, 'object_get', return_value=FR()) as get:
1423 cb65588d Stavros Sachtouris
            r = self.client.get_object_hashmap(obj)
1424 cb65588d Stavros Sachtouris
            self.assertEqual(r, object_hashmap)
1425 cb65588d Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(obj, **exp_args))
1426 cb65588d Stavros Sachtouris
            r = self.client.get_object_hashmap(obj, **kwargs)
1427 cb65588d Stavros Sachtouris
            exp_args['if_etag_match'] = kwargs.pop('if_match')
1428 cb65588d Stavros Sachtouris
            exp_args['if_etag_not_match'] = kwargs.pop('if_none_match')
1429 cb65588d Stavros Sachtouris
            exp_args.update(kwargs)
1430 cb65588d Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(obj, **exp_args))
1431 8b71426c Stavros Sachtouris
1432 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
1433 20387cd4 Stavros Sachtouris
    def test_set_account_group(self, post):
1434 20387cd4 Stavros Sachtouris
        (group, usernames) = ('aU53rGr0up', ['u1', 'u2', 'u3'])
1435 20387cd4 Stavros Sachtouris
        self.client.set_account_group(group, usernames)
1436 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, groups={group: usernames})
1437 419fa6c4 Stavros Sachtouris
1438 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
1439 20387cd4 Stavros Sachtouris
    def test_del_account_group(self, post):
1440 419fa6c4 Stavros Sachtouris
        group = 'aU53rGr0up'
1441 20387cd4 Stavros Sachtouris
        self.client.del_account_group(group)
1442 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, groups={group: []})
1443 34f48ce0 Stavros Sachtouris
1444 20387cd4 Stavros Sachtouris
    @patch('%s.get_account_info' % pithos_pkg, return_value=account_info)
1445 20387cd4 Stavros Sachtouris
    def test_get_account_quota(self, GAI):
1446 34f48ce0 Stavros Sachtouris
        key = 'x-account-policy-quota'
1447 20387cd4 Stavros Sachtouris
        r = self.client.get_account_quota()
1448 98a7195e Stavros Sachtouris
        GAI.assert_called_once_with()
1449 20387cd4 Stavros Sachtouris
        self.assertEqual(r[key], account_info[key])
1450 16b77981 Stavros Sachtouris
1451 c088076b Stavros Sachtouris
    #@patch('%s.get_account_info' % pithos_pkg, return_value=account_info)
1452 c088076b Stavros Sachtouris
    #def test_get_account_versioning(self, GAI):
1453 c088076b Stavros Sachtouris
    #    key = 'x-account-policy-versioning'
1454 c088076b Stavros Sachtouris
    #    r = self.client.get_account_versioning()
1455 c088076b Stavros Sachtouris
    #    GAI.assert_called_once_with()
1456 c088076b Stavros Sachtouris
    #    self.assertEqual(r[key], account_info[key])
1457 de27950a Stavros Sachtouris
1458 de27950a Stavros Sachtouris
    def test_get_account_meta(self):
1459 e78922d9 Stavros Sachtouris
        key = 'x-account-meta-'
1460 55faa0bc Stavros Sachtouris
        with patch.object(
1461 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_account_info',
1462 55faa0bc Stavros Sachtouris
                return_value=account_info):
1463 de27950a Stavros Sachtouris
            r = self.client.get_account_meta()
1464 e78922d9 Stavros Sachtouris
            keys = [k for k in r if k.startswith(key)]
1465 e78922d9 Stavros Sachtouris
            self.assertFalse(keys)
1466 de27950a Stavros Sachtouris
        acc_info = dict(account_info)
1467 e78922d9 Stavros Sachtouris
        acc_info['%sk1' % key] = 'v1'
1468 e78922d9 Stavros Sachtouris
        acc_info['%sk2' % key] = 'v2'
1469 e78922d9 Stavros Sachtouris
        acc_info['%sk3' % key] = 'v3'
1470 55faa0bc Stavros Sachtouris
        with patch.object(
1471 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_account_info',
1472 55faa0bc Stavros Sachtouris
                return_value=acc_info):
1473 de27950a Stavros Sachtouris
            r = self.client.get_account_meta()
1474 e78922d9 Stavros Sachtouris
            for k in [k for k in acc_info if k.startswith(key)]:
1475 e78922d9 Stavros Sachtouris
                self.assertEqual(r[k], acc_info[k])
1476 e78922d9 Stavros Sachtouris
1477 e78922d9 Stavros Sachtouris
    def test_get_account_group(self):
1478 e78922d9 Stavros Sachtouris
        key = 'x-account-group-'
1479 55faa0bc Stavros Sachtouris
        with patch.object(
1480 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_account_info',
1481 55faa0bc Stavros Sachtouris
                return_value=account_info):
1482 e78922d9 Stavros Sachtouris
            r = self.client.get_account_group()
1483 e78922d9 Stavros Sachtouris
            keys = [k for k in r if k.startswith(key)]
1484 e78922d9 Stavros Sachtouris
            self.assertFalse(keys)
1485 e78922d9 Stavros Sachtouris
        acc_info = dict(account_info)
1486 e78922d9 Stavros Sachtouris
        acc_info['%sk1' % key] = 'g1'
1487 e78922d9 Stavros Sachtouris
        acc_info['%sk2' % key] = 'g2'
1488 e78922d9 Stavros Sachtouris
        acc_info['%sk3' % key] = 'g3'
1489 55faa0bc Stavros Sachtouris
        with patch.object(
1490 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_account_info',
1491 55faa0bc Stavros Sachtouris
                return_value=acc_info):
1492 e78922d9 Stavros Sachtouris
            r = self.client.get_account_group()
1493 e78922d9 Stavros Sachtouris
            for k in [k for k in acc_info if k.startswith(key)]:
1494 e78922d9 Stavros Sachtouris
                self.assertEqual(r[k], acc_info[k])
1495 84817ae5 Stavros Sachtouris
1496 20387cd4 Stavros Sachtouris
    @patch('%s.account_post' % pithos_pkg, return_value=FR())
1497 20387cd4 Stavros Sachtouris
    def test_set_account_meta(self, post):
1498 84817ae5 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
1499 20387cd4 Stavros Sachtouris
        self.client.set_account_meta(metas)
1500 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, metadata=metas)
1501 edd209d3 Stavros Sachtouris
1502 c088076b Stavros Sachtouris
    #@patch('%s.account_post' % pithos_pkg, return_value=FR())
1503 c088076b Stavros Sachtouris
    #def test_set_account_quota(self, post):
1504 c088076b Stavros Sachtouris
    #    qu = 1024
1505 c088076b Stavros Sachtouris
    #    self.client.set_account_quota(qu)
1506 c088076b Stavros Sachtouris
    #    post.assert_called_once_with(update=True, quota=qu)
1507 a6439733 Stavros Sachtouris
1508 c088076b Stavros Sachtouris
    #@patch('%s.account_post' % pithos_pkg, return_value=FR())
1509 c088076b Stavros Sachtouris
    #def test_set_account_versioning(self, post):
1510 c088076b Stavros Sachtouris
    #    vrs = 'n3wV3r51on1ngTyp3'
1511 c088076b Stavros Sachtouris
    #    self.client.set_account_versioning(vrs)
1512 c088076b Stavros Sachtouris
    #    post.assert_called_once_with(update=True, versioning=vrs)
1513 20387cd4 Stavros Sachtouris
1514 20387cd4 Stavros Sachtouris
    @patch('%s.container_delete' % pithos_pkg, return_value=FR())
1515 20387cd4 Stavros Sachtouris
    def test_del_container(self, delete):
1516 20387cd4 Stavros Sachtouris
        for kwarg in (
1517 20387cd4 Stavros Sachtouris
                dict(delimiter=None, until=None),
1518 20387cd4 Stavros Sachtouris
                dict(delimiter='X', until='50m3d473')):
1519 20387cd4 Stavros Sachtouris
            self.client.del_container(**kwarg)
1520 20387cd4 Stavros Sachtouris
            expected = dict(kwarg)
1521 20387cd4 Stavros Sachtouris
            expected['success'] = (204, 404, 409)
1522 20387cd4 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(**expected))
1523 20387cd4 Stavros Sachtouris
        for status_code in (404, 409):
1524 20387cd4 Stavros Sachtouris
            FR.status_code = status_code
1525 20387cd4 Stavros Sachtouris
            self.assertRaises(ClientError, self.client.del_container)
1526 bae347d3 Stavros Sachtouris
1527 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
1528 d85e02c5 Stavros Sachtouris
    def test_get_container_versioning(self, GCI):
1529 bae347d3 Stavros Sachtouris
        key = 'x-container-policy-versioning'
1530 bae347d3 Stavros Sachtouris
        cont = 'c0n7-417'
1531 1879e310 Stavros Sachtouris
        bu_cnt = self.client.container
1532 d85e02c5 Stavros Sachtouris
        for container in (None, cont):
1533 d85e02c5 Stavros Sachtouris
            r = self.client.get_container_versioning(container=container)
1534 d85e02c5 Stavros Sachtouris
            self.assertEqual(r[key], container_info[key])
1535 d85e02c5 Stavros Sachtouris
            self.assertEqual(GCI.mock_calls[-1], call())
1536 d85e02c5 Stavros Sachtouris
            self.assertEqual(bu_cnt, self.client.container)
1537 d85e02c5 Stavros Sachtouris
1538 f847a0cc Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
1539 3ed6dbde Stavros Sachtouris
    def test_get_container_limit(self, GCI):
1540 1879e310 Stavros Sachtouris
        key = 'x-container-policy-quota'
1541 1879e310 Stavros Sachtouris
        cont = 'c0n7-417'
1542 1879e310 Stavros Sachtouris
        bu_cnt = self.client.container
1543 d85e02c5 Stavros Sachtouris
        for container in (None, cont):
1544 3ed6dbde Stavros Sachtouris
            r = self.client.get_container_limit(container=container)
1545 d85e02c5 Stavros Sachtouris
            self.assertEqual(r[key], container_info[key])
1546 d85e02c5 Stavros Sachtouris
            self.assertEqual(GCI.mock_calls[-1], call())
1547 d85e02c5 Stavros Sachtouris
            self.assertEqual(bu_cnt, self.client.container)
1548 c297102c Stavros Sachtouris
1549 c297102c Stavros Sachtouris
    def test_get_container_meta(self):
1550 c297102c Stavros Sachtouris
        somedate = '50m3d473'
1551 c297102c Stavros Sachtouris
        key = 'x-container-meta'
1552 c297102c Stavros Sachtouris
        metaval = '50m3m374v41'
1553 c297102c Stavros Sachtouris
        container_plus = dict(container_info)
1554 c297102c Stavros Sachtouris
        container_plus[key] = metaval
1555 c297102c Stavros Sachtouris
        for ret in ((container_info, {}), (container_plus, {key: metaval})):
1556 c297102c Stavros Sachtouris
            with patch.object(
1557 3c50df2e Stavros Sachtouris
                    pithos.PithosClient,
1558 c297102c Stavros Sachtouris
                    'get_container_info',
1559 98a7195e Stavros Sachtouris
                    return_value=ret[0]) as GCI:
1560 c297102c Stavros Sachtouris
                for until in (None, somedate):
1561 c297102c Stavros Sachtouris
                    r = self.client.get_container_meta(until=until)
1562 c297102c Stavros Sachtouris
                    self.assertEqual(r, ret[1])
1563 98a7195e Stavros Sachtouris
                    self.assertEqual(GCI.mock_calls[-1], call(until=until))
1564 a8f0a8e2 Stavros Sachtouris
1565 a8f0a8e2 Stavros Sachtouris
    def test_get_container_object_meta(self):
1566 a8f0a8e2 Stavros Sachtouris
        somedate = '50m3d473'
1567 a8f0a8e2 Stavros Sachtouris
        key = 'x-container-object-meta'
1568 a8f0a8e2 Stavros Sachtouris
        metaval = '50m3m374v41'
1569 a8f0a8e2 Stavros Sachtouris
        container_plus = dict(container_info)
1570 a8f0a8e2 Stavros Sachtouris
        container_plus[key] = metaval
1571 a8f0a8e2 Stavros Sachtouris
        for ret in (
1572 a8f0a8e2 Stavros Sachtouris
                (container_info, {key: ''}),
1573 a8f0a8e2 Stavros Sachtouris
                (container_plus, {key: metaval})):
1574 a8f0a8e2 Stavros Sachtouris
            with patch.object(
1575 3c50df2e Stavros Sachtouris
                    pithos.PithosClient,
1576 a8f0a8e2 Stavros Sachtouris
                    'get_container_info',
1577 98a7195e Stavros Sachtouris
                    return_value=ret[0]) as GCI:
1578 a8f0a8e2 Stavros Sachtouris
                for until in (None, somedate):
1579 a8f0a8e2 Stavros Sachtouris
                    r = self.client.get_container_object_meta(until=until)
1580 a8f0a8e2 Stavros Sachtouris
                    self.assertEqual(r, ret[1])
1581 98a7195e Stavros Sachtouris
                    self.assertEqual(GCI.mock_calls[-1], call(until=until))
1582 c1b21988 Stavros Sachtouris
1583 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
1584 20387cd4 Stavros Sachtouris
    def test_set_container_meta(self, post):
1585 c1b21988 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
1586 20387cd4 Stavros Sachtouris
        self.client.set_container_meta(metas)
1587 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, metadata=metas)
1588 e9a2925f Stavros Sachtouris
1589 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
1590 98a7195e Stavros Sachtouris
    def test_del_container_meta(self, AP):
1591 20387cd4 Stavros Sachtouris
        self.client.del_container_meta('somekey')
1592 98a7195e Stavros Sachtouris
        AP.assert_called_once_with(update=True, metadata={'somekey': ''})
1593 ec1d0bbe Stavros Sachtouris
1594 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
1595 326a79b9 Stavros Sachtouris
    def test_set_container_limit(self, post):
1596 ec1d0bbe Stavros Sachtouris
        qu = 1024
1597 326a79b9 Stavros Sachtouris
        self.client.set_container_limit(qu)
1598 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, quota=qu)
1599 ec1d0bbe Stavros Sachtouris
1600 20387cd4 Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
1601 20387cd4 Stavros Sachtouris
    def test_set_container_versioning(self, post):
1602 ec1d0bbe Stavros Sachtouris
        vrs = 'n3wV3r51on1ngTyp3'
1603 20387cd4 Stavros Sachtouris
        self.client.set_container_versioning(vrs)
1604 98a7195e Stavros Sachtouris
        post.assert_called_once_with(update=True, versioning=vrs)
1605 20387cd4 Stavros Sachtouris
1606 20387cd4 Stavros Sachtouris
    @patch('%s.object_delete' % pithos_pkg, return_value=FR())
1607 20387cd4 Stavros Sachtouris
    def test_del_object(self, delete):
1608 20387cd4 Stavros Sachtouris
        for kwarg in (
1609 20387cd4 Stavros Sachtouris
                dict(delimiter=None, until=None),
1610 20387cd4 Stavros Sachtouris
                dict(delimiter='X', until='50m3d473')):
1611 20387cd4 Stavros Sachtouris
            self.client.del_object(obj, **kwarg)
1612 20387cd4 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(obj, **kwarg))
1613 20387cd4 Stavros Sachtouris
1614 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1615 20387cd4 Stavros Sachtouris
    def test_set_object_meta(self, post):
1616 d85e02c5 Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
1617 20387cd4 Stavros Sachtouris
        self.assertRaises(
1618 20387cd4 Stavros Sachtouris
            AssertionError,
1619 20387cd4 Stavros Sachtouris
            self.client.set_object_meta,
1620 20387cd4 Stavros Sachtouris
            obj, 'Non dict arg')
1621 20387cd4 Stavros Sachtouris
        self.client.set_object_meta(obj, metas)
1622 98a7195e Stavros Sachtouris
        post.assert_called_once_with(obj, update=True, metadata=metas)
1623 f847a0cc Stavros Sachtouris
1624 f847a0cc Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1625 f847a0cc Stavros Sachtouris
    def test_publish_object(self, post):
1626 f847a0cc Stavros Sachtouris
        oinfo = dict(object_info)
1627 f847a0cc Stavros Sachtouris
        val = 'pubL1c'
1628 c088076b Stavros Sachtouris
        oinfo['x-object-public'] = 'https://www.example.com/' + val
1629 55faa0bc Stavros Sachtouris
        with patch.object(
1630 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_object_info',
1631 55faa0bc Stavros Sachtouris
                return_value=oinfo) as GOF:
1632 f847a0cc Stavros Sachtouris
            r = self.client.publish_object(obj)
1633 f847a0cc Stavros Sachtouris
            self.assertEqual(
1634 f847a0cc Stavros Sachtouris
                post.mock_calls[-1],
1635 f847a0cc Stavros Sachtouris
                call(obj, public=True, update=True))
1636 98a7195e Stavros Sachtouris
            self.assertEqual(GOF.mock_calls[-1], call(obj))
1637 f847a0cc Stavros Sachtouris
            self.assertEqual(r, '%s%s' % (self.url[:-6], val))
1638 aa67b8e5 Stavros Sachtouris
1639 aa67b8e5 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1640 aa67b8e5 Stavros Sachtouris
    def test_unpublish_object(self, post):
1641 aa67b8e5 Stavros Sachtouris
        self.client.unpublish_object(obj)
1642 98a7195e Stavros Sachtouris
        post.assert_called_once_with(obj, public=False, update=True)
1643 8d4b8387 Stavros Sachtouris
1644 8d4b8387 Stavros Sachtouris
    def test_get_object_sharing(self):
1645 8d4b8387 Stavros Sachtouris
        info = dict(object_info)
1646 8d4b8387 Stavros Sachtouris
        expected = dict(read='u1,g1,u2', write='u1')
1647 8d4b8387 Stavros Sachtouris
        info['x-object-sharing'] = '; '.join(
1648 8d4b8387 Stavros Sachtouris
            ['%s=%s' % (k, v) for k, v in expected.items()])
1649 55faa0bc Stavros Sachtouris
        with patch.object(
1650 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_object_info',
1651 55faa0bc Stavros Sachtouris
                return_value=info) as GOF:
1652 8d4b8387 Stavros Sachtouris
            r = self.client.get_object_sharing(obj)
1653 8d4b8387 Stavros Sachtouris
            self.assertEqual(GOF.mock_calls[-1], call(obj))
1654 8d4b8387 Stavros Sachtouris
            self.assert_dicts_are_equal(r, expected)
1655 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = '//'.join(
1656 8d4b8387 Stavros Sachtouris
                ['%s=%s' % (k, v) for k, v in expected.items()])
1657 8d4b8387 Stavros Sachtouris
            self.assertRaises(
1658 8d4b8387 Stavros Sachtouris
                ValueError,
1659 8d4b8387 Stavros Sachtouris
                self.client.get_object_sharing,
1660 8d4b8387 Stavros Sachtouris
                obj)
1661 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = '; '.join(
1662 8d4b8387 Stavros Sachtouris
                ['%s:%s' % (k, v) for k, v in expected.items()])
1663 8d4b8387 Stavros Sachtouris
            self.assertRaises(
1664 8d4b8387 Stavros Sachtouris
                ClientError,
1665 8d4b8387 Stavros Sachtouris
                self.client.get_object_sharing,
1666 8d4b8387 Stavros Sachtouris
                obj)
1667 8d4b8387 Stavros Sachtouris
            info['x-object-sharing'] = 'read=%s' % expected['read']
1668 8d4b8387 Stavros Sachtouris
            r = self.client.get_object_sharing(obj)
1669 8d4b8387 Stavros Sachtouris
            expected.pop('write')
1670 8d4b8387 Stavros Sachtouris
            self.assert_dicts_are_equal(r, expected)
1671 221820b8 Stavros Sachtouris
1672 221820b8 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1673 98a7195e Stavros Sachtouris
    def test_set_object_sharing(self, OP):
1674 221820b8 Stavros Sachtouris
        read_perms = ['u1', 'g1', 'u2', 'g2']
1675 221820b8 Stavros Sachtouris
        write_perms = ['u1', 'g1']
1676 221820b8 Stavros Sachtouris
        for kwargs in (
1677 6aadd6e1 Stavros Sachtouris
                dict(read_permission=read_perms, write_permission=write_perms),
1678 6aadd6e1 Stavros Sachtouris
                dict(read_permission=read_perms),
1679 6aadd6e1 Stavros Sachtouris
                dict(write_permission=write_perms),
1680 e73b65dd Stavros Sachtouris
                dict()):
1681 221820b8 Stavros Sachtouris
            self.client.set_object_sharing(obj, **kwargs)
1682 6aadd6e1 Stavros Sachtouris
            kwargs['read'] = kwargs.pop('read_permission', '')
1683 6aadd6e1 Stavros Sachtouris
            kwargs['write'] = kwargs.pop('write_permission', '')
1684 221820b8 Stavros Sachtouris
            self.assertEqual(
1685 98a7195e Stavros Sachtouris
                OP.mock_calls[-1],
1686 e73b65dd Stavros Sachtouris
                call(obj, update=True, permissions=kwargs))
1687 221820b8 Stavros Sachtouris
1688 e73b65dd Stavros Sachtouris
    @patch('%s.set_object_sharing' % pithos_pkg)
1689 e73b65dd Stavros Sachtouris
    def test_del_object_sharing(self, SOS):
1690 e73b65dd Stavros Sachtouris
        self.client.del_object_sharing(obj)
1691 98a7195e Stavros Sachtouris
        SOS.assert_called_once_with(obj)
1692 20387cd4 Stavros Sachtouris
1693 20387cd4 Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
1694 20387cd4 Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1695 20387cd4 Stavros Sachtouris
    def test_append_object(self, post, GCI):
1696 20387cd4 Stavros Sachtouris
        num_of_blocks = 4
1697 fe7278ee Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
1698 20387cd4 Stavros Sachtouris
        tmpFile.seek(0, 2)
1699 20387cd4 Stavros Sachtouris
        file_size = tmpFile.tell()
1700 20387cd4 Stavros Sachtouris
        for turn in range(2):
1701 20387cd4 Stavros Sachtouris
            tmpFile.seek(0, 0)
1702 20387cd4 Stavros Sachtouris
1703 20387cd4 Stavros Sachtouris
            try:
1704 20387cd4 Stavros Sachtouris
                from progress.bar import ShadyBar
1705 20387cd4 Stavros Sachtouris
                apn_bar = ShadyBar('Mock append')
1706 20387cd4 Stavros Sachtouris
            except ImportError:
1707 20387cd4 Stavros Sachtouris
                apn_bar = None
1708 20387cd4 Stavros Sachtouris
1709 20387cd4 Stavros Sachtouris
            if apn_bar:
1710 20387cd4 Stavros Sachtouris
1711 20387cd4 Stavros Sachtouris
                def append_gen(n):
1712 20387cd4 Stavros Sachtouris
                    for i in apn_bar.iter(range(n)):
1713 20387cd4 Stavros Sachtouris
                        yield
1714 20387cd4 Stavros Sachtouris
                    yield
1715 20387cd4 Stavros Sachtouris
1716 20387cd4 Stavros Sachtouris
            else:
1717 20387cd4 Stavros Sachtouris
                append_gen = None
1718 20387cd4 Stavros Sachtouris
1719 20387cd4 Stavros Sachtouris
            self.client.append_object(
1720 20387cd4 Stavros Sachtouris
                obj, tmpFile,
1721 20387cd4 Stavros Sachtouris
                upload_cb=append_gen if turn else None)
1722 20387cd4 Stavros Sachtouris
            self.assertEqual((turn + 1) * num_of_blocks, len(post.mock_calls))
1723 20387cd4 Stavros Sachtouris
            (args, kwargs) = post.mock_calls[-1][1:3]
1724 5655d560 Stavros Sachtouris
            self.assertEqual(kwargs['obj'], obj)
1725 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_length'], len(kwargs['data']))
1726 20387cd4 Stavros Sachtouris
            fsize = num_of_blocks * int(kwargs['content_length'])
1727 20387cd4 Stavros Sachtouris
            self.assertEqual(fsize, file_size)
1728 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_range'], 'bytes */*')
1729 20387cd4 Stavros Sachtouris
            exp = 'application/octet-stream'
1730 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['content_type'], exp)
1731 20387cd4 Stavros Sachtouris
            self.assertEqual(kwargs['update'], True)
1732 5597767e Stavros Sachtouris
1733 5597767e Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1734 5597767e Stavros Sachtouris
    def test_truncate_object(self, post):
1735 5597767e Stavros Sachtouris
        upto_bytes = 377
1736 5597767e Stavros Sachtouris
        self.client.truncate_object(obj, upto_bytes)
1737 98a7195e Stavros Sachtouris
        post.assert_called_once_with(
1738 5597767e Stavros Sachtouris
            obj,
1739 5597767e Stavros Sachtouris
            update=True,
1740 5597767e Stavros Sachtouris
            object_bytes=upto_bytes,
1741 5597767e Stavros Sachtouris
            content_range='bytes 0-%s/*' % upto_bytes,
1742 5597767e Stavros Sachtouris
            content_type='application/octet-stream',
1743 98a7195e Stavros Sachtouris
            source_object='/%s/%s' % (self.client.container, obj))
1744 fe7278ee Stavros Sachtouris
1745 fe7278ee Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
1746 fe7278ee Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
1747 fe7278ee Stavros Sachtouris
    def test_overwrite_object(self, post, GCI):
1748 fe7278ee Stavros Sachtouris
        num_of_blocks = 4
1749 fe7278ee Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
1750 fe7278ee Stavros Sachtouris
        tmpFile.seek(0, 2)
1751 fe7278ee Stavros Sachtouris
        file_size = tmpFile.tell()
1752 fe7278ee Stavros Sachtouris
        info = dict(object_info)
1753 fe7278ee Stavros Sachtouris
        info['content-length'] = file_size
1754 fe7278ee Stavros Sachtouris
        block_size = container_info['x-container-block-size']
1755 55faa0bc Stavros Sachtouris
        with patch.object(
1756 3c50df2e Stavros Sachtouris
                pithos.PithosClient, 'get_object_info',
1757 55faa0bc Stavros Sachtouris
                return_value=info) as GOI:
1758 fe7278ee Stavros Sachtouris
            for start, end in (
1759 fe7278ee Stavros Sachtouris
                    (0, file_size + 1),
1760 fe7278ee Stavros Sachtouris
                    (file_size + 1, file_size + 2)):
1761 fe7278ee Stavros Sachtouris
                tmpFile.seek(0, 0)
1762 fe7278ee Stavros Sachtouris
                self.assertRaises(
1763 fe7278ee Stavros Sachtouris
                    ClientError,
1764 fe7278ee Stavros Sachtouris
                    self.client.overwrite_object,
1765 fe7278ee Stavros Sachtouris
                    obj, start, end, tmpFile)
1766 fe7278ee Stavros Sachtouris
            for start, end in ((0, 144), (144, 233), (233, file_size)):
1767 fe7278ee Stavros Sachtouris
                tmpFile.seek(0, 0)
1768 fe7278ee Stavros Sachtouris
                owr_gen = None
1769 fe7278ee Stavros Sachtouris
                exp_size = end - start + 1
1770 fe7278ee Stavros Sachtouris
                if not start or exp_size > block_size:
1771 fe7278ee Stavros Sachtouris
                    try:
1772 fe7278ee Stavros Sachtouris
                        from progress.bar import ShadyBar
1773 fe7278ee Stavros Sachtouris
                        owr_bar = ShadyBar('Mock append')
1774 fe7278ee Stavros Sachtouris
                    except ImportError:
1775 fe7278ee Stavros Sachtouris
                        owr_bar = None
1776 fe7278ee Stavros Sachtouris
1777 fe7278ee Stavros Sachtouris
                    if owr_bar:
1778 fe7278ee Stavros Sachtouris
1779 fe7278ee Stavros Sachtouris
                        def owr_gen(n):
1780 fe7278ee Stavros Sachtouris
                            for i in owr_bar.iter(range(n)):
1781 fe7278ee Stavros Sachtouris
                                yield
1782 fe7278ee Stavros Sachtouris
                            yield
1783 fe7278ee Stavros Sachtouris
1784 fe7278ee Stavros Sachtouris
                    if exp_size > block_size:
1785 fe7278ee Stavros Sachtouris
                        exp_size = exp_size % block_size or block_size
1786 fe7278ee Stavros Sachtouris
1787 fe7278ee Stavros Sachtouris
                self.client.overwrite_object(obj, start, end, tmpFile, owr_gen)
1788 fe7278ee Stavros Sachtouris
                self.assertEqual(GOI.mock_calls[-1], call(obj))
1789 fe7278ee Stavros Sachtouris
                self.assertEqual(GCI.mock_calls[-1], call())
1790 fe7278ee Stavros Sachtouris
                (args, kwargs) = post.mock_calls[-1][1:3]
1791 fe7278ee Stavros Sachtouris
                self.assertEqual(args, (obj,))
1792 fe7278ee Stavros Sachtouris
                self.assertEqual(len(kwargs['data']), exp_size)
1793 fe7278ee Stavros Sachtouris
                self.assertEqual(kwargs['content_length'], exp_size)
1794 fe7278ee Stavros Sachtouris
                self.assertEqual(kwargs['update'], True)
1795 fe7278ee Stavros Sachtouris
                exp = 'application/octet-stream'
1796 fe7278ee Stavros Sachtouris
                self.assertEqual(kwargs['content_type'], exp)
1797 23be9656 Stavros Sachtouris
1798 5ea1e2ac Stavros Sachtouris
    @patch('%s.set_param' % pithos_pkg)
1799 607f60ab Stavros Sachtouris
    @patch('%s.get' % pithos_pkg, return_value=FR())
1800 23be9656 Stavros Sachtouris
    def test_get_sharing_accounts(self, get, SP):
1801 23be9656 Stavros Sachtouris
        FR.json = sharers
1802 23be9656 Stavros Sachtouris
        for kws in (
1803 23be9656 Stavros Sachtouris
                dict(),
1804 23be9656 Stavros Sachtouris
                dict(limit='50m3-11m17'),
1805 23be9656 Stavros Sachtouris
                dict(marker='X'),
1806 23be9656 Stavros Sachtouris
                dict(limit='50m3-11m17', marker='X')):
1807 23be9656 Stavros Sachtouris
            r = self.client.get_sharing_accounts(**kws)
1808 98a7195e Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call('', success=(200, 204)))
1809 23be9656 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-3], call('format', 'json'))
1810 23be9656 Stavros Sachtouris
            limit, marker = kws.get('limit', None), kws.get('marker', None)
1811 23be9656 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-2], call(
1812 23be9656 Stavros Sachtouris
                'limit', limit,
1813 23be9656 Stavros Sachtouris
                iff=limit is not None))
1814 23be9656 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
1815 23be9656 Stavros Sachtouris
                'marker', marker,
1816 23be9656 Stavros Sachtouris
                iff=marker is not None))
1817 23be9656 Stavros Sachtouris
            for i in range(len(r)):
1818 23be9656 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], sharers[i])
1819 607f60ab Stavros Sachtouris
1820 607f60ab Stavros Sachtouris
    @patch('%s.object_get' % pithos_pkg, return_value=FR())
1821 607f60ab Stavros Sachtouris
    def test_get_object_versionlist(self, get):
1822 607f60ab Stavros Sachtouris
        info = dict(object_info)
1823 607f60ab Stavros Sachtouris
        info['versions'] = ['v1', 'v2']
1824 607f60ab Stavros Sachtouris
        FR.json = info
1825 607f60ab Stavros Sachtouris
        r = self.client.get_object_versionlist(obj)
1826 98a7195e Stavros Sachtouris
        get.assert_called_once_with(obj, format='json', version='list')
1827 607f60ab Stavros Sachtouris
        self.assertEqual(r, info['versions'])
1828 85898ca4 Stavros Sachtouris
1829 85898ca4 Stavros Sachtouris
if __name__ == '__main__':
1830 85898ca4 Stavros Sachtouris
    from sys import argv
1831 85898ca4 Stavros Sachtouris
    from kamaki.clients.test import runTestCase
1832 55faa0bc Stavros Sachtouris
    not_found = True
1833 3c50df2e Stavros Sachtouris
    if not argv[1:] or argv[1] == 'PithosClient':
1834 55faa0bc Stavros Sachtouris
        not_found = False
1835 3c50df2e Stavros Sachtouris
        runTestCase(PithosClient, 'Pithos Client', argv[2:])
1836 3c50df2e Stavros Sachtouris
    if not argv[1:] or argv[1] == 'PithosRestClient':
1837 55faa0bc Stavros Sachtouris
        not_found = False
1838 3c50df2e Stavros Sachtouris
        runTestCase(PithosRestClient, 'PithosRest Client', argv[2:])
1839 776b275c Stavros Sachtouris
    if not argv[1:] or argv[1] == 'PithosMethods':
1840 776b275c Stavros Sachtouris
        not_found = False
1841 776b275c Stavros Sachtouris
        runTestCase(PithosRestClient, 'Pithos Methods', argv[2:])
1842 55faa0bc Stavros Sachtouris
    if not_found:
1843 55faa0bc Stavros Sachtouris
        print('TestCase %s not found' % argv[1])