Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / test.py @ edaf3ba6

History | View | Annotate | Download (18.6 kB)

1 2fde8651 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 2fde8651 Stavros Sachtouris
#
3 2fde8651 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 2fde8651 Stavros Sachtouris
# without modification, are permitted provided that the following
5 2fde8651 Stavros Sachtouris
# conditions are met:
6 2fde8651 Stavros Sachtouris
#
7 2fde8651 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 2fde8651 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 2fde8651 Stavros Sachtouris
#      disclaimer.
10 2fde8651 Stavros Sachtouris
#
11 2fde8651 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 2fde8651 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 2fde8651 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 2fde8651 Stavros Sachtouris
#      provided with the distribution.
15 2fde8651 Stavros Sachtouris
#
16 2fde8651 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 2fde8651 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 2fde8651 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 2fde8651 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 2fde8651 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 2fde8651 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 2fde8651 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 2fde8651 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 2fde8651 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 2fde8651 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 2fde8651 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 2fde8651 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 2fde8651 Stavros Sachtouris
#
29 2fde8651 Stavros Sachtouris
# The views and conclusions contained in the software and
30 2fde8651 Stavros Sachtouris
# documentation are those of the authors and should not be
31 2fde8651 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 2fde8651 Stavros Sachtouris
# or implied, of GRNET S.A.
33 2fde8651 Stavros Sachtouris
34 2fde8651 Stavros Sachtouris
from unittest import makeSuite, TestSuite, TextTestRunner, TestCase
35 2fde8651 Stavros Sachtouris
from inspect import getmembers, isclass
36 98093aac Stavros Sachtouris
from tempfile import NamedTemporaryFile
37 4769da6b Stavros Sachtouris
from mock import patch, call
38 4769da6b Stavros Sachtouris
from itertools import product
39 2fde8651 Stavros Sachtouris
40 0962adb7 Stavros Sachtouris
from kamaki.cli.command_tree.test import Command, CommandTree
41 f767b407 Stavros Sachtouris
from kamaki.cli.config.test import Config
42 3a5b1ceb Stavros Sachtouris
from kamaki.cli.argument.test import (
43 3a5b1ceb Stavros Sachtouris
    Argument, ConfigArgument, RuntimeConfigArgument, FlagArgument,
44 8d427cb9 Stavros Sachtouris
    ValueArgument, IntArgument, DateArgument, VersionArgument,
45 ca5528f1 Stavros Sachtouris
    RepeatableArgument, KeyValueArgument, ProgressBarArgument,
46 ca5528f1 Stavros Sachtouris
    ArgumentParseManager)
47 b3cb58c2 Stavros Sachtouris
from kamaki.cli.utils.test import UtilsMethods
48 2fde8651 Stavros Sachtouris
49 2fde8651 Stavros Sachtouris
50 98093aac Stavros Sachtouris
class History(TestCase):
51 98093aac Stavros Sachtouris
52 98093aac Stavros Sachtouris
    def setUp(self):
53 98093aac Stavros Sachtouris
        from kamaki.cli.history import History as HClass
54 98093aac Stavros Sachtouris
        self.HCLASS = HClass
55 98093aac Stavros Sachtouris
        self.file = NamedTemporaryFile()
56 98093aac Stavros Sachtouris
57 98093aac Stavros Sachtouris
    def tearDown(self):
58 98093aac Stavros Sachtouris
        self.file.close()
59 98093aac Stavros Sachtouris
60 98093aac Stavros Sachtouris
    def test__match(self):
61 98093aac Stavros Sachtouris
        self.assertRaises(AttributeError, self.HCLASS._match, 'ok', 42)
62 98093aac Stavros Sachtouris
        self.assertRaises(TypeError, self.HCLASS._match, 2.71, 'ok')
63 98093aac Stavros Sachtouris
        for args, expected in (
64 98093aac Stavros Sachtouris
                (('XXX', None), True),
65 98093aac Stavros Sachtouris
                ((None, None), True),
66 98093aac Stavros Sachtouris
                (('this line has some terms', 'some terms'), True),
67 98093aac Stavros Sachtouris
                (('this line has some terms', 'some bad terms'), False),
68 98093aac Stavros Sachtouris
                (('small line', 'not so small line terms'), False),
69 98093aac Stavros Sachtouris
                ((['line', 'with', 'some', 'terms'], 'some terms'), True),
70 98093aac Stavros Sachtouris
                ((['line', 'with', 'some terms'], 'some terms'), False)):
71 98093aac Stavros Sachtouris
            self.assertEqual(self.HCLASS._match(*args), expected)
72 98093aac Stavros Sachtouris
73 98093aac Stavros Sachtouris
    def test_get(self):
