~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_errors.py

  • Committer: Patch Queue Manager
  • Date: 2016-04-21 04:10:52 UTC
  • mfrom: (6616.1.1 fix-en-user-guide)
  • Revision ID: pqm@pqm.ubuntu.com-20160421041052-clcye7ns1qcl2n7w
(richard-wilbur) Ensure build of English use guide always uses English text
 even when user's locale specifies a different language. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2012, 2016 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
22
22
import sys
23
23
 
24
24
from bzrlib import (
25
 
    bzrdir,
 
25
    controldir,
26
26
    errors,
27
27
    osutils,
28
 
    symbol_versioning,
29
28
    urlutils,
30
29
    )
31
 
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
 
30
from bzrlib.tests import (
 
31
    TestCase,
 
32
    TestCaseWithTransport,
 
33
    TestSkipped,
 
34
    )
32
35
 
33
36
 
34
37
class TestErrors(TestCaseWithTransport):
130
133
        error = errors.InvalidHttpRange('path',
131
134
                                        'Content-Range: potatoes 0-00/o0oo0',
132
135
                                        'bad range')
133
 
        self.assertEquals("Invalid http range"
134
 
                          " 'Content-Range: potatoes 0-00/o0oo0'"
135
 
                          " for path: bad range",
136
 
                          str(error))
 
136
        self.assertEqual("Invalid http range"
 
137
                         " 'Content-Range: potatoes 0-00/o0oo0'"
 
138
                         " for path: bad range",
 
139
                         str(error))
137
140
 
138
141
    def test_invalid_range(self):
139
142
        error = errors.InvalidRange('path', 12, 'bad range')
140
 
        self.assertEquals("Invalid range access in path at 12: bad range",
141
 
                          str(error))
 
143
        self.assertEqual("Invalid range access in path at 12: bad range",
 
144
                         str(error))
142
145
 
143
146
    def test_inventory_modified(self):
144
147
        error = errors.InventoryModified("a tree to be repred")
159
162
            "cannot be broken.",
160
163
            str(error))
161
164
 
 
165
    def test_lock_corrupt(self):
 
166
        error = errors.LockCorrupt("corruption info")
 
167
        self.assertEqualDiff("Lock is apparently held, but corrupted: "
 
168
            "corruption info\n"
 
169
            "Use 'bzr break-lock' to clear it",
 
170
            str(error))
 
171
 
162
172
    def test_knit_data_stream_incompatible(self):
163
173
        error = errors.KnitDataStreamIncompatible(
164
174
            'stream format', 'target format')
197
207
            'There is no public branch set for "%s".' % url, str(error))
198
208
 
199
209
    def test_no_repo(self):
200
 
        dir = bzrdir.BzrDir.create(self.get_url())
 
210
        dir = controldir.ControlDir.create(self.get_url())
201
211
        error = errors.NoRepositoryPresent(dir)
202
212
        self.assertNotEqual(-1, str(error).find((dir.transport.clone('..').base)))
203
213
        self.assertEqual(-1, str(error).find((dir.transport.base)))
290
300
            str(error))
291
301
 
292
302
    def test_up_to_date(self):
293
 
        error = errors.UpToDateFormat(bzrdir.BzrDirFormat4())
294
 
        self.assertEqualDiff("The branch format All-in-one "
295
 
                             "format 4 is already at the most "
296
 
                             "recent format.",
297
 
                             str(error))
 
303
        error = errors.UpToDateFormat("someformat")
 
304
        self.assertEqualDiff(
 
305
            "The branch format someformat is already at the most "
 
306
            "recent format.", str(error))
298
307
 
299
308
    def test_corrupt_repository(self):
300
309
        repo = self.make_repository('.')
340
349
        self.assertEqual("The value 'foo' is not a valid value.",
341
350
            str(error))
342
351
 
343
 
    def test_bzrnewerror_is_deprecated(self):
344
 
        class DeprecatedError(errors.BzrNewError):
345
 
            pass
346
 
        self.callDeprecated(['BzrNewError was deprecated in bzr 0.13; '
347
 
             'please convert DeprecatedError to use BzrError instead'],
348
 
            DeprecatedError)
349
 
 
350
352
    def test_bzrerror_from_literal_string(self):
351
353
        # Some code constructs BzrError from a literal string, in which case
352
354
        # no further formatting is done.  (I'm not sure raising the base class
515
517
 
516
518
    def test_immortal_pending_deletion_message(self):
517
519
        err = errors.ImmortalPendingDeletion('foo')
