~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_errors.py

  • Committer: Vincent Ladeuil
  • Date: 2009-09-16 10:37:29 UTC
  • mto: (4695.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4696.
  • Revision ID: v.ladeuil+lp@free.fr-20090916103729-m6h1pyvjprm6puvm
Respect items() protocol for registry objects.

* bzrlib/tests/test_registry.py:
(TestRegistryIter): Test some corner cases where object are
registered while the registry is iterated.

* bzrlib/registry.py:
(Registry): iteritems() and items() have different intents, don't
mix them under the covers or devs get tricked (see bug #277048
which seemed to have fixed the issue).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2008, 2009 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
21
19
import socket
22
20
import sys
23
21
 
28
26
    symbol_versioning,
29
27
    urlutils,
30
28
    )
31
 
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
 
29
from bzrlib.tests import TestCase, TestCaseWithTransport
32
30
 
33
31
 
34
32
class TestErrors(TestCaseWithTransport):
35
33
 
36
 
    def test_no_arg_named_message(self):
37
 
        """Ensure the __init__ and _fmt in errors do not have "message" arg.
38
 
 
39
 
        This test fails if __init__ or _fmt in errors has an argument
40
 
        named "message" as this can cause errors in some Python versions.
41
 
        Python 2.5 uses a slot for StandardError.message.
42
 
        See bug #603461
43
 
        """
44
 
        fmt_pattern = re.compile("%\(message\)[sir]")
45
 
        subclasses_present = getattr(errors.BzrError, '__subclasses__', None)
46
 
        if not subclasses_present:
47
 
            raise TestSkipped('__subclasses__ attribute required for classes. '
48
 
                'Requires Python 2.5 or later.')
49
 
        for c in errors.BzrError.__subclasses__():
50
 
            init = getattr(c, '__init__', None)
51
 
            fmt = getattr(c, '_fmt', None)
52
 
            if init:
53
 
                args = inspect.getargspec(init)[0]
54
 
                self.assertFalse('message' in args,
55
 
                    ('Argument name "message" not allowed for '
56
 
                    '"errors.%s.__init__"' % c.__name__))
57
 
            if fmt and fmt_pattern.search(fmt):
58
 
                self.assertFalse(True, ('"message" not allowed in '
59
 
                    '"errors.%s._fmt"' % c.__name__))
60
 
 
61
34
    def test_bad_filename_encoding(self):
62
35
        error = errors.BadFilenameEncoding('bad/filen\xe5me', 'UTF-8')
63
36
        self.assertEqualDiff(
569
542
            1/0
570
543
        except ZeroDivisionError:
571
544
            exc_info = sys.exc_info()
572
 
        err = errors.HookFailed('hook stage', 'hook name', exc_info, warn=False)
 
545
        err = errors.HookFailed('hook stage', 'hook name', exc_info)
573
546
        self.assertStartsWith(
574
547
            str(err), 'Hook \'hook name\' during hook stage failed:\n')
575
548
        self.assertEndsWith(
650
623
        self.assertEqual(
651
624
            'Repository dummy repo cannot suspend a write group.', str(err))
652
625
 
653
 
    def test_not_branch_no_args(self):
654
 
        err = errors.NotBranchError('path')
655
 
        self.assertEqual('Not a branch: "path".', str(err))
656
 
 
657
 
    def test_not_branch_bzrdir_with_repo(self):
658
 
        bzrdir = self.make_repository('repo').bzrdir
659
 
        err = errors.NotBranchError('path', bzrdir=bzrdir)
660
 
        self.assertEqual(
661
 
            'Not a branch: "path": location is a repository.', str(err))
662
 
 
663
 
    def test_not_branch_bzrdir_without_repo(self):
664
 
        bzrdir = self.make_bzrdir('bzrdir')
665
 
        err = errors.NotBranchError('path', bzrdir=bzrdir)
666
 
        self.assertEqual('Not a branch: "path".', str(err))
667
 
 
668
 
    def test_not_branch_laziness(self):
669
 
        real_bzrdir = self.make_bzrdir('path')
670
 
        class FakeBzrDir(object):
671
 
            def __init__(self):
672
 
                self.calls = []
673
 
            def open_repository(self):
674
 
                self.calls.append('open_repository')
675
 
                raise errors.NoRepositoryPresent(real_bzrdir)
676
 
        fake_bzrdir = FakeBzrDir()
677
 
        err = errors.NotBranchError('path', bzrdir=fake_bzrdir)
678
 
        self.assertEqual([], fake_bzrdir.calls)
679
 
        str(err)
680
 
        self.assertEqual(['open_repository'], fake_bzrdir.calls)
681
 
        # Stringifying twice doesn't try to open a repository twice.
682
 
        str(err)
683
 
        self.assertEqual(['open_repository'], fake_bzrdir.calls)
684
 
 
685
 
    def test_invalid_pattern(self):
686
 
        error = errors.InvalidPattern('Bad pattern msg.')
687
 
        self.assertEqualDiff("Invalid pattern(s) found. Bad pattern msg.",
688
 
            str(error))
689
 
 
690
 
    def test_recursive_bind(self):
691
 
        error = errors.RecursiveBind('foo_bar_branch')
692
 
        msg = ('Branch "foo_bar_branch" appears to be bound to itself. '
693
 
            'Please use `bzr unbind` to fix.')
694
 
        self.assertEqualDiff(msg, str(error))
695
 
 
696
626
 
697
627
class PassThroughError(errors.BzrError):
698
628
 
708
638
 
709
639
 
710
640
class ErrorWithNoFormat(errors.BzrError):
711
 
    __doc__ = """This class has a docstring but no format string."""
 
641
    """This class has a docstring but no format string."""
712
642
 
713
643
 
714
644
class TestErrorFormatting(TestCase):
741
671
            str(e), 'Unprintable exception ErrorWithBadFormat')
742
672
 
743
673
    def test_cannot_bind_address(self):
744
 
        # see <https://bugs.launchpad.net/bzr/+bug/286871>
 
674
        # see <https://bugs.edge.launchpad.net/bzr/+bug/286871>
745
675
        e = errors.CannotBindAddress('example.com', 22,
746
676
            socket.error(13, 'Permission denied'))
747
677
        self.assertContainsRe(str(e),
748
678
            r'Cannot bind address "example\.com:22":.*Permission denied')
749
 
 
750
 
    def test_file_timestamp_unavailable(self):            
751
 
        e = errors.FileTimestampUnavailable("/path/foo")
752
 
        self.assertEquals("The filestamp for /path/foo is not available.",
753
 
            str(e))
754
 
            
755
 
    def test_transform_rename_failed(self):
756
 
        e = errors.TransformRenameFailed(u"from", u"to", "readonly file", 2)
757
 
        self.assertEquals(
758
 
            u"Failed to rename from to to: readonly file",
759
 
            str(e))