74 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
75 98093aac Stavros Sachtouris
        self.assertEqual(history.get(), [])
76 98093aac Stavros Sachtouris
77 98093aac Stavros Sachtouris
        sample_history = (
78 98093aac Stavros Sachtouris
            'kamaki history show\n',
79 98093aac Stavros Sachtouris
            'kamaki file list\n',
80 98093aac Stavros Sachtouris
            'kamaki touch pithos:f1\n',
81 98093aac Stavros Sachtouris
            'kamaki file info pithos:f1\n')
82 98093aac Stavros Sachtouris
        self.file.write(''.join(sample_history))
83 98093aac Stavros Sachtouris
        self.file.flush()
84 98093aac Stavros Sachtouris
85 98093aac Stavros Sachtouris
        expected = ['%s.  \t%s' % (
86 98093aac Stavros Sachtouris
            i + 1, event) for i, event in enumerate(sample_history)]
87 98093aac Stavros Sachtouris
        self.assertEqual(history.get(), expected)
88 98093aac Stavros Sachtouris
        self.assertEqual(history.get('kamaki'), expected)
89 98093aac Stavros Sachtouris
        self.assertEqual(history.get('file kamaki'), expected[1::2])
90 98093aac Stavros Sachtouris
        self.assertEqual(history.get('pithos:f1'), expected[2:])
91 98093aac Stavros Sachtouris
        self.assertEqual(history.get('touch pithos:f1'), expected[2:3])
92 98093aac Stavros Sachtouris
93 98093aac Stavros Sachtouris
        for limit in range(len(sample_history)):
94 98093aac Stavros Sachtouris
            self.assertEqual(history.get(limit=limit), expected[-limit:])
95 98093aac Stavros Sachtouris
            self.assertEqual(
96 98093aac Stavros Sachtouris
                history.get('kamaki', limit=limit), expected[-limit:])
97 98093aac Stavros Sachtouris
98 98093aac Stavros Sachtouris
    def test_add(self):
99 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
100 98093aac Stavros Sachtouris
        some_strings = ('a brick', 'two bricks', 'another brick', 'A wall!')
101 98093aac Stavros Sachtouris
        for i, line in enumerate(some_strings):
102 98093aac Stavros Sachtouris
            history.add(line)
103 98093aac Stavros Sachtouris
            self.file.seek(0)
104 98093aac Stavros Sachtouris
            self.assertEqual(
105 98093aac Stavros Sachtouris
                self.file.read(), '\n'.join(some_strings[:(i + 1)]) + '\n')
106 98093aac Stavros Sachtouris
107 edaf3ba6 Stavros Sachtouris
    def test_empty(self):
108 98093aac Stavros Sachtouris
        content = 'a brick\ntwo bricks\nanother brick\nA wall!\n'
109 98093aac Stavros Sachtouris
        self.file.write(content)
110 98093aac Stavros Sachtouris
        self.file.flush()
111 98093aac Stavros Sachtouris
        self.file.seek(0)
112 98093aac Stavros Sachtouris
        self.assertEqual(self.file.read(), content)
113 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
114 edaf3ba6 Stavros Sachtouris
        history.empty()
115 98093aac Stavros Sachtouris
        self.file.seek(0)
116 98093aac Stavros Sachtouris
        self.assertEqual(self.file.read(), '')
117 98093aac Stavros Sachtouris
118 98093aac Stavros Sachtouris
    def test_retrieve(self):
119 98093aac Stavros Sachtouris
        sample_history = (
120 98093aac Stavros Sachtouris
            'kamaki history show\n',
121 98093aac Stavros Sachtouris
            'kamaki file list\n',
122 98093aac Stavros Sachtouris
            'kamaki touch pithos:f1\n',
123 98093aac Stavros Sachtouris
            'kamaki file info pithos:f1\n',
124 98093aac Stavros Sachtouris
            'current / last command is always excluded')
125 98093aac Stavros Sachtouris
        self.file.write(''.join(sample_history))
126 98093aac Stavros Sachtouris
        self.file.flush()
127 98093aac Stavros Sachtouris
128 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
129 edaf3ba6 Stavros Sachtouris
        retrieve = history.__getitem__
130 edaf3ba6 Stavros Sachtouris
        self.assertRaises(ValueError, retrieve, 'must be number')
131 edaf3ba6 Stavros Sachtouris
        self.assertRaises(TypeError, retrieve, [1, 2, 3])
132 98093aac Stavros Sachtouris
133 98093aac Stavros Sachtouris
        for i in (0, len(sample_history), -len(sample_history)):
134 edaf3ba6 Stavros Sachtouris
            self.assertEqual(history[i], None)
