/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1115 by Martin Pool
- split fetch tests into a separate file
1
# Copyright (C) 2005 by Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1238 by Martin Pool
- remove a lot of dead code from fetch
16
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
17
import os
1238 by Martin Pool
- remove a lot of dead code from fetch
18
import sys
19
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
20
from bzrlib.branch import Branch
21
from bzrlib.clone import copy_branch
1115 by Martin Pool
- split fetch tests into a separate file
22
import bzrlib.errors
1238 by Martin Pool
- remove a lot of dead code from fetch
23
from bzrlib.fetch import greedy_fetch
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
24
from bzrlib.merge import merge
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
25
from bzrlib.tests import TestCaseWithTransport
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
26
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
27
from bzrlib.tests.test_revision import make_branches
28
from bzrlib.trace import mutter
29
from bzrlib.workingtree import WorkingTree
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
30
1115 by Martin Pool
- split fetch tests into a separate file
31
1238 by Martin Pool
- remove a lot of dead code from fetch
32
def has_revision(branch, revision_id):
33
    try:
1185.42.5 by Jelmer Vernooij
Make get_revision_xml_file() private
34
        branch.get_revision_xml(revision_id)
1238 by Martin Pool
- remove a lot of dead code from fetch
35
        return True
36
    except bzrlib.errors.NoSuchRevision:
37
        return False
38
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
39
1393 by Robert Collins
reenable remotebranch tests
40
def fetch_steps(self, br_a, br_b, writable_a):
41
    """A foreign test method for testing fetch locally and remotely."""
42
    def new_branch(name):
43
        os.mkdir(name)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
44
        return WorkingTree.create_standalone(name).branch
1393 by Robert Collins
reenable remotebranch tests
45
            
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
46
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
47
    self.assert_(has_revision(br_b, br_a.revision_history()[2]))
48
    self.assertEquals(len(br_b.revision_history()), 7)
49
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[2])[0], 0)
1393 by Robert Collins
reenable remotebranch tests
50
51
    # greedy_fetch is not supposed to alter the revision history
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
52
    self.assertEquals(len(br_b.revision_history()), 7)
53
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
54
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
55
    self.assertEquals(len(br_b.revision_history()), 7)
56
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[3])[0], 1)
57
    self.assert_(has_revision(br_b, br_a.revision_history()[3]))
58
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
59
    self.assert_(has_revision(br_a, br_b.revision_history()[5]))
1393 by Robert Collins
reenable remotebranch tests
60
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
61
    # When a non-branch ancestor is missing, it should be unlisted...
1415 by Robert Collins
remove the ancestry weave file
62
    # as its not reference from the inventory weave.
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
63
    br_b4 = new_branch('br_4')
64
    count, failures = greedy_fetch(br_b4, br_b)
65
    self.assertEqual(count, 7)
66
    self.assertEqual(failures, [])
