diff options
Diffstat (limited to 'bzrlib/tests/blackbox/test_exceptions.py')
-rw-r--r-- | bzrlib/tests/blackbox/test_exceptions.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/bzrlib/tests/blackbox/test_exceptions.py b/bzrlib/tests/blackbox/test_exceptions.py new file mode 100644 index 0000000..9124662 --- /dev/null +++ b/bzrlib/tests/blackbox/test_exceptions.py @@ -0,0 +1,167 @@ +# Copyright (C) 2006, 2007, 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 + +"""Tests for display of exceptions.""" + +import os +import re + +from bzrlib import ( + bzrdir, + config, + controldir, + errors, + osutils, + repository, + tests, + ) +from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a + + +class TestExceptionReporting(tests.TestCaseInTempDir): + + def test_exception_exitcode(self): + # we must use a subprocess, because the normal in-memory mechanism + # allows errors to propagate up through the test suite + out, err = self.run_bzr_subprocess(['assert-fail'], + universal_newlines=True, + retcode=errors.EXIT_INTERNAL_ERROR) + self.assertEqual(4, errors.EXIT_INTERNAL_ERROR) + self.assertContainsRe(err, + r'exceptions\.AssertionError: always fails\n') + self.assertContainsRe(err, r'Bazaar has encountered an internal error') + + def test_undecodable_argv(self): + """A user error must be reported if argv is not in the locale encoding + + A subprocess with an environment ascii-only setting is used so the test + can run without worrying about the locale the test suite is using. + """ + if os.name != "posix": + raise tests.TestNotApplicable("Needs system beholden to C locales") + out, err = self.run_bzr_subprocess(["\xa0"], + env_changes={"LANG": "C", "LC_ALL": "C"}, + universal_newlines=True, + retcode=errors.EXIT_ERROR) + self.assertContainsRe(err, r"^bzr: ERROR: .*'\\xa0'.* unsupported", + flags=re.MULTILINE) + self.assertEquals(out, "") + + def test_utf8_default_fs_enc(self): + """In the C locale bzr treats a posix filesystem as UTF-8 encoded""" + if os.name != "posix": + raise tests.TestNotApplicable("Needs system beholden to C locales") + out, err = self.run_bzr_subprocess(["init", "file:%C2%A7"], + env_changes={"LANG": "C", "LC_ALL": "C"}) + self.assertContainsRe(out, "^Created a standalone tree .*$") + + +class TestOptParseBugHandling(tests.TestCase): + "Test that we handle http://bugs.python.org/issue2931" + + def test_nonascii_optparse(self): + """Reasonable error raised when non-ascii in option name""" + error_re = 'Only ASCII permitted in option names' + out = self.run_bzr_error([error_re], ['st',u'-\xe4']) + + +class TestObsoleteRepoFormat(RepositoryFormat2a): + + @classmethod + def get_format_string(cls): + return "Test Obsolete Repository Format" + + def is_deprecated(self): + return True + + +class TestDeprecationWarning(tests.TestCaseWithTransport): + """The deprecation warning is controlled via a global variable: + repository._deprecation_warning_done. As such, it can be emitted only once + during a bzr invocation, no matter how many repositories are involved. + + It would be better if it was a repo attribute instead but that's far more + work than I want to do right now -- vila 20091215. + """ + + def setUp(self): + super(TestDeprecationWarning, self).setUp() + self.addCleanup(repository.format_registry.remove, + TestObsoleteRepoFormat) + repository.format_registry.register(TestObsoleteRepoFormat) + self.addCleanup(controldir.format_registry.remove, "testobsolete") + bzrdir.register_metadir(controldir.format_registry, "testobsolete", + "bzrlib.tests.blackbox.test_exceptions.TestObsoleteRepoFormat", + branch_format='bzrlib.branch.BzrBranchFormat7', + tree_format='bzrlib.workingtree_4.WorkingTreeFormat6', + deprecated=True, + help='Same as 2a, but with an obsolete repo format.') + self.disable_deprecation_warning() + + def enable_deprecation_warning(self, repo=None): + """repo is not used yet since _deprecation_warning_done is a global""" + repository._deprecation_warning_done = False + + def disable_deprecation_warning(self, repo=None): + """repo is not used yet since _deprecation_warning_done is a global""" + repository._deprecation_warning_done = True + + def make_obsolete_repo(self, path): + # We don't want the deprecation raising during the repo creation + format = controldir.format_registry.make_bzrdir("testobsolete") + tree = self.make_branch_and_tree(path, format=format) + return tree + + def check_warning(self, present): + if present: + check = self.assertContainsRe + else: + check = self.assertNotContainsRe + check(self.get_log(), 'WARNING.*bzr upgrade') + + def test_repository_deprecation_warning(self): + """Old formats give a warning""" + self.make_obsolete_repo('foo') + self.enable_deprecation_warning() + out, err = self.run_bzr('status', working_dir='foo') + self.check_warning(True) + + def test_repository_deprecation_warning_suppressed_global(self): + """Old formats give a warning""" + conf = config.GlobalStack() + conf.set('suppress_warnings', 'format_deprecation') + self.make_obsolete_repo('foo') + self.enable_deprecation_warning() + out, err = self.run_bzr('status', working_dir='foo') + self.check_warning(False) + + def test_repository_deprecation_warning_suppressed_locations(self): + """Old formats give a warning""" + self.make_obsolete_repo('foo') + conf = config.LocationStack(osutils.pathjoin(self.test_dir, 'foo')) + conf.set('suppress_warnings', 'format_deprecation') + self.enable_deprecation_warning() + out, err = self.run_bzr('status', working_dir='foo') + self.check_warning(False) + + def test_repository_deprecation_warning_suppressed_branch(self): + """Old formats give a warning""" + tree = self.make_obsolete_repo('foo') + conf = tree.branch.get_config_stack() + conf.set('suppress_warnings', 'format_deprecation') + self.enable_deprecation_warning() + out, err = self.run_bzr('status', working_dir='foo') + self.check_warning(False) |