Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / storage / test.py @ 3e6f33ca

History | View | Annotate | Download (21.1 kB)

1 3e6f33ca Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 3e6f33ca Stavros Sachtouris
#
3 3e6f33ca Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 3e6f33ca Stavros Sachtouris
# without modification, are permitted provided that the following
5 3e6f33ca Stavros Sachtouris
# conditions are met:
6 3e6f33ca Stavros Sachtouris
#
7 3e6f33ca Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 3e6f33ca Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 3e6f33ca Stavros Sachtouris
#      disclaimer.
10 3e6f33ca Stavros Sachtouris
#
11 3e6f33ca Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 3e6f33ca Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 3e6f33ca Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 3e6f33ca Stavros Sachtouris
#      provided with the distribution.
15 3e6f33ca Stavros Sachtouris
#
16 3e6f33ca Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 3e6f33ca Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 3e6f33ca Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 3e6f33ca Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 3e6f33ca Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 3e6f33ca Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 3e6f33ca Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 3e6f33ca Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 3e6f33ca Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 3e6f33ca Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 3e6f33ca Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 3e6f33ca Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 3e6f33ca Stavros Sachtouris
#
29 3e6f33ca Stavros Sachtouris
# The views and conclusions contained in the software and
30 3e6f33ca Stavros Sachtouris
# documentation are those of the authors and should not be
31 3e6f33ca Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 3e6f33ca Stavros Sachtouris
# or implied, of GRNET S.A.
33 3e6f33ca Stavros Sachtouris
34 3e6f33ca Stavros Sachtouris
from unittest import TestCase
35 3e6f33ca Stavros Sachtouris
from mock import patch, call
36 3e6f33ca Stavros Sachtouris
from tempfile import NamedTemporaryFile
37 3e6f33ca Stavros Sachtouris
from os import urandom
38 3e6f33ca Stavros Sachtouris
39 3e6f33ca Stavros Sachtouris
from kamaki.clients import ClientError
40 3e6f33ca Stavros Sachtouris
from kamaki.clients.storage import StorageClient as SC
41 3e6f33ca Stavros Sachtouris
from kamaki.clients.connection.kamakicon import KamakiHTTPConnection as C
42 3e6f33ca Stavros Sachtouris
43 3e6f33ca Stavros Sachtouris
client_pkg = 'kamaki.clients.Client'
44 3e6f33ca Stavros Sachtouris
storage_pkg = 'kamaki.clients.storage.StorageClient'
45 3e6f33ca Stavros Sachtouris
46 3e6f33ca Stavros Sachtouris
user_id = 'ac0un7-1d-5tr1ng'
47 3e6f33ca Stavros Sachtouris
obj = 'obj3c7N4m3'
48 3e6f33ca Stavros Sachtouris
49 3e6f33ca Stavros Sachtouris
account_info = {
50 3e6f33ca Stavros Sachtouris
    'content-language': 'en-us',
51 3e6f33ca Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
52 3e6f33ca Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 13:25:51 GMT',
53 3e6f33ca Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
54 3e6f33ca Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
55 3e6f33ca Stavros Sachtouris
    'vary': 'Accept-Language',
56 3e6f33ca Stavros Sachtouris
    'x-account-bytes-used': '751615526',
57 3e6f33ca Stavros Sachtouris
    'x-account-container-count': 7,
58 3e6f33ca Stavros Sachtouris
    'x-account-policy-quota': 53687091200,
59 3e6f33ca Stavros Sachtouris
    'x-account-policy-versioning': 'auto',
60 3e6f33ca Stavros Sachtouris
    'x-account-meta-k1': 'val1',
61 3e6f33ca Stavros Sachtouris
    'x-account-meta-k2': 'val2',
62 3e6f33ca Stavros Sachtouris
    'x-account-meta-k3': 'val3'}
63 3e6f33ca Stavros Sachtouris
container_info = {
64 3e6f33ca Stavros Sachtouris
    'content-language': 'en-us',
65 3e6f33ca Stavros Sachtouris
    'content-type': 'text/html; charset=utf-8',
66 3e6f33ca Stavros Sachtouris
    'date': 'Wed, 06 Mar 2013 15:11:05 GMT',
67 3e6f33ca Stavros Sachtouris
    'last-modified': 'Wed, 27 Feb 2013 15:56:13 GMT',
68 3e6f33ca Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
69 3e6f33ca Stavros Sachtouris
    'vary': 'Accept-Language',
70 3e6f33ca Stavros Sachtouris
    'x-container-block-hash': 'sha256',
71 3e6f33ca Stavros Sachtouris
    'x-container-block-size': 4194304,
72 3e6f33ca Stavros Sachtouris
    'x-container-bytes-used': 309528938,
73 3e6f33ca Stavros Sachtouris
    'x-container-object-count': 14,
74 3e6f33ca Stavros Sachtouris
    'x-container-object-meta': '',
75 3e6f33ca Stavros Sachtouris
    'x-container-policy-quota': 53687091200,
76 3e6f33ca Stavros Sachtouris
    'x-container-policy-versioning': 'auto'}
