Revision 4769da6b

b/kamaki/cli/test.py
34 34
from unittest import makeSuite, TestSuite, TextTestRunner, TestCase
35 35
from inspect import getmembers, isclass
36 36
from tempfile import NamedTemporaryFile
37
from mock import patch, call
38
from itertools import product
37 39

  
38 40
from kamaki.cli.command_tree.test import Command, CommandTree
39 41
from kamaki.cli.argument.test import (
......
131 133
            self.assertEqual(history.retrieve(- i), sample_history[- i - 1])
132 134

  
133 135

  
136
class LoggerMethods(TestCase):
137

  
138
    class PseudoLogger(object):
139
        level = 'some level'
140
        _setLevel_calls = []
141
        _addHandler_calls = []
142

  
143
        def setLevel(self, *args):
144
            self._setLevel_calls.append(args)
145

  
146
        def addHandler(self, *args):
147
            self._addHandler_calls.append(args)
148

  
149
    class PseudoHandler(object):
150
        _setFormatter_calls = []
151

  
152
        def setFormatter(self, *args):
153
            self._setFormatter_calls.append(args)
154

  
155
    def setUp(self):
156
        from kamaki.cli.logger import LOG_FILE, _blacklist
157
        self.LF, self.BL = list(LOG_FILE), dict(_blacklist)
158

  
159
    def tearDown(self):
160
        self.PseudoLogger._setLevel_calls = []
161
        self.PseudoLogger._addHandler_calls = []
162
        self.PseudoLogger._setFormatter_calls = []
163
        from kamaki.cli.logger import LOG_FILE, _blacklist
164
        for e in LOG_FILE:
165
            LOG_FILE.pop()
166
        for e in self.LF:
167
            LOG_FILE.append(e)
168
        _blacklist.clear()
169
        _blacklist.update(self.BL)
170

  
171
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
172
    def test_deactivate(self, GL):
173
        from kamaki.cli.logger import deactivate, _blacklist
174
        self.assertEqual(_blacklist, {})
175
        deactivate('some logger')
176
        GL.assert_called_once_with('some logger')
177
        self.assertEqual(
178
            _blacklist.get('some logger', None), self.PseudoLogger.level)
179
        from logging import CRITICAL
180
        self.assertEqual(self.PseudoLogger._setLevel_calls[-1], (CRITICAL, ))
181

  
182
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
183
    def test_activate(self, GL):
184
        from kamaki.cli.logger import activate
185
        activate('another logger')
186
        GL.assert_called_once_with('another logger')
187
        self.assertEqual(
188
            self.PseudoLogger._setLevel_calls[-1], (self.PseudoLogger.level, ))
189

  
190
    def test_get_log_filename(self):
191
        from kamaki.cli.logger import get_log_filename, LOG_FILE
192
        f = NamedTemporaryFile()
193
        for e in LOG_FILE:
194
            LOG_FILE.pop()
195
        LOG_FILE.append(f.name)
196
        self.assertEqual(get_log_filename(), f.name)
197
        LOG_FILE.pop()
198
        LOG_FILE.append(2 * f.name)
199
        print('\n  Should print error msg here: ')
200
        self.assertEqual(get_log_filename(), None)
201

  
202
    def test_set_log_filename(self):
203
        from kamaki.cli.logger import set_log_filename, LOG_FILE
204
        for n in ('some name', 'some other name'):
205
            set_log_filename(n)
206
            self.assertEqual(LOG_FILE[0], n)
207

  
208
    @patch('kamaki.cli.logger.get_logger', return_value=PseudoLogger())
209
    @patch('kamaki.cli.logger.logging.Formatter', return_value='f0rm4t')
210
    @patch(
211
        'kamaki.cli.logger.logging.StreamHandler',
212
        return_value=PseudoHandler())
213
    @patch(
214
        'kamaki.cli.logger.logging.FileHandler',
215
        return_value=PseudoHandler())
216
    def test__add_logger(self, FH, SH, F, GL):
217
        from kamaki.cli.logger import _add_logger
218
        from logging import DEBUG
219
        stdf, cnt = '%(name)s\n %(message)s', 0
220
        for name, level, filename, fmt in product(
221
                ('my logger', ),
222
                ('my level', None),
223
                ('my filename', None),
224
                ('my fmt', None)):
225
            log = _add_logger(name, level, filename, fmt)
226
            self.assertTrue(isinstance(log, self.PseudoLogger))
227
            self.assertEqual(GL.mock_calls[-1], call(name))
228
            if filename:
229
                self.assertEqual(FH.mock_calls[-1], call(filename))
230
            else:
231
                self.assertEqual(SH.mock_calls[-1], call())
232
            self.assertEqual(F.mock_calls[-1], call(fmt or stdf))
233
            self.assertEqual(
234
                self.PseudoHandler._setFormatter_calls[-1], ('f0rm4t', ))
235
            cnt += 1
236
            self.assertEqual(len(self.PseudoLogger._addHandler_calls), cnt)
237
            h = self.PseudoLogger._addHandler_calls[-1]
238
            self.assertTrue(isinstance(h[0], self.PseudoHandler))
239
            l = self.PseudoLogger._setLevel_calls[-1]
240
            self.assertEqual(l, (level or DEBUG, ))
241

  
242
    @patch('kamaki.cli.logger.get_log_filename', return_value='my log fname')
243
    @patch('kamaki.cli.logger.get_logger', return_value='my get logger ret')
244
    def test_add_file_logger(self, GL, GLF):
245
        from kamaki.cli.logger import add_file_logger
246
        with patch('kamaki.cli.logger._add_logger', return_value='AL') as AL:
247
            GLFcount = GLF.call_count
248
            for name, level, filename in product(
249
                    ('my name'), ('my level', None), ('my filename', None)):
250
                self.assertEqual(add_file_logger(name, level, filename), 'AL')
251
                self.assertEqual(AL.mock_calls[-1], call(
252
                    name, level, filename or 'my log fname',
253
                    fmt='%(name)s(%(levelname)s) %(asctime)s\n\t%(message)s'))
254
                if filename:
255
                    self.assertEqual(GLFcount, GLF.call_count)
256
                else:
257
                    GLFcount = GLF.call_count
258
                    self.assertEqual(GLF.mock_calls[-1], call())
259
        with patch('kamaki.cli.logger._add_logger', side_effect=Exception):
260
            self.assertEqual(add_file_logger('X'), 'my get logger ret')
261
            GL.assert_called_once_with('X')
262

  
263
    @patch('kamaki.cli.logger.get_logger', return_value='my get logger ret')
264
    def test_add_stream_logger(self, GL):
265
        from kamaki.cli.logger import add_stream_logger
266
        with patch('kamaki.cli.logger._add_logger', return_value='AL') as AL:
267
            for name, level, fmt in product(
268
                    ('my name'), ('my level', None), ('my fmt', None)):
269
                self.assertEqual(add_stream_logger(name, level, fmt), 'AL')
270
                self.assertEqual(AL.mock_calls[-1], call(name, level, fmt=fmt))
271
        with patch('kamaki.cli.logger._add_logger', side_effect=Exception):
272
            self.assertEqual(add_stream_logger('X'), 'my get logger ret')
273
            GL.assert_called_once_with('X')
274

  
275
    @patch('kamaki.cli.logger.logging.getLogger', return_value=PseudoLogger())
276
    def test_get_logger(self, GL):
277
        from kamaki.cli.logger import get_logger
278
        get_logger('my logger name')
279
        GL.assert_called_once_with('my logger name')
280

  
281

  
134 282
#  TestCase auxiliary methods
135 283

  
136 284
def runTestCase(cls, test_name, args=[], failure_collector=[]):

Also available in: Unified diff