~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_remote.py

  • Committer: Vincent Ladeuil
  • Date: 2009-05-05 15:31:34 UTC
  • mto: (4343.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4344.
  • Revision ID: v.ladeuil+lp@free.fr-20090505153134-q4bp4is9gywsmzrv
Clean up test for log formats.

* bzrlib/tests/blackbox/test_logformats.py:
Update tests to actual style.

Show diffs side-by-side

added added

removed removed

Lines of Context:
58
58
    condition_isinstance,
59
59
    split_suite_by_condition,
60
60
    multiply_tests,
61
 
    KnownFailure,
62
61
    )
63
62
from bzrlib.transport import get_transport, http
64
63
from bzrlib.transport.memory import MemoryTransport
154
153
        r = BzrDir.open_from_transport(t.clone('stackable')).open_repository()
155
154
        self.assertTrue(r._format.supports_external_lookups)
156
155
 
157
 
    def test_remote_branch_set_append_revisions_only(self):
158
 
        # Make a format 1.9 branch, which supports append_revisions_only
159
 
        branch = self.make_branch('branch', format='1.9')
160
 
        config = branch.get_config()
161
 
        branch.set_append_revisions_only(True)
162
 
        self.assertEqual(
163
 
            'True', config.get_user_option('append_revisions_only'))
164
 
        branch.set_append_revisions_only(False)
165
 
        self.assertEqual(
166
 
            'False', config.get_user_option('append_revisions_only'))
167
 
 
168
 
    def test_remote_branch_set_append_revisions_only_upgrade_reqd(self):
169
 
        branch = self.make_branch('branch', format='knit')
170
 
        config = branch.get_config()
171
 
        self.assertRaises(
172
 
            errors.UpgradeRequired, branch.set_append_revisions_only, True)
173
 
 
174
156
 
175
157
class FakeProtocol(object):
176
158
    """Lookalike SmartClientRequestProtocolOne allowing body reading tests."""
341
323
            request_handlers.register(verb, orig_method)
342
324
        self.addCleanup(restoreVerb)
343
325
 
344
 
    def assertFinished(self, fake_client):
345
 
        """Assert that all of a FakeClient's expected calls have occurred."""
346
 
        fake_client.finished_test()
347
 
 
348
326
 
349
327
class Test_ClientMedium_remote_path_from_transport(tests.TestCase):
350
328
    """Tests for the behaviour of client_medium.remote_path_from_transport."""
450
428
        self.assertEqual(bzrdir.BzrDirMetaFormat1, type(result))
451
429
        self.assertEqual(expected._repository_format, result._repository_format)
452
430
        self.assertEqual(expected._branch_format, result._branch_format)
453
 
        self.assertFinished(client)
 
431
        client.finished_test()
454
432
 
455
433
    def test_current_server(self):
456
434
        transport = self.get_transport('.')
471
449
        self.assertEqual(bzrdir.BzrDirMetaFormat1, type(result))
472
450
        self.assertEqual(None, result._repository_format)
473
451
        self.assertEqual(None, result._branch_format)
474
 
        self.assertFinished(client)
 
452
        client.finished_test()
475
453
 
476
454
 
477
455
class TestBzrDirOpenBranch(TestRemote):
510
488
        result = bzrdir.open_branch()
511
489
        self.assertIsInstance(result, RemoteBranch)
512
490
        self.assertEqual(bzrdir, result.bzrdir)
513
 
        self.assertFinished(client)
 
491
        client.finished_test()
514
492
 
515
493
    def test_branch_missing(self):
516
494
        transport = MemoryTransport()
563
541
        bzrdir = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
564
542
            _client=client)
565
543
        result = bzrdir.open_branch()
566
 
        self.assertFinished(client)
 
544
        client.finished_test()
567
545
 
568
546
    def check_open_repository(self, rich_root, subtrees, external_lookup='no'):
569
547
        reference_format = self.get_repo_format()
763
741
        self.assertEqual(network_name, repo._format.network_name())
764
742
 
765
743
 
766
 
class TestBzrDirFormatInitializeEx(TestRemote):
767
 
 
768
 
    def test_success(self):
769
 
        """Simple test for typical successful call."""
770
 
        fmt = bzrdir.RemoteBzrDirFormat()
771
 
        default_format_name = BzrDirFormat.get_default_format().network_name()
772
 
        transport = self.get_transport()
773
 
        client = FakeClient(transport.base)
