Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test.py @ 6d6d5141

History | View | Annotate | Download (18.6 kB)

1 85898ca4 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 97baa5c3 Stavros Sachtouris
from mock import patch, call
35 db113224 Stavros Sachtouris
from unittest import makeSuite, TestSuite, TextTestRunner, TestCase
36 db113224 Stavros Sachtouris
from time import sleep
37 85898ca4 Stavros Sachtouris
from inspect import getmembers, isclass
38 97baa5c3 Stavros Sachtouris
from itertools import product
39 9c6c3d69 Stavros Sachtouris
from random import randint
40 c1004a00 Stavros Sachtouris
41 480585cd Stavros Sachtouris
from kamaki.clients.utils.test import Utils
42 3c50df2e Stavros Sachtouris
from kamaki.clients.astakos.test import AstakosClient
43 3c50df2e Stavros Sachtouris
from kamaki.clients.compute.test import ComputeClient, ComputeRestClient
44 3c50df2e Stavros Sachtouris
from kamaki.clients.cyclades.test import CycladesClient
45 3c50df2e Stavros Sachtouris
from kamaki.clients.cyclades.test import CycladesRestClient
46 3c50df2e Stavros Sachtouris
from kamaki.clients.image.test import ImageClient
47 3c50df2e Stavros Sachtouris
from kamaki.clients.storage.test import StorageClient
48 3c50df2e Stavros Sachtouris
from kamaki.clients.pithos.test import PithosClient, PithosRestClient
49 c1004a00 Stavros Sachtouris
50 c1004a00 Stavros Sachtouris
51 f4de4c91 Stavros Sachtouris
class ClientError(TestCase):
52 f4de4c91 Stavros Sachtouris
53 f4de4c91 Stavros Sachtouris
    def test___init__(self):
54 f4de4c91 Stavros Sachtouris
        from kamaki.clients import ClientError
55 f4de4c91 Stavros Sachtouris
        for msg, status, details, exp_msg, exp_status, exp_details in (
56 f4de4c91 Stavros Sachtouris
                ('some msg', 42, 0.28, 0, 0, 0),
57 f4de4c91 Stavros Sachtouris
                ('some msg', 'fail', [], 0, 0, 0),
58 f4de4c91 Stavros Sachtouris
                ('some msg', 42, 'details on error', 0, 0, 0),
59 f4de4c91 Stavros Sachtouris
                (
60 f4de4c91 Stavros Sachtouris
                    '404 {"ExampleError":'
61 f4de4c91 Stavros Sachtouris
                    ' {"message": "a msg", "code": 42, "details": "dets"}}',
62 f4de4c91 Stavros Sachtouris
                    404,
63 f4de4c91 Stavros Sachtouris
                    0,
64 f4de4c91 Stavros Sachtouris
                    '404 ExampleError (a msg)\n',
65 f4de4c91 Stavros Sachtouris
                    42,
66 f4de4c91 Stavros Sachtouris
                    ['dets']),
67 f4de4c91 Stavros Sachtouris
                (
68 f4de4c91 Stavros Sachtouris
                    '404 {"ExampleError":'
69 f4de4c91 Stavros Sachtouris
                    ' {"message": "a msg", "code": 42}}',
70 f4de4c91 Stavros Sachtouris
                    404,
71 f4de4c91 Stavros Sachtouris
                    'details on error',
72 f4de4c91 Stavros Sachtouris
                    '404 ExampleError (a msg)\n',
73 f4de4c91 Stavros Sachtouris
                    42,
74 f4de4c91 Stavros Sachtouris
                    0),
75 f4de4c91 Stavros Sachtouris
                (
76 f4de4c91 Stavros Sachtouris
                    '404 {"ExampleError":'
77 f4de4c91 Stavros Sachtouris
                    ' {"details": "Explain your error"}}',
78 f4de4c91 Stavros Sachtouris
                    404,
79 f4de4c91 Stavros Sachtouris
                    'details on error',
80 f4de4c91 Stavros Sachtouris
                    '404 ExampleError',
81 f4de4c91 Stavros Sachtouris
                    0,
82 f4de4c91 Stavros Sachtouris
                    ['details on error', 'Explain your error']),
83 f4de4c91 Stavros Sachtouris
                ('some msg\n', -10, ['details', 'on', 'error'], 0, 0, 0)):
84 f4de4c91 Stavros Sachtouris
            ce = ClientError(msg, status, details)
85 f4de4c91 Stavros Sachtouris
            exp_msg = exp_msg or (msg if msg.endswith('\n') else msg + '\n')
86 f4de4c91 Stavros Sachtouris
            exp_status = exp_status or status
87 f4de4c91 Stavros Sachtouris
            exp_details = exp_details or details
88 f4de4c91 Stavros Sachtouris
            self.assertEqual('%s' % ce, exp_msg)