135 98093aac Stavros Sachtouris
        for i in range(1, len(sample_history)):
136 edaf3ba6 Stavros Sachtouris
            self.assertEqual(history[i], sample_history[i - 1])
137 edaf3ba6 Stavros Sachtouris
            self.assertEqual(history[- i], sample_history[- i - 1])
138 98093aac Stavros Sachtouris
139 98093aac Stavros Sachtouris
140 4769da6b Stavros Sachtouris
class LoggerMethods(TestCase):
141 4769da6b Stavros Sachtouris
142 4769da6b Stavros Sachtouris
    class PseudoLogger(object):
143 4769da6b Stavros Sachtouris
        level = 'some level'
144 4769da6b Stavros Sachtouris
        _setLevel_calls = []
145 4769da6b Stavros Sachtouris
        _addHandler_calls = []
146 4769da6b Stavros Sachtouris
147 4769da6b Stavros Sachtouris
        def setLevel(self, *args):
148 4769da6b Stavros Sachtouris
            self._setLevel_calls.append(args)
149 4769da6b Stavros Sachtouris
150 4769da6b Stavros Sachtouris
        def addHandler(self, *args):
151 4769da6b Stavros Sachtouris
            self._addHandler_calls.append(args)
152 4769da6b Stavros Sachtouris
153 4769da6b Stavros Sachtouris
    class PseudoHandler(object):
154 4769da6b Stavros Sachtouris
        _setFormatter_calls = []
155 4769da6b Stavros Sachtouris
156 4769da6b Stavros Sachtouris
        def setFormatter(self, *args):
157 4769da6b Stavros Sachtouris
            self._setFormatter_calls.append(args)
158 4769da6b Stavros Sachtouris
159 4769da6b Stavros Sachtouris
    def setUp(self):
160 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import LOG_FILE, _blacklist
161 4769da6b Stavros Sachtouris
        self.LF, self.BL = list(LOG_FILE), dict(_blacklist)
162 4769da6b Stavros Sachtouris
163 4769da6b Stavros Sachtouris
    def tearDown(self):
164 4769da6b Stavros Sachtouris
        self.PseudoLogger._setLevel_calls = []
165 4769da6b Stavros Sachtouris
        self.PseudoLogger._addHandler_calls = []
166 4769da6b Stavros Sachtouris
        self.PseudoLogger._setFormatter_calls = []
167 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import LOG_FILE, _blacklist
168 4769da6b Stavros Sachtouris
        for e in LOG_FILE:
169 4769da6b Stavros Sachtouris
            LOG_FILE.pop()
170 4769da6b Stavros Sachtouris
        for e in self.LF:
171 4769da6b Stavros Sachtouris
            LOG_FILE.append(e)
172 4769da6b Stavros Sachtouris
        _blacklist.clear()
173 4769da6b Stavros Sachtouris
        _blacklist.update(self.BL)
174 4769da6b Stavros Sachtouris
175 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
176 4769da6b Stavros Sachtouris
    def test_deactivate(self, GL):
177 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import deactivate, _blacklist
178 4769da6b Stavros Sachtouris
        self.assertEqual(_blacklist, {})
179 4769da6b Stavros Sachtouris
        deactivate('some logger')
180 4769da6b Stavros Sachtouris
        GL.assert_called_once_with('some logger')
181 4769da6b Stavros Sachtouris
        self.assertEqual(
182 4769da6b Stavros Sachtouris
            _blacklist.get('some logger', None), self.PseudoLogger.level)
183 4769da6b Stavros Sachtouris
        from logging import CRITICAL
184 4769da6b Stavros Sachtouris
        self.assertEqual(self.PseudoLogger._setLevel_calls[-1], (CRITICAL, ))
185 4769da6b Stavros Sachtouris
186 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
187 4769da6b Stavros Sachtouris
    def test_activate(self, GL):
188 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import activate
189 4769da6b Stavros Sachtouris
        activate('another logger')
190 4769da6b Stavros Sachtouris
        GL.assert_called_once_with('another logger')
191 4769da6b Stavros Sachtouris
        self.assertEqual(
192 4769da6b Stavros Sachtouris
            self.PseudoLogger._setLevel_calls[-1], (self.PseudoLogger.level, ))
193 4769da6b Stavros Sachtouris
194 4769da6b Stavros Sachtouris
    def test_get_log_filename(self):
195 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import get_log_filename, LOG_FILE
196 4769da6b Stavros Sachtouris
        f = NamedTemporaryFile()
197 4769da6b Stavros Sachtouris
        for e in LOG_FILE:
198 4769da6b Stavros Sachtouris
            LOG_FILE.pop()
