1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
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
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
# "weren't nothing promised to you. do i look like i got a promise face?"
48
48
class TestTrace(TestCase):
50
50
def test_format_sys_exception(self):
51
# Test handling of an internal/unexpected error that probably
52
# indicates a bug in bzr. The details of the message may vary
53
# depending on whether apport is available or not. See test_crash for
52
56
raise NotImplementedError, "time travel"
53
57
except NotImplementedError:
56
60
self.assertEqualDiff(err.splitlines()[0],
57
61
'bzr: ERROR: exceptions.NotImplementedError: time travel')
58
62
self.assertContainsRe(err,
59
r'File.*test_trace.py')
63
'Bazaar has encountered an internal error.')
61
65
def test_format_interrupt_exception(self):
68
72
self.assertTrue(len(msg) > 0)
69
73
self.assertEqualDiff(msg, 'bzr: interrupted\n')
75
def test_format_memory_error(self):
80
msg = _format_exception()
81
self.assertEquals(msg,
82
"bzr: out of memory\n")
71
84
def test_format_os_error(self):
86
os.rmdir('nosuchfile22222')
89
msg = _format_exception()
90
# Linux seems to give "No such file" but Windows gives "The system
91
# cannot find the file specified".
92
self.assertEqual('bzr: ERROR: %s\n' % (e_str,), msg)
94
def test_format_io_error(self):
73
96
file('nosuchfile22222')
74
except (OSError, IOError):
76
99
msg = _format_exception()
77
self.assertContainsRe(msg, r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
100
# Even though Windows and Linux differ for 'os.rmdir', they both give
101
# 'No such file' for open()
102
self.assertContainsRe(msg,
103
r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
79
105
def test_format_unicode_error(self):
114
140
msg = _format_exception()
115
141
self.assertContainsRe(msg,
116
r"Traceback \(most recent call last\)")
142
r'Bazaar has encountered an internal error')
118
144
def test_trace_unicode(self):
119
145
"""Write Unicode to trace log"""
120
146
self.log(u'the unicode character for benzene is \N{BENZENE RING}')
121
self.assertContainsRe(self._get_log(keep_log_file=True),
122
"the unicode character for benzene is")
148
self.assertContainsRe(log, "the unicode character for benzene is")
124
150
def test_trace_argument_unicode(self):
125
151
"""Write a Unicode argument to the trace log"""
126
152
mutter(u'the unicode character for benzene is %s', u'\N{BENZENE RING}')
127
self.assertContainsRe(self._get_log(keep_log_file=True),
128
'the unicode character')
154
self.assertContainsRe(log, 'the unicode character')
130
156
def test_trace_argument_utf8(self):
131
157
"""Write a Unicode argument to the trace log"""
132
158
mutter(u'the unicode character for benzene is %s',
133
159
u'\N{BENZENE RING}'.encode('utf-8'))
134
self.assertContainsRe(self._get_log(keep_log_file=True),
135
'the unicode character')
161
self.assertContainsRe(log, 'the unicode character')
137
163
def test_report_broken_pipe(self):
151
177
def test_mutter_callsite_1(self):
152
178
"""mutter_callsite can capture 1 level of stack frame."""
153
179
mutter_callsite(1, "foo %s", "a string")
154
log = self._get_log(keep_log_file=True)
155
181
# begin with the message
156
182
self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
157
183
# should show two frame: this frame and the one above
163
189
def test_mutter_callsite_2(self):
164
190
"""mutter_callsite can capture 2 levels of stack frame."""
165
191
mutter_callsite(2, "foo %s", "a string")
166
log = self._get_log(keep_log_file=True)
167
193
# begin with the message
168
194
self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
169
195
# should show two frame: this frame and the one above
175
201
def test_mutter_never_fails(self):
176
202
# Even if the decode/encode stage fails, mutter should not
177
203
# raise an exception
204
# This test checks that mutter doesn't fail; the current behaviour
205
# is that it doesn't fail *and writes non-utf8*.
178
206
mutter(u'Writing a greek mu (\xb5) works in a unicode string')
179
207
mutter('But fails in an ascii string \xb5')
180
208
mutter('and in an ascii argument: %s', '\xb5')
181
log = self._get_log(keep_log_file=True)
182
210
self.assertContainsRe(log, 'Writing a greek mu')
183
211
self.assertContainsRe(log, "But fails in an ascii string")
184
self.assertContainsRe(log, u"ascii argument: \xb5")
212
# However, the log content object does unicode replacement on reading
213
# to let it get unicode back where good data has been written. So we
214
# have to do a replaceent here as well.
215
self.assertContainsRe(log, "ascii argument: \xb5".decode('utf8',
186
218
def test_push_log_file(self):
187
219
"""Can push and pop log file, and this catches mutter messages.
189
This is primarily for use in the test framework.
221
This is primarily for use in the test framework.
191
223
tmp1 = tempfile.NamedTemporaryFile()
192
224
tmp2 = tempfile.NamedTemporaryFile()
246
278
def test_log_rollover(self):
247
279
temp_log_name = 'test-log'
248
280
trace_file = open(temp_log_name, 'at')
249
trace_file.write('test_log_rollover padding\n' * 1000000)
281
trace_file.writelines(['test_log_rollover padding\n'] * 200000)
250
282
trace_file.close()
251
283
_rollover_trace_maybe(temp_log_name)
252
284
# should have been rolled over