774
 
        client.add_expected_call(
775
 
            'BzrDirFormat.initialize_ex_1.16',
776
 
                (default_format_name, 'path', 'False', 'False', 'False', '',
777
 
                 '', '', '', 'False'),
778
 
            'success',
779
 
                ('.', 'no', 'no', 'yes', 'repo fmt', 'repo bzrdir fmt',
780
 
                 'bzrdir fmt', 'False', '', '', 'repo lock token'))
781
 
        # XXX: It would be better to call fmt.initialize_on_transport_ex, but
782
 
        # it's currently hard to test that without supplying a real remote
783
 
        # transport connected to a real server.
784
 
        result = fmt._initialize_on_transport_ex_rpc(client, 'path',
785
 
            transport, False, False, False, None, None, None, None, False)
786
 
        self.assertFinished(client)
787
 
 
788
 
    def test_error(self):
789
 
        """Error responses are translated, e.g. 'PermissionDenied' raises the
790
 
        corresponding error from the client.
791
 
        """
792
 
        fmt = bzrdir.RemoteBzrDirFormat()
793
 
        default_format_name = BzrDirFormat.get_default_format().network_name()
794
 
        transport = self.get_transport()
795
 
        client = FakeClient(transport.base)
796
 
        client.add_expected_call(
797
 
            'BzrDirFormat.initialize_ex_1.16',
798
 
                (default_format_name, 'path', 'False', 'False', 'False', '',
799
 
                 '', '', '', 'False'),
800
 
            'error',
801
 
                ('PermissionDenied', 'path', 'extra info'))
802
 
        # XXX: It would be better to call fmt.initialize_on_transport_ex, but
803
 
        # it's currently hard to test that without supplying a real remote
804
 
        # transport connected to a real server.
805
 
        err = self.assertRaises(errors.PermissionDenied,
806
 
            fmt._initialize_on_transport_ex_rpc, client, 'path', transport,
807
 
            False, False, False, None, None, None, None, False)
808
 
        self.assertEqual('path', err.path)
809
 
        self.assertEqual(': extra info', err.extra)
810
 
        self.assertFinished(client)
811
 
 
812
 
    def test_error_from_real_server(self):
813
 
        """Integration test for error translation."""
814
 
        transport = self.make_smart_server('foo')
815
 
        transport = transport.clone('no-such-path')
816
 
        fmt = bzrdir.RemoteBzrDirFormat()
817
 
        err = self.assertRaises(errors.NoSuchFile,
818
 
            fmt.initialize_on_transport_ex, transport, create_prefix=False)
