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

  • Committer: Aaron Bentley
  • Date: 2008-02-24 16:42:13 UTC
  • mfrom: (3234 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3235.
  • Revision ID: aaron@aaronbentley.com-20080224164213-eza1lzru5bwuwmmj
Merge with bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
Tests for low-level protocol encoding are found in test_smart_transport.
25
25
"""
26
26
 
 
27
import bz2
27
28
from StringIO import StringIO
28
29
import tempfile
29
30
import tarfile
30
31
 
31
32
from bzrlib import bzrdir, errors, pack, smart, tests
32
 
from bzrlib.smart.request import SmartServerResponse
 
33
from bzrlib.smart.request import (
 
34
    FailedSmartServerResponse,
 
35
    SmartServerResponse,
 
36
    SuccessfulSmartServerResponse,
 
37
    )
33
38
import bzrlib.smart.bzrdir
34
39
import bzrlib.smart.branch
35
40
import bzrlib.smart.repository
 
41
from bzrlib.tests import (
 
42
    iter_suite_tests,
 
43
    split_suite_by_re,
 
44
    TestScenarioApplier,
 
45
    )
36
46
from bzrlib.util import bencode
37
47
 
38
48
 
 
49
def load_tests(standard_tests, module, loader):
 
50
    """Multiply tests version and protocol consistency."""
 
51
    # FindRepository tests.
 
52
    bzrdir_mod = bzrlib.smart.bzrdir
 
53
    applier = TestScenarioApplier()
 
54
    applier.scenarios = [
 
55
        ("find_repository", {
 
56
            "_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
 
57
        ("find_repositoryV2", {
 
58
            "_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
 
59
        ]
 
60
    to_adapt, result = split_suite_by_re(standard_tests,
 
61
        "TestSmartServerRequestFindRepository")
 
62
    v2_only, v1_and_2 = split_suite_by_re(to_adapt,
 
63
        "_v2")
 
64
    for test in iter_suite_tests(v1_and_2):
 
65
        result.addTests(applier.adapt(test))
 
66
    del applier.scenarios[0]
 
67
    for test in iter_suite_tests(v2_only):
 
68
        result.addTests(applier.adapt(test))
 
69
    return result
 
70
 
 
71
 
39
72
class TestCaseWithSmartMedium(tests.TestCaseWithTransport):
40
73
 
41
74
    def setUp(self):
72
105
    def test_no_repository(self):
73
106
        """When there is no repository to be found, ('norepository', ) is returned."""
74
107
        backing = self.get_transport()
75
 
        request = smart.bzrdir.SmartServerRequestFindRepository(backing)
 
108
        request = self._request_class(backing)
76
109
        self.make_bzrdir('.')
77
110
        self.assertEqual(SmartServerResponse(('norepository', )),
78
111
            request.execute(backing.local_abspath('')))
82
115
        # path the repository is being searched on is the same as that that 
83
116
        # the repository is at.
84
117
        backing = self.get_transport()
85
 
        request = smart.bzrdir.SmartServerRequestFindRepository(backing)
 
118
        request = self._request_class(backing)
86
119
        result = self._make_repository_and_result()
87
120
        self.assertEqual(result, request.execute(backing.local_abspath('')))
88
121
        self.make_bzrdir('subdir')
103
136
            subtrees = 'yes'
104
137
        else:
105
138
            subtrees = 'no'
106
 
        return SmartServerResponse(('ok', '', rich_root, subtrees))
 
139
        if (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
 
140
            self._request_class):
 
141
            # All tests so far are on formats, and for non-external
 
142
            # repositories.
 
143
            return SuccessfulSmartServerResponse(
 
144
                ('ok', '', rich_root, subtrees, 'no'))
 
145
        else:
 
146
            return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
107
147
 
108
148
    def test_shared_repository(self):
109
149
        """When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
110
150
        backing = self.get_transport()
111
 
        request = smart.bzrdir.SmartServerRequestFindRepository(backing)
 
151
        request = self._request_class(backing)
112
152
        result = self._make_repository_and_result(shared=True)
113
153
        self.assertEqual(result, request.execute(backing.local_abspath('')))
114
154
        self.make_bzrdir('subdir')
123
163
    def test_rich_root_and_subtree_encoding(self):
124
164
        """Test for the format attributes for rich root and subtree support."""
125
165
        backing = self.get_transport()
126
 
        request = smart.bzrdir.SmartServerRequestFindRepository(backing)
 
166
        request = self._request_class(backing)
127
167
        result = self._make_repository_and_result(format='dirstate-with-subtree')
128
168
        # check the test will be valid
129
169
        self.assertEqual('yes', result.args[2])
130
170
        self.assertEqual('yes', result.args[3])
131
171
        self.assertEqual(result, request.execute(backing.local_abspath('')))
132
172
 
 
173
    def test_supports_external_lookups_no_v2(self):
 
174
        """Test for the supports_external_lookups attribute."""
 
175
        backing = self.get_transport()
 
176
        request = self._request_class(backing)
 
177
        result = self._make_repository_and_result(format='dirstate-with-subtree')
 
178
        # check the test will be valid
 
179
        self.assertEqual('no', result.args[4])
 
180
        self.assertEqual(result, request.execute(backing.local_abspath('')))
 
181
 
133
182
 
134
183
class TestSmartServerRequestInitializeBzrDir(tests.TestCaseWithTransport):
135
184
 
525
574
            request.execute, backing.local_abspath('subdir'))
