/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_remote.py

Rework test_script a little bit.


Don't allow someone to request a stdin request to echo.
Echo never reads from stdin, it just echos its arguments.
You use 'cat' if you want to read from stdin.

A few other fixes because the tests were using filenames
that are actually illegal on Windows, rather than just
nonexistant.


Change the exception handling for commands so that
unknown errors don't get silently squashed and then
turn into hard-to-debug errors later.

test_script now passes on Windows.

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
27
27
from cStringIO import StringIO
28
28
 
29
29
from bzrlib import (
30
 
    branch,
31
30
    bzrdir,
32
31
    config,
33
32
    errors,
37
36
    pack,
38
37
    remote,
39
38
    repository,
 
39
    smart,
40
40
    tests,
41
41
    treebuilder,
42
42
    urlutils,
54
54
    )
55
55
from bzrlib.repofmt import groupcompress_repo, pack_repo
56
56
from bzrlib.revision import NULL_REVISION
57
 
from bzrlib.smart import medium
 
57
from bzrlib.smart import server, medium
58
58
from bzrlib.smart.client import _SmartClient
59
59
from bzrlib.smart.repository import SmartServerRepositoryGetParentMap
60
60
from bzrlib.tests import (
61
61
    condition_isinstance,
62
62
    split_suite_by_condition,
63
63
    multiply_tests,
64
 
    test_server,
 
64
    KnownFailure,
65
65
    )
66
 
from bzrlib.transport import get_transport
 
66
from bzrlib.transport import get_transport, http
67
67
from bzrlib.transport.memory import MemoryTransport
68
68
from bzrlib.transport.remote import (
69
69
    RemoteTransport,
76
76
        standard_tests, condition_isinstance(BasicRemoteObjectTests))
77
77
    smart_server_version_scenarios = [
78
78
        ('HPSS-v2',
79
 
         {'transport_server': test_server.SmartTCPServer_for_testing_v2_only}),
 
79
            {'transport_server': server.SmartTCPServer_for_testing_v2_only}),
80
80
        ('HPSS-v3',
81
 
         {'transport_server': test_server.SmartTCPServer_for_testing})]
 
81
            {'transport_server': server.SmartTCPServer_for_testing})]
82
82
    return multiply_tests(to_adapt, smart_server_version_scenarios, result)
83
83
 
84
84
 
135
135
        b = BzrDir.open_from_transport(self.transport).open_branch()
136
136
        self.assertStartsWith(str(b), 'RemoteBranch(')
137
137
 
138
 
    def test_remote_bzrdir_repr(self):
139
 
        b = BzrDir.open_from_transport(self.transport)
140
 
        self.assertStartsWith(str(b), 'RemoteBzrDir(')
141
 
 
142
138
    def test_remote_branch_format_supports_stacking(self):
143
139
        t = self.transport
144
140
        self.make_branch('unstackable', format='pack-0.92')
418
414
        # Calling _remember_remote_is_before again with a lower value works.
419
415
        client_medium._remember_remote_is_before((1, 5))
420
416
        self.assertTrue(client_medium._is_remote_before((1, 5)))
421
 
        # If you call _remember_remote_is_before with a higher value it logs a
422
 
        # warning, and continues to remember the lower value.
423
 
        self.assertNotContainsRe(self.get_log(), '_remember_remote_is_before')
424
 
        client_medium._remember_remote_is_before((1, 9))
425
 
        self.assertContainsRe(self.get_log(), '_remember_remote_is_before')
426
 
        self.assertTrue(client_medium._is_remote_before((1, 5)))
 
417
        # You cannot call _remember_remote_is_before with a larger value.
 
418
        self.assertRaises(
 
419
            AssertionError, client_medium._remember_remote_is_before, (1, 9))
427
420
 
428
421
 
429
422
class TestBzrDirCloningMetaDir(TestRemote):
448
441
            'BzrDir.cloning_metadir', ('quack/', 'False'),
449
442
            'error', ('BranchReference',)),
450
443
        client.add_expected_call(
451
 
            'BzrDir.open_branchV3', ('quack/',),
 
444
            'BzrDir.open_branchV2', ('quack/',),
452
445
            'success', ('ref', self.get_url('referenced'))),
453
446
        a_bzrdir = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
454
447
            _client=client)
531
524
        self.assertIsInstance(bd, RemoteBzrDir)
