/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_trace.py

  • Committer: Andrew Bennetts
  • Date: 2010-01-12 03:53:21 UTC
  • mfrom: (4948 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4964.
  • Revision ID: andrew.bennetts@canonical.com-20100112035321-hofpz5p10224ryj3
Merge lp:bzr, resolving conflicts.

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, 2008, 2009 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
# "weren't nothing promised to you.  do i look like i got a promise face?"
18
18
 
48
48
class TestTrace(TestCase):
49
49
 
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
 
54
        # more.
51
55
        try:
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.')
60
64
 
61
65
    def test_format_interrupt_exception(self):
62
66
        try:
68
72
        self.assertTrue(len(msg) > 0)
69
73
        self.assertEqualDiff(msg, 'bzr: interrupted\n')
70
74
 
 
75
    def test_format_memory_error(self):
 
76
        try:
 
77
            raise MemoryError()
 
78
        except MemoryError:
 
79
            pass
 
80
        msg = _format_exception()
 
81
        self.assertEquals(msg,
 
82
            "bzr: out of memory\n")
 
83
 
71
84
    def test_format_os_error(self):
72
85
        try:
 
86
            os.rmdir('nosuchfile22222')
 
87
        except OSError, e:
 
88
            e_str = str(e)
 
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)
 
93
 
 
94
    def test_format_io_error(self):
 
95
        try:
73
96
            file('nosuchfile22222')
74
 
        except (OSError, IOError):
 
97
        except IOError:
75
98
            pass
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')
78
104
 
79
105
    def test_format_unicode_error(self):
80
106
        try:
113
139
            pass
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')
117
143
 
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")
123
 
    
 
147
        log = self.get_log()
 
148
        self.assertContainsRe(log, "the unicode character for benzene is")
 
149
 
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')
 
153
        log = self.get_log()
 
154
        self.assertContainsRe(log, 'the unicode character')
129
155
 
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')
 
160
        log = self.get_log()
 
161
        self.assertContainsRe(log, 'the unicode character')
136
162
 
137
163
    def test_report_broken_pipe(self):
138
164
        try:
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)
 
180
        log = self.get_log()
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)
 
192
        log = self.get_log()
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)
 
209
        log = self.get_log()
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',
 
216
            'replace'))
185
217
 
186
218
    def test_push_log_file(self):
187
219
        """Can push and pop log file, and this catches mutter messages.
188
220
 
189
 
        This is primarily for use in the test framework. 
 
221
        This is primarily for use in the test framework.
190
222
        """
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