526
575
 
527
576
 
 
577
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithTransport):
 
578
 
 
579
    def test_trivial_bzipped(self):
 
580
        # This tests that the wire encoding is actually bzipped
 
581
        backing = self.get_transport()
 
582
        request = smart.repository.SmartServerRepositoryGetParentMap(backing)
 
583
        tree = self.make_branch_and_memory_tree('.')
 
584
 
 
585
        self.assertEqual(None,
 
586
            request.execute(backing.local_abspath(''), 'missing-id'))
 
587
        # Note that it returns a body (of '' bzipped).
 
588
        self.assertEqual(
 
589
            SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
 
590
            request.do_body('\n\n0\n'))
 
591
 
 
592
 
528
593
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithTransport):
529
594
 
530
595
    def test_none_argument(self):
814
879
            response)
815
880
 
816
881
 
 
882
class TestSmartServerRepositoryStreamRevisionsChunked(tests.TestCaseWithTransport):
 
883
 
 
884
    def test_fetch_revisions(self):
 
885
        backing = self.get_transport()
 
886
        request = smart.repository.SmartServerRepositoryStreamRevisionsChunked(
 
887
            backing)
 
888
        tree = self.make_branch_and_memory_tree('.')
 
889
        tree.lock_write()
 
890
        tree.add('')
 
891
        rev_id1_utf8 = u'\xc8'.encode('utf-8')
 
892
        rev_id2_utf8 = u'\xc9'.encode('utf-8')
 
893
        tree.commit('1st commit', rev_id=rev_id1_utf8)
 
894
        tree.commit('2nd commit', rev_id=rev_id2_utf8)
 
895
        tree.unlock()
 
896
 
 
897
        response = request.execute(backing.local_abspath(''))
 
898
        self.assertEqual(None, response)
 
899
        response = request.do_body("%s\n%s\n1" % (rev_id2_utf8, rev_id1_utf8))
 
900
        self.assertEqual(('ok',), response.args)
 
901
        from cStringIO import StringIO
 
902
        parser = pack.ContainerPushParser()
 
903
        names = []
 
904
        for stream_bytes in response.body_stream:
 
905
            parser.accept_bytes(stream_bytes)
 
906
            for [name], record_bytes in parser.read_pending_records():
 
907
                names.append(name)
 
908
                # The bytes should be a valid bencoded string.
 
909
                bencode.bdecode(record_bytes)
 
910
                # XXX: assert that the bencoded knit records have the right
 
911
                # contents?
 
912
        
 
913
    def test_no_such_revision_error(self):
 
914
        backing = self.get_transport()
 
915
        request = smart.repository.SmartServerRepositoryStreamRevisionsChunked(
 
916
            backing)
 
917
        repo = self.make_repository('.')
 
918
        rev_id1_utf8 = u'\xc8'.encode('utf-8')
 
919
        response = request.execute(backing.local_abspath(''))
 
920
        self.assertEqual(None, response)
 
921
        response = request.do_body("%s\n\n1" % (rev_id1_utf8,))
 
922
        self.assertEqual(
 
923
            FailedSmartServerResponse(('NoSuchRevision', )),
 
924
            response)
 
925
 
 
926
 
817
927
class TestSmartServerIsReadonly(tests.TestCaseWithTransport):
818
928
 
819
929
    def test_is_readonly_no(self):
856
966
            smart.branch.SmartServerBranchRequestUnlock)
857
967
        self.assertEqual(
858
968
            smart.request.request_handlers.get('BzrDir.find_repository'),
859
 
            smart.bzrdir.SmartServerRequestFindRepository)
 
969
            smart.bzrdir.SmartServerRequestFindRepositoryV1)
 
970
        self.assertEqual(
 
971
            smart.request.request_handlers.get('BzrDir.find_repositoryV2'),
 
972
            smart.bzrdir.SmartServerRequestFindRepositoryV2)
860
973
        self.assertEqual(
861
974
            smart.request.request_handlers.get('BzrDirFormat.initialize'),
862
975
            smart.bzrdir.SmartServerRequestInitializeBzrDir)
867
980
            smart.request.request_handlers.get('Repository.gather_stats'),
868
981
            smart.repository.SmartServerRepositoryGatherStats)
869
982
        self.assertEqual(
 
983
            smart.request.request_handlers.get('Repository.get_parent_map'),
 
984
            smart.repository.SmartServerRepositoryGetParentMap)
 
985
        self.assertEqual(
870
986
            smart.request.request_handlers.get(
871
987
                'Repository.get_revision_graph'),
872
988
            smart.repository.SmartServerRepositoryGetRevisionGraph)
880
996
            smart.request.request_handlers.get('Repository.lock_write'),
881
997
            smart.repository.SmartServerRepositoryLockWrite)
882
998
        self.assertEqual(
883
 
            smart.request.request_handlers.get(
884
 
                'Repository.stream_knit_data_for_revisions'),
885
 
            smart.repository.SmartServerRepositoryStreamKnitDataForRevisions)
886
 
        self.assertEqual(
887
999
            smart.request.request_handlers.get('Repository.tarball'),
888
1000
            smart.repository.SmartServerRepositoryTarball)
889
1001
        self.assertEqual(