532
525
        self.assertFinished(client)
533
526
 
534
 
    def test_backwards_compat_hpss_v2(self):
535
 
        client, transport = self.make_fake_client_and_transport()
536
 
        # Monkey-patch fake client to simulate real-world behaviour with v2
537
 
        # server: upon first RPC call detect the protocol version, and because
538
 
        # the version is 2 also do _remember_remote_is_before((1, 6)) before
539
 
        # continuing with the RPC.
540
 
        orig_check_call = client._check_call
541
 
        def check_call(method, args):
542
 
            client._medium._protocol_version = 2
543
 
            client._medium._remember_remote_is_before((1, 6))
544
 
            client._check_call = orig_check_call
545
 
            client._check_call(method, args)
546
 
        client._check_call = check_call
547
 
        client.add_expected_call(
548
 
            'BzrDir.open_2.1', ('quack/',), 'unknown', ('BzrDir.open_2.1',))
549
 
        client.add_expected_call(
550
 
            'BzrDir.open', ('quack/',), 'success', ('yes',))
551
 
        bd = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
552
 
            _client=client, _force_probe=True)
553
 
        self.assertIsInstance(bd, RemoteBzrDir)
554
 
        self.assertFinished(client)
555
 
 
556
527
 
557
528
class TestBzrDirOpenBranch(TestRemote):
558
529
 
561
532
        self.make_branch('.')
562
533
        a_dir = BzrDir.open(self.get_url('.'))
563
534
        self.reset_smart_call_log()
564
 
        verb = 'BzrDir.open_branchV3'
 
535
        verb = 'BzrDir.open_branchV2'
565
536
        self.disable_verb(verb)
566
537
        format = a_dir.open_branch()
