~bzr-pqm/bzr/bzr.dev

1185.33.9 by Martin Pool
Add new selftest module.
1
# Copyright (C) 2005 by Canonical Ltd
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
# "weren't nothing promised to you.  do i look like i got a promise face?"
19
20
"""Tests for trace library"""
21
22
import os
23
import sys
24
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
25
from bzrlib.tests import TestCaseInTempDir, TestCase
1185.33.51 by Martin Pool
Fix trace of non-ascii messages, and add test.
26
from bzrlib.trace import format_exception_short, mutter
1185.33.63 by Martin Pool
Better display of BzrError classes that are not BzrNewErrors.
27
from bzrlib.errors import NotBranchError, BzrError, BzrNewError
1185.33.9 by Martin Pool
Add new selftest module.
28
29
class TestTrace(TestCase):
30
    def test_format_sys_exception(self):
31
        """Short formatting of exceptions"""
32
        try:
33
            raise NotImplementedError, "time travel"
34
        except NotImplementedError:
35
            pass
36
        error_lines = format_exception_short(sys.exc_info()).splitlines()
37
        self.assertEqualDiff(error_lines[0], 
38
                'exceptions.NotImplementedError: time travel')
39
        self.assertContainsRe(error_lines[1], 
1185.31.16 by John Arbash Meinel
Renamed all test modules to remove the 'test' prefix
40
                r'^  at .*trace\.py line \d+$')  
1185.33.9 by Martin Pool
Add new selftest module.
41
        self.assertContainsRe(error_lines[2], 
42
                r'^  in test_format_sys_exception$')
43
44
    def test_format_exception(self):
45
        """Short formatting of exceptions"""
46
        try:
47
            raise NotBranchError, 'wibble'
48
        except NotBranchError:
49
            pass
50
        msg = format_exception_short(sys.exc_info())
51
        self.assertEqualDiff(msg, 'Not a branch: wibble')
1185.33.51 by Martin Pool
Fix trace of non-ascii messages, and add test.
52
1185.33.63 by Martin Pool
Better display of BzrError classes that are not BzrNewErrors.
53
    def test_format_old_exception(self):
54
        # format a class that doesn't descend from BzrNewError; 
55
        # remove this test when everything is unified there
56
        self.assertFalse(issubclass(BzrError, BzrNewError))
57
        try:
58
            raise BzrError('some old error')
59
        except BzrError:
60
            pass
61
        msg = format_exception_short(sys.exc_info())
62
        self.assertEqualDiff(msg, 'some old error')
63
1185.33.51 by Martin Pool
Fix trace of non-ascii messages, and add test.
64
    def test_trace_unicode(self):
65
        """Write Unicode to trace log"""
66
        self.log(u'the unicode character for benzene is \N{BENZENE RING}')
67
        self.assertContainsRe('the unicode character',
68
                self._get_log())
1185.85.5 by John Arbash Meinel
mutter() should not fail because of unicode errors
69
70
    def test_mutter_never_fails(self):
71
        # Even if the decode/encode stage fails, mutter should not
72
        # raise an exception
73
        mutter(u'Writing a greek mu (\xb5) works in a unicode string')
74
        mutter('But fails in an ascii string \xb5')
75
        # TODO: jam 20051227 mutter() doesn't flush the log file, and
76
        #       self._get_log() opens the file directly and reads it.
77
        #       So we need to manually flush the log file
78
        import bzrlib.trace
79
        bzrlib.trace._trace_file.flush()
80
        log = self._get_log()
81
        self.assertContainsRe(log, 'Writing a greek mu')
82
        self.assertContainsRe(log, 'UnicodeError')
83
        self.assertContainsRe(log, "'But fails in an ascii string")
84