89 f4de4c91 Stavros Sachtouris
            self.assertEqual(
90 f4de4c91 Stavros Sachtouris
                exp_status if isinstance(exp_status, int) else 0,
91 f4de4c91 Stavros Sachtouris
                ce.status)
92 f4de4c91 Stavros Sachtouris
            self.assertEqual(exp_details, ce.details)
93 db113224 Stavros Sachtouris
94 f4de4c91 Stavros Sachtouris
95 7fa5c263 Stavros Sachtouris
class RequestManager(TestCase):
96 7fa5c263 Stavros Sachtouris
97 7fa5c263 Stavros Sachtouris
    def setUp(self):
98 7fa5c263 Stavros Sachtouris
        from kamaki.clients import RequestManager
99 7fa5c263 Stavros Sachtouris
        self.RM = RequestManager
100 7fa5c263 Stavros Sachtouris
101 7fa5c263 Stavros Sachtouris
    def test___init__(self):
102 7fa5c263 Stavros Sachtouris
        from kamaki.clients import HTTP_METHODS
103 7fa5c263 Stavros Sachtouris
        method_values = HTTP_METHODS + [v.lower() for v in HTTP_METHODS]
104 7fa5c263 Stavros Sachtouris
        for args in product(
105 7fa5c263 Stavros Sachtouris
                tuple(method_values),
106 7fa5c263 Stavros Sachtouris
                ('http://www.example.com', 'https://example.com', ''),
107 7fa5c263 Stavros Sachtouris
                ('/some/path', '/' ''),
108 7fa5c263 Stavros Sachtouris
                ('Some data', '', None),
109 7fa5c263 Stavros Sachtouris
                (dict(k1='v1', k2='v2'), dict()),
110 7fa5c263 Stavros Sachtouris
                (dict(k='v', k2=None, k3='v3'), dict(k=0), dict(k='v'), {})):
111 7fa5c263 Stavros Sachtouris
            req = self.RM(*args)
112 7fa5c263 Stavros Sachtouris
            method, url, path, data, headers, params = args
113 7fa5c263 Stavros Sachtouris
            self.assertEqual(req.method, method.upper())
114 7fa5c263 Stavros Sachtouris
            for i, (k, v) in enumerate(params.items()):
115 7fa5c263 Stavros Sachtouris
                path += '%s%s%s' % (
116 7fa5c263 Stavros Sachtouris
                    '&' if '?' in path or i else '?',
117 7fa5c263 Stavros Sachtouris
                    k,
118 7fa5c263 Stavros Sachtouris
                    ('=%s' % v) if v else '')
119 7fa5c263 Stavros Sachtouris
            self.assertEqual(req.path, path)
120 7fa5c263 Stavros Sachtouris
            self.assertEqual(req.data, data)
121 7fa5c263 Stavros Sachtouris
            self.assertEqual(req.headers, headers)
122 7fa5c263 Stavros Sachtouris
        self.assertRaises(AssertionError, self.RM, 'GOT', '', '', '', {}, {})
123 7fa5c263 Stavros Sachtouris
124 f8eea8ec Stavros Sachtouris
    @patch('httplib.HTTPConnection.getresponse')
125 f8eea8ec Stavros Sachtouris
    @patch('httplib.HTTPConnection.request')
126 f8eea8ec Stavros Sachtouris
    def test_perform(self, request, getresponse):
127 f8eea8ec Stavros Sachtouris
        from httplib import HTTPConnection
128 f8eea8ec Stavros Sachtouris
        self.RM('GET', 'http://example.com', '/').perform(
129 f8eea8ec Stavros Sachtouris
            HTTPConnection('http', 'example.com'))
130 f8eea8ec Stavros Sachtouris
        expected = dict(body=None, headers={}, url='/', method='GET')
131 f8eea8ec Stavros Sachtouris
        request.assert_called_once_with(**expected)
132 f8eea8ec Stavros Sachtouris
        getresponse.assert_called_once_with()
133 f8eea8ec Stavros Sachtouris
134 f8eea8ec Stavros Sachtouris
135 f8eea8ec Stavros Sachtouris
class FakeResp(object):
136 f8eea8ec Stavros Sachtouris
137 f8eea8ec Stavros Sachtouris
    READ = 'something to read'
138 f8eea8ec Stavros Sachtouris
    HEADERS = dict(k='v', k1='v1', k2='v2')
139 f8eea8ec Stavros Sachtouris
    reason = 'some reason'
140 f8eea8ec Stavros Sachtouris
    status = 42
141 c088076b Stavros Sachtouris
    status_code = 200
142 f8eea8ec Stavros Sachtouris
143 f8eea8ec Stavros Sachtouris
    def read(self):