77 3e6f33ca Stavros Sachtouris
object_info = {
78 3e6f33ca Stavros Sachtouris
    'content-language': 'en-us',
79 3e6f33ca Stavros Sachtouris
    'content-length': 254965,
80 3e6f33ca Stavros Sachtouris
    'content-type': 'application/octet-stream',
81 3e6f33ca Stavros Sachtouris
    'date': 'Thu, 07 Mar 2013 13:27:43 GMT',
82 3e6f33ca Stavros Sachtouris
    'etag': '',
83 3e6f33ca Stavros Sachtouris
    'last-modified': 'Mon, 04 Mar 2013 18:22:31 GMT',
84 3e6f33ca Stavros Sachtouris
    'server': 'gunicorn/0.14.5',
85 3e6f33ca Stavros Sachtouris
    'vary': 'Accept-Language',
86 3e6f33ca Stavros Sachtouris
    'x-object-hash': 'obj3c7h45h1s0bj3c7h45h411r34dY',
87 3e6f33ca Stavros Sachtouris
    'x-object-uuid': 'd0c747ca-34bd-49e0-8e98-1d07d8b0cbc7',
88 3e6f33ca Stavros Sachtouris
    'x-object-version': '525996',
89 3e6f33ca Stavros Sachtouris
    'x-object-version-timestamp': 'Mon, 04 Mar 2013 18:22:31 GMT',
90 3e6f33ca Stavros Sachtouris
    'x-object-meta-k1': 'v1',
91 3e6f33ca Stavros Sachtouris
    'x-object-meta-k2': 'v2'}
92 3e6f33ca Stavros Sachtouris
container_list = [
93 3e6f33ca Stavros Sachtouris
    dict(
94 3e6f33ca Stavros Sachtouris
        count=2,
95 3e6f33ca Stavros Sachtouris
        last_modified="2013-02-27T11:56:09.893033+00:00",
96 3e6f33ca Stavros Sachtouris
        bytes=677076979,
97 3e6f33ca Stavros Sachtouris
        name="pithos",
98 3e6f33ca Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto")),
99 3e6f33ca Stavros Sachtouris
    dict(
100 3e6f33ca Stavros Sachtouris
        count=0,
101 3e6f33ca Stavros Sachtouris
        last_modified="2012-10-23T12:25:17.229187+00:00",
102 3e6f33ca Stavros Sachtouris
        bytes=0,
103 3e6f33ca Stavros Sachtouris
        name="trash",
104 3e6f33ca Stavros Sachtouris
        x_container_policy=dict(quota="21474836480", versioning="auto"))]
105 3e6f33ca Stavros Sachtouris
object_list = [
106 3e6f33ca Stavros Sachtouris
    dict(hash="",
107 3e6f33ca Stavros Sachtouris
        name="The_Secret_Garden.zip",
108 3e6f33ca Stavros Sachtouris
        x_object_public="/public/wdp9p",
109 3e6f33ca Stavros Sachtouris
        bytes=203304947,
110 3e6f33ca Stavros Sachtouris
        x_object_version_timestamp="1360237915.7027509",
111 3e6f33ca Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj0n3",
112 3e6f33ca Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
113 3e6f33ca Stavros Sachtouris
        content_type="application/octet-stream",
114 3e6f33ca Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
115 3e6f33ca Stavros Sachtouris
        x_object_version=17737,
116 3e6f33ca Stavros Sachtouris
        x_object_modified_by=user_id),
117 3e6f33ca Stavros Sachtouris
    dict(hash="",
118 3e6f33ca Stavros Sachtouris
        name="The_Revealed_Garden.zip",
119 3e6f33ca Stavros Sachtouris
        x_object_public="/public/wpd7p",
120 3e6f33ca Stavros Sachtouris
        bytes=20330947,
121 3e6f33ca Stavros Sachtouris
        x_object_version_timestamp="13602915.7027509",
122 3e6f33ca Stavros Sachtouris
        x_object_uuid="s0m3uu1df0r0bj70w",
123 3e6f33ca Stavros Sachtouris
        last_modified="2013-02-07T11:51:55.702751+00:00",
124 3e6f33ca Stavros Sachtouris
        content_type="application/octet-stream",
125 3e6f33ca Stavros Sachtouris
        x_object_hash="0afdf29f71cd53126225c3f54ca",
126 3e6f33ca Stavros Sachtouris
        x_object_version=17737,
127 3e6f33ca Stavros Sachtouris
        x_object_modified_by=user_id)]
128 3e6f33ca Stavros Sachtouris
object_hashmap = dict(
129 3e6f33ca Stavros Sachtouris
    block_hash="sha256", block_size=4194304, bytes=33554432,
130 3e6f33ca Stavros Sachtouris
    hashes=[
131 3e6f33ca Stavros Sachtouris
        "4988438cc1c0292c085d289649b28cf547ba3db71c6efaac9f2df7e193d4d0af",
132 3e6f33ca Stavros Sachtouris
        "b214244aa56df7d1df7c6cac066e7cef268d9c2beb4dcf7ce68af667b0626f91",
133 3e6f33ca Stavros Sachtouris
        "17f365f25e0682565ded30576066bb13377a3d306967e4d74e06bb6bbc20f75f",
134 3e6f33ca Stavros Sachtouris
        "2524ae208932669fff89adf8a2fc0df3b67736ca0d3aadce7a2ce640f142af37",
135 3e6f33ca Stavros Sachtouris
        "5d807a2129d2fcd3c221c3da418ed52af3fc48d0817b62e0bb437acffccd3514",
136 3e6f33ca Stavros Sachtouris
        "609de22ce842d997f645fc49d5f14e0e3766dd51a6cbe66383b2bab82c8dfcd0",
137 3e6f33ca Stavros Sachtouris
        "3102851ac168c78be70e35ff5178c7b1ebebd589e5106d565ca1094d1ca8ff59",
138 3e6f33ca Stavros Sachtouris
        "bfe306dd24e92a8d85caf7055643f250fd319e8c4cdd4755ddabbf3ff97e83c7"])
139 3e6f33ca Stavros Sachtouris
sharers = [
140 3e6f33ca Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="0b1a-82d5"),
141 3e6f33ca Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="0b2a-f2d5"),
142 3e6f33ca Stavros Sachtouris
    dict(last_modified="2013-01-29T16:50:06.084674+00:00", name="2b1a-82d6")]