819
 
 
820
 
 
821
744
class OldSmartClient(object):
822
745
    """A fake smart client for test_old_version that just returns a version one
823
746
    response to the 'hello' (query version) command.
888
811
        transport = transport.clone('quack')
889
812
        branch = self.make_remote_branch(transport, client)
890
813
        result = branch.get_parent()
891
 
        self.assertFinished(client)
 
814
        client.finished_test()
892
815
        self.assertEqual(None, result)
893
816
 
894
817
    def test_parent_relative(self):
920
843
        branch = self.make_remote_branch(transport, client)
921
844
        result = branch.get_parent()
922
845
        self.assertEqual('http://foo/', result)
923
 
        self.assertFinished(client)
 
846
        client.finished_test()
924
847
 
925
848
 
926
849
class TestBranchSetParentLocation(RemoteBranchTestCase):
941
864
        branch._lock_token = 'b'
942
865
        branch._repo_lock_token = 'r'
943
866
        branch._set_parent_location(None)
944
 
        self.assertFinished(client)
 
867
        client.finished_test()
945
868
 
946
869
    def test_parent(self):
947
870
        transport = MemoryTransport()
958
881
        branch._lock_token = 'b'
959
882
        branch._repo_lock_token = 'r'
960
883
        branch._set_parent_location('foo')
961
 
        self.assertFinished(client)
 
884
        client.finished_test()
962
885
 
963
886
    def test_backwards_compat(self):
964
887
        self.setup_smart_server_with_call_log()
996
919
        transport = transport.clone('quack')
997
920
        branch = self.make_remote_branch(transport, client)
998
921
        result = branch.tags.get_tag_dict()
999
 
        self.assertFinished(client)
 
922
        client.finished_test()
1000
923
        self.assertEqual({}, result)
1001
924
 
1002
925
 
1016
939
        transport = transport.clone('quack')
1017
940
        branch = self.make_remote_branch(transport, client)
1018
941
        result = branch.last_revision_info()
1019
 
        self.assertFinished(client)
 
942
        client.finished_test()
1020
943
        self.assertEqual((0, NULL_REVISION), result)
1021
944
 
1022
945
    def test_non_empty_branch(self):
1097
1020
        branch = bzrdir.open_branch()
1098
1021
        result = branch.get_stacked_on_url()
1099
1022
        self.assertEqual('../base', result)
1100
 
        self.assertFinished(client)
 
1023
        client.finished_test()
1101
1024
        # it's in the fallback list both for the RemoteRepository and its vfs
1102
1025
        # repository
1103
1026
        self.assertEqual(1, len(branch.repository._fallback_repositories))
1130
1053
        branch = bzrdir.open_branch()
1131
1054
        result = branch.get_stacked_on_url()
1132
1055
        self.assertEqual('../base', result)
1133
 
        self.assertFinished(client)
 
1056
        client.finished_test()
1134
1057
        # it's in the fallback list both for the RemoteRepository.
1135
1058
        self.assertEqual(1, len(branch.repository._fallback_repositories))
1136
1059
        # And we haven't had to construct a real repository.
1171
1094
        result = branch.set_revision_history([])
1172
1095
        branch.unlock()
1173
1096
        self.assertEqual(None, result)
1174
 
        self.assertFinished(client)
 
1097
        client.finished_test()
1175
1098
 
1176
1099
    def test_set_nonempty(self):
1177
1100
        # set_revision_history([rev-id1, ..., rev-idN]) is translated to calling
1209
1132
        result = branch.set_revision_history(['rev-id1', 'rev-id2'])
1210
1133
        branch.unlock()
1211
1134
        self.assertEqual(None, result)
1212
 
        self.assertFinished(client)
 
1135
        client.finished_test()
1213
1136
 
1214
1137
    def test_no_such_revision(self):
1215
1138
        transport = MemoryTransport()
1244
1167
        self.assertRaises(
1245
1168
            errors.NoSuchRevision, branch.set_revision_history, ['rev-id'])
1246
1169
        branch.unlock()
1247
 
        self.assertFinished(client)
 
1170
        client.finished_test()
1248
1171
 
1249
1172
    def test_tip_change_rejected(self):
1250
1173
        """TipChangeRejected responses cause a TipChangeRejected exception to
1287
1210
        self.assertIsInstance(err.msg, unicode)
1288
1211
        self.assertEqual(rejection_msg_unicode, err.msg)
1289
1212
        branch.unlock()
1290
 
        self.assertFinished(client)
 
1213
        client.finished_test()
1291
1214
 
1292
1215
 
1293
1216
class TestBranchSetLastRevisionInfo(RemoteBranchTestCase):
1403
1326
        self.assertEqual(
1404
1327
            [('set_last_revision_info', 1234, 'a-revision-id')],
1405
1328
            real_branch.calls)
1406
 
        self.assertFinished(client)
 
1329
        client.finished_test()
1407
1330
 
1408
1331
    def test_unexpected_error(self):
1409
1332
        # If the server sends an error the client doesn't understand, it gets
1517
1440
        config = branch._get_config()
1518
1441
        config.set_option('foo', 'bar')
1519
1442
        branch.unlock()
1520
 
        self.assertFinished(client)
 
1443
        client.finished_test()
1521
1444
 
1522
1445
    def test_backwards_compat_set_option(self):
1523
1446
        self.setup_smart_server_with_call_log()
1547
1470
        transport = transport.clone('quack')
1548
1471
        branch = self.make_remote_branch(transport, client)
1549
1472
        self.assertRaises(errors.UnlockableTransport, branch.lock_write)
1550
 
        self.assertFinished(client)
 
1473
        client.finished_test()
1551
1474
 
1552
1475
 
1553
1476
class TestBzrDirGetSetConfig(RemoteBzrDirTestCase):
2040
1963
        self.assertEqual(('AnUnexpectedError',), e.error_tuple)
2041
1964
 
2042
1965
 
2043
 
class TestRepositoryGetRevIdForRevno(TestRemoteRepository):
2044
 
 
2045
 
    def test_ok(self):
2046
 
        repo, client = self.setup_fake_client_and_repository('quack')
2047
 
        client.add_expected_call(
2048
 
            'Repository.get_rev_id_for_revno', ('quack/', 5, (42, 'rev-foo')),
2049
 
            'success', ('ok', 'rev-five'))
