~bzr-pqm/bzr/bzr.dev

5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2006, 2007, 2009, 2010, 2011 Canonical Ltd
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
16
17
"""Tests for display of exceptions."""
18
5785.1.1 by Martin
Add blackbox test for reporting of argv encoding failures
19
import os
5939.4.2 by Jelmer Vernooij
Use re.MULTILINE rather than removing the anchor.
20
import re
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
21
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
22
from bzrlib import (
5582.10.74 by Jelmer Vernooij
Fix import.
23
    bzrdir,
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
24
    config,
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
25
    controldir,
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
26
    errors,
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
27
    osutils,
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
28
    repository,
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
29
    tests,
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
30
    )
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
31
from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a
1551.9.3 by Aaron Bentley
Revert buggy apport changes
32
5984.1.1 by Vincent Ladeuil
Some cleanup and a first try at fixing bug #798698.
33
34
class TestExceptionReporting(tests.TestCaseInTempDir):
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
35
2830.2.11 by Martin Pool
Integrate testing of return codes/error reporting
36
    def test_exception_exitcode(self):
2830.2.7 by Martin Pool
Return exitcode 4 on internal error
37
        # we must use a subprocess, because the normal in-memory mechanism
38
        # allows errors to propagate up through the test suite
2830.2.10 by Martin Pool
merge trunk
39
        out, err = self.run_bzr_subprocess(['assert-fail'],
2947.3.1 by Alexander Belchenko
test_exceptions.py: run_bzr_subprocess should use universal_newlines=True
40
            universal_newlines=True,
2830.2.7 by Martin Pool
Return exitcode 4 on internal error
41
            retcode=errors.EXIT_INTERNAL_ERROR)
2830.2.11 by Martin Pool
Integrate testing of return codes/error reporting
42
        self.assertEqual(4, errors.EXIT_INTERNAL_ERROR)
1551.9.3 by Aaron Bentley
Revert buggy apport changes
43
        self.assertContainsRe(err,
4584.3.32 by Martin Pool
Correct blackbox tests for new apport message
44
                r'exceptions\.AssertionError: always fails\n')
45
        self.assertContainsRe(err, r'Bazaar has encountered an internal error')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
46
5785.1.1 by Martin
Add blackbox test for reporting of argv encoding failures
47
    def test_undecodable_argv(self):
48
        """A user error must be reported if argv is not in the locale encoding
49
50
        A subprocess with an environment ascii-only setting is used so the test
51
        can run without worrying about the locale the test suite is using.
52
        """
53
        if os.name != "posix":
5785.1.3 by Martin
Tweak argv encoding error message
54
            raise tests.TestNotApplicable("Needs system beholden to C locales")
5785.1.1 by Martin
Add blackbox test for reporting of argv encoding failures
55
        out, err = self.run_bzr_subprocess(["\xa0"],
5815.2.1 by Jelmer Vernooij
Override LC_ALL.
56
            env_changes={"LANG": "C", "LC_ALL": "C"},
5785.1.1 by Martin
Add blackbox test for reporting of argv encoding failures
57
            universal_newlines=True,
58
            retcode=errors.EXIT_ERROR)
5939.4.2 by Jelmer Vernooij
Use re.MULTILINE rather than removing the anchor.
59
        self.assertContainsRe(err, r"^bzr: ERROR: .*'\\xa0'.* unsupported",
60
            flags=re.MULTILINE)
5785.1.1 by Martin
Add blackbox test for reporting of argv encoding failures
61
        self.assertEquals(out, "")
62
6352.3.1 by Martin Packman
Add test for working with non-ascii filenames under the C locale
63
    def test_utf8_default_fs_enc(self):
64
        """In the C locale bzr treats a posix filesystem as UTF-8 encoded"""
65
        if os.name != "posix":
66
            raise tests.TestNotApplicable("Needs system beholden to C locales")
67
        out, err = self.run_bzr_subprocess(["init", "file:%C2%A7"],
68
            env_changes={"LANG": "C", "LC_ALL": "C"})
69
        self.assertContainsRe(out, "^Created a standalone tree .*$")
70
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
71
5984.1.2 by Vincent Ladeuil
Really fix it.
72
class TestOptParseBugHandling(tests.TestCase):
5514.3.3 by Rory Yorke
Moved test to bb.test_exceptions, and test differently for Python 2.4.
73
    "Test that we handle http://bugs.python.org/issue2931"
74
75
    def test_nonascii_optparse(self):
76
        """Reasonable error raised when non-ascii in option name"""