144 f8eea8ec Stavros Sachtouris
        return self.READ
145 f8eea8ec Stavros Sachtouris
146 f8eea8ec Stavros Sachtouris
    def getheaders(self):
147 f8eea8ec Stavros Sachtouris
        return self.HEADERS.items()
148 f8eea8ec Stavros Sachtouris
149 f8eea8ec Stavros Sachtouris
150 f8eea8ec Stavros Sachtouris
class ResponseManager(TestCase):
151 f8eea8ec Stavros Sachtouris
152 f8eea8ec Stavros Sachtouris
    def setUp(self):
153 f8eea8ec Stavros Sachtouris
        from kamaki.clients import ResponseManager, RequestManager
154 f8eea8ec Stavros Sachtouris
        from httplib import HTTPConnection
155 f8eea8ec Stavros Sachtouris
        self.RM = ResponseManager(RequestManager('GET', 'http://ok', '/'))
156 f8eea8ec Stavros Sachtouris
        self.HTTPC = HTTPConnection
157 f8eea8ec Stavros Sachtouris
158 f8eea8ec Stavros Sachtouris
    def tearDown(self):
159 f8eea8ec Stavros Sachtouris
        FakeResp.READ = 'something to read'
160 f8eea8ec Stavros Sachtouris
161 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
162 f8eea8ec Stavros Sachtouris
    def test_content(self, perform):
163 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.content, FakeResp.READ)
164 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
165 f8eea8ec Stavros Sachtouris
166 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
167 f8eea8ec Stavros Sachtouris
    def test_text(self, perform):
168 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.text, FakeResp.READ)
169 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
170 f8eea8ec Stavros Sachtouris
171 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
172 f8eea8ec Stavros Sachtouris
    def test_status(self, perform):
173 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.status, FakeResp.reason)
174 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
175 f8eea8ec Stavros Sachtouris
176 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
177 f8eea8ec Stavros Sachtouris
    def test_status_code(self, perform):
178 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.status_code, FakeResp.status)
179 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
180 f8eea8ec Stavros Sachtouris
181 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
182 f8eea8ec Stavros Sachtouris
    def test_headers(self, perform):
183 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.headers, FakeResp.HEADERS)
184 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
185 f8eea8ec Stavros Sachtouris
186 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
187 f8eea8ec Stavros Sachtouris
    def test_json(self, perform):
188 f8eea8ec Stavros Sachtouris
        try:
189 f8eea8ec Stavros Sachtouris
            self.RM.json
190 f8eea8ec Stavros Sachtouris
        except Exception as e:
191 f8eea8ec Stavros Sachtouris
            self.assertEqual(
192 f8eea8ec Stavros Sachtouris
                '%s' % e,
193 f8eea8ec Stavros Sachtouris
                'Response not formated in JSON - '
194 f8eea8ec Stavros Sachtouris
                'No JSON object could be decoded\n')
195 f8eea8ec Stavros Sachtouris
196 f8eea8ec Stavros Sachtouris
        from json import dumps
197 f8eea8ec Stavros Sachtouris
        FakeResp.READ = dumps(FakeResp.HEADERS)
198 f8eea8ec Stavros Sachtouris
        self.RM._request_performed = False
199 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.json, FakeResp.HEADERS)
200 f8eea8ec Stavros Sachtouris
        self.assertTrue(isinstance(perform.call_args[0][0], self.HTTPC))
201 f8eea8ec Stavros Sachtouris
202 f8eea8ec Stavros Sachtouris
    @patch('kamaki.clients.RequestManager.perform', return_value=FakeResp())
203 f8eea8ec Stavros Sachtouris
    def test_all(self, perform):
204 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.content, FakeResp.READ)
205 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.text, FakeResp.READ)
206 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.status, FakeResp.reason)
207 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.status_code, FakeResp.status)
208 f8eea8ec Stavros Sachtouris
        self.assertEqual(self.RM.headers, FakeResp.HEADERS)
209 f8eea8ec Stavros Sachtouris
        perform.assert_called_only_once
210 f8eea8ec Stavros Sachtouris
211 7fa5c263 Stavros Sachtouris
212 f4de4c91 Stavros Sachtouris
class SilentEvent(TestCase):
213 db113224 Stavros Sachtouris
214 27abfa9f Stavros Sachtouris
    def thread_content(self, methodid, raiseException=0):
215 db113224 Stavros Sachtouris
        wait = 0.1
216 f4de4c91 Stavros Sachtouris
        self.can_finish = -1
217 db113224 Stavros Sachtouris
        while self.can_finish < methodid and wait < 4:
218 db113224 Stavros Sachtouris
            sleep(wait)
219 db113224 Stavros Sachtouris
            wait = 2 * wait
220 27abfa9f Stavros Sachtouris
        if raiseException and raiseException == methodid:
221 27abfa9f Stavros Sachtouris
            raise Exception('Some exception')
222 03493855 Stavros Sachtouris
        self._value = methodid
223 db113224 Stavros Sachtouris
        self.assertTrue(wait < 4)
224 db113224 Stavros Sachtouris
225 db113224 Stavros Sachtouris
    def setUp(self):
226 db113224 Stavros Sachtouris
        from kamaki.clients import SilentEvent
227 db113224 Stavros Sachtouris
        self.SE = SilentEvent
228 db113224 Stavros Sachtouris
229 27abfa9f Stavros Sachtouris
    def test_run(self):
230 27abfa9f Stavros Sachtouris
        threads = [self.SE(self.thread_content, i) for i in range(4)]
231 db113224 Stavros Sachtouris
        for t in threads:
232 db113224 Stavros Sachtouris
            t.start()
233 db113224 Stavros Sachtouris
234 db113224 Stavros Sachtouris
        for i in range(4):
235 db113224 Stavros Sachtouris
            self.assertTrue(threads[i].is_alive())
236 db113224 Stavros Sachtouris
            self.can_finish = i
237 db113224 Stavros Sachtouris
            threads[i].join()
238 db113224 Stavros Sachtouris
            self.assertFalse(threads[i].is_alive())
239 db113224 Stavros Sachtouris
240 27abfa9f Stavros Sachtouris
    def test_value(self):
241 27abfa9f Stavros Sachtouris
        threads = [self.SE(self.thread_content, i) for i in range(4)]
242 27abfa9f Stavros Sachtouris
        for t in threads:
243 27abfa9f Stavros Sachtouris
            t.start()
244 27abfa9f Stavros Sachtouris
245 27abfa9f Stavros Sachtouris
        for mid, t in enumerate(threads):
246 27abfa9f Stavros Sachtouris
            if t.is_alive():
247 27abfa9f Stavros Sachtouris
                self.can_finish = mid
248 27abfa9f Stavros Sachtouris
                continue
249 27abfa9f Stavros Sachtouris
            self.assertTrue(mid, t.value)
250 27abfa9f Stavros Sachtouris
251 27abfa9f Stavros Sachtouris
    def test_exception(self):
252 27abfa9f Stavros Sachtouris
        threads = [self.SE(self.thread_content, i, (i % 2)) for i in range(4)]
253 27abfa9f Stavros Sachtouris
        for t in threads:
254 27abfa9f Stavros Sachtouris
            t.start()
255 27abfa9f Stavros Sachtouris
256 27abfa9f Stavros Sachtouris
        for i, t in enumerate(threads):
257 27abfa9f Stavros Sachtouris
            if t.is_alive():
258 27abfa9f Stavros Sachtouris
                self.can_finish = i
259 27abfa9f Stavros Sachtouris
                continue
260 27abfa9f Stavros Sachtouris
            if i % 2:
261 27abfa9f Stavros Sachtouris
                self.assertTrue(isinstance(t.exception, Exception))
262 27abfa9f Stavros Sachtouris
            else:
263 27abfa9f Stavros Sachtouris
                self.assertFalse(t.exception)
264 27abfa9f Stavros Sachtouris
265 db113224 Stavros Sachtouris
266 6a6175c0 Stavros Sachtouris
class FR(object):
267 6a6175c0 Stavros Sachtouris
    json = None
268 6a6175c0 Stavros Sachtouris
    text = None
269 6a6175c0 Stavros Sachtouris
    headers = dict()
270 6a6175c0 Stavros Sachtouris
    content = json
271 6a6175c0 Stavros Sachtouris
    status = None
272 6a6175c0 Stavros Sachtouris
    status_code = 200
273 6a6175c0 Stavros Sachtouris
274 6a6175c0 Stavros Sachtouris
275 5a71b3a1 Stavros Sachtouris
class Client(TestCase):
276 5a71b3a1 Stavros Sachtouris
277 5a71b3a1 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
278 5a71b3a1 Stavros Sachtouris
        for k, v in d1.items():
279 5a71b3a1 Stavros Sachtouris
            self.assertTrue(k in d2)
280 5a71b3a1 Stavros Sachtouris
            if isinstance(v, dict):
281 5a71b3a1 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
282 5a71b3a1 Stavros Sachtouris
            else:
283 5a71b3a1 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
284 5a71b3a1 Stavros Sachtouris
285 5a71b3a1 Stavros Sachtouris
    def setUp(self):
286 5a71b3a1 Stavros Sachtouris
        from kamaki.clients import Client
287 5dde4c83 Stavros Sachtouris
        from kamaki.clients import ClientError as CE
288 5a71b3a1 Stavros Sachtouris
        self.base_url = 'http://example.com'
289 5a71b3a1 Stavros Sachtouris
        self.token = 's0m370k3n=='