2050
 
        result = repo.get_rev_id_for_revno(5, (42, 'rev-foo'))
2051
 
        self.assertEqual((True, 'rev-five'), result)
2052
 
        self.assertFinished(client)
2053
 
 
2054
 
    def test_history_incomplete(self):
2055
 
        repo, client = self.setup_fake_client_and_repository('quack')
2056
 
        client.add_expected_call(
2057
 
            'Repository.get_rev_id_for_revno', ('quack/', 5, (42, 'rev-foo')),
2058
 
            'success', ('history-incomplete', 10, 'rev-ten'))
2059
 
        result = repo.get_rev_id_for_revno(5, (42, 'rev-foo'))
2060
 
        self.assertEqual((False, (10, 'rev-ten')), result)
2061
 
        self.assertFinished(client)
2062
 
 
2063
 
    def test_history_incomplete_with_fallback(self):
2064
 
        """A 'history-incomplete' response causes the fallback repository to be
2065
 
        queried too, if one is set.
2066
 
        """
2067
 
        # Make a repo with a fallback repo, both using a FakeClient.
2068
 
        format = remote.response_tuple_to_repo_format(
2069
 
            ('yes', 'no', 'yes', 'fake-network-name'))
2070
 
        repo, client = self.setup_fake_client_and_repository('quack')
2071
 
        repo._format = format
2072
 
        fallback_repo, ignored = self.setup_fake_client_and_repository(
2073
 
            'fallback')
2074
 
        fallback_repo._client = client
2075
 
        repo.add_fallback_repository(fallback_repo)
2076
 
        # First the client should ask the primary repo
2077
 
        client.add_expected_call(
2078
 
            'Repository.get_rev_id_for_revno', ('quack/', 1, (42, 'rev-foo')),
2079
 
            'success', ('history-incomplete', 2, 'rev-two'))
2080
 
        # Then it should ask the fallback, using revno/revid from the
2081
 
        # history-incomplete response as the known revno/revid.
2082
 
        client.add_expected_call(
2083
 
            'Repository.get_rev_id_for_revno',('fallback/', 1, (2, 'rev-two')),
2084
 
            'success', ('ok', 'rev-one'))
2085
 
        result = repo.get_rev_id_for_revno(1, (42, 'rev-foo'))
2086
 
        self.assertEqual((True, 'rev-one'), result)
2087
 
        self.assertFinished(client)
2088
 
 
2089
 
    def test_nosuchrevision(self):
2090
 
        # 'nosuchrevision' is returned when the known-revid is not found in the
2091
 
        # remote repo.  The client translates that response to NoSuchRevision.
2092
 
        repo, client = self.setup_fake_client_and_repository('quack')
2093
 
        client.add_expected_call(
2094
 
            'Repository.get_rev_id_for_revno', ('quack/', 5, (42, 'rev-foo')),
2095
 
            'error', ('nosuchrevision', 'rev-foo'))
2096
 
        self.assertRaises(
2097
 
            errors.NoSuchRevision,
2098
 
            repo.get_rev_id_for_revno, 5, (42, 'rev-foo'))
2099
 
        self.assertFinished(client)
2100
 
 
2101
 
 
2102
1966
class TestRepositoryIsShared(TestRemoteRepository):
2103
1967
 
2104
1968
    def test_is_shared(self):
2235
2099
        resume_tokens, missing_keys = sink.insert_stream([], fmt, [])
2236
2100
        self.assertEqual([], resume_tokens)
2237
2101
        self.assertEqual(set(), missing_keys)
2238
 
        self.assertFinished(client)
 
2102
        client.finished_test()
2239
2103
 
2240
2104
    def test_locked_repo_with_no_lock_token(self):
2241
2105
        transport_path = 'quack'
2255
2119
        resume_tokens, missing_keys = sink.insert_stream([], fmt, [])
2256
2120
        self.assertEqual([], resume_tokens)
2257
2121
        self.assertEqual(set(), missing_keys)
2258
 
        self.assertFinished(client)
 
2122
        client.finished_test()
2259
2123
 
2260
2124
    def test_locked_repo_with_lock_token(self):
2261
2125
        transport_path = 'quack'
2275
2139
        resume_tokens, missing_keys = sink.insert_stream([], fmt, [])
2276
2140
        self.assertEqual([], resume_tokens)
2277
2141
        self.assertEqual(set(), missing_keys)
2278
 
        self.assertFinished(client)
 
2142
        client.finished_test()
2279
2143
 
2280
2144
 
