summaryrefslogtreecommitdiff
path: root/bzrlib/tests/test_crash.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/tests/test_crash.py')
-rw-r--r--bzrlib/tests/test_crash.py112
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)