/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
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
21
from bzrlib.bzrdir import BzrDir
1534.1.16 by Robert Collins
Merge from jam-integration.
22
from bzrlib.builtins import merge
1115 by Martin Pool
- split fetch tests into a separate file
23
import bzrlib.errors
1534.1.16 by Robert Collins
Merge from jam-integration.
24
from bzrlib.fetch import greedy_fetch
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):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
33
    return branch.repository.has_revision(revision_id)
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
34
1393 by Robert Collins
reenable remotebranch tests
35
def fetch_steps(self, br_a, br_b, writable_a):
36
    """A foreign test method for testing fetch locally and remotely."""
37
    def new_branch(name):
38
        os.mkdir(name)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
39
        return WorkingTree.create_standalone(name).branch
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
40
     
41
    # TODO RBC 20060201 make this a repository test.
42
    repo_b = br_b.repository
43
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
44
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
45
    self.assertEquals(len(br_b.revision_history()), 7)
46
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[2])[0], 0)
1393 by Robert Collins
reenable remotebranch tests
47
48
    # greedy_fetch is not supposed to alter the revision history
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
49
    self.assertEquals(len(br_b.revision_history()), 7)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
50
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
51
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
52
    self.assertEquals(len(br_b.revision_history()), 7)
53
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[3])[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
54
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[3]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
55
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
56
    self.assertTrue(br_a.repository.has_revision(br_b.revision_history()[5]))
1393 by Robert Collins
reenable remotebranch tests
57
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
58
    # When a non-branch ancestor is missing, it should be unlisted...
1415 by Robert Collins
remove the ancestry weave file
59
    # as its not reference from the inventory weave.
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
60
    br_b4 = new_branch('br_4')
61
    count, failures = greedy_fetch(br_b4, br_b)
62
    self.assertEqual(count, 7)
63
    self.assertEqual(failures, [])
1393 by Robert Collins
reenable remotebranch tests
64
65
    self.assertEqual(greedy_fetch(writable_a, br_b)[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
66
    self.assertTrue(has_revision(br_a, br_b.revision_history()[3]))
67
    self.assertTrue(has_revision(br_a, br_b.revision_history()[4]))
1393 by Robert Collins
reenable remotebranch tests
68
        
69
    br_b2 = new_branch('br_b2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
70
    self.assertEquals(greedy_fetch(br_b2, br_b)[0], 7)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
71
    self.assertTrue(has_revision(br_b2, br_b.revision_history()[4]))
72
    self.assertTrue(has_revision(br_b2, br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
73
    self.assertFalse(has_revision(br_b2, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
74
75
    br_a2 = new_branch('br_a2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
76
    self.assertEquals(greedy_fetch(br_a2, br_a)[0], 9)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
77
    self.assertTrue(has_revision(br_a2, br_b.revision_history()[4]))
78
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[3]))
79
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
80
81
    br_a3 = new_branch('br_a3')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
82
    # pulling a branch with no revisions grabs nothing, regardless of 
83
    # whats in the inventory.
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
84
    self.assertEquals(greedy_fetch(br_a3, br_a2)[0], 0)
1393 by Robert Collins
reenable remotebranch tests
85
    for revno in range(4):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
86
        self.assertFalse(
87
            br_a3.repository.has_revision(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)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
89
    # pull the 3 revisions introduced by a@u-0-3
1393 by Robert Collins
reenable remotebranch tests
90
    fetched = greedy_fetch(br_a3, br_a2, br_a.revision_history()[3])[0]
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
91
    self.assertEquals(fetched, 3, "fetched %d instead of 3" % fetched)
1393 by Robert Collins
reenable remotebranch tests
92
    # InstallFailed should be raised if the branch is missing the revision
93
    # that was requested.
94
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
95
                      br_a2, 'pizza')
96
    # InstallFailed should be raised if the branch is missing a revision
97
    # from its own revision history
98
    br_a2.append_revision('a-b-c')
99
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
100
                      br_a2)
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
101
    #TODO: test that fetch correctly does reweaving when needed. RBC 20051008
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
102
    # Note that this means - updating the weave when ghosts are filled in to 
103
    # add the right parents.
104
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
105
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
106
class TestFetch(TestCaseWithTransport):
1392 by Robert Collins
reinstate testfetch test case
107
108
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
109
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
110
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
111
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
112
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
113
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
114
class TestMergeFetch(TestCaseWithTransport):
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
115
116
    def test_merge_fetches_unrelated(self):
117
        """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.
118
        wt1 = self.make_branch_and_tree('br1')
119
        br1 = wt1.branch
120
        wt1.commit(message='rev 1-1', rev_id='1-1')
121
        wt1.commit(message='rev 1-2', rev_id='1-2')
122
        wt2 = self.make_branch_and_tree('br2')
123
        br2 = wt2.branch
124
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
125
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
126
              this_dir='br2')
127
        self._check_revs_present(br2)
128
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
129
    def test_merge_fetches(self):
130
        """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.
131
        wt1 = self.make_branch_and_tree('br1')
132
        br1 = wt1.branch
133
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.28 by Robert Collins
first cut at merge from integration.
134
        br2 = br1.clone('br2')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
135
        wt1.commit(message='rev 1-2', rev_id='1-2')
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
136
        WorkingTree.create(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
137
        merge(other_revision=['br1', -1], base_revision=[None, None], 
138
              this_dir='br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
139
        self._check_revs_present(br2)
140
141
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
142
        for rev_id in '1-1', '1-2', '2-1':
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
143
            self.assertTrue(br2.repository.has_revision(rev_id))
144
            rev = br2.repository.get_revision(rev_id)
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
145
            self.assertEqual(rev.revision_id, rev_id)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
146
            self.assertTrue(br2.repository.get_inventory(rev_id))
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
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.28 by Robert Collins
first cut at merge from integration.
156
        wt1.add('file', 'this-file-id')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
157
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.28 by Robert Collins
first cut at merge from integration.
158
        br2 = br1.clone('br2')
159
        wt2 = WorkingTree('br2', br2)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
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')])
1534.4.28 by Robert Collins
first cut at merge from integration.
165
        wt2.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')])
1534.4.28 by Robert Collins
first cut at merge from integration.
167
        wt2.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')]:
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
178
            self.assertEqualDiff(
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
179
                br2.repository.revision_tree(
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
180
                    rev_id).get_file_text('this-file-id'), text)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
181
182
1404 by Robert Collins
only pull remote text weaves once per fetch operation
183
class TestHttpFetch(TestCaseWithWebserver):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
184
    # FIXME RBC 20060124 this really isn't web specific, perhaps an
185
    # instrumented readonly transport? Can we do an instrumented
186
    # adapter and use self.get_readonly_url ?
1404 by Robert Collins
only pull remote text weaves once per fetch operation
187
188
    def test_fetch(self):
189
        #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.
190
        print "TestHttpFetch.test_fetch disabled during transition."
191
        return
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
192
        br_a, br_b = make_branches(self)
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
193
        br_rem_a = Branch.open(self.get_remote_url(br_a.base))
1404 by Robert Collins
only pull remote text weaves once per fetch operation
194
        fetch_steps(self, br_rem_a, br_b, br_a)
195
196
    def test_weaves_are_retrieved_once(self):
197
        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.
198
        wt = WorkingTree.create_standalone('source')
199
        branch = wt.branch
200
        wt.add(["file"], ["id"])
201
        wt.commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
202
        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.
203
        wt.commit("changed file")
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
204
        target = BzrDir.create_branch_and_repo("target/")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
205
        source = Branch.open(self.get_remote_url("source/"))
206
        self.assertEqual(greedy_fetch(target, source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
207
        # this is the path to the literal file. As format changes 
208
        # occur it needs to be updated. FIXME: ask the store for the
209
        # path.
210
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
1404 by Robert Collins
only pull remote text weaves once per fetch operation
211
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
212
            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
213
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
214
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
215
            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
216
                inventory_weave_suffix)]))
1417.1.12 by Robert Collins
cache revision history during read transactions
217
        # this r-h check test will prevent regressions, but it currently already 
218
        # passes, before the patch to cache-rh is applied :[
219
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
220
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
221
            len([log for log in self.server.logs if log.endswith(
1417.1.12 by Robert Collins
cache revision history during read transactions
222
                revision_history_suffix)]))
1530.1.18 by Robert Collins
unbreak test_fetch
223
        # FIXME naughty poking in there.
224
        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
225
        # check there is nothing more to fetch
226
        source = Branch.open(self.get_remote_url("source/"))
227
        self.assertEqual(greedy_fetch(target, source), (0, []))
1530.1.18 by Robert Collins
unbreak test_fetch
228
        self.failUnless(self.server.logs[0].endswith('branch-format HTTP/1.1" 200 -'))
229
        self.failUnless(self.server.logs[1].endswith('revision-history HTTP/1.1" 200 -'))
230
        self.assertEqual(2, len(self.server.logs))