290 c088076b Stavros Sachtouris
        self.client = Client(self.base_url, self.token)
291 5dde4c83 Stavros Sachtouris
        self.CE = CE
292 5dde4c83 Stavros Sachtouris
293 5dde4c83 Stavros Sachtouris
    def tearDown(self):
294 5dde4c83 Stavros Sachtouris
        FR.text = None
295 5dde4c83 Stavros Sachtouris
        FR.status = None
296 5dde4c83 Stavros Sachtouris
        FR.status_code = 200
297 6a6175c0 Stavros Sachtouris
        self.client.token = self.token
298 5a71b3a1 Stavros Sachtouris
299 5a71b3a1 Stavros Sachtouris
    def test___init__(self):
300 5a71b3a1 Stavros Sachtouris
        self.assertEqual(self.client.base_url, self.base_url)
301 5a71b3a1 Stavros Sachtouris
        self.assertEqual(self.client.token, self.token)
302 5a71b3a1 Stavros Sachtouris
        self.assert_dicts_are_equal(self.client.headers, {})
303 5a71b3a1 Stavros Sachtouris
        DATE_FORMATS = [
304 5a71b3a1 Stavros Sachtouris
            '%a %b %d %H:%M:%S %Y',
305 5a71b3a1 Stavros Sachtouris
            '%A, %d-%b-%y %H:%M:%S GMT',
306 5a71b3a1 Stavros Sachtouris
            '%a, %d %b %Y %H:%M:%S GMT']
307 5a71b3a1 Stavros Sachtouris
        self.assertEqual(self.client.DATE_FORMATS, DATE_FORMATS)
308 5a71b3a1 Stavros Sachtouris
309 9c6c3d69 Stavros Sachtouris
    def test__init_thread_limit(self):
310 9c6c3d69 Stavros Sachtouris
        exp = 'Nothing set here'
311 9c6c3d69 Stavros Sachtouris
        for faulty in (-1, 0.5, 'a string', {}):
312 9c6c3d69 Stavros Sachtouris
            self.assertRaises(
313 9c6c3d69 Stavros Sachtouris
                AssertionError,
314 9c6c3d69 Stavros Sachtouris
                self.client._init_thread_limit,
315 9c6c3d69 Stavros Sachtouris
                faulty)
316 9c6c3d69 Stavros Sachtouris
            self.assertEqual(exp, getattr(self.client, '_thread_limit', exp))
317 9c6c3d69 Stavros Sachtouris
            self.assertEqual(exp, getattr(self.client, '_elapsed_old', exp))
318 9c6c3d69 Stavros Sachtouris
            self.assertEqual(exp, getattr(self.client, '_elapsed_new', exp))
319 9c6c3d69 Stavros Sachtouris
        self.client._init_thread_limit(42)
320 9c6c3d69 Stavros Sachtouris
        self.assertEqual(42, self.client._thread_limit)
321 9c6c3d69 Stavros Sachtouris
        self.assertEqual(0.0, self.client._elapsed_old)
322 9c6c3d69 Stavros Sachtouris
        self.assertEqual(0.0, self.client._elapsed_new)
323 9c6c3d69 Stavros Sachtouris
324 9c6c3d69 Stavros Sachtouris
    def test__watch_thread_limit(self):
325 9c6c3d69 Stavros Sachtouris
        waits = (
326 9c6c3d69 Stavros Sachtouris
            dict(args=((0.1, 1), (0.1, 2), (0.2, 1), (0.7, 1), (0.3, 2))),
327 9c6c3d69 Stavros Sachtouris
            dict(args=((1.0 - (i / 10.0), (i + 1)) for i in range(7))),
328 9c6c3d69 Stavros Sachtouris
            dict(max=1, args=tuple([(randint(1, 10) / 3.0, 1), ] * 10)),
329 9c6c3d69 Stavros Sachtouris
            dict(
330 9c6c3d69 Stavros Sachtouris
                limit=5,
331 9c6c3d69 Stavros Sachtouris
                args=tuple([
332 9c6c3d69 Stavros Sachtouris
                    (1.0 + (i / 10.0), (5 - i - 1)) for i in range(4)] + [
333 9c6c3d69 Stavros Sachtouris
                    (2.0, 1), (1.9, 2), (2.0, 1), (2.0, 2)])),
334 9c6c3d69 Stavros Sachtouris
            dict(args=tuple(
335 9c6c3d69 Stavros Sachtouris
                [(1.0 - (i / 10.0), (i + 1)) for i in range(7)] + [
336 9c6c3d69 Stavros Sachtouris
                (0.1, 7), (0.2, 6), (0.4, 5), (0.3, 6), (0.2, 7), (0.1, 7)])),)
337 9c6c3d69 Stavros Sachtouris
        for wait_dict in waits:
