/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_errors.py

  • Committer: John Arbash Meinel
  • Date: 2011-04-20 09:46:28 UTC
  • mfrom: (5609.33.4 2.3)
  • mto: (5609.33.5 2.3)
  • mto: This revision was merged to the branch mainline in revision 5811.
  • Revision ID: john@arbash-meinel.com-20110420094628-l0bafq1lwb6ib1v2
Merge lp:bzr/2.3 @ 5640 so we can update the release notes (aka NEWS)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Tests for the formatting and construction of errors."""
18
18
 
 
19
import inspect
 
20
import re
19
21
import socket
20
22
import sys
21
23
 
23
25
    bzrdir,
24
26
    errors,
25
27
    osutils,
26
 
    symbol_versioning,
27
28
    urlutils,
28
29
    )
29
 
from bzrlib.tests import TestCase, TestCaseWithTransport
 
30
from bzrlib.tests import (
 
31
    TestCase,
 
32
    TestCaseWithTransport,
 
33
    TestSkipped,
 
34
    )
30
35
 
31
36
 
32
37
class TestErrors(TestCaseWithTransport):
33
38
 
 
39
    def test_no_arg_named_message(self):
 
40
        """Ensure the __init__ and _fmt in errors do not have "message" arg.
 
41
 
 
42
        This test fails if __init__ or _fmt in errors has an argument
 
43
        named "message" as this can cause errors in some Python versions.
 
44
        Python 2.5 uses a slot for StandardError.message.
 
45
        See bug #603461
 
46
        """
 
47
        fmt_pattern = re.compile("%\(message\)[sir]")
 
48
        subclasses_present = getattr(errors.BzrError, '__subclasses__', None)
 
49
        if not subclasses_present:
 
50
            raise TestSkipped('__subclasses__ attribute required for classes. '
 
51
                'Requires Python 2.5 or later.')
 
52
        for c in errors.BzrError.__subclasses__():
 
53
            init = getattr(c, '__init__', None)
 
54
            fmt = getattr(c, '_fmt', None)
 
55
            if init:
 
56
                args = inspect.getargspec(init)[0]
 
57
                self.assertFalse('message' in args,
 
58
                    ('Argument name "message" not allowed for '
 
59
                    '"errors.%s.__init__"' % c.__name__))
 
60
            if fmt and fmt_pattern.search(fmt):
 
61
                self.assertFalse(True, ('"message" not allowed in '
 
62
                    '"errors.%s._fmt"' % c.__name__))
 
63
 
34
64
    def test_bad_filename_encoding(self):
35
65
        error = errors.BadFilenameEncoding('bad/filen\xe5me', 'UTF-8')
36
66
        self.assertEqualDiff(
645
675
        err = errors.NotBranchError('path', bzrdir=bzrdir)
646
676
        self.assertEqual('Not a branch: "path".', str(err))
647
677
 
 
678
    def test_not_branch_bzrdir_with_recursive_not_branch_error(self):
 
679
        class FakeBzrDir(object):
 
680
            def open_repository(self):
 
681
                # str() on the NotBranchError will trigger a call to this,
 
682
                # which in turn will another, identical NotBranchError.
 
683
                raise errors.NotBranchError('path', bzrdir=FakeBzrDir())
 
684
        err = errors.NotBranchError('path', bzrdir=FakeBzrDir())
 
685
        self.assertEqual('Not a branch: "path".', str(err))
 
686
 
648
687
    def test_not_branch_laziness(self):
649
688
        real_bzrdir = self.make_bzrdir('path')
650
689
        class FakeBzrDir(object):
662
701
        str(err)
663
702
        self.assertEqual(['open_repository'], fake_bzrdir.calls)
664
703
 
 
704
    def test_invalid_pattern(self):
 
705
        error = errors.InvalidPattern('Bad pattern msg.')
 
706
        self.assertEqualDiff("Invalid pattern(s) found. Bad pattern msg.",
 
707
            str(error))
 
708
 
 
709
    def test_recursive_bind(self):
 
710
        error = errors.RecursiveBind('foo_bar_branch')
 
711
        msg = ('Branch "foo_bar_branch" appears to be bound to itself. '
 
712
            'Please use `bzr unbind` to fix.')
 
713
        self.assertEqualDiff(msg, str(error))
 
714
 
665
715
 
666
716
class PassThroughError(errors.BzrError):
667
717
 
677
727
 
678
728
 
679
729
class ErrorWithNoFormat(errors.BzrError):
680
 
    """This class has a docstring but no format string."""
 
730
    __doc__ = """This class has a docstring but no format string."""
681
731
 
682
732
 
683
733
class TestErrorFormatting(TestCase):
720
770
        e = errors.FileTimestampUnavailable("/path/foo")
721
771
        self.assertEquals("The filestamp for /path/foo is not available.",
722
772
            str(e))
 
773
            
 
774
    def test_transform_rename_failed(self):
 
775
        e = errors.TransformRenameFailed(u"from", u"to", "readonly file", 2)
 
776
        self.assertEquals(
 
777
            u"Failed to rename from to to: readonly file",
 
778
            str(e))