~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_trace.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-04-09 20:23:07 UTC
  • mfrom: (4265.1.4 bbc-merge)
  • Revision ID: pqm@pqm.ubuntu.com-20090409202307-n0depb16qepoe21o
(jam) Change _fetch_uses_deltas = False for CHK repos until we can
        write a better fix.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 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
 
21
21
from cStringIO import StringIO
22
22
import errno
23
23
import os
 
24
import re
24
25
import sys
 
26
import tempfile
25
27
 
26
28
from bzrlib import (
27
29
    errors,
28
30
    )
29
31
from bzrlib.tests import TestCaseInTempDir, TestCase
30
 
from bzrlib.trace import mutter, report_exception
 
32
from bzrlib.trace import (
 
33
    mutter, mutter_callsite, report_exception,
 
34
    set_verbosity_level, get_verbosity_level, is_quiet, is_verbose, be_quiet,
 
35
    pop_log_file,
 
36
    push_log_file,
 
37
    _rollover_trace_maybe,
 
38
    )
31
39
 
32
40
 
33
41
def _format_exception():
62
70
 
63
71
    def test_format_os_error(self):
64
72
        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:
65
82
            file('nosuchfile22222')
66
 
        except (OSError, IOError):
 
83
        except IOError:
67
84
            pass
68
85
        msg = _format_exception()
69
86
        self.assertContainsRe(msg, r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
83
100
            pass
84
101
        msg = _format_exception()
85
102
        self.assertTrue(len(msg) > 0)
86
 
        self.assertEqualDiff(msg, 'bzr: ERROR: Not a branch: wibble\n')
 
103
        self.assertEqualDiff(msg, 'bzr: ERROR: Not a branch: \"wibble\".\n')
 
104
 
 
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\)")
87
126
 
88
127
    def test_trace_unicode(self):
89
128
        """Write Unicode to trace log"""
90
129
        self.log(u'the unicode character for benzene is \N{BENZENE RING}')
91
130
        self.assertContainsRe(self._get_log(keep_log_file=True),
92
131
                              "the unicode character for benzene is")
93
 
    
 
132
 
94
133
    def test_trace_argument_unicode(self):
95
134
        """Write a Unicode argument to the trace log"""
96
135
        mutter(u'the unicode character for benzene is %s', u'\N{BENZENE RING}')
113
152
        else:
114
153
            self.fail("expected error not raised")
115
154
 
 
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
    def test_mutter_callsite_1(self):
 
161
        """mutter_callsite can capture 1 level of stack frame."""
 
162
        mutter_callsite(1, "foo %s", "a string")
 
163
        log = self._get_log(keep_log_file=True)
 
164
        # begin with the message
 
165
        self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
 
166
        # should show two frame: this frame and the one above
 
167
        self.assertContainsRe(log,
 
168
            'test_trace\\.py", line \\d+, in test_mutter_callsite_1\n')
 
169
        # this frame should be the final one
 
170
        self.assertEndsWith(log, ' "a string")\n')
 
171
 
 
172
    def test_mutter_callsite_2(self):
 
173
        """mutter_callsite can capture 2 levels of stack frame."""
 
174
        mutter_callsite(2, "foo %s", "a string")
 
175
        log = self._get_log(keep_log_file=True)
 
176
        # begin with the message
 
177
        self.assertLogStartsWith(log, 'foo a string\nCalled from:\n')
 
178
        # should show two frame: this frame and the one above
 
179
        self.assertContainsRe(log,
 
180
            'test_trace.py", line \d+, in test_mutter_callsite_2\n')
 
181
        # this frame should be the final one
 
182
        self.assertEndsWith(log, ' "a string")\n')
 
183
 
116
184
    def test_mutter_never_fails(self):
117
185
        # Even if the decode/encode stage fails, mutter should not
118
186
        # raise an exception
123
191
        self.assertContainsRe(log, 'Writing a greek mu')
124
192
        self.assertContainsRe(log, "But fails in an ascii string")
125
193
        self.assertContainsRe(log, u"ascii argument: \xb5")
 
194
 
 
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
 
 
229
class TestVerbosityLevel(TestCase):
 
230
 
 
231
    def test_verbosity_level(self):
 
232
        set_verbosity_level(1)
 
233
        self.assertEqual(1, get_verbosity_level())
 
234
        self.assertTrue(is_verbose())
 
235
        self.assertFalse(is_quiet())
 
236
        set_verbosity_level(-1)
 
237
        self.assertEqual(-1, get_verbosity_level())
 
238
        self.assertFalse(is_verbose())
 
239
        self.assertTrue(is_quiet())
 
240
        set_verbosity_level(0)
 
241
        self.assertEqual(0, get_verbosity_level())
 
242
        self.assertFalse(is_verbose())
 
243
        self.assertFalse(is_quiet())
 
244
 
 
245
    def test_be_quiet(self):
 
246
        # Confirm the old API still works
 
247
        be_quiet(True)
 
248
        self.assertEqual(-1, get_verbosity_level())
 
249
        be_quiet(False)
 
250
        self.assertEqual(0, get_verbosity_level())
 
251
 
 
252
 
 
253
class TestBzrLog(TestCaseInTempDir):
 
254
 
 
255
    def test_log_rollover(self):
 
256
        temp_log_name = 'test-log'
 
257
        trace_file = open(temp_log_name, 'at')
 
258
        trace_file.write('test_log_rollover padding\n' * 1000000)
 
259
        trace_file.close()
 
260
        _rollover_trace_maybe(temp_log_name)
 
261
        # should have been rolled over
 
262
        self.assertFalse(os.access(temp_log_name, os.R_OK))