Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / pithos / test.py @ 776b275c

History | View | Annotate | Download (73.5 kB)

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