1393 by Robert Collins
reenable remotebranch tests
67
68
    self.assertEqual(greedy_fetch(writable_a, br_b)[0], 1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
69
    self.assert_(has_revision(br_a, br_b.revision_history()[3]))
70
    self.assert_(has_revision(br_a, br_b.revision_history()[4]))
1393 by Robert Collins
reenable remotebranch tests
71
        
72
    br_b2 = new_branch('br_b2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
73
    self.assertEquals(greedy_fetch(br_b2, br_b)[0], 7)
74
    self.assert_(has_revision(br_b2, br_b.revision_history()[4]))
75
    self.assert_(has_revision(br_b2, br_a.revision_history()[2]))
76
    self.assertFalse(has_revision(br_b2, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
77
78
    br_a2 = new_branch('br_a2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
79
    self.assertEquals(greedy_fetch(br_a2, br_a)[0], 9)
80
    self.assert_(has_revision(br_a2, br_b.revision_history()[4]))
81
    self.assert_(has_revision(br_a2, br_a.revision_history()[3]))
82
    self.assert_(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
83
84
    br_a3 = new_branch('br_a3')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
85
    self.assertEquals(greedy_fetch(br_a3, br_a2)[0], 0)
1393 by Robert Collins
reenable remotebranch tests
86
    for revno in range(4):
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
87
        self.assertFalse(has_revision(br_a3, br_a.revision_history()[revno]))
1393 by Robert Collins
reenable remotebranch tests
88
    self.assertEqual(greedy_fetch(br_a3, br_a2, br_a.revision_history()[2])[0], 3)
89
    fetched = greedy_fetch(br_a3, br_a2, br_a.revision_history()[3])[0]
1185.64.1 by Goffredo Baroncelli
function file_involved added
90
    self.assertEquals(fetched, 6, "fetched %d instead of 6" % fetched)
1393 by Robert Collins
reenable remotebranch tests
91
    # InstallFailed should be raised if the branch is missing the revision
92
    # that was requested.
93
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
94
                      br_a2, 'pizza')
95
    # InstallFailed should be raised if the branch is missing a revision
96
    # from its own revision history
97
    br_a2.append_revision('a-b-c')
98
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
99
                      br_a2)
100
1238 by Martin Pool
- remove a lot of dead code from fetch
101
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
102
    #TODO: test that fetch correctly does reweaving when needed. RBC 20051008
103
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
104
class TestFetch(TestCaseWithTransport):
1392 by Robert Collins
reinstate testfetch test case
105
106
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
107
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
108
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
109
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
110
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
111
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
112
class TestMergeFetch(TestCaseWithTransport):
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
113
114
    def test_merge_fetches_unrelated(self):
115
        """Merge brings across history from unrelated source"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
116
        wt1 = self.make_branch_and_tree('br1')
117
        br1 = wt1.branch
118
        wt1.commit(message='rev 1-1', rev_id='1-1')
119
        wt1.commit(message='rev 1-2', rev_id='1-2')
120
        wt2 = self.make_branch_and_tree('br2')
121
        br2 = wt2.branch
122
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
123
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
124
              this_dir='br2')
125
        self._check_revs_present(br2)
126
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
127
    def test_merge_fetches(self):
128
        """Merge brings across history from source"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
129
        wt1 = self.make_branch_and_tree('br1')
130
        br1 = wt1.branch
131
        wt1.commit(message='rev 1-1', rev_id='1-1')
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
132
        copy_branch(br1, 'br2')
133
        br2 = Branch.open('br2')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
134
        wt1.commit(message='rev 1-2', rev_id='1-2')
135
        WorkingTree('br2', br2).commit(message='rev 2-1', rev_id='2-1')
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
136
        merge(other_revision=['br1', -1], base_revision=[None, None], 
137
              this_dir='br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
138
        self._check_revs_present(br2)
139
140
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
141
        for rev_id in '1-1', '1-2', '2-1':
142
            self.assertTrue(br2.has_revision(rev_id))
143
            rev = br2.get_revision(rev_id)
144
            self.assertEqual(rev.revision_id, rev_id)
145
            self.assertTrue(br2.get_inventory(rev_id))
146
1404 by Robert Collins
only pull remote text weaves once per fetch operation
147
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
148
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
149
class TestMergeFileHistory(TestCaseWithTransport):
150
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
151
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
152
        super(TestMergeFileHistory, self).setUp()
153
        wt1 = self.make_branch_and_tree('br1')
154
        br1 = wt1.branch
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
155
        self.build_tree_contents([('br1/file', 'original contents\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
156
        wt1.add(['file'], ['this-file-id'])
157
        wt1.commit(message='rev 1-1', rev_id='1-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
158
        copy_branch(br1, 'br2')
159
        br2 = Branch.open('br2')
160
        self.build_tree_contents([('br1/file', 'original from 1\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
161
        wt1.commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
162
        self.build_tree_contents([('br1/file', 'agreement\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
163
        wt1.commit(message='rev 1-3', rev_id='1-3')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
164
        self.build_tree_contents([('br2/file', 'contents in 2\n')])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
165
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
166
        self.build_tree_contents([('br2/file', 'agreement\n')])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
167
        br2.working_tree().commit(message='rev 2-2', rev_id='2-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
168
169
    def test_merge_fetches_file_history(self):
170
        """Merge brings across file histories"""
171
        br2 = Branch.open('br2')
172
        merge(other_revision=['br1', -1], base_revision=[None, None], 
173
              this_dir='br2')
174
        for rev_id, text in [('1-2', 'original from 1\n'),
175
                             ('1-3', 'agreement\n'),
176
                             ('2-1', 'contents in 2\n'),
177
                             ('2-2', 'agreement\n')]:
178
            self.assertEqualDiff(br2.revision_tree(rev_id).get_file_text('this-file-id'),
179
                                 text)
180
181
1404 by Robert Collins
only pull remote text weaves once per fetch operation
182
class TestHttpFetch(TestCaseWithWebserver):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
183
    # FIXME RBC 20060124 this really isn't web specific, perhaps an
184
    # instrumented readonly transport? Can we do an instrumented
185
    # adapter and use self.get_readonly_url ?
1404 by Robert Collins
only pull remote text weaves once per fetch operation
186
187
    def test_fetch(self):
188
        #highest indices a: 5, b: 7
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
189
        print "TestHttpFetch.test_fetch disabled during transition."
190
        return
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
191
        br_a, br_b = make_branches(self)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
192
        br_rem_a = Branch.open(self.get_remote_url(br_a._transport.base))
193
        fetch_steps(self, br_rem_a, br_b, br_a)
194
195
    def test_weaves_are_retrieved_once(self):
196
        self.build_tree(("source/", "source/file", "target/"))
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
197
        wt = WorkingTree.create_standalone('source')
198
        branch = wt.branch
199
        wt.add(["file"], ["id"])
200
        wt.commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
201
        print >>open("source/file", 'w'), "blah"
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
202
        wt.commit("changed file")
203
        target = Branch.create("target/")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
204
        source = Branch.open(self.get_remote_url("source/"))
205
        self.assertEqual(greedy_fetch(target, source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
206
        # this is the path to the literal file. As format changes 
207
        # occur it needs to be updated. FIXME: ask the store for the
208
        # path.
209
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
1404 by Robert Collins
only pull remote text weaves once per fetch operation
210
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
211
            len([log for log in self.server.logs if log.endswith(weave_suffix)]))
1437 by Robert Collins
lock during fetch, which is a separate code path to the special case of cloning
212
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
213
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
214
            len([log for log in self.server.logs if log.endswith(
1437 by Robert Collins
lock during fetch, which is a separate code path to the special case of cloning
215
                inventory_weave_suffix)]))
1417.1.12 by Robert Collins
cache revision history during read transactions
216
        # this r-h check test will prevent regressions, but it currently already 
217
        # passes, before the patch to cache-rh is applied :[
218
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
219
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
220
            len([log for log in self.server.logs if log.endswith(
1417.1.12 by Robert Collins
cache revision history during read transactions
221
                revision_history_suffix)]))
1530.1.18 by Robert Collins
unbreak test_fetch
222
        # FIXME naughty poking in there.
223
        self.server.logs = []
1417.1.13 by Robert Collins
do not download remote ancestry.weave if the target revision we are stopping at is in our local store
224
        # check there is nothing more to fetch
225
        source = Branch.open(self.get_remote_url("source/"))
226
        self.assertEqual(greedy_fetch(target, source), (0, []))
1530.1.18 by Robert Collins
unbreak test_fetch
227
        self.failUnless(self.server.logs[0].endswith('branch-format HTTP/1.1" 200 -'))
228
        self.failUnless(self.server.logs[1].endswith('revision-history HTTP/1.1" 200 -'))
229
        self.assertEqual(2, len(self.server.logs))