~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
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
63
5984.1.2 by Vincent Ladeuil
Really fix it.
64
class TestOptParseBugHandling(tests.TestCase):
5514.3.3 by Rory Yorke
Moved test to bb.test_exceptions, and test differently for Python 2.4.
65
    "Test that we handle http://bugs.python.org/issue2931"
66
67
    def test_nonascii_optparse(self):
68
        """Reasonable error raised when non-ascii in option name"""
5848.2.1 by John Arbash Meinel
Break compatibility with python <2.6.
69
        error_re = 'Only ASCII permitted in option names'
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
70
        out = self.run_bzr_error([error_re], ['st',u'-\xe4'])
71
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
72
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
73
class TestObsoleteRepoFormat(RepositoryFormat2a):
74
75
    @classmethod
76
    def get_format_string(cls):
77
        return "Test Obsolete Repository Format"
78
79
    def is_deprecated(self):
80
        return True
81
82
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
83
class TestDeprecationWarning(tests.TestCaseWithTransport):
84
    """The deprecation warning is controlled via a global variable:
85
    repository._deprecation_warning_done. As such, it can be emitted only once
86
    during a bzr invocation, no matter how many repositories are involved.
87
88
    It would be better if it was a repo attribute instead but that's far more
89
    work than I want to do right now -- vila 20091215.
90
    """
91
92
    def setUp(self):
93
        super(TestDeprecationWarning, self).setUp()
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
94
        self.addCleanup(repository.format_registry.remove,
95
            TestObsoleteRepoFormat)
5675.2.7 by Jelmer Vernooij
Merge bzr.dev.
96
        repository.format_registry.register(TestObsoleteRepoFormat)
5675.2.6 by Jelmer Vernooij
Fix some tests.
97
        self.addCleanup(controldir.format_registry.remove, "testobsolete")
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
98
        bzrdir.register_metadir(controldir.format_registry, "testobsolete",
99
            "bzrlib.tests.blackbox.test_exceptions.TestObsoleteRepoFormat",
100
            branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.2 by Jelmer Vernooij
Fix import.
101
            tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
102
            deprecated=True,
103
            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
104
        self.disable_deprecation_warning()
105
106
    def enable_deprecation_warning(self, repo=None):
107
        """repo is not used yet since _deprecation_warning_done is a global"""
108
        repository._deprecation_warning_done = False
109
110
    def disable_deprecation_warning(self, repo=None):
111
        """repo is not used yet since _deprecation_warning_done is a global"""
112
        repository._deprecation_warning_done = True
113
114
    def make_obsolete_repo(self, path):
115
        # 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
116
        format = controldir.format_registry.make_bzrdir("testobsolete")
117
        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
118
        return tree
119
120
    def check_warning(self, present):
121
        if present:
122
            check = self.assertContainsRe
123
        else:
124
            check = self.assertNotContainsRe
5901.1.1 by John Arbash Meinel
Re-apply the bits of TestCase that I wanted, on the new bzr.dev tip.
125
        check(self.get_log(), 'WARNING.*bzr upgrade')
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
126
127
    def test_repository_deprecation_warning(self):
128
        """Old formats give a warning"""
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
129
        self.make_obsolete_repo('foo')
130
        self.enable_deprecation_warning()
131
        out, err = self.run_bzr('status', working_dir='foo')
132
        self.check_warning(True)
133
134
    def test_repository_deprecation_warning_suppressed_global(self):
135
        """Old formats give a warning"""
136
        conf = config.GlobalConfig()
137
        conf.set_user_option('suppress_warnings', 'format_deprecation')
138
        self.make_obsolete_repo('foo')
139
        self.enable_deprecation_warning()
140
        out, err = self.run_bzr('status', working_dir='foo')
141
        self.check_warning(False)
142
143
    def test_repository_deprecation_warning_suppressed_locations(self):
144
        """Old formats give a warning"""
145
        self.make_obsolete_repo('foo')
146
        conf = config.LocationConfig(osutils.pathjoin(self.test_dir, 'foo'))
147
        conf.set_user_option('suppress_warnings', 'format_deprecation')
148
        self.enable_deprecation_warning()
149
        out, err = self.run_bzr('status', working_dir='foo')
150
        self.check_warning(False)
151
152
    def test_repository_deprecation_warning_suppressed_branch(self):
153
        """Old formats give a warning"""
154
        tree = self.make_obsolete_repo('foo')
155
        conf = tree.branch.get_config()
156
        conf.set_user_option('suppress_warnings', 'format_deprecation')
157
        self.enable_deprecation_warning()
158
        out, err = self.run_bzr('status', working_dir='foo')
159
        self.check_warning(False)