/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: Robert Collins
  • Date: 2006-11-08 00:36:30 UTC
  • mto: This revision was merged to the branch mainline in revision 2124.
  • Revision ID: robertc@robertcollins.net-20061108003630-feb31613c83f7096
(Robert Collins) Extend the problem reporting command line UI to use
apport to report more detailed diagnostics which should help in in getting
faults reported in Malone and provides the basis for capturing more
information such as detailed logging data from the current invocation of
bzr in the future (without cluttering 'bzr.log' unnecessarily).
apport is available from Ubuntu Edgy onwards.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
from bzrlib import (
27
27
    errors,
 
28
    plugin,
 
29
    trace,
28
30
    )
29
31
from bzrlib.tests import TestCaseInTempDir, TestCase
30
32
from bzrlib.trace import mutter, report_exception
33
35
def _format_exception():
34
36
    """Format an exception as it would normally be displayed to the user"""
35
37
    buf = StringIO()
36
 
    report_exception(sys.exc_info(), buf)
37
 
    return buf.getvalue()
 
38
    report = report_exception(sys.exc_info(), buf)
 
39
    return buf.getvalue(), report
38
40
 
39
41
 
40
42
class TestTrace(TestCase):
41
43
 
42
 
    def test_format_sys_exception(self):
 
44
    def test_format_sys_exception_no_apport(self):
43
45
        try:
44
46
            raise NotImplementedError, "time travel"
45
47
        except NotImplementedError:
46
48
            pass
47
 
        err = _format_exception()
 
49
        old_use_apport = trace._use_apport
 
50
        trace._use_apport = False
 
51
        try:
 
52
            err, report = _format_exception()
 
53
        finally:
 
54
            trace._use_apport = old_use_apport
 
55
        self.assertEqual(None, report)
48
56
        self.assertEqualDiff(err.splitlines()[0],
49
57
                'bzr: ERROR: exceptions.NotImplementedError: time travel')
50
58
        self.assertContainsRe(err,
51
59
                r'File.*test_trace.py')
52
60
 
 
61
    def test_format_sys_exception_apport(self):
 
62
        try:
 
63
            import problem_report
 
64
        except ImportError:
 
65
            raise TestSkipped('Apport not installed')
 
66
        try:
 
67
            raise NotImplementedError, "time travel"
 
68
        except NotImplementedError:
 
69
            pass
 
70
        old_argv = sys.argv
 
71
        sys.argv = ['foo', 'bar', 'quux']
 
72
        try:
 
73
            err, (report, report_filename) = _format_exception()
 
74
        finally:
 
75
            sys.argv = old_argv
 
76
        self.assertIsInstance(report, problem_report.ProblemReport)
 
77
        # the error formatting is checked by the blackbox ui command.
 
78
        # here we need to check that the file on disk - the problem report
 
79
        # will contain the right information.
 
80
        # the report needs:
 
81
        #  - the command line.
 
82
        #  - package data
 
83
        #  - plugins list
 
84
        #  - backtrace.
 
85
        # check the report logical data.
 
86
        self.assertEqual('foo bar quux', report['CommandLine'])
 
87
        known_plugins = ' '.join(plugin.all_plugins())
 
88
        self.assertEqual(known_plugins, report['BzrPlugins'])
 
89
        self.assertContainsRe(report['Traceback'], r'Traceback')
 
90
        # Stock apport facilities we just invoke, no need to test their
 
91
        # content
 
92
        self.assertNotEqual(None, report['Package'])
 
93
        self.assertNotEqual(None, report['Uname'])
 
94
        # check the file 'looks' like a good file, because we dont
 
95
        # want apport changes to break the user interface.
 
96
        report_file = file(report_filename, 'r')
 
97
        try:
 
98
            report_text = report_file.read()
 
99
        finally:
 
100
            report_file.close()
 
101
        # so we check this by looking across two fields and they should
 
102
        # be just \n separated.
 
103
        self.assertTrue('ProblemType: Crash\n'
 
104
            'BzrPlugins: ' in report_text)
 
105
 
53
106
    def test_format_interrupt_exception(self):
54
107
        try:
55
108
            raise KeyboardInterrupt()
56
109
        except KeyboardInterrupt:
57
110
            # XXX: Some risk that a *real* keyboard interrupt won't be seen
 
111
            # We can probably detect that by checking for the specific line
 
112
            # that we raise from in the test being in the backtrace.
58
113
            pass
59
 
        msg = _format_exception()
 
114
        msg, report = _format_exception()
60
115
        self.assertTrue(len(msg) > 0)
61
116
        self.assertEqualDiff(msg, 'bzr: interrupted\n')
62
117
 
65
120
            file('nosuchfile22222')
66
121
        except (OSError, IOError):
67
122
            pass
68
 
        msg = _format_exception()
 
123
        msg, report = _format_exception()
69
124
        self.assertContainsRe(msg, r'^bzr: ERROR: \[Errno .*\] No such file.*nosuchfile')
70
125
 
71
126
    def test_format_unicode_error(self):
73
128
            raise errors.BzrCommandError(u'argument foo\xb5 does not exist')
74
129
        except errors.BzrCommandError:
75
130
            pass
76
 
        msg = _format_exception()
 
131
        msg, report = _format_exception()
77
132
 
78
133
    def test_format_exception(self):
79
134
        """Short formatting of bzr exceptions"""
81
136
            raise errors.NotBranchError('wibble')
82
137
        except errors.NotBranchError:
83
138
            pass
84
 
        msg = _format_exception()
 
139
        msg, report = _format_exception()
85
140
        self.assertTrue(len(msg) > 0)
86
141
        self.assertEqualDiff(msg, 'bzr: ERROR: Not a branch: wibble\n')
87
142
 
108
163
        try:
109
164
            raise IOError(errno.EPIPE, 'broken pipe foofofo')
110
165
        except IOError, e:
111
 
            msg = _format_exception()
 
166
            msg, report = _format_exception()
112
167
            self.assertEquals(msg, "bzr: broken pipe\n")
113
168
        else:
114
169
            self.fail("expected error not raised")