~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
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
50
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
51
class TestDeprecationWarning(tests.TestCaseWithTransport):
52
    """The deprecation warning is controlled via a global variable:
53
    repository._deprecation_warning_done. As such, it can be emitted only once
54
    during a bzr invocation, no matter how many repositories are involved.
55
56
    It would be better if it was a repo attribute instead but that's far more
57
    work than I want to do right now -- vila 20091215.
58
    """
59
60
    def setUp(self):
61
        super(TestDeprecationWarning, self).setUp()
62
        self.disable_deprecation_warning()
63
64
    def enable_deprecation_warning(self, repo=None):
65
        """repo is not used yet since _deprecation_warning_done is a global"""
66
        repository._deprecation_warning_done = False
67
68
    def disable_deprecation_warning(self, repo=None):
69
        """repo is not used yet since _deprecation_warning_done is a global"""
70
        repository._deprecation_warning_done = True
71
72
    def make_obsolete_repo(self, path):
73
        # We don't want the deprecation raising during the repo creation
74
        tree = self.make_branch_and_tree(path, format=bzrdir.BzrDirFormat5())
75
        return tree
76
77
    def check_warning(self, present):
78
        if present:
79
            check = self.assertContainsRe
80
        else:
81
            check = self.assertNotContainsRe
82
        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
83
84
    def test_repository_deprecation_warning(self):
85
        """Old formats give a warning"""
4840.2.7 by Vincent Ladeuil
Move the _warn_if_deprecated call from repo.__init__ to
86
        self.make_obsolete_repo('foo')
87
        self.enable_deprecation_warning()
88
        out, err = self.run_bzr('status', working_dir='foo')
89
        self.check_warning(True)
90
91
    def test_repository_deprecation_warning_suppressed_global(self):
92
        """Old formats give a warning"""
93
        conf = config.GlobalConfig()
94
        conf.set_user_option('suppress_warnings', 'format_deprecation')
95
        self.make_obsolete_repo('foo')
96
        self.enable_deprecation_warning()
97
        out, err = self.run_bzr('status', working_dir='foo')
98
        self.check_warning(False)
99
100
    def test_repository_deprecation_warning_suppressed_locations(self):
101
        """Old formats give a warning"""
102
        self.make_obsolete_repo('foo')
103
        conf = config.LocationConfig(osutils.pathjoin(self.test_dir, 'foo'))
104
        conf.set_user_option('suppress_warnings', 'format_deprecation')
105
        self.enable_deprecation_warning()
106
        out, err = self.run_bzr('status', working_dir='foo')
107
        self.check_warning(False)
108
109
    def test_repository_deprecation_warning_suppressed_branch(self):
110
        """Old formats give a warning"""
111
        tree = self.make_obsolete_repo('foo')
112
        conf = tree.branch.get_config()
113
        conf.set_user_option('suppress_warnings', 'format_deprecation')
114
        self.enable_deprecation_warning()
115
        out, err = self.run_bzr('status', working_dir='foo')
116
        self.check_warning(False)