~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_trace.py

  • Committer: Robert Collins
  • Date: 2007-04-23 03:41:48 UTC
  • mfrom: (2387.2.1 cleanassertions)
  • mto: This revision was merged to the branch mainline in revision 2444.
  • Revision ID: robertc@robertcollins.net-20070423034148-b4m9c1iwl7528prf
Review feedback.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
# "weren't nothing promised to you.  do i look like i got a promise face?"
 
18
 
 
19
"""Tests for trace library"""
 
20
 
 
21
from cStringIO import StringIO
 
22
import errno
 
23
import os
 
24
import sys
 
25
 
 
26
from bzrlib import (
 
27
    errors,
 
28
    )
 
29
from bzrlib.tests import TestCaseInTempDir, TestCase
 
30
from bzrlib.trace import mutter, report_exception
 
31
 
 
32
 
 
33
def _format_exception():
 
34
    """Format an exception as it would normally be displayed to the user"""
 
35
    buf = StringIO()
 
36
    report_exception(sys.exc_info(), buf)
 
37
    return buf.getvalue()
 
38
 
 
39
 
 
40
class TestTrace(TestCase):
 
41
 
 
42
    def test_format_sys_exception(self):
 
43
        try:
 
44
            raise NotImplementedError, "time travel"
 
45
        except NotImplementedError:
 
46
            pass
 
47
        err = _format_exception()
 
48
        self.assertEqualDiff(err.splitlines()[0],
 
49
                'bzr: ERROR: exceptions.NotImplementedError: time travel')
 
50
        self.assertContainsRe(err,
 
51
                r'File.*test_trace.py')
 
52
 
 
53
    def test_format_interrupt_exception(self):
 
54
        try:
 
55
            raise KeyboardInterrupt()
 
56
        except KeyboardInterrupt:
 
57
            # XXX: Some risk that a *real* keyboard interrupt won't be seen
 
58
            pass
 
59
        msg = _format_exception()
 
60
        self.assertTrue(len(msg) > 0)
 
61
        self.assertEqualDiff(msg, 'bzr: interrupted\n')
 
62
 
 
63
    def test_format_os_error(self):
 
64
        try:
 
65
            file('nosuchfile22222')
 
66
        except (OSError, IOError):
 
67
            pass
 
68
        msg = _format_exception()
 
69
        self.assertContainsRe(msg, r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
 
70
 
 
71
    def test_format_unicode_error(self):
 
72
        try:
 
73
            raise errors.BzrCommandError(u'argument foo\xb5 does not exist')
 
74
        except errors.BzrCommandError:
 
75
            pass
 
76
        msg = _format_exception()
 
77
 
 
78
    def test_format_exception(self):
 
79
        """Short formatting of bzr exceptions"""
 
80
        try:
 
81
            raise errors.NotBranchError('wibble')
 
82
        except errors.NotBranchError:
 
83
            pass
 
84
        msg = _format_exception()
 
85
        self.assertTrue(len(msg) > 0)
 
86
        self.assertEqualDiff(msg, 'bzr: ERROR: Not a branch: wibble\n')
 
87
 
 
88
    def test_trace_unicode(self):
 
89
        """Write Unicode to trace log"""
 
90
        self.log(u'the unicode character for benzene is \N{BENZENE RING}')
 
91
        self.assertContainsRe(self._get_log(keep_log_file=True),
 
92
                              "the unicode character for benzene is")
 
93
    
 
94
    def test_trace_argument_unicode(self):
 
95
        """Write a Unicode argument to the trace log"""
 
96
        mutter(u'the unicode character for benzene is %s', u'\N{BENZENE RING}')
 
97
        self.assertContainsRe(self._get_log(keep_log_file=True),
 
98
                              'the unicode character')
 
99
 
 
100
    def test_trace_argument_utf8(self):
 
101
        """Write a Unicode argument to the trace log"""
 
102
        mutter(u'the unicode character for benzene is %s',
 
103
               u'\N{BENZENE RING}'.encode('utf-8'))
 
104
        self.assertContainsRe(self._get_log(keep_log_file=True),
 
105
                              'the unicode character')
 
106
 
 
107
    def test_report_broken_pipe(self):
 
108
        try:
 
109
            raise IOError(errno.EPIPE, 'broken pipe foofofo')
 
110
        except IOError, e:
 
111
            msg = _format_exception()
 
112
            self.assertEquals(msg, "bzr: broken pipe\n")
 
113
        else:
 
114
            self.fail("expected error not raised")
 
115
 
 
116
    def test_mutter_never_fails(self):
 
117
        # Even if the decode/encode stage fails, mutter should not
 
118
        # raise an exception
 
119
        mutter(u'Writing a greek mu (\xb5) works in a unicode string')
 
120
        mutter('But fails in an ascii string \xb5')
 
121
        mutter('and in an ascii argument: %s', '\xb5')
 
122
        log = self._get_log(keep_log_file=True)
 
123
        self.assertContainsRe(log, 'Writing a greek mu')
 
124
        self.assertContainsRe(log, "But fails in an ascii string")
 
125
        self.assertContainsRe(log, u"ascii argument: \xb5")