~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_trace.py

  • Committer: Vincent Ladeuil
  • Date: 2007-10-09 20:32:29 UTC
  • mto: (2903.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 2904.
  • Revision ID: v.ladeuil+lp@free.fr-20071009203229-5k200m1g7mf4jf9l
Fix 149019 by using a proper line number when reporting errors.

* bzrlib/util/configobj/configobj.py:
(ConfigObj._handle_error): Trivial fix. Since cur_index is
0-based, line number was off by one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
# "weren't nothing promised to you.  do i look like i got a promise face?"
18
18
 
21
21
from cStringIO import StringIO
22
22
import errno
23
23
import os
24
 
import re
25
24
import sys
26
 
import tempfile
27
25
 
28
26
from bzrlib import (
29
27
    errors,
32
30
from bzrlib.trace import (
33
31
    mutter, mutter_callsite, report_exception,
34
32
    set_verbosity_level, get_verbosity_level, is_quiet, is_verbose, be_quiet,
35
 
    pop_log_file,
36
 
    push_log_file,
37
33
    _rollover_trace_maybe,
38
34
    )
39
35
 
70
66
 
71
67
    def test_format_os_error(self):
72
68
        try:
73
 
            os.rmdir('nosuchfile22222')
74
 
        except OSError:
75
 
            pass
76
 
        msg = _format_exception()
77
 
        self.assertContainsRe(msg,
78
 
            r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile22222')
79
 
 
80
 
    def test_format_io_error(self):
81
 
        try:
82
69
            file('nosuchfile22222')
83
 
        except IOError:
 
70
        except (OSError, IOError):
84
71
            pass
85
72
        msg = _format_exception()
86
73
        self.assertContainsRe(msg, r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
102
89
        self.assertTrue(len(msg) > 0)
103
90
        self.assertEqualDiff(msg, 'bzr: ERROR: Not a branch: \"wibble\".\n')
104
91
 
105
 
    def test_report_external_import_error(self):
106
 
        """Short friendly message for missing system modules."""
107
 
        try:
108
 
            import ImaginaryModule
109
 
        except ImportError, e:
110
 
            pass
111
 
        else:
112
 
            self.fail("somehow succeeded in importing %r" % ImaginaryModule)
113
 
        msg = _format_exception()
114
 
        self.assertEqual(msg,
115
 
            'bzr: ERROR: No module named ImaginaryModule\n'
116
 
            'You may need to install this Python library separately.\n')
117
 
 
118
 
    def test_report_import_syntax_error(self):
119
 
        try:
120
 
            raise ImportError("syntax error")
121
 
        except ImportError, e:
122
 
            pass
123
 
        msg = _format_exception()
124
 
        self.assertContainsRe(msg,
125
 
            r"Traceback \(most recent call last\)")
126
 
 
127
92
    def test_trace_unicode(self):
128
93
        """Write Unicode to trace log"""
129
94
        self.log(u'the unicode character for benzene is \N{BENZENE RING}')
130
95
        self.assertContainsRe(self._get_log(keep_log_file=True),
131
96
                              "the unicode character for benzene is")
132
 
 
 
97
    
133
98
    def test_trace_argument_unicode(self):
134
99
        """Write a Unicode argument to the trace log"""
135
100
        mutter(u'the unicode character for benzene is %s', u'\N{BENZENE RING}')
152
117
        else:
153
118
            self.fail("expected error not raised")
154
119
 
155
 
    def assertLogStartsWith(self, log, string):
156
 
        """Like assertStartsWith, but skips the log timestamp."""
157
 
        self.assertContainsRe(log,
158
 
            '^\\d+\\.\\d+  ' + re.escape(string))
159
 
 
160
120
    def test_mutter_callsite_1(self):
161
121
        """mutter_callsite can capture 1 level of stack frame."""
162
122
        mutter_callsite(1, "foo %s", "a string")
163
123
        log = self._get_log(keep_log_file=True)
164
124
        # begin with the message
165
 
        self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
 
125
        self.assertStartsWith(log, 'foo a string\nCalled from:\n')
166
126
        # should show two frame: this frame and the one above
167
127
        self.assertContainsRe(log,
168
 
            'test_trace\\.py", line \\d+, in test_mutter_callsite_1\n')
 
128
            'test_trace\.py", line \d+, in test_mutter_callsite_1\n')
169
129
        # this frame should be the final one
170
130
        self.assertEndsWith(log, ' "a string")\n')
171
131
 
174
134
        mutter_callsite(2, "foo %s", "a string")
175
135
        log = self._get_log(keep_log_file=True)
176
136
        # begin with the message
177
 
        self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
 
137
        self.assertStartsWith(log, 'foo a string\nCalled from:\n')
178
138
        # should show two frame: this frame and the one above
179
139
        self.assertContainsRe(log,
180
140
            'test_trace.py", line \d+, in test_mutter_callsite_2\n')
192
152
        self.assertContainsRe(log, "But fails in an ascii string")
193
153
        self.assertContainsRe(log, u"ascii argument: \xb5")
194
154
 
195
 
    def test_push_log_file(self):
196
 
        """Can push and pop log file, and this catches mutter messages.
197
 
 
198
 
        This is primarily for use in the test framework.
199
 
        """
200
 
        tmp1 = tempfile.NamedTemporaryFile()
201
 
        tmp2 = tempfile.NamedTemporaryFile()
202
 
        try:
203
 
            memento1 = push_log_file(tmp1)
204
 
            mutter("comment to file1")
205
 
            try:
206
 
                memento2 = push_log_file(tmp2)
207
 
                try:
208
 
                    mutter("comment to file2")
209
 
                finally:
210
 
                    pop_log_file(memento2)
211
 
                mutter("again to file1")
212
 
            finally:
213
 
                pop_log_file(memento1)
214
 
            # the files were opened in binary mode, so should have exactly
215
 
            # these bytes.  and removing the file as the log target should
216
 
            # have caused them to be flushed out.  need to match using regexps
217
 
            # as there's a timestamp at the front.
218
 
            tmp1.seek(0)
219
 
            self.assertContainsRe(tmp1.read(),
220
 
                r"\d+\.\d+  comment to file1\n\d+\.\d+  again to file1\n")
221
 
            tmp2.seek(0)
222
 
            self.assertContainsRe(tmp2.read(),
223
 
                r"\d+\.\d+  comment to file2\n")
224
 
        finally:
225
 
            tmp1.close()
226
 
            tmp2.close()
227
 
 
228
155
 
229
156
class TestVerbosityLevel(TestCase):
230
157