143 3e6f33ca Stavros Sachtouris
144 3e6f33ca Stavros Sachtouris
145 3e6f33ca Stavros Sachtouris
class FR(object):
146 3e6f33ca Stavros Sachtouris
    """FR stands for Fake Response"""
147 3e6f33ca Stavros Sachtouris
    json = dict()
148 3e6f33ca Stavros Sachtouris
    headers = dict()
149 3e6f33ca Stavros Sachtouris
    content = json
150 3e6f33ca Stavros Sachtouris
    status = None
151 3e6f33ca Stavros Sachtouris
    status_code = 200
152 3e6f33ca Stavros Sachtouris
153 3e6f33ca Stavros Sachtouris
    def release(self):
154 3e6f33ca Stavros Sachtouris
        pass
155 3e6f33ca Stavros Sachtouris
156 3e6f33ca Stavros Sachtouris
157 3e6f33ca Stavros Sachtouris
class Storage(TestCase):
158 3e6f33ca Stavros Sachtouris
159 3e6f33ca Stavros Sachtouris
    files = []
160 3e6f33ca Stavros Sachtouris
161 3e6f33ca Stavros Sachtouris
    def _create_temp_file(self, num_of_blocks):
162 3e6f33ca Stavros Sachtouris
        self.files.append(NamedTemporaryFile())
163 3e6f33ca Stavros Sachtouris
        tmpFile = self.files[-1]
164 3e6f33ca Stavros Sachtouris
        file_size = num_of_blocks * 4 * 1024 * 1024
165 3e6f33ca Stavros Sachtouris
        print('\n\tCreate tmp file')
166 3e6f33ca Stavros Sachtouris
        tmpFile.write(urandom(file_size))
167 3e6f33ca Stavros Sachtouris
        tmpFile.flush()
168 3e6f33ca Stavros Sachtouris
        tmpFile.seek(0)
169 3e6f33ca Stavros Sachtouris
        print('\t\tDone')
170 3e6f33ca Stavros Sachtouris
        return tmpFile
171 3e6f33ca Stavros Sachtouris
172 3e6f33ca Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
173 3e6f33ca Stavros Sachtouris
        for k, v in d1.items():
174 3e6f33ca Stavros Sachtouris
            self.assertTrue(k in d2)
175 3e6f33ca Stavros Sachtouris
            if isinstance(v, dict):
176 3e6f33ca Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
177 3e6f33ca Stavros Sachtouris
            else:
178 3e6f33ca Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
179 3e6f33ca Stavros Sachtouris
180 3e6f33ca Stavros Sachtouris
    def setUp(self):
181 3e6f33ca Stavros Sachtouris
        self.url = 'https://www.example.com/pithos'
182 3e6f33ca Stavros Sachtouris
        self.token = 'p17h0570k3n'
183 3e6f33ca Stavros Sachtouris
        self.client = SC(self.url, self.token)
184 3e6f33ca Stavros Sachtouris
        self.client.account = user_id
185 3e6f33ca Stavros Sachtouris
        self.client.container = 'c0nt@1n3r_i'
186 3e6f33ca Stavros Sachtouris
187 3e6f33ca Stavros Sachtouris
    def tearDown(self):
188 3e6f33ca Stavros Sachtouris
        FR.headers = dict()
189 3e6f33ca Stavros Sachtouris
        FR.status_code = 200
190 3e6f33ca Stavros Sachtouris
        FR.json = dict()
191 3e6f33ca Stavros Sachtouris
        FR.content = FR.json
192 3e6f33ca Stavros Sachtouris
        for f in self.files:
193 3e6f33ca Stavros Sachtouris
            f.close()
194 3e6f33ca Stavros Sachtouris
195 3e6f33ca Stavros Sachtouris
    #  Pithos+ methods that extend storage API
196 3e6f33ca Stavros Sachtouris
197 3e6f33ca Stavros Sachtouris
    @patch('%s.head' % client_pkg, return_value=FR())
198 3e6f33ca Stavros Sachtouris
    def test_get_account_info(self, head):
199 3e6f33ca Stavros Sachtouris
        FR.headers = account_info
200 3e6f33ca Stavros Sachtouris
        r = self.client.get_account_info()
201 3e6f33ca Stavros Sachtouris
        self.assert_dicts_are_equal(account_info, r)
202 3e6f33ca Stavros Sachtouris
        self.assertEqual(
203 3e6f33ca Stavros Sachtouris
            head.mock_calls[-1],
204 3e6f33ca Stavros Sachtouris
            call('/%s' % self.client.account, success=(204, 401)))
205 3e6f33ca Stavros Sachtouris
        FR.status_code = 401
206 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.get_account_info)
207 3e6f33ca Stavros Sachtouris
208 3e6f33ca Stavros Sachtouris
    @patch('%s.post' % storage_pkg, return_value=FR())
209 3e6f33ca Stavros Sachtouris
    @patch('%s.set_header' % storage_pkg)
210 3e6f33ca Stavros Sachtouris
    def test_replace_account_meta(self, SH, post):
211 3e6f33ca Stavros Sachtouris
        metas = dict(k1='v1', k2='v2', k3='v3')
212 3e6f33ca Stavros Sachtouris
        self.client.replace_account_meta(metas)
213 3e6f33ca Stavros Sachtouris
        prfx = 'X-Account-Meta-'
214 3e6f33ca Stavros Sachtouris
        expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