338 9c6c3d69 Stavros Sachtouris
            if 'max' in wait_dict:
339 9c6c3d69 Stavros Sachtouris
                self.client.MAX_THREADS = wait_dict['max']
340 9c6c3d69 Stavros Sachtouris
            else:
341 9c6c3d69 Stavros Sachtouris
                self.client.MAX_THREADS = 7
342 9c6c3d69 Stavros Sachtouris
            if 'limit' in wait_dict:
343 9c6c3d69 Stavros Sachtouris
                self.client._init_thread_limit(wait_dict['limit'])
344 9c6c3d69 Stavros Sachtouris
            else:
345 9c6c3d69 Stavros Sachtouris
                self.client._init_thread_limit()
346 9c6c3d69 Stavros Sachtouris
                self.client._watch_thread_limit(list())
347 9c6c3d69 Stavros Sachtouris
                self.assertEqual(1, self.client._thread_limit)
348 9c6c3d69 Stavros Sachtouris
            for wait, exp_limit in wait_dict['args']:
349 9c6c3d69 Stavros Sachtouris
                self.client._elapsed_new = wait
350 9c6c3d69 Stavros Sachtouris
                self.client._watch_thread_limit(list())
351 9c6c3d69 Stavros Sachtouris
                self.assertEqual(exp_limit, self.client._thread_limit)
352 9c6c3d69 Stavros Sachtouris
353 5dde4c83 Stavros Sachtouris
    def test__raise_for_status(self):
354 5dde4c83 Stavros Sachtouris
        r = FR()
355 5dde4c83 Stavros Sachtouris
        for txt, sts_code, sts in (('err msg', 10, None), ('', 42, 'Err St')):
356 5dde4c83 Stavros Sachtouris
            r.text, r.status_code, r.status = txt, sts_code, sts
357 5dde4c83 Stavros Sachtouris
            try:
358 5dde4c83 Stavros Sachtouris
                self.client._raise_for_status(r)
359 5dde4c83 Stavros Sachtouris
            except self.CE as ce:
360 5dde4c83 Stavros Sachtouris
                self.assertEqual('%s' % ce, '%s %s\n' % (sts or '', txt))
361 5dde4c83 Stavros Sachtouris
                self.assertEqual(ce.status, sts_code)
362 5dde4c83 Stavros Sachtouris
363 5dde4c83 Stavros Sachtouris
        for msg, sts_code in (('err msg', 32), ('', 42), ('an err', None)):
364 5dde4c83 Stavros Sachtouris
            err = self.CE(msg, sts_code) if sts_code else Exception(msg)
365 5dde4c83 Stavros Sachtouris
            try:
366 5dde4c83 Stavros Sachtouris
                self.client._raise_for_status(err)
367 5dde4c83 Stavros Sachtouris
            except self.CE as ce:
368 5dde4c83 Stavros Sachtouris
                self.assertEqual('%s' % ce, '%s %s\n' % (sts_code or '', msg))
369 5dde4c83 Stavros Sachtouris
                self.assertEqual(ce.status, sts_code or 0)
370 5dde4c83 Stavros Sachtouris
371 c088076b Stavros Sachtouris
    @patch('kamaki.clients.Client.set_header')
372 97baa5c3 Stavros Sachtouris
    def test_set_header(self, SH):
373 97baa5c3 Stavros Sachtouris
        for name, value, condition in product(
374 97baa5c3 Stavros Sachtouris
                ('n4m3', '', None),
375 97baa5c3 Stavros Sachtouris
                ('v41u3', None, 42),
376 97baa5c3 Stavros Sachtouris
                (True, False, None, 1, '')):
377 97baa5c3 Stavros Sachtouris
            self.client.set_header(name, value, iff=condition)
378 c088076b Stavros Sachtouris
            self.assertEqual(
379 c088076b Stavros Sachtouris
                SH.mock_calls[-1], call(name, value, iff=condition))
380 97baa5c3 Stavros Sachtouris
381 c088076b Stavros Sachtouris
    @patch('kamaki.clients.Client.set_param')
382 9af3a427 Stavros Sachtouris
    def test_set_param(self, SP):
383 9af3a427 Stavros Sachtouris
        for name, value, condition in product(
384 9af3a427 Stavros Sachtouris
                ('n4m3', '', None),
385 9af3a427 Stavros Sachtouris
                ('v41u3', None, 42),
386 9af3a427 Stavros Sachtouris
                (True, False, None, 1, '')):
387 9af3a427 Stavros Sachtouris
            self.client.set_param(name, value, iff=condition)
388 c088076b Stavros Sachtouris
            self.assertEqual(
389 c088076b Stavros Sachtouris
                SP.mock_calls[-1], call(name, value, iff=condition))
