~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2006, 2007, 2009, 2010 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
2830.2.2 by Martin Pool
Update test for report_exception to be cleaner and work with new run_bzr behavior
19
from cStringIO import StringIO
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
20
import os
21
import sys
22
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
23
from bzrlib import (
24
    bzrdir,
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
25
    config,
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,
2830.2.2 by Martin Pool
Update test for report_exception to be cleaner and work with new run_bzr behavior
30
    trace,
2713.2.2 by Martin Pool
Add mention of exitcode 4 for internal errors
31
    )
1551.9.3 by Aaron Bentley
Revert buggy apport changes
32
33
from bzrlib.tests import TestCaseInTempDir, TestCase
1740.5.6 by Martin Pool
Clean up many exception classes.
34
from bzrlib.errors import NotBranchError
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
35
2830.2.2 by Martin Pool
Update test for report_exception to be cleaner and work with new run_bzr behavior
36
1740.5.1 by Martin Pool
When an unhandled exception occurs, write the traceback to stderr.
37
class TestExceptionReporting(TestCase):
38
2830.2.11 by Martin Pool
Integrate testing of return codes/error reporting
39
    def test_exception_exitcode(self):
2830.2.7 by Martin Pool
Return exitcode 4 on internal error
40
        # we must use a subprocess, because the normal in-memory mechanism
41
        # allows errors to propagate up through the test suite
2830.2.10 by Martin Pool
merge trunk
42
        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
43
            universal_newlines=True,
2830.2.7 by Martin Pool
Return exitcode 4 on internal error
44
            retcode=errors.EXIT_INTERNAL_ERROR)
2830.2.11 by Martin Pool
Integrate testing of return codes/error reporting
45
        self.assertEqual(4, errors.EXIT_INTERNAL_ERROR)
1551.9.3 by Aaron Bentley
Revert buggy apport changes
46
        self.assertContainsRe(err,
4584.3.32 by Martin Pool
Correct blackbox tests for new apport message
47
                r'exceptions\.AssertionError: always fails\n')
48
        self.assertContainsRe(err, r'Bazaar has encountered an internal error')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
49
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
50
5514.3.3 by Rory Yorke
Moved test to bb.test_exceptions, and test differently for Python 2.4.
51
class TestOptParseBugHandling(TestCase):
52
    "Test that we handle http://bugs.python.org/issue2931"
53
54
    def test_nonascii_optparse(self):
55
        """Reasonable error raised when non-ascii in option name"""
56
        if sys.version_info < (2,5):
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
57
            error_re = 'no such option'
5514.3.3 by Rory Yorke
Moved test to bb.test_exceptions, and test differently for Python 2.4.
58
        else:
5527.1.2 by Vincent Ladeuil
Report error if a non-ASCII command option is given.
59
            error_re = 'Only ASCII permitted in option names'
60
        out = self.run_bzr_error([error_re], ['st',u'-\xe4'])
61
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
62
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
63
class TestDeprecationWarning(tests.TestCaseWithTransport):
64
    """The deprecation warning is controlled via a global variable:
65
    repository._deprecation_warning_done. As such, it can be emitted only once
66
    during a bzr invocation, no matter how many repositories are involved.
67
68
    It would be better if it was a repo attribute instead but that's far more
69
    work than I want to do right now -- vila 20091215.
70
    """
71
72
    def setUp(self):
73
        super(TestDeprecationWarning, self).setUp()
74
        self.disable_deprecation_warning()
75
76
    def enable_deprecation_warning(self, repo=None):
77
        """repo is not used yet since _deprecation_warning_done is a global"""
78
        repository._deprecation_warning_done = False
79
80
    def disable_deprecation_warning(self, repo=None):
81
        """repo is not used yet since _deprecation_warning_done is a global"""
82
        repository._deprecation_warning_done = True
83
84
    def make_obsolete_repo(self, path):
85
        # We don't want the deprecation raising during the repo creation
86
        tree = self.make_branch_and_tree(path, format=bzrdir.BzrDirFormat5())
87
        return tree
88
89
    def check_warning(self, present):
90
        if present:
91
            check = self.assertContainsRe
92
        else:
93
            check = self.assertNotContainsRe
94
        check(self._get_log(keep_log_file=True), 'WARNING.*bzr upgrade')
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
95
96
    def test_repository_deprecation_warning(self):
97
        """Old formats give a warning"""
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
98
        self.make_obsolete_repo('foo')
99
        self.enable_deprecation_warning()
100
        out, err = self.run_bzr('status', working_dir='foo')
101
        self.check_warning(True)
102
103
    def test_repository_deprecation_warning_suppressed_global(self):
104
        """Old formats give a warning"""
105
        conf = config.GlobalConfig()
106
        conf.set_user_option('suppress_warnings', 'format_deprecation')
107
        self.make_obsolete_repo('foo')
108
        self.enable_deprecation_warning()
109
        out, err = self.run_bzr('status', working_dir='foo')
110
        self.check_warning(False)
111
112
    def test_repository_deprecation_warning_suppressed_locations(self):
113
        """Old formats give a warning"""
114
        self.make_obsolete_repo('foo')
115
        conf = config.LocationConfig(osutils.pathjoin(self.test_dir, 'foo'))
116
        conf.set_user_option('suppress_warnings', 'format_deprecation')
117
        self.enable_deprecation_warning()
118
        out, err = self.run_bzr('status', working_dir='foo')
119
        self.check_warning(False)
120
121
    def test_repository_deprecation_warning_suppressed_branch(self):
122
        """Old formats give a warning"""
123
        tree = self.make_obsolete_repo('foo')
124
        conf = tree.branch.get_config()
125
        conf.set_user_option('suppress_warnings', 'format_deprecation')
126
        self.enable_deprecation_warning()
127
        out, err = self.run_bzr('status', working_dir='foo')
128
        self.check_warning(False)