215 3e6f33ca Stavros Sachtouris
        self.assertEqual(SH.mock_calls, expected)
216 3e6f33ca Stavros Sachtouris
        self.assertEqual(
217 3e6f33ca Stavros Sachtouris
            post.mock_calls[-1],
218 3e6f33ca Stavros Sachtouris
            call('/%s' % self.client.account, success=202))
219 3e6f33ca Stavros Sachtouris
220 3e6f33ca Stavros Sachtouris
    @patch('%s.post' % storage_pkg, return_value=FR())
221 3e6f33ca Stavros Sachtouris
    @patch('%s.get_account_info' % storage_pkg, return_value=account_info)
222 3e6f33ca Stavros Sachtouris
    def test_del_account_meta(self, GAI, post):
223 3e6f33ca Stavros Sachtouris
        prfx = 'x-account-meta-'
224 3e6f33ca Stavros Sachtouris
        keys = [k[len(prfx):] for k in account_info if k.startswith(prfx)]
225 3e6f33ca Stavros Sachtouris
        for key in keys:
226 3e6f33ca Stavros Sachtouris
            self.client.del_account_meta(key)
227 3e6f33ca Stavros Sachtouris
            self.assertEqual(
228 3e6f33ca Stavros Sachtouris
                post.mock_calls[-1],
229 3e6f33ca Stavros Sachtouris
                call('/%s' % self.client.account, success=202))
230 3e6f33ca Stavros Sachtouris
        self.assertEqual(len(keys), len(post.mock_calls))