518
 
        self.assertEquals(
 
520
        self.assertEqual(
519
521
            "Unable to delete transform temporary directory foo.  "
520
522
            "Please examine foo to see if it contains any files "
521
523
            "you wish to keep, and delete it when you are done.",
523
525
 
524
526
    def test_unable_create_symlink(self):
525
527
        err = errors.UnableCreateSymlink()
526
 
        self.assertEquals(
 
528
        self.assertEqual(
527
529
            "Unable to create symlink on this platform",
528
530
            str(err))
529
531
        err = errors.UnableCreateSymlink(path=u'foo')
530
 
        self.assertEquals(
 
532
        self.assertEqual(
531
533
            "Unable to create symlink 'foo' on this platform",
532
534
            str(err))
533
535
        err = errors.UnableCreateSymlink(path=u'\xb5')
534
 
        self.assertEquals(
 
536
        self.assertEqual(
535
537
            "Unable to create symlink u'\\xb5' on this platform",
536
538
            str(err))
537
539
 
544
546
 
545
547
    def test_incorrect_url(self):
546
548
        err = errors.InvalidBugTrackerURL('foo', 'http://bug.com/')
547
 
        self.assertEquals(
 
549
        self.assertEqual(
548
550
            ("The URL for bug tracker \"foo\" doesn't contain {id}: "
549
551
             "http://bug.com/"),
550
552
            str(err))
551
553
 
552
554
    def test_unable_encode_path(self):
553
555
        err = errors.UnableEncodePath('foo', 'executable')
554
 
        self.assertEquals("Unable to encode executable path 'foo' in "
555
 
            "user encoding " + osutils.get_user_encoding(),
556
 
            str(err))
 
556
        self.assertEqual("Unable to encode executable path 'foo' in "
 
557
                         "user encoding " + osutils.get_user_encoding(),
 
558
                         str(err))
557
559
 
558
560
    def test_unknown_format(self):
559
561
        err = errors.UnknownFormatError('bar', kind='foo')
560
 
        self.assertEquals("Unknown foo format: 'bar'", str(err))
 
562
        self.assertEqual("Unknown foo format: 'bar'", str(err))
561
563
 
562
564
    def test_unknown_rules(self):
563
565
        err = errors.UnknownRules(['foo', 'bar'])
564
 
        self.assertEquals("Unknown rules detected: foo, bar.", str(err))
565
 
 
566
 
    def test_hook_failed(self):
567
 
        # Create an exc_info tuple by raising and catching an exception.
568
 
        try:
569
 
            1/0
570
 
        except ZeroDivisionError:
571
 
            exc_info = sys.exc_info()
572
 
        err = errors.HookFailed('hook stage', 'hook name', exc_info, warn=False)
573
 
        self.assertStartsWith(
574
 
            str(err), 'Hook \'hook name\' during hook stage failed:\n')
575
 
        self.assertEndsWith(
576
 
            str(err), 'integer division or modulo by zero')
 
566
        self.assertEqual("Unknown rules detected: foo, bar.", str(err))
577
567
 
578
568
    def test_tip_change_rejected(self):
579
569
        err = errors.TipChangeRejected(u'Unicode message\N{INTERROBANG}')
580
 
        self.assertEquals(
 
570
        self.assertEqual(
581
571
            u'Tip change rejected: Unicode message\N{INTERROBANG}',
582
572
            unicode(err))
583
 
        self.assertEquals(
 
573
        self.assertEqual(
584
574
            'Tip change rejected: Unicode message\xe2\x80\xbd',
585
575
            str(err))
586
576
 
587
577
    def test_error_from_smart_server(self):
588
578
        error_tuple = ('error', 'tuple')
589
579
        err = errors.ErrorFromSmartServer(error_tuple)
590
 
        self.assertEquals(
 
580
        self.assertEqual(
591
581
            "Error received from smart server: ('error', 'tuple')", str(err))
592
582
 
593
583
    def test_untranslateable_error_from_smart_server(self):
594
584
        error_tuple = ('error', 'tuple')
595
585
        orig_err = errors.ErrorFromSmartServer(error_tuple)
596
586
        err = errors.UnknownErrorFromSmartServer(orig_err)
597
 
        self.assertEquals(
 
587
        self.assertEqual(
598
588
            "Server sent an unexpected error: ('error', 'tuple')", str(err))
599
589
 
600
590
    def test_smart_message_handler_error(self):
602
592
        try:
603
593
            raise Exception("example error")
604
594
        except Exception:
605
 
            exc_info = sys.exc_info()
606
 
        err = errors.SmartMessageHandlerError(exc_info)
607
 
        self.assertStartsWith(
608
 
            str(err), "The message handler raised an exception:\n")
609
 
        self.assertEndsWith(str(err), "Exception: example error\n")
 
595
            err = errors.SmartMessageHandlerError(sys.exc_info())
 
596
        # GZ 2010-11-08: Should not store exc_info in exception instances.
 
597
        try:
 
598
            self.assertStartsWith(
 
599
                str(err), "The message handler raised an exception:\n")
 
600
            self.assertEndsWith(str(err), "Exception: example error\n")
 
601
        finally:
 
602
            del err
610
603
 
611
604
    def test_must_have_working_tree(self):
612
605
        err = errors.MustHaveWorkingTree('foo', 'bar')
615
608
 
616
609
    def test_no_such_view(self):
617
610
        err = errors.NoSuchView('foo')
618
 
        self.assertEquals("No such view: foo.", str(err))
 
611
        self.assertEqual("No such view: foo.", str(err))
619
612
 
620
613
    def test_views_not_supported(self):
621
614
        err = errors.ViewsNotSupported('atree')
626
619
 
627
620
    def test_file_outside_view(self):
628
621
        err = errors.FileOutsideView('baz', ['foo', 'bar'])
629
 
        self.assertEquals('Specified file "baz" is outside the current view: '
630
 
            'foo, bar', str(err))
 
622
        self.assertEqual('Specified file "baz" is outside the current view: '
 
623
                         'foo, bar', str(err))
631
624
 
632
625
    def test_invalid_shelf_id(self):
633
626
        invalid_id = "foo"
634
627
        err = errors.InvalidShelfId(invalid_id)
635
628
        self.assertEqual('"foo" is not a valid shelf id, '
636
 
            'try a number instead.', str(err))
 
629
                         'try a number instead.', str(err))
637
630
 
638
631
    def test_unresumable_write_group(self):
639
632
        repo = "dummy repo"
665
658
        err = errors.NotBranchError('path', bzrdir=bzrdir)
666
659
        self.assertEqual('Not a branch: "path".', str(err))
667
660
 
 
661
    def test_not_branch_bzrdir_with_recursive_not_branch_error(self):
 
662
        class FakeBzrDir(object):
 
663
            def open_repository(self):
 
664
                # str() on the NotBranchError will trigger a call to this,
 
665
                # which in turn will another, identical NotBranchError.
 
666
                raise errors.NotBranchError('path', bzrdir=FakeBzrDir())
 
667
        err = errors.NotBranchError('path', bzrdir=FakeBzrDir())
 
668
        self.assertEqual('Not a branch: "path".', str(err))
 
669
 
668
670
    def test_not_branch_laziness(self):
669
671
        real_bzrdir = self.make_bzrdir('path')
670
672
        class FakeBzrDir(object):
693
695
            'Please use `bzr unbind` to fix.')
694
696
        self.assertEqualDiff(msg, str(error))
695
697
 
 
698
    def test_retry_with_new_packs(self):
 
699
        fake_exc_info = ('{exc type}', '{exc value}', '{exc traceback}')
 
700
        error = errors.RetryWithNewPacks(
 
701
            '{context}', reload_occurred=False, exc_info=fake_exc_info)
 
702
        self.assertEqual(
 
703
            'Pack files have changed, reload and retry. context: '
 
704
            '{context} {exc value}', str(error))
 
705
 
696
706
 
697
707
class PassThroughError(errors.BzrError):
698
708
 
725
735
 
726
736
    def test_missing_format_string(self):
727
737
        e = ErrorWithNoFormat(param='randomvalue')
728
 
        s = self.callDeprecated(
729
 
                ['ErrorWithNoFormat uses its docstring as a format, it should use _fmt instead'],
730
 
                lambda x: str(x), e)
731
 
        ## s = str(e)
732
 
        self.assertEqual(s,
733
 
                "This class has a docstring but no format string.")
 
738
        self.assertStartsWith(str(e),
 
739
                              "Unprintable exception ErrorWithNoFormat")
734
740
 
735
741
    def test_mismatched_format_args(self):
736
742
        # Even though ErrorWithBadFormat's format string does not match the
743
749
    def test_cannot_bind_address(self):
744
750
        # see <https://bugs.launchpad.net/bzr/+bug/286871>
745
751
        e = errors.CannotBindAddress('example.com', 22,
746
 
            socket.error(13, 'Permission denied'))
747
 
        self.assertContainsRe(str(e),
 
752
                                     socket.error(13, 'Permission denied'))
 
753
        self.assertContainsRe(
 
754
            str(e),
748
755
            r'Cannot bind address "example\.com:22":.*Permission denied')
749
756
 
750
 
    def test_file_timestamp_unavailable(self):            
 
757
    def test_file_timestamp_unavailable(self):
751
758
        e = errors.FileTimestampUnavailable("/path/foo")
752
 
        self.assertEquals("The filestamp for /path/foo is not available.",
753
 
            str(e))
754
 
            
 
759
        self.assertEqual("The filestamp for /path/foo is not available.",
 
760
                         str(e))
 
761
 
755
762
    def test_transform_rename_failed(self):
756
763
        e = errors.TransformRenameFailed(u"from", u"to", "readonly file", 2)
757
 
        self.assertEquals(
 
764
        self.assertEqual(
758
765
            u"Failed to rename from to to: readonly file",
759
766
            str(e))