199 4769da6b Stavros Sachtouris
        LOG_FILE.append(f.name)
200 4769da6b Stavros Sachtouris
        self.assertEqual(get_log_filename(), f.name)
201 4769da6b Stavros Sachtouris
        LOG_FILE.pop()
202 4769da6b Stavros Sachtouris
        LOG_FILE.append(2 * f.name)
203 4769da6b Stavros Sachtouris
        print('\n  Should print error msg here: ')
204 4769da6b Stavros Sachtouris
        self.assertEqual(get_log_filename(), None)
205 4769da6b Stavros Sachtouris
206 4769da6b Stavros Sachtouris
    def test_set_log_filename(self):
207 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import set_log_filename, LOG_FILE
208 4769da6b Stavros Sachtouris
        for n in ('some name', 'some other name'):
209 4769da6b Stavros Sachtouris
            set_log_filename(n)
210 4769da6b Stavros Sachtouris
            self.assertEqual(LOG_FILE[0], n)
211 4769da6b Stavros Sachtouris
212 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.get_logger', return_value=PseudoLogger())
213 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.logging.Formatter', return_value='f0rm4t')
214 4769da6b Stavros Sachtouris
    @patch(
215 4769da6b Stavros Sachtouris
        'kamaki.cli.logger.logging.StreamHandler',
216 4769da6b Stavros Sachtouris
        return_value=PseudoHandler())
217 4769da6b Stavros Sachtouris
    @patch(
218 4769da6b Stavros Sachtouris
        'kamaki.cli.logger.logging.FileHandler',
219 4769da6b Stavros Sachtouris
        return_value=PseudoHandler())
220 4769da6b Stavros Sachtouris
    def test__add_logger(self, FH, SH, F, GL):
221 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import _add_logger
222 4769da6b Stavros Sachtouris
        from logging import DEBUG
223 4769da6b Stavros Sachtouris
        stdf, cnt = '%(name)s\n %(message)s', 0
224 4769da6b Stavros Sachtouris
        for name, level, filename, fmt in product(
225 4769da6b Stavros Sachtouris
                ('my logger', ),
226 4769da6b Stavros Sachtouris
                ('my level', None),
227 4769da6b Stavros Sachtouris
                ('my filename', None),
228 4769da6b Stavros Sachtouris
                ('my fmt', None)):
229 4769da6b Stavros Sachtouris
            log = _add_logger(name, level, filename, fmt)
230 4769da6b Stavros Sachtouris
            self.assertTrue(isinstance(log, self.PseudoLogger))
231 4769da6b Stavros Sachtouris
            self.assertEqual(GL.mock_calls[-1], call(name))
232 4769da6b Stavros Sachtouris
            if filename:
233 4769da6b Stavros Sachtouris
                self.assertEqual(FH.mock_calls[-1], call(filename))
234 4769da6b Stavros Sachtouris
            else:
235 4769da6b Stavros Sachtouris
                self.assertEqual(SH.mock_calls[-1], call())
236 4769da6b Stavros Sachtouris
            self.assertEqual(F.mock_calls[-1], call(fmt or stdf))
237 4769da6b Stavros Sachtouris
            self.assertEqual(
238 4769da6b Stavros Sachtouris
                self.PseudoHandler._setFormatter_calls[-1], ('f0rm4t', ))
239 4769da6b Stavros Sachtouris
            cnt += 1
240 4769da6b Stavros Sachtouris
            self.assertEqual(len(self.PseudoLogger._addHandler_calls), cnt)
241 4769da6b Stavros Sachtouris
            h = self.PseudoLogger._addHandler_calls[-1]
242 4769da6b Stavros Sachtouris
            self.assertTrue(isinstance(h[0], self.PseudoHandler))
243 4769da6b Stavros Sachtouris
            l = self.PseudoLogger._setLevel_calls[-1]
244 4769da6b Stavros Sachtouris
            self.assertEqual(l, (level or DEBUG, ))
245 4769da6b Stavros Sachtouris
246 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.get_log_filename', return_value='my log fname')
247 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.get_logger', return_value='my get logger ret')
248 4769da6b Stavros Sachtouris
    def test_add_file_logger(self, GL, GLF):
249 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import add_file_logger
250 4769da6b Stavros Sachtouris
        with patch('kamaki.cli.logger._add_logger', return_value='AL') as AL:
251 4769da6b Stavros Sachtouris
            GLFcount = GLF.call_count
252 4769da6b Stavros Sachtouris
            for name, level, filename in product(
253 4769da6b Stavros Sachtouris
                    ('my name'), ('my level', None), ('my filename', None)):