231 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.del_account_meta, 'k4')
232 3e6f33ca Stavros Sachtouris
233 3e6f33ca Stavros Sachtouris
    """
234 3e6f33ca Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
235 3e6f33ca Stavros Sachtouris
    def test_create_container(self, put):
236 3e6f33ca Stavros Sachtouris
        FR.status_code = 201
237 3e6f33ca Stavros Sachtouris
        cont = 's0m3c0n731n3r'
238 3e6f33ca Stavros Sachtouris
        self.client.create_container(cont)
239 3e6f33ca Stavros Sachtouris
        expected = [call('/%s/%s' % (user_id, cont), success=(201, 202))]
240 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls, expected)
241 3e6f33ca Stavros Sachtouris
        FR.status_code = 202
242 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.create_container, cont)
243 3e6f33ca Stavros Sachtouris

244 3e6f33ca Stavros Sachtouris
    @patch('%s.container_head' % pithos_pkg, return_value=FR())
245 3e6f33ca Stavros Sachtouris
    def test_get_container_info(self, ch):
246 3e6f33ca Stavros Sachtouris
        FR.headers = container_info
247 3e6f33ca Stavros Sachtouris
        r = self.client.get_container_info()
248 3e6f33ca Stavros Sachtouris
        self.assert_dicts_are_equal(r, container_info)
249 3e6f33ca Stavros Sachtouris
        u = 'some date'
250 3e6f33ca Stavros Sachtouris
        r = self.client.get_container_info(until=u)
251 3e6f33ca Stavros Sachtouris
        self.assertEqual(ch.mock_calls, [call(until=None), call(until=u)])
252 3e6f33ca Stavros Sachtouris

253 3e6f33ca Stavros Sachtouris
    @patch('%s.delete' % pithos_pkg, return_value=FR())
254 3e6f33ca Stavros Sachtouris
    def test_delete_container(self, delete):
255 3e6f33ca Stavros Sachtouris
        FR.status_code = 204
256 3e6f33ca Stavros Sachtouris
        cont = 's0m3c0n731n3r'
257 3e6f33ca Stavros Sachtouris
        self.client.delete_container(cont)
258 3e6f33ca Stavros Sachtouris
        for err_code in (404, 409):
259 3e6f33ca Stavros Sachtouris
            FR.status_code = err_code
260 3e6f33ca Stavros Sachtouris
            self.assertRaises(ClientError, self.client.delete_container, cont)
261 3e6f33ca Stavros Sachtouris
        acall = call('/%s/%s' % (user_id, cont), success=(204, 404, 409))
262 3e6f33ca Stavros Sachtouris
        self.assertEqual(delete.mock_calls, [acall] * 3)
263 3e6f33ca Stavros Sachtouris

264 3e6f33ca Stavros Sachtouris
    @patch('%s.account_get' % pithos_pkg, return_value=FR())
265 3e6f33ca Stavros Sachtouris
    def test_list_containers(self, get):
266 3e6f33ca Stavros Sachtouris
        FR.json = container_list
267 3e6f33ca Stavros Sachtouris
        r = self.client.list_containers()
268 3e6f33ca Stavros Sachtouris
        for i in range(len(r)):
269 3e6f33ca Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], container_list[i])
270 3e6f33ca Stavros Sachtouris

271 3e6f33ca Stavros Sachtouris
    @patch('%s.get_container_info' % pithos_pkg, return_value=container_info)
272 3e6f33ca Stavros Sachtouris
    @patch('%s.container_post' % pithos_pkg, return_value=FR())
273 3e6f33ca Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
274 3e6f33ca Stavros Sachtouris
    def test_upload_object(self, CI, CP, OP):
275 3e6f33ca Stavros Sachtouris
        num_of_blocks = 8
276 3e6f33ca Stavros Sachtouris
        tmpFile = self._create_temp_file(num_of_blocks)
277 3e6f33ca Stavros Sachtouris

278 3e6f33ca Stavros Sachtouris
        # Without kwargs
279 3e6f33ca Stavros Sachtouris
        self.client.upload_object(obj, tmpFile)
280 3e6f33ca Stavros Sachtouris
        self.assertEqual(PC.get_container_info.mock_calls, [call()])
281 3e6f33ca Stavros Sachtouris
        [call1, call2] = PC.object_put.mock_calls
282 3e6f33ca Stavros Sachtouris

283 3e6f33ca Stavros Sachtouris
        (args1, kwargs1) = call1[1:3]
284 3e6f33ca Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
285 3e6f33ca Stavros Sachtouris
        self.assertEqual(args1, (obj,))
286 3e6f33ca Stavros Sachtouris
        expected1 = dict(
287 3e6f33ca Stavros Sachtouris
            hashmap=True,
288 3e6f33ca Stavros Sachtouris
            success=(201, 409),
289 3e6f33ca Stavros Sachtouris
            format='json',
290 3e6f33ca Stavros Sachtouris
            json=dict(
291 3e6f33ca Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
292 3e6f33ca Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
293 3e6f33ca Stavros Sachtouris
            etag=None,
294 3e6f33ca Stavros Sachtouris
            content_encoding=None,
295 3e6f33ca Stavros Sachtouris
            content_type='application/octet-stream',
296 3e6f33ca Stavros Sachtouris
            content_disposition=None,
297 3e6f33ca Stavros Sachtouris
            public=None,
298 3e6f33ca Stavros Sachtouris
            permissions=None)
299 3e6f33ca Stavros Sachtouris
        for k, v in expected1.items():
300 3e6f33ca Stavros Sachtouris
            if k == 'json':
301 3e6f33ca Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs1[k]['hashes']))
302 3e6f33ca Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs1[k]['bytes'])
303 3e6f33ca Stavros Sachtouris
            else:
304 3e6f33ca Stavros Sachtouris
                self.assertEqual(v, kwargs1[k])
305 3e6f33ca Stavros Sachtouris

306 3e6f33ca Stavros Sachtouris
        (args2, kwargs2) = call2[1:3]
307 3e6f33ca Stavros Sachtouris
        self.assertEqual(args2, (obj,))
308 3e6f33ca Stavros Sachtouris
        expected2 = dict(
309 3e6f33ca Stavros Sachtouris
            json=dict(
310 3e6f33ca Stavros Sachtouris
                hashes=['s0m3h@5h'] * num_of_blocks,
311 3e6f33ca Stavros Sachtouris
                bytes=num_of_blocks * 4 * 1024 * 1024),
312 3e6f33ca Stavros Sachtouris
            content_type='application/octet-stream',
313 3e6f33ca Stavros Sachtouris
            hashmap=True,
314 3e6f33ca Stavros Sachtouris
            success=201,
315 3e6f33ca Stavros Sachtouris
            format='json')
316 3e6f33ca Stavros Sachtouris
        for k, v in expected2.items():
317 3e6f33ca Stavros Sachtouris
            if k == 'json':
318 3e6f33ca Stavros Sachtouris
                self.assertEqual(len(v['hashes']), len(kwargs2[k]['hashes']))
319 3e6f33ca Stavros Sachtouris
                self.assertEqual(v['bytes'], kwargs2[k]['bytes'])
320 3e6f33ca Stavros Sachtouris
            else:
321 3e6f33ca Stavros Sachtouris
                self.assertEqual(v, kwargs2[k])
322 3e6f33ca Stavros Sachtouris

323 3e6f33ca Stavros Sachtouris
        OP = PC.object_put
324 3e6f33ca Stavros Sachtouris
        mock_offset = 2
325 3e6f33ca Stavros Sachtouris

326 3e6f33ca Stavros Sachtouris
        #  With progress bars
327 3e6f33ca Stavros Sachtouris
        try:
328 3e6f33ca Stavros Sachtouris
            from progress.bar import ShadyBar
329 3e6f33ca Stavros Sachtouris
            blck_bar = ShadyBar('Mock blck calc.')
330 3e6f33ca Stavros Sachtouris
            upld_bar = ShadyBar('Mock uplds')
331 3e6f33ca Stavros Sachtouris
        except ImportError:
332 3e6f33ca Stavros Sachtouris
            blck_bar = None
333 3e6f33ca Stavros Sachtouris
            upld_bar = None
334 3e6f33ca Stavros Sachtouris

335 3e6f33ca Stavros Sachtouris
        if blck_bar and upld_bar:
336 3e6f33ca Stavros Sachtouris

337 3e6f33ca Stavros Sachtouris
            def blck_gen(n):
338 3e6f33ca Stavros Sachtouris
                for i in blck_bar.iter(range(n)):
339 3e6f33ca Stavros Sachtouris
                    yield
340 3e6f33ca Stavros Sachtouris
                yield
341 3e6f33ca Stavros Sachtouris

342 3e6f33ca Stavros Sachtouris
            def upld_gen(n):
343 3e6f33ca Stavros Sachtouris
                for i in upld_bar.iter(range(n)):
344 3e6f33ca Stavros Sachtouris
                    yield
345 3e6f33ca Stavros Sachtouris
                yield
346 3e6f33ca Stavros Sachtouris

347 3e6f33ca Stavros Sachtouris
            tmpFile.seek(0)
348 3e6f33ca Stavros Sachtouris
            self.client.upload_object(
349 3e6f33ca Stavros Sachtouris
                obj, tmpFile,
350 3e6f33ca Stavros Sachtouris
                hash_cb=blck_gen, upload_cb=upld_gen)
351 3e6f33ca Stavros Sachtouris

352 3e6f33ca Stavros Sachtouris
            for i, c in enumerate(OP.mock_calls[-mock_offset:]):
353 3e6f33ca Stavros Sachtouris
                self.assertEqual(OP.mock_calls[i], c)
354 3e6f33ca Stavros Sachtouris

355 3e6f33ca Stavros Sachtouris
        #  With content-type
356 3e6f33ca Stavros Sachtouris
        tmpFile.seek(0)
357 3e6f33ca Stavros Sachtouris
        ctype = 'video/mpeg'
358 3e6f33ca Stavros Sachtouris
        sharing = dict(read=['u1', 'g1', 'u2'], write=['u1'])
359 3e6f33ca Stavros Sachtouris
        self.client.upload_object(obj, tmpFile,
360 3e6f33ca Stavros Sachtouris
            content_type=ctype, sharing=sharing)
361 3e6f33ca Stavros Sachtouris
        self.assertEqual(OP.mock_calls[-1][2]['content_type'], ctype)
362 3e6f33ca Stavros Sachtouris
        self.assert_dicts_are_equal(
363 3e6f33ca Stavros Sachtouris
            OP.mock_calls[-2][2]['permissions'],
364 3e6f33ca Stavros Sachtouris
            sharing)
365 3e6f33ca Stavros Sachtouris

366 3e6f33ca Stavros Sachtouris
        # With other args
367 3e6f33ca Stavros Sachtouris
        tmpFile.seek(0)
368 3e6f33ca Stavros Sachtouris
        kwargs = dict(
369 3e6f33ca Stavros Sachtouris
            etag='s0m3E74g',
370 3e6f33ca Stavros Sachtouris
            content_type=ctype,
371 3e6f33ca Stavros Sachtouris
            content_disposition=ctype + 'd15p051710n',
372 3e6f33ca Stavros Sachtouris
            public=True,
373 3e6f33ca Stavros Sachtouris
            content_encoding='802.11')
374 3e6f33ca Stavros Sachtouris
        self.client.upload_object(obj, tmpFile, **kwargs)
375 3e6f33ca Stavros Sachtouris
        for arg, val in kwargs.items():
376 3e6f33ca Stavros Sachtouris
            self.assertEqual(OP.mock_calls[-2][2][arg], val)
377 3e6f33ca Stavros Sachtouris

378 3e6f33ca Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
379 3e6f33ca Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
380 3e6f33ca Stavros Sachtouris
    def test_create_object(self, SH, put):
381 3e6f33ca Stavros Sachtouris
        cont = self.client.container
382 3e6f33ca Stavros Sachtouris
        ctype = 'c0n73n7/typ3'
383 3e6f33ca Stavros Sachtouris
        exp_shd = [
384 3e6f33ca Stavros Sachtouris
            call('Content-Type', 'application/octet-stream'),
385 3e6f33ca Stavros Sachtouris
            call('Content-length', '0'),
386 3e6f33ca Stavros Sachtouris
            call('Content-Type', ctype), call('Content-length', '42')]
387 3e6f33ca Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)] * 2
388 3e6f33ca Stavros Sachtouris
        self.client.create_object(obj)
389 3e6f33ca Stavros Sachtouris
        self.client.create_object(obj, content_type=ctype, content_length=42)
390 3e6f33ca Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, exp_shd)
391 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls, exp_put)
392 3e6f33ca Stavros Sachtouris

393 3e6f33ca Stavros Sachtouris
    @patch('%s.put' % pithos_pkg, return_value=FR())
394 3e6f33ca Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
395 3e6f33ca Stavros Sachtouris
    def test_create_directory(self, SH, put):
396 3e6f33ca Stavros Sachtouris
        cont = self.client.container
397 3e6f33ca Stavros Sachtouris
        exp_shd = [
398 3e6f33ca Stavros Sachtouris
            call('Content-Type', 'application/directory'),
399 3e6f33ca Stavros Sachtouris
            call('Content-length', '0')]
400 3e6f33ca Stavros Sachtouris
        exp_put = [call('/%s/%s/%s' % (user_id, cont, obj), success=201)]
401 3e6f33ca Stavros Sachtouris
        self.client.create_directory(obj)
402 3e6f33ca Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, exp_shd)
403 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls, exp_put)
404 3e6f33ca Stavros Sachtouris

405 3e6f33ca Stavros Sachtouris
    def test_get_object_info(self):
406 3e6f33ca Stavros Sachtouris
        FR.headers = object_info
407 3e6f33ca Stavros Sachtouris
        version = 'v3r510n'
408 3e6f33ca Stavros Sachtouris
        with patch.object(PC, 'object_head', return_value=FR()) as head:
409 3e6f33ca Stavros Sachtouris
            r = self.client.get_object_info(obj)
410 3e6f33ca Stavros Sachtouris
            self.assertEqual(r, object_info)
411 3e6f33ca Stavros Sachtouris
            r = self.client.get_object_info(obj, version=version)
412 3e6f33ca Stavros Sachtouris
            self.assertEqual(head.mock_calls, [
413 3e6f33ca Stavros Sachtouris
                call(obj, version=None),
414 3e6f33ca Stavros Sachtouris
                call(obj, version=version)])
415 3e6f33ca Stavros Sachtouris
        with patch.object(
416 3e6f33ca Stavros Sachtouris
                PC,
417 3e6f33ca Stavros Sachtouris
                'object_head',
418 3e6f33ca Stavros Sachtouris
                side_effect=ClientError('Obj not found', 404)):
419 3e6f33ca Stavros Sachtouris
            self.assertRaises(
420 3e6f33ca Stavros Sachtouris
                ClientError,
421 3e6f33ca Stavros Sachtouris
                self.client.get_object_info,
422 3e6f33ca Stavros Sachtouris
                obj, version=version)
423 3e6f33ca Stavros Sachtouris

424 3e6f33ca Stavros Sachtouris
    @patch('%s.get_object_info' % pithos_pkg, return_value=object_info)
425 3e6f33ca Stavros Sachtouris
    def test_get_object_meta(self, GOI):
426 3e6f33ca Stavros Sachtouris
        expected = dict()
427 3e6f33ca Stavros Sachtouris
        for k, v in object_info.items():
428 3e6f33ca Stavros Sachtouris
            expected[k] = v
429 3e6f33ca Stavros Sachtouris
        r = self.client.get_object_meta(obj)
430 3e6f33ca Stavros Sachtouris
        self.assert_dicts_are_equal(r, expected)
431 3e6f33ca Stavros Sachtouris

432 3e6f33ca Stavros Sachtouris
    @patch('%s.object_post' % pithos_pkg, return_value=FR())
433 3e6f33ca Stavros Sachtouris
    def test_del_object_meta(self, post):
434 3e6f33ca Stavros Sachtouris
        metakey = '50m3m3t4k3y'
435 3e6f33ca Stavros Sachtouris
        self.client.del_object_meta(obj, metakey)
436 3e6f33ca Stavros Sachtouris
        expected = call(obj, update=True, metadata={metakey: ''})
437 3e6f33ca Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], expected)
438 3e6f33ca Stavros Sachtouris

439 3e6f33ca Stavros Sachtouris
    @patch('%s.post' % client_pkg, return_value=FR())
440 3e6f33ca Stavros Sachtouris
    @patch('%s.set_header' % client_pkg)
441 3e6f33ca Stavros Sachtouris
    def test_replace_object_meta(self, SH, post):
442 3e6f33ca Stavros Sachtouris
        metas = dict(k1='new1', k2='new2', k3='new3')
443 3e6f33ca Stavros Sachtouris
        cont = self.client.container
444 3e6f33ca Stavros Sachtouris
        self.client.replace_object_meta(metas)
445 3e6f33ca Stavros Sachtouris
        expected = call('/%s/%s' % (user_id, cont), success=202)
446 3e6f33ca Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], expected)
447 3e6f33ca Stavros Sachtouris
        prfx = 'X-Object-Meta-'
448 3e6f33ca Stavros Sachtouris
        expected = [call('%s%s' % (prfx, k), v) for k, v in metas.items()]
449 3e6f33ca Stavros Sachtouris
        self.assertEqual(PC.set_header.mock_calls, expected)
450 3e6f33ca Stavros Sachtouris

451 3e6f33ca Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
452 3e6f33ca Stavros Sachtouris
    def test_copy_object(self, put):
453 3e6f33ca Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
454 3e6f33ca Stavros Sachtouris
        src_obj = 'src-0bj'
455 3e6f33ca Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
456 3e6f33ca Stavros Sachtouris
        dst_obj = 'dst-0bj'
457 3e6f33ca Stavros Sachtouris
        expected = call(
458 3e6f33ca Stavros Sachtouris
            src_obj,
459 3e6f33ca Stavros Sachtouris
            content_length=0,
460 3e6f33ca Stavros Sachtouris
            source_account=None,
461 3e6f33ca Stavros Sachtouris
            success=201,
462 3e6f33ca Stavros Sachtouris
            copy_from='/%s/%s' % (src_cont, src_obj),
463 3e6f33ca Stavros Sachtouris
            delimiter=None,
464 3e6f33ca Stavros Sachtouris
            content_type=None,
465 3e6f33ca Stavros Sachtouris
            source_version=None,
466 3e6f33ca Stavros Sachtouris
            public=False)
467 3e6f33ca Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont)
468 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
469 3e6f33ca Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, dst_obj)
470 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
471 3e6f33ca Stavros Sachtouris
        kwargs = dict(
472 3e6f33ca Stavros Sachtouris
            source_version='src-v3r510n',
473 3e6f33ca Stavros Sachtouris
            source_account='src-4cc0un7',
474 3e6f33ca Stavros Sachtouris
            public=True,
475 3e6f33ca Stavros Sachtouris
            content_type='c0n73n7Typ3',
476 3e6f33ca Stavros Sachtouris
            delimiter='5')
477 3e6f33ca Stavros Sachtouris
        self.client.copy_object(src_cont, src_obj, dst_cont, **kwargs)
478 3e6f33ca Stavros Sachtouris
        for k, v in kwargs.items():
479 3e6f33ca Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
480 3e6f33ca Stavros Sachtouris

481 3e6f33ca Stavros Sachtouris
    @patch('%s.object_put' % pithos_pkg, return_value=FR())
482 3e6f33ca Stavros Sachtouris
    def test_move_object(self, put):
483 3e6f33ca Stavros Sachtouris
        src_cont = 'src-c0nt41n3r'
484 3e6f33ca Stavros Sachtouris
        src_obj = 'src-0bj'
485 3e6f33ca Stavros Sachtouris
        dst_cont = 'dst-c0nt41n3r'
486 3e6f33ca Stavros Sachtouris
        dst_obj = 'dst-0bj'
487 3e6f33ca Stavros Sachtouris
        expected = call(
488 3e6f33ca Stavros Sachtouris
            src_obj,
489 3e6f33ca Stavros Sachtouris
            content_length=0,
490 3e6f33ca Stavros Sachtouris
            source_account=None,
491 3e6f33ca Stavros Sachtouris
            success=201,
492 3e6f33ca Stavros Sachtouris
            move_from='/%s/%s' % (src_cont, src_obj),
493 3e6f33ca Stavros Sachtouris
            delimiter=None,
494 3e6f33ca Stavros Sachtouris
            content_type=None,
495 3e6f33ca Stavros Sachtouris
            source_version=None,
496 3e6f33ca Stavros Sachtouris
            public=False)
497 3e6f33ca Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont)
498 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1], expected)
499 3e6f33ca Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, dst_obj)
500 3e6f33ca Stavros Sachtouris
        self.assertEqual(put.mock_calls[-1][1], (dst_obj,))
501 3e6f33ca Stavros Sachtouris
        kwargs = dict(
502 3e6f33ca Stavros Sachtouris
            source_version='src-v3r510n',
503 3e6f33ca Stavros Sachtouris
            source_account='src-4cc0un7',
504 3e6f33ca Stavros Sachtouris
            public=True,
505 3e6f33ca Stavros Sachtouris
            content_type='c0n73n7Typ3',
506 3e6f33ca Stavros Sachtouris
            delimiter='5')
507 3e6f33ca Stavros Sachtouris
        self.client.move_object(src_cont, src_obj, dst_cont, **kwargs)
508 3e6f33ca Stavros Sachtouris
        for k, v in kwargs.items():
509 3e6f33ca Stavros Sachtouris
            self.assertEqual(v, put.mock_calls[-1][2][k])
510 3e6f33ca Stavros Sachtouris

511 3e6f33ca Stavros Sachtouris
    @patch('%s.delete' % client_pkg, return_value=FR())
512 3e6f33ca Stavros Sachtouris
    def test_delete_object(self, delete):
513 3e6f33ca Stavros Sachtouris
        cont = self.client.container
514 3e6f33ca Stavros Sachtouris
        self.client.delete_object(obj)
515 3e6f33ca Stavros Sachtouris
        self.assertEqual(
516 3e6f33ca Stavros Sachtouris
            delete.mock_calls[-1],
517 3e6f33ca Stavros Sachtouris
            call('/%s/%s/%s' % (user_id, cont, obj), success=(204, 404)))
518 3e6f33ca Stavros Sachtouris
        FR.status_code = 404
519 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.delete_object, obj)
520 3e6f33ca Stavros Sachtouris

521 3e6f33ca Stavros Sachtouris
    @patch('%s.get' % client_pkg, return_value=FR())
522 3e6f33ca Stavros Sachtouris
    @patch('%s.set_param' % client_pkg)
523 3e6f33ca Stavros Sachtouris
    def test_list_objects(self, SP, get):
524 3e6f33ca Stavros Sachtouris
        FR.json = object_list
525 3e6f33ca Stavros Sachtouris
        acc = self.client.account
526 3e6f33ca Stavros Sachtouris
        cont = self.client.container
527 3e6f33ca Stavros Sachtouris
        SP = PC.set_param
528 3e6f33ca Stavros Sachtouris
        r = self.client.list_objects()
529 3e6f33ca Stavros Sachtouris
        for i in range(len(r)):
530 3e6f33ca Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], object_list[i])
531 3e6f33ca Stavros Sachtouris
        self.assertEqual(get.mock_calls, [
532 3e6f33ca Stavros Sachtouris
            call('/%s/%s' % (acc, cont), success=(200, 204, 304, 404))])
533 3e6f33ca Stavros Sachtouris
        self.assertEqual(SP.mock_calls, [call('format', 'json')])
534 3e6f33ca Stavros Sachtouris
        FR.status_code = 304
535 3e6f33ca Stavros Sachtouris
        self.assertEqual(self.client.list_objects(), [])
536 3e6f33ca Stavros Sachtouris
        FR.status_code = 404
537 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.list_objects)
538 3e6f33ca Stavros Sachtouris

539 3e6f33ca Stavros Sachtouris
    @patch('%s.get' % client_pkg, return_value=FR())
540 3e6f33ca Stavros Sachtouris
    @patch('%s.set_param' % client_pkg)
541 3e6f33ca Stavros Sachtouris
    def test_list_objects_in_path(self, SP, get):
542 3e6f33ca Stavros Sachtouris
        FR.json = object_list
543 3e6f33ca Stavros Sachtouris
        path = '/some/awsome/path'
544 3e6f33ca Stavros Sachtouris
        acc = self.client.account
545 3e6f33ca Stavros Sachtouris
        cont = self.client.container
546 3e6f33ca Stavros Sachtouris
        SP = PC.set_param
547 3e6f33ca Stavros Sachtouris
        self.client.list_objects_in_path(path)
548 3e6f33ca Stavros Sachtouris
        self.assertEqual(get.mock_calls, [
549 3e6f33ca Stavros Sachtouris
            call('/%s/%s' % (acc, cont), success=(200, 204, 404))])
550 3e6f33ca Stavros Sachtouris
        self.assertEqual(SP.mock_calls, [
551 3e6f33ca Stavros Sachtouris
            call('format', 'json'), call('path', path)])
552 3e6f33ca Stavros Sachtouris
        FR.status_code = 404
553 3e6f33ca Stavros Sachtouris
        self.assertRaises(ClientError, self.client.list_objects)
554 3e6f33ca Stavros Sachtouris
    """
555 3e6f33ca Stavros Sachtouris
556 3e6f33ca Stavros Sachtouris
if __name__ == '__main__':
557 3e6f33ca Stavros Sachtouris
    from sys import argv
558 3e6f33ca Stavros Sachtouris
    from kamaki.clients.test import runTestCase
559 3e6f33ca Stavros Sachtouris
    runTestCase(Storage, 'Storage Client', argv[1:])