390 9af3a427 Stavros Sachtouris
391 c088076b Stavros Sachtouris
    @patch('kamaki.clients.RequestManager', return_value=FR)
392 c088076b Stavros Sachtouris
    @patch('kamaki.clients.ResponseManager', return_value=FakeResp())
393 c088076b Stavros Sachtouris
    @patch('kamaki.clients.ResponseManager.__init__')
394 c088076b Stavros Sachtouris
    def test_request(self, Requ, RespInit, Resp):
395 6a6175c0 Stavros Sachtouris
        for args in product(
396 6a6175c0 Stavros Sachtouris
                ('get', '', dict(method='get')),
397 6a6175c0 Stavros Sachtouris
                ('/some/path', None, ['some', 'path']),
398 6a6175c0 Stavros Sachtouris
                (dict(), dict(h1='v1'), dict(h1='v2', h2='v2')),
399 6a6175c0 Stavros Sachtouris
                (dict(), dict(p1='v1'), dict(p1='v2', p2=None, p3='v3')),
400 6a6175c0 Stavros Sachtouris
                (dict(), dict(data='some data'), dict(
401 6a6175c0 Stavros Sachtouris
                    success=400,
402 6a6175c0 Stavros Sachtouris
                    json=dict(k2='v2', k1='v1')))):
403 6a6175c0 Stavros Sachtouris
            method, path, kwargs = args[0], args[1], args[-1]
404 c088076b Stavros Sachtouris
            FakeResp.status_code = kwargs.get('success', 200)
405 c088076b Stavros Sachtouris
            if not (method and (
406 c088076b Stavros Sachtouris
                    isinstance(method, str) or isinstance(
407 c088076b Stavros Sachtouris
                        method, unicode)) and (
408 c088076b Stavros Sachtouris
                    isinstance(path, str) or isinstance(path, unicode))):
409 6a6175c0 Stavros Sachtouris
                self.assertRaises(
410 c088076b Stavros Sachtouris
                    AssertionError, self.client.request, method, path,
411 c088076b Stavros Sachtouris
                    **kwargs)
412 c088076b Stavros Sachtouris
                continue
413 c088076b Stavros Sachtouris
            self.client.request(method, path, **kwargs)
414 c088076b Stavros Sachtouris
            self.assertEqual(
415 c088076b Stavros Sachtouris
                RespInit.mock_calls[-1], call(FR, connection_retry_limit=0))
416 6a6175c0 Stavros Sachtouris
417 6a6175c0 Stavros Sachtouris
    @patch('kamaki.clients.Client.request', return_value='lala')
418 6a6175c0 Stavros Sachtouris
    def _test_foo(self, foo, request):
419 6a6175c0 Stavros Sachtouris
        method = getattr(self.client, foo)
420 6a6175c0 Stavros Sachtouris
        r = method('path', k='v')
421 6a6175c0 Stavros Sachtouris
        self.assertEqual(r, 'lala')
422 6a6175c0 Stavros Sachtouris
        request.assert_called_once_with(foo, 'path', k='v')
423 6a6175c0 Stavros Sachtouris
424 6a6175c0 Stavros Sachtouris
    def test_delete(self):
425 6a6175c0 Stavros Sachtouris
        self._test_foo('delete')
426 6a6175c0 Stavros Sachtouris
427 6a6175c0 Stavros Sachtouris
    def test_get(self):
428 6a6175c0 Stavros Sachtouris
        self._test_foo('get')
429 6a6175c0 Stavros Sachtouris
430 6a6175c0 Stavros Sachtouris
    def test_head(self):
431 6a6175c0 Stavros Sachtouris
        self._test_foo('head')
432 6a6175c0 Stavros Sachtouris
433 6a6175c0 Stavros Sachtouris
    def test_post(self):
434 6a6175c0 Stavros Sachtouris
        self._test_foo('post')
435 6a6175c0 Stavros Sachtouris
436 6a6175c0 Stavros Sachtouris
    def test_put(self):
437 6a6175c0 Stavros Sachtouris
        self._test_foo('put')
438 6a6175c0 Stavros Sachtouris
439 6a6175c0 Stavros Sachtouris
    def test_copy(self):
440 6a6175c0 Stavros Sachtouris
        self._test_foo('copy')
441 6a6175c0 Stavros Sachtouris
442 6a6175c0 Stavros Sachtouris
    def test_move(self):
443 6a6175c0 Stavros Sachtouris
        self._test_foo('move')