2281
2145
class TestRepositoryTarball(TestRemoteRepository):
2366
2230
        client.add_expected_call(
2367
2231
            'PackRepository.autopack', ('quack/',), 'success', ('ok',))
2368
2232
        repo.autopack()
2369
 
        self.assertFinished(client)
 
2233
        client.finished_test()
2370
2234
 
2371
2235
    def test_ok_with_real_repo(self):
2372
2236
        """When the server returns 'ok' and there is a _real_repository, then
2679
2543
                    result.append(content.key[-1])
2680
2544
        return result
2681
2545
 
2682
 
    def get_ordered_revs(self, format, order, branch_factory=None):
 
2546
    def get_ordered_revs(self, format, order):
2683
2547
        """Get a list of the revisions in a stream to format format.
2684
2548
 
2685
2549
        :param format: The format of the target.
2686
2550
        :param order: the order that target should have requested.
2687
 
        :param branch_factory: A callable to create a trunk and stacked branch
2688
 
            to fetch from. If none, self.prepare_stacked_remote_branch is used.
2689
2551
        :result: The revision ids in the stream, in the order seen,
2690
2552
            the topological order of revisions in the source.
2691
2553
        """
2693
2555
        target_repository_format = unordered_format.repository_format
2694
2556
        # Cross check
2695
2557
        self.assertEqual(order, target_repository_format._fetch_order)
2696
 
        if branch_factory is None:
2697
 
            branch_factory = self.prepare_stacked_remote_branch
2698
 
        _, stacked = branch_factory()
 
2558
        trunk, stacked = self.prepare_stacked_remote_branch()
2699
2559
        source = stacked.repository._get_source(target_repository_format)
2700
2560
        tip = stacked.last_revision()
2701
2561
        revs = stacked.repository.get_ancestry(tip)
2720
2580
        # from the server, then one from the backing branch.
2721
2581
        self.assertLength(2, self.hpss_calls)
2722
2582
 
2723
 
    def test_stacked_on_stacked_get_stream_unordered(self):
2724
 
        # Repository._get_source.get_stream() from a stacked repository which
2725
 
        # is itself stacked yields the full data from all three sources.
2726
 
        def make_stacked_stacked():
2727
 
            _, stacked = self.prepare_stacked_remote_branch()
2728
 
            tree = stacked.bzrdir.sprout('tree3', stacked=True
2729
 
                ).open_workingtree()
2730
 
            tree.commit('more local changes are better')
2731
 
            branch = Branch.open(self.get_url('tree3'))
2732
 
            branch.lock_read()
2733
 
            return None, branch
2734
 
        rev_ord, expected_revs = self.get_ordered_revs('1.9', 'unordered',
2735
 
            branch_factory=make_stacked_stacked)
2736
 
        self.assertEqual(set(expected_revs), set(rev_ord))
2737
 
        # Getting unordered results should have made a streaming data request
2738
 
        # from the server, and one from each backing repo
2739
 
        self.assertLength(3, self.hpss_calls)
2740
 
 
2741
2583
    def test_stacked_get_stream_topological(self):
2742
2584
        # Repository._get_source.get_stream() from a stacked repository with
2743
2585
        # topological sorting yields the full data from both stacked and
2758
2600
        # from the backing branch, and one from the stacked on branch.
2759
2601
        self.assertLength(2, self.hpss_calls)
2760
2602
 
2761
 
    def test_stacked_pull_more_than_stacking_has_bug_360791(self):
2762
 
        # When pulling some fixed amount of content that is more than the
2763
 
        # source has (because some is coming from a fallback branch, no error
2764
 
        # should be received. This was reported as bug 360791.
2765
 
        # Need three branches: a trunk, a stacked branch, and a preexisting
2766
 
        # branch pulling content from stacked and trunk.
2767
 
        self.setup_smart_server_with_call_log()
2768
 
        trunk = self.make_branch_and_tree('trunk', format="1.9-rich-root")
2769
 
        r1 = trunk.commit('start')
2770
 
        stacked_branch = trunk.branch.create_clone_on_transport(
2771
 
            self.get_transport('stacked'), stacked_on=trunk.branch.base)
2772
 
        local = self.make_branch('local', format='1.9-rich-root')
2773
 
        local.repository.fetch(stacked_branch.repository,
2774
 
            stacked_branch.last_revision())
2775
 
 
2776
2603
 
2777
2604
class TestRemoteBranchEffort(tests.TestCaseWithTransport):
2778
2605