254 4769da6b Stavros Sachtouris
                self.assertEqual(add_file_logger(name, level, filename), 'AL')
255 4769da6b Stavros Sachtouris
                self.assertEqual(AL.mock_calls[-1], call(
256 4769da6b Stavros Sachtouris
                    name, level, filename or 'my log fname',
257 4769da6b Stavros Sachtouris
                    fmt='%(name)s(%(levelname)s) %(asctime)s\n\t%(message)s'))
258 4769da6b Stavros Sachtouris
                if filename:
259 4769da6b Stavros Sachtouris
                    self.assertEqual(GLFcount, GLF.call_count)
260 4769da6b Stavros Sachtouris
                else:
261 4769da6b Stavros Sachtouris
                    GLFcount = GLF.call_count
262 4769da6b Stavros Sachtouris
                    self.assertEqual(GLF.mock_calls[-1], call())
263 4769da6b Stavros Sachtouris
        with patch('kamaki.cli.logger._add_logger', side_effect=Exception):
264 4769da6b Stavros Sachtouris
            self.assertEqual(add_file_logger('X'), 'my get logger ret')
265 4769da6b Stavros Sachtouris
            GL.assert_called_once_with('X')
266 4769da6b Stavros Sachtouris
267 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.get_logger', return_value='my get logger ret')
268 4769da6b Stavros Sachtouris
    def test_add_stream_logger(self, GL):
269 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import add_stream_logger
270 4769da6b Stavros Sachtouris
        with patch('kamaki.cli.logger._add_logger', return_value='AL') as AL:
271 4769da6b Stavros Sachtouris
            for name, level, fmt in product(
272 4769da6b Stavros Sachtouris
                    ('my name'), ('my level', None), ('my fmt', None)):
273 4769da6b Stavros Sachtouris
                self.assertEqual(add_stream_logger(name, level, fmt), 'AL')
274 4769da6b Stavros Sachtouris
                self.assertEqual(AL.mock_calls[-1], call(name, level, fmt=fmt))
275 4769da6b Stavros Sachtouris
        with patch('kamaki.cli.logger._add_logger', side_effect=Exception):
276 4769da6b Stavros Sachtouris
            self.assertEqual(add_stream_logger('X'), 'my get logger ret')
277 4769da6b Stavros Sachtouris
            GL.assert_called_once_with('X')
278 4769da6b Stavros Sachtouris
279 4769da6b Stavros Sachtouris
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
280 4769da6b Stavros Sachtouris
    def test_get_logger(self, GL):
281 4769da6b Stavros Sachtouris
        from kamaki.cli.logger import get_logger
282 4769da6b Stavros Sachtouris
        get_logger('my logger name')
283 4769da6b Stavros Sachtouris
        GL.assert_called_once_with('my logger name')
284 4769da6b Stavros Sachtouris
285 4769da6b Stavros Sachtouris
286 f10cef01 Stavros Sachtouris
_RET = None
287 f10cef01 Stavros Sachtouris
288 f10cef01 Stavros Sachtouris
289 f10cef01 Stavros Sachtouris
class PseudoException(object):
290 f10cef01 Stavros Sachtouris
291 f10cef01 Stavros Sachtouris
    def __init__(self, *args):
292 f10cef01 Stavros Sachtouris
        global _RET
293 f10cef01 Stavros Sachtouris
        _RET = args
294 f10cef01 Stavros Sachtouris
295 f10cef01 Stavros Sachtouris
296 f10cef01 Stavros Sachtouris
class CLIError(TestCase):
297 f10cef01 Stavros Sachtouris
298 f10cef01 Stavros Sachtouris
    @patch('__builtin__.super', return_value=PseudoException())
299 f10cef01 Stavros Sachtouris
    def test___init__(self, S):
300 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLIError
301 f10cef01 Stavros Sachtouris
        global _RET
302 f10cef01 Stavros Sachtouris
        for message, details, importance in (
303 f10cef01 Stavros Sachtouris
                ('some msg', [], 0),
304 f10cef01 Stavros Sachtouris
                ('some msg\n', 'details', 0),
305 f10cef01 Stavros Sachtouris
                ('some msg', ['details1', 'details2'], 10)):
306 f10cef01 Stavros Sachtouris
            clie = CLIError(message, details, importance)
307 f10cef01 Stavros Sachtouris
            self.assertEqual(S.mock_calls[-1], call(CLIError, clie))
308 f10cef01 Stavros Sachtouris
            self.assertEqual(_RET[0], (message + '\n') if (
309 f10cef01 Stavros Sachtouris
                message and not message.endswith('\n')) else message)