444 6a6175c0 Stavros Sachtouris
445 5a71b3a1 Stavros Sachtouris
446 85898ca4 Stavros Sachtouris
#  TestCase auxiliary methods
447 85898ca4 Stavros Sachtouris
448 657dc0c8 Stavros Sachtouris
def runTestCase(cls, test_name, args=[], failure_collector=[]):
449 657dc0c8 Stavros Sachtouris
    """
450 657dc0c8 Stavros Sachtouris
    :param cls: (TestCase) a set of Tests
451 657dc0c8 Stavros Sachtouris

452 657dc0c8 Stavros Sachtouris
    :param test_name: (str)
453 657dc0c8 Stavros Sachtouris

454 657dc0c8 Stavros Sachtouris
    :param args: (list) these are prefixed with test_ and used as params when
455 657dc0c8 Stavros Sachtouris
        instantiating cls
456 657dc0c8 Stavros Sachtouris

457 657dc0c8 Stavros Sachtouris
    :param failure_collector: (list) collects info of test failures
458 657dc0c8 Stavros Sachtouris

459 657dc0c8 Stavros Sachtouris
    :returns: (int) total # of run tests
460 657dc0c8 Stavros Sachtouris
    """
461 85898ca4 Stavros Sachtouris
    suite = TestSuite()
462 85898ca4 Stavros Sachtouris
    if args:
463 85898ca4 Stavros Sachtouris
        suite.addTest(cls('_'.join(['test'] + args)))
464 85898ca4 Stavros Sachtouris
    else:
465 85898ca4 Stavros Sachtouris
        suite.addTest(makeSuite(cls))
466 85898ca4 Stavros Sachtouris
    print('* Test * %s *' % test_name)
467 657dc0c8 Stavros Sachtouris
    r = TextTestRunner(verbosity=2).run(suite)
468 657dc0c8 Stavros Sachtouris
    failure_collector += r.failures
469 657dc0c8 Stavros Sachtouris
    return r.testsRun
470 85898ca4 Stavros Sachtouris
471 85898ca4 Stavros Sachtouris
472 85898ca4 Stavros Sachtouris
def _add_value(foo, value):
473 85898ca4 Stavros Sachtouris
    def wrap(self):
474 85898ca4 Stavros Sachtouris
        return foo(self, value)
475 85898ca4 Stavros Sachtouris
    return wrap
476 85898ca4 Stavros Sachtouris
477 85898ca4 Stavros Sachtouris
478 85898ca4 Stavros Sachtouris
def get_test_classes(module=__import__(__name__), name=''):
479 85898ca4 Stavros Sachtouris
    module_stack = [module]
480 85898ca4 Stavros Sachtouris
    while module_stack:
481 85898ca4 Stavros Sachtouris
        module = module_stack[-1]
482 85898ca4 Stavros Sachtouris
        module_stack = module_stack[:-1]
483 85898ca4 Stavros Sachtouris
        for objname, obj in getmembers(module):
484 85898ca4 Stavros Sachtouris
            if (objname == name or not name):
485 85898ca4 Stavros Sachtouris
                if isclass(obj) and objname != 'TestCase' and (
486 85898ca4 Stavros Sachtouris
                        issubclass(obj, TestCase)):
487 85898ca4 Stavros Sachtouris
                    yield (obj, objname)
488 85898ca4 Stavros Sachtouris
489 85898ca4 Stavros Sachtouris
490 c1004a00 Stavros Sachtouris
def main(argv):
491 d86c3c7d Stavros Sachtouris
    found = False
492 657dc0c8 Stavros Sachtouris
    failure_collector = list()
493 657dc0c8 Stavros Sachtouris
    num_of_tests = 0
494 c1004a00 Stavros Sachtouris
    for cls, name in get_test_classes(name=argv[1] if len(argv) > 1 else ''):
495 d86c3c7d Stavros Sachtouris
        found = True
496 657dc0c8 Stavros Sachtouris
        num_of_tests += runTestCase(cls, name, argv[2:], failure_collector)
497 d86c3c7d Stavros Sachtouris
    if not found:
498 d86c3c7d Stavros Sachtouris
        print('Test "%s" not found' % ' '.join(argv[1:]))
499 657dc0c8 Stavros Sachtouris
    else:
500 657dc0c8 Stavros Sachtouris
        for i, failure in enumerate(failure_collector):
501 657dc0c8 Stavros Sachtouris
            print('Failure %s: ' % (i + 1))
502 657dc0c8 Stavros Sachtouris
            for field in failure:
503 657dc0c8 Stavros Sachtouris
                print('\t%s' % field)
504 657dc0c8 Stavros Sachtouris
        print('\nTotal tests run: %s' % num_of_tests)
505 657dc0c8 Stavros Sachtouris
        print('Total failures: %s' % len(failure_collector))
506 c1004a00 Stavros Sachtouris
507 c1004a00 Stavros Sachtouris
508 c1004a00 Stavros Sachtouris
if __name__ == '__main__':
509 c1004a00 Stavros Sachtouris
    from sys import argv
510 c1004a00 Stavros Sachtouris
    main(argv)