567
538
        call_count = len([call for call in self.hpss_calls if
577
548
        transport = transport.clone('quack')
578
549
        client = FakeClient(transport.base)
579
550
        client.add_expected_call(
580
 
            'BzrDir.open_branchV3', ('quack/',),
 
551
            'BzrDir.open_branchV2', ('quack/',),
581
552
            'success', ('branch', branch_network_name))
582
553
        client.add_expected_call(
583
554
            'BzrDir.find_repositoryV3', ('quack/',),
602
573
            _client=client)
603
574
        self.assertRaises(errors.NotBranchError, bzrdir.open_branch)
604
575
        self.assertEqual(
605
 
            [('call', 'BzrDir.open_branchV3', ('quack/',))],
 
576
            [('call', 'BzrDir.open_branchV2', ('quack/',))],
606
577
            client._calls)
607
578
 
608
579
    def test__get_tree_branch(self):
632
603
        network_name = reference_format.network_name()
633
604
        branch_network_name = self.get_branch_format().network_name()
634
605
        client.add_expected_call(
635
 
            'BzrDir.open_branchV3', ('~hello/',),
 
606
            'BzrDir.open_branchV2', ('~hello/',),
636
607
            'success', ('branch', branch_network_name))
637
608
        client.add_expected_call(
638
609
            'BzrDir.find_repositoryV3', ('~hello/',),
1220
1191
        client = FakeClient(self.get_url())
1221
1192
        branch_network_name = self.get_branch_format().network_name()
1222
1193
        client.add_expected_call(
1223
 
            'BzrDir.open_branchV3', ('stacked/',),
 
1194
            'BzrDir.open_branchV2', ('stacked/',),
1224
1195
            'success', ('branch', branch_network_name))
1225
1196
        client.add_expected_call(
1226
1197
            'BzrDir.find_repositoryV3', ('stacked/',),
1248
1219
            len(branch.repository._real_repository._fallback_repositories))
1249
1220
 
1250
1221
    def test_get_stacked_on_real_branch(self):
1251
 
        base_branch = self.make_branch('base')
1252
 
        stacked_branch = self.make_branch('stacked')
 
1222
        base_branch = self.make_branch('base', format='1.6')
 
1223
        stacked_branch = self.make_branch('stacked', format='1.6')
1253
1224
        stacked_branch.set_stacked_on_url('../base')
1254
1225
        reference_format = self.get_repo_format()
1255
1226
        network_name = reference_format.network_name()
1256
1227
        client = FakeClient(self.get_url())
1257
1228
        branch_network_name = self.get_branch_format().network_name()
1258
1229
        client.add_expected_call(
1259
 
            'BzrDir.open_branchV3', ('stacked/',),
 
1230
            'BzrDir.open_branchV2', ('stacked/',),
1260
1231
            'success', ('branch', branch_network_name))
1261
1232
        client.add_expected_call(
1262
1233
            'BzrDir.find_repositoryV3', ('stacked/',),
1263
 
            'success', ('ok', '', 'yes', 'no', 'yes', network_name))
 
1234
            'success', ('ok', '', 'no', 'no', 'yes', network_name))
1264
1235
        # called twice, once from constructor and then again by us
1265
1236
        client.add_expected_call(
1266
1237
            'Branch.get_stacked_on_url', ('stacked/',),
1811
1782
        return repo, client
1812
1783
 
1813
1784
 
1814
 
def remoted_description(format):
1815
 
    return 'Remote: ' + format.get_format_description()
1816
 
 
1817
 
 
1818
 
class TestBranchFormat(tests.TestCase):
1819
 
 
1820
 
    def test_get_format_description(self):
1821
 
        remote_format = RemoteBranchFormat()
1822
 
        real_format = branch.BranchFormat.get_default_format()
1823
 
        remote_format._network_name = real_format.network_name()
1824
 
        self.assertEqual(remoted_description(real_format),
1825
 
            remote_format.get_format_description())
1826
 
 
1827
 
 
1828
1785
class TestRepositoryFormat(TestRemoteRepository):
1829
1786
 
1830
1787
    def test_fast_delta(self):
1837
1794
        false_format._network_name = false_name
1838
1795
        self.assertEqual(False, false_format.fast_deltas)
1839
1796
 
1840
 
    def test_get_format_description(self):
1841
 
        remote_repo_format = RemoteRepositoryFormat()
1842
 
        real_format = repository.RepositoryFormat.get_default_format()
1843
 
        remote_repo_format._network_name = real_format.network_name()
1844
 
        self.assertEqual(remoted_description(real_format),
1845
 
            remote_repo_format.get_format_description())
1846
 
 
1847
1797
 
1848
1798
class TestRepositoryGatherStats(TestRemoteRepository):
1849
1799
 
2034
1984
        self.assertLength(1, self.hpss_calls)
2035
1985
 
2036
1986
    def disableExtraResults(self):
2037
 
        self.overrideAttr(SmartServerRepositoryGetParentMap,
2038
 
                          'no_extra_results', True)
 
1987
        old_flag = SmartServerRepositoryGetParentMap.no_extra_results
 
1988
        SmartServerRepositoryGetParentMap.no_extra_results = True
 
1989
        def reset_values():
 
1990
            SmartServerRepositoryGetParentMap.no_extra_results = old_flag
 
1991
        self.addCleanup(reset_values)
2039
1992
 
2040
1993
    def test_null_cached_missing_and_stop_key(self):
2041
1994
        self.setup_smart_server_with_call_log()
2100
2053
 
2101
2054
    def test_allows_new_revisions(self):
2102
2055
        """get_parent_map's results can be updated by commit."""
2103
 
        smart_server = test_server.SmartTCPServer_for_testing()
 
2056
        smart_server = server.SmartTCPServer_for_testing()
2104
2057
        self.start_server(smart_server)
2105
2058
        self.make_branch('branch')
2106
2059
        branch = Branch.open(smart_server.get_url() + '/branch')
2216
2169
        """
2217
2170
        # Make a repo with a fallback repo, both using a FakeClient.
2218
2171
        format = remote.response_tuple_to_repo_format(
2219
 
            ('yes', 'no', 'yes', self.get_repo_format().network_name()))
 
2172
            ('yes', 'no', 'yes', 'fake-network-name'))
2220
2173
        repo, client = self.setup_fake_client_and_repository('quack')
2221
2174
        repo._format = format
2222
2175
        fallback_repo, ignored = self.setup_fake_client_and_repository(
2223
2176
            'fallback')
2224
2177
        fallback_repo._client = client
2225
 
        fallback_repo._format = format
2226
2178
        repo.add_fallback_repository(fallback_repo)
2227
2179
        # First the client should ask the primary repo
2228
2180
        client.add_expected_call(
2301
2253
        transport_path = 'quack'
2302
2254
        repo, client = self.setup_fake_client_and_repository(transport_path)
2303
2255
        client.add_success_response('ok', 'a token')
2304
 
        token = repo.lock_write().repository_token
 
2256
        result = repo.lock_write()
2305
2257
        self.assertEqual(
2306
2258
            [('call', 'Repository.lock_write', ('quack/', ''))],
2307
2259
            client._calls)
2308
 
        self.assertEqual('a token', token)
 
2260
        self.assertEqual('a token', result)
2309
2261
 
2310
2262
    def test_lock_write_already_locked(self):
2311
2263
        transport_path = 'quack'
2649
2601
    """RemoteRepository.copy_content_into optimizations"""
2650
2602
 
2651
2603
    def test_copy_content_remote_to_local(self):
2652
 
        self.transport_server = test_server.SmartTCPServer_for_testing
 
2604
        self.transport_server = server.SmartTCPServer_for_testing
2653
2605
        src_repo = self.make_repository('repo1')
2654
2606
        src_repo = repository.Repository.open(self.get_url('repo1'))
2655
2607
        # At the moment the tarball-based copy_content_into can't write back
2803
2755
        expected_error = errors.NotBranchError(path=bzrdir.root_transport.base)
2804
2756
        self.assertEqual(expected_error, translated_error)
2805
2757
 
2806
 
    def test_nobranch_one_arg(self):
2807
 
        bzrdir = self.make_bzrdir('')
2808
 
        translated_error = self.translateTuple(
2809
 
            ('nobranch', 'extra detail'), bzrdir=bzrdir)
2810
 
        expected_error = errors.NotBranchError(
2811
 
            path=bzrdir.root_transport.base,
2812
 
            detail='extra detail')
2813
 
        self.assertEqual(expected_error, translated_error)
2814
 
 
2815
2758
    def test_LockContention(self):
2816
2759
        translated_error = self.translateTuple(('LockContention',))
2817
2760
        expected_error = errors.LockContention('(remote lock)')
2930
2873
        # In addition to re-raising ErrorFromSmartServer, some debug info has
2931
2874
        # been muttered to the log file for developer to look at.
2932
2875
        self.assertContainsRe(
2933
 
            self.get_log(),
 
2876
            self._get_log(keep_log_file=True),
2934
2877
            "Missing key 'branch' in context")
2935
2878
 
2936
2879
    def test_path_missing(self):
2944
2887
        self.assertEqual(server_error, translated_error)
2945
2888
        # In addition to re-raising ErrorFromSmartServer, some debug info has
2946
2889
        # been muttered to the log file for developer to look at.
2947
 
        self.assertContainsRe(self.get_log(), "Missing key 'path' in context")
 
2890
        self.assertContainsRe(
 
2891
            self._get_log(keep_log_file=True), "Missing key 'path' in context")
2948
2892
 
2949
2893
 
2950
2894
class TestStacking(tests.TestCaseWithTransport):
2968
2912
        stacked_branch = self.make_branch('stacked', format='1.9')
2969
2913
        stacked_branch.set_stacked_on_url('../base')
2970
2914
        # start a server looking at this
2971
 
        smart_server = test_server.SmartTCPServer_for_testing()
 
2915
        smart_server = server.SmartTCPServer_for_testing()
2972
2916
        self.start_server(smart_server)
2973
2917
        remote_bzrdir = BzrDir.open(smart_server.get_url() + '/stacked')
2974
2918
        # can get its branch and repository
3078
3022
            local_tree.commit('more local changes are better')
3079
3023
            branch = Branch.open(self.get_url('tree3'))
3080
3024
            branch.lock_read()
3081
 
            self.addCleanup(branch.unlock)
3082
3025
            return None, branch
3083
3026
        rev_ord, expected_revs = self.get_ordered_revs('1.9', 'unordered',
3084
3027
            branch_factory=make_stacked_stacked)
3130
3073
        super(TestRemoteBranchEffort, self).setUp()
3131
3074
        # Create a smart server that publishes whatever the backing VFS server
3132
3075
        # does.
3133
 
        self.smart_server = test_server.SmartTCPServer_for_testing()
 
3076
        self.smart_server = server.SmartTCPServer_for_testing()
3134
3077
        self.start_server(self.smart_server, self.get_server())
3135
3078
        # Log all HPSS calls into self.hpss_calls.
3136
3079
        _SmartClient.hooks.install_named_hook(