diff options
Diffstat (limited to 'bzrlib/tests/test_crash.py')
-rw-r--r-- | bzrlib/tests/test_crash.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/bzrlib/tests/test_crash.py b/bzrlib/tests/test_crash.py new file mode 100644 index 0000000..f7647b7 --- /dev/null +++ b/bzrlib/tests/test_crash.py @@ -0,0 +1,112 @@ +# Copyright (C) 2009, 2010, 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +import doctest +import os +from StringIO import StringIO +import sys + +from bzrlib import ( + config, + crash, + osutils, + plugin, + tests, + ) + +from bzrlib.tests import features + + +class TestApportReporting(tests.TestCaseInTempDir): + + _test_needs_features = [features.apport] + + def test_apport_report(self): + crash_dir = osutils.joinpath((self.test_base_dir, 'crash')) + os.mkdir(crash_dir) + self.overrideEnv('APPORT_CRASH_DIR', crash_dir) + self.assertEquals(crash_dir, config.crash_dir()) + + self.overrideAttr( + plugin, + 'plugin_warnings', + {'example': ['Failed to load plugin foo']}) + + stderr = StringIO() + + try: + raise AssertionError("my error") + except AssertionError, e: + pass + + crash_filename = crash.report_bug_to_apport(sys.exc_info(), + stderr) + + # message explaining the crash + self.assertContainsRe(stderr.getvalue(), + " apport-bug %s" % crash_filename) + + crash_file = open(crash_filename) + try: + report = crash_file.read() + finally: + crash_file.close() + + self.assertContainsRe(report, + '(?m)^BzrVersion:') # should be in the traceback + self.assertContainsRe(report, 'my error') + self.assertContainsRe(report, 'AssertionError') + # see https://bugs.launchpad.net/bzr/+bug/528114 + self.assertContainsRe(report, 'ExecutablePath') + self.assertContainsRe(report, 'test_apport_report') + # should also be in there + self.assertContainsRe(report, '(?m)^CommandLine:') + self.assertContainsRe( + report, + 'Failed to load plugin foo') + + +class TestNonApportReporting(tests.TestCase): + """Reporting of crash-type bugs without apport. + + This should work in all environments. + """ + + def setup_fake_plugins(self): + def fake_plugins(): + fake = plugin.PlugIn('fake_plugin', plugin) + fake.version_info = lambda: (1, 2, 3) + return {"fake_plugin": fake} + self.overrideAttr(plugin, 'plugins', fake_plugins) + + def test_report_bug_legacy(self): + self.setup_fake_plugins() + err_file = StringIO() + try: + raise AssertionError("my error") + except AssertionError, e: + pass + crash.report_bug_legacy(sys.exc_info(), err_file) + report = err_file.getvalue() + for needle in [ + "bzr: ERROR: exceptions.AssertionError: my error", + r"Traceback \(most recent call last\):", + r"plugins: fake_plugin\[1\.2\.3\]", + ]: + self.assertContainsRe( + report, + needle) |