17
17
"""Tests for display of exceptions."""
19
from cStringIO import StringIO
22
from bzrlib import bzrdir, repository
24
30
from bzrlib.tests import TestCaseInTempDir, TestCase
25
31
from bzrlib.errors import NotBranchError
27
34
class TestExceptionReporting(TestCase):
29
36
def test_report_exception(self):
30
37
"""When an error occurs, display bug report details to stderr"""
31
out, err = self.run_bzr("assert-fail", retcode=3)
39
raise AssertionError("failed")
40
except AssertionError, e:
42
trace.report_exception(sys.exc_info(), erf)
44
self.assertContainsRe(err,
45
r'bzr: ERROR: exceptions\.AssertionError: failed\n')
46
self.assertContainsRe(err,
47
r'Please send this report to')
48
self.assertContainsRe(err,
49
'(?m)^encoding: .*, fsenc: .*, lang: .*')
50
self.assertContainsRe(err,
53
def test_exception_exitcode(self):
54
# we must use a subprocess, because the normal in-memory mechanism
55
# allows errors to propagate up through the test suite
56
out, err = self.run_bzr_subprocess(['assert-fail'],
57
retcode=errors.EXIT_INTERNAL_ERROR)
58
self.assertEqual(4, errors.EXIT_INTERNAL_ERROR)
32
59
self.assertContainsRe(err,
33
60
r'bzr: ERROR: exceptions\.AssertionError: always fails\n')
34
self.assertContainsRe(err, r'please send this report to')
36
# TODO: assert-fail doesn't need to always be present; we could just
37
# register (and unregister) it from tests that want to touch it.
39
# TODO: Some kind of test for the feature of invoking pdb
61
self.assertContainsRe(err, r'Please send this report to')
42
64
class TestDeprecationWarning(TestCaseInTempDir):