5848.2.1 by John Arbash Meinel
Break compatibility with python <2.6.
77
        error_re = 'Only ASCII permitted in option names'
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
78
        out = self.run_bzr_error([error_re], ['st',u'-\xe4'])
79
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
80
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
81
class TestObsoleteRepoFormat(RepositoryFormat2a):
82
83
    @classmethod
84
    def get_format_string(cls):
85
        return "Test Obsolete Repository Format"
86
87
    def is_deprecated(self):
88
        return True
89
90
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
91
class TestDeprecationWarning(tests.TestCaseWithTransport):
92
    """The deprecation warning is controlled via a global variable:
93
    repository._deprecation_warning_done. As such, it can be emitted only once
94
    during a bzr invocation, no matter how many repositories are involved.
95
96
    It would be better if it was a repo attribute instead but that's far more
97
    work than I want to do right now -- vila 20091215.
98
    """
99
100
    def setUp(self):
101
        super(TestDeprecationWarning, self).setUp()
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
102
        self.addCleanup(repository.format_registry.remove,
103
            TestObsoleteRepoFormat)
5675.2.7 by Jelmer Vernooij
Merge bzr.dev.
104
        repository.format_registry.register(TestObsoleteRepoFormat)
5675.2.6 by Jelmer Vernooij
Fix some tests.
105
        self.addCleanup(controldir.format_registry.remove, "testobsolete")
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
106
        bzrdir.register_metadir(controldir.format_registry, "testobsolete",
107
            "bzrlib.tests.blackbox.test_exceptions.TestObsoleteRepoFormat",
108
            branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.2 by Jelmer Vernooij
Fix import.
109
            tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
110
            deprecated=True,
111
            help='Same as 2a, but with an obsolete repo format.')
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
112
        self.disable_deprecation_warning()
113
114
    def enable_deprecation_warning(self, repo=None):
115
        """repo is not used yet since _deprecation_warning_done is a global"""
116
        repository._deprecation_warning_done = False
117
118
    def disable_deprecation_warning(self, repo=None):
119
        """repo is not used yet since _deprecation_warning_done is a global"""
120
        repository._deprecation_warning_done = True
121
122
    def make_obsolete_repo(self, path):
123
        # We don't want the deprecation raising during the repo creation
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
124
        format = controldir.format_registry.make_bzrdir("testobsolete")
125
        tree = self.make_branch_and_tree(path, format=format)
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
126
        return tree
127
128
    def check_warning(self, present):
129
        if present:
130
            check = self.assertContainsRe
131
        else:
132
            check = self.assertNotContainsRe
5340.15.1 by John Arbash Meinel
supersede exc-info branch
133
        check(self.get_log(), 'WARNING.*bzr upgrade')
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
134
135
    def test_repository_deprecation_warning(self):
136
        """Old formats give a warning"""
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
137
        self.make_obsolete_repo('foo')
138
        self.enable_deprecation_warning()
139
        out, err = self.run_bzr('status', working_dir='foo')
140
        self.check_warning(True)
141
142
    def test_repository_deprecation_warning_suppressed_global(self):
143
        """Old formats give a warning"""
6449.1.1 by Jelmer Vernooij
Convert 'suppress_warnings' option to config stacks.
144
        conf = config.GlobalStack()
145
        conf.set('suppress_warnings', 'format_deprecation')
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
146
        self.make_obsolete_repo('foo')
147
        self.enable_deprecation_warning()
148
        out, err = self.run_bzr('status', working_dir='foo')
149
        self.check_warning(False)
150
151
    def test_repository_deprecation_warning_suppressed_locations(self):
152
        """Old formats give a warning"""
153
        self.make_obsolete_repo('foo')
6449.1.1 by Jelmer Vernooij
Convert 'suppress_warnings' option to config stacks.
154
        conf = config.LocationStack(osutils.pathjoin(self.test_dir, 'foo'))
155
        conf.set('suppress_warnings', 'format_deprecation')
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
156
        self.enable_deprecation_warning()
157
        out, err = self.run_bzr('status', working_dir='foo')
158
        self.check_warning(False)
159
160
    def test_repository_deprecation_warning_suppressed_branch(self):
161
        """Old formats give a warning"""
162
        tree = self.make_obsolete_repo('foo')
6449.1.1 by Jelmer Vernooij
Convert 'suppress_warnings' option to config stacks.
163
        conf = tree.branch.get_config_stack()
164
        conf.set('suppress_warnings', 'format_deprecation')
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
165
        self.enable_deprecation_warning()
166
        out, err = self.run_bzr('status', working_dir='foo')
167
        self.check_warning(False)