310 f10cef01 Stavros Sachtouris
            self.assertEqual(clie.details, (list(details) if (
311 f10cef01 Stavros Sachtouris
                isinstance(details, list)) else ['%s' % details]) if (
312 f10cef01 Stavros Sachtouris
                    details) else [])
313 f10cef01 Stavros Sachtouris
            self.assertEqual(clie.importance, int(importance))
314 f10cef01 Stavros Sachtouris
        clie = CLIError(message, details, 'non int')
315 f10cef01 Stavros Sachtouris
        self.assertEqual(clie.importance, 0)
316 f10cef01 Stavros Sachtouris
317 cfebddb5 Stavros Sachtouris
    def test_raiseCLIError(self):
318 cfebddb5 Stavros Sachtouris
        from kamaki.cli.errors import raiseCLIError, CLIError
319 cfebddb5 Stavros Sachtouris
        for err, message, importance, details in (
320 cfebddb5 Stavros Sachtouris
                (Exception('msg'), '', 0, []),
321 cfebddb5 Stavros Sachtouris
                (Exception('msg'), 'orther msg', 0, []),
322 cfebddb5 Stavros Sachtouris
                (Exception('msg'), 'orther msg', 0, ['d1', 'd2']),
323 cfebddb5 Stavros Sachtouris
                (Exception('msg'), '', 10, []),
324 cfebddb5 Stavros Sachtouris
                (Exception('msg'), '', None, []),
325 cfebddb5 Stavros Sachtouris
                (CLIError('some msg'), '', None, ['d1', 'd2'])
326 cfebddb5 Stavros Sachtouris
            ):
327 cfebddb5 Stavros Sachtouris
            try:
328 cfebddb5 Stavros Sachtouris
                raiseCLIError(err, message, importance, details)
329 cfebddb5 Stavros Sachtouris
            except CLIError as clie:
330 cfebddb5 Stavros Sachtouris
                exp_msg = '%s' % (message or err)
331 cfebddb5 Stavros Sachtouris
                exp_msg += '' if exp_msg.endswith('\n') else '\n'
332 cfebddb5 Stavros Sachtouris
                self.assertEqual('%s' % clie, exp_msg)
333 cfebddb5 Stavros Sachtouris
                self.assertEqual(clie.importance, importance or 0)
334 cfebddb5 Stavros Sachtouris
                exp_d = list(details) if isinstance(details, list) else [
335 cfebddb5 Stavros Sachtouris
                    '%s' % (details or '')]
336 cfebddb5 Stavros Sachtouris
                base_msg = '%s' % err
337 cfebddb5 Stavros Sachtouris
                if message and base_msg != message:
338 cfebddb5 Stavros Sachtouris
                    exp_d.append(base_msg)
339 cfebddb5 Stavros Sachtouris
                self.assertEqual(clie.details, exp_d)
340 cfebddb5 Stavros Sachtouris
341 f10cef01 Stavros Sachtouris
342 f10cef01 Stavros Sachtouris
class CLIUnimplemented(TestCase):
343 f10cef01 Stavros Sachtouris
344 f10cef01 Stavros Sachtouris
    def test___init__(self):
345 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLIUnimplemented
346 f10cef01 Stavros Sachtouris
        cliu = CLIUnimplemented()
347 f10cef01 Stavros Sachtouris
        self.assertEqual(
348 f10cef01 Stavros Sachtouris
            '%s' % cliu,
349 f10cef01 Stavros Sachtouris
            'I \'M SORRY, DAVE.\nI \'M AFRAID I CAN\'T DO THAT.\n')
350 f10cef01 Stavros Sachtouris
        self.assertEqual(cliu.details, [
351 f10cef01 Stavros Sachtouris
            '      _        |',
352 f10cef01 Stavros Sachtouris
            '   _-- --_     |',
353 f10cef01 Stavros Sachtouris
            '  --     --    |',
354 f10cef01 Stavros Sachtouris
            ' --   .   --   |',
355 f10cef01 Stavros Sachtouris
            ' -_       _-   |',
356 f10cef01 Stavros Sachtouris
            '   -_   _-     |',
357 f10cef01 Stavros Sachtouris
            '      -        |'])
358 f10cef01 Stavros Sachtouris
        self.assertEqual(cliu.importance, 3)
359 f10cef01 Stavros Sachtouris
360 f10cef01 Stavros Sachtouris
361 f10cef01 Stavros Sachtouris
class CLIBaseUrlError(TestCase):
362 f10cef01 Stavros Sachtouris
363 f10cef01 Stavros Sachtouris
    def test___init__(self):
364 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLIBaseUrlError
365 f10cef01 Stavros Sachtouris
        for service in ('', 'some service'):
366 f10cef01 Stavros Sachtouris
            clibue = CLIBaseUrlError(service=service)
367 f10cef01 Stavros Sachtouris
            self.assertEqual('%s' % clibue, 'No URL for %s\n' % service)
368 f10cef01 Stavros Sachtouris
            self.assertEqual(clibue.details, [
369 f10cef01 Stavros Sachtouris
                'Two ways to resolve this:',
370 f10cef01 Stavros Sachtouris
                '(Use the correct cloud name, instead of "default")',
371 f10cef01 Stavros Sachtouris
                'A. (recommended) Let kamaki discover endpoint URLs for all',
372 f10cef01 Stavros Sachtouris
                'services by setting a single Authentication URL and token:',
373 f10cef01 Stavros Sachtouris
                '  /config set cloud.default.url <AUTH_URL>',
374 f10cef01 Stavros Sachtouris
                '  /config set cloud.default.token <t0k3n>',
375 f10cef01 Stavros Sachtouris
                'B. (advanced users) Explicitly set an %s endpoint URL' % (
376 f10cef01 Stavros Sachtouris
                    service.upper()),
377 f10cef01 Stavros Sachtouris
                'Note: URL option has a higher priority, so delete it to',
378 f10cef01 Stavros Sachtouris
                'make that work',
379 f10cef01 Stavros Sachtouris
                '  /config delete cloud.default.url',
380 f10cef01 Stavros Sachtouris
                '  /config set cloud.%s.url <%s_URL>' % (
381 f10cef01 Stavros Sachtouris
                    service, service.upper())])
382 f10cef01 Stavros Sachtouris
            self.assertEqual(clibue.importance, 2)
383 f10cef01 Stavros Sachtouris
384 f10cef01 Stavros Sachtouris
385 f10cef01 Stavros Sachtouris
class CLISyntaxError(TestCase):
386 f10cef01 Stavros Sachtouris
387 f10cef01 Stavros Sachtouris
    def test___init__(self):
388 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLISyntaxError
389 f10cef01 Stavros Sachtouris
        clise = CLISyntaxError()
390 f10cef01 Stavros Sachtouris
        self.assertEqual('%s' % clise, 'Syntax Error\n')
391 f10cef01 Stavros Sachtouris
        self.assertEqual(clise.details, [])
392 f10cef01 Stavros Sachtouris
        self.assertEqual(clise.importance, 1)
393 f10cef01 Stavros Sachtouris
394 f10cef01 Stavros Sachtouris
395 8694bdad Stavros Sachtouris
class CLIInvalidArgument(TestCase):
396 8694bdad Stavros Sachtouris
397 8694bdad Stavros Sachtouris
    def test___init__(self):
398 8694bdad Stavros Sachtouris
        from kamaki.cli.errors import CLIInvalidArgument
399 8694bdad Stavros Sachtouris
        cliia = CLIInvalidArgument()
400 8694bdad Stavros Sachtouris
        self.assertEqual('%s' % cliia, 'Invalid Argument\n')
401 8694bdad Stavros Sachtouris
        self.assertEqual(cliia.details, [])
402 8694bdad Stavros Sachtouris
        self.assertEqual(cliia.importance, 1)
403 8694bdad Stavros Sachtouris
404 8694bdad Stavros Sachtouris
405 f10cef01 Stavros Sachtouris
class CLIUnknownCommand(TestCase):
406 f10cef01 Stavros Sachtouris
407 f10cef01 Stavros Sachtouris
    def test___init__(self):
408 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLIUnknownCommand
409 f10cef01 Stavros Sachtouris
        cliec = CLIUnknownCommand()
410 f10cef01 Stavros Sachtouris
        self.assertEqual('%s' % cliec, 'Unknown Command\n')
411 f10cef01 Stavros Sachtouris
        self.assertEqual(cliec.details, [])
412 f10cef01 Stavros Sachtouris
        self.assertEqual(cliec.importance, 1)
413 f10cef01 Stavros Sachtouris
414 f10cef01 Stavros Sachtouris
415 f10cef01 Stavros Sachtouris
class CLICmdSpecError(TestCase):
416 f10cef01 Stavros Sachtouris
417 f10cef01 Stavros Sachtouris
    def test___init__(self):
418 f10cef01 Stavros Sachtouris
        from kamaki.cli.errors import CLICmdSpecError
419 f10cef01 Stavros Sachtouris
        clicse = CLICmdSpecError()
420 f10cef01 Stavros Sachtouris
        self.assertEqual('%s' % clicse, 'Command Specification Error\n')
421 f10cef01 Stavros Sachtouris
        self.assertEqual(clicse.details, [])
422 f10cef01 Stavros Sachtouris
        self.assertEqual(clicse.importance, 0)
423 f10cef01 Stavros Sachtouris
424 f10cef01 Stavros Sachtouris
425 2fde8651 Stavros Sachtouris
#  TestCase auxiliary methods
426 2fde8651 Stavros Sachtouris
427 2fde8651 Stavros Sachtouris
def runTestCase(cls, test_name, args=[], failure_collector=[]):
428 2fde8651 Stavros Sachtouris
    """
429 2fde8651 Stavros Sachtouris
    :param cls: (TestCase) a set of Tests
430 2fde8651 Stavros Sachtouris

431 2fde8651 Stavros Sachtouris
    :param test_name: (str)
432 2fde8651 Stavros Sachtouris

433 2fde8651 Stavros Sachtouris
    :param args: (list) these are prefixed with test_ and used as params when
434 2fde8651 Stavros Sachtouris
        instantiating cls
435 2fde8651 Stavros Sachtouris

436 2fde8651 Stavros Sachtouris
    :param failure_collector: (list) collects info of test failures
437 2fde8651 Stavros Sachtouris

438 2fde8651 Stavros Sachtouris
    :returns: (int) total # of run tests
439 2fde8651 Stavros Sachtouris
    """
440 2fde8651 Stavros Sachtouris
    suite = TestSuite()
441 2fde8651 Stavros Sachtouris
    if args:
442 2fde8651 Stavros Sachtouris
        suite.addTest(cls('_'.join(['test'] + args)))
443 2fde8651 Stavros Sachtouris
    else:
444 2fde8651 Stavros Sachtouris
        suite.addTest(makeSuite(cls))
445 2fde8651 Stavros Sachtouris
    print('* Test * %s *' % test_name)
446 2fde8651 Stavros Sachtouris
    r = TextTestRunner(verbosity=2).run(suite)
447 2fde8651 Stavros Sachtouris
    failure_collector += r.failures
448 2fde8651 Stavros Sachtouris
    return r.testsRun
449 2fde8651 Stavros Sachtouris
450 2fde8651 Stavros Sachtouris
451 2fde8651 Stavros Sachtouris
def get_test_classes(module=__import__(__name__), name=''):
452 2fde8651 Stavros Sachtouris
    module_stack = [module]
453 2fde8651 Stavros Sachtouris
    while module_stack:
454 2fde8651 Stavros Sachtouris
        module = module_stack[-1]
455 2fde8651 Stavros Sachtouris
        module_stack = module_stack[:-1]
456 2fde8651 Stavros Sachtouris
        for objname, obj in getmembers(module):
457 2fde8651 Stavros Sachtouris
            if (objname == name or not name):
458 2fde8651 Stavros Sachtouris
                if isclass(obj) and objname != 'TestCase' and (
459 2fde8651 Stavros Sachtouris
                        issubclass(obj, TestCase)):
460 2fde8651 Stavros Sachtouris
                    yield (obj, objname)
461 2fde8651 Stavros Sachtouris
462 2fde8651 Stavros Sachtouris
463 2fde8651 Stavros Sachtouris
def main(argv):
464 2fde8651 Stavros Sachtouris
    found = False
465 2fde8651 Stavros Sachtouris
    failure_collector = list()
466 2fde8651 Stavros Sachtouris
    num_of_tests = 0
467 2fde8651 Stavros Sachtouris
    for cls, name in get_test_classes(name=argv[1] if len(argv) > 1 else ''):
468 2fde8651 Stavros Sachtouris
        found = True
469 2fde8651 Stavros Sachtouris
        num_of_tests += runTestCase(cls, name, argv[2:], failure_collector)
470 2fde8651 Stavros Sachtouris
    if not found:
471 2fde8651 Stavros Sachtouris
        print('Test "%s" not found' % ' '.join(argv[1:]))
472 2fde8651 Stavros Sachtouris
    else:
473 2fde8651 Stavros Sachtouris
        for i, failure in enumerate(failure_collector):
474 2fde8651 Stavros Sachtouris
            print('Failure %s: ' % (i + 1))
475 2fde8651 Stavros Sachtouris
            for field in failure:
476 2fde8651 Stavros Sachtouris
                print('\t%s' % field)
477 2fde8651 Stavros Sachtouris
        print('\nTotal tests run: %s' % num_of_tests)
478 2fde8651 Stavros Sachtouris
        print('Total failures: %s' % len(failure_collector))
479 2fde8651 Stavros Sachtouris
480 2fde8651 Stavros Sachtouris
481 2fde8651 Stavros Sachtouris
if __name__ == '__main__':
482 2fde8651 Stavros Sachtouris
    from sys import argv
483 2fde8651 Stavros Sachtouris
    main(argv)