/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.1.16 by Robert Collins
Merge from jam-integration.
21
from bzrlib.builtins import merge
1115 by Martin Pool
- split fetch tests into a separate file
22
import bzrlib.errors
1534.1.16 by Robert Collins
Merge from jam-integration.
23
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.
24
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
25
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.
26
from bzrlib.tests.test_revision import make_branches
27
from bzrlib.trace import mutter
28
from bzrlib.workingtree import WorkingTree
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
29
1115 by Martin Pool
- split fetch tests into a separate file
30
1238 by Martin Pool
- remove a lot of dead code from fetch
31
def has_revision(branch, revision_id):
32
    try:
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
33
        branch.repository.get_revision_xml_file(revision_id)
1238 by Martin Pool
- remove a lot of dead code from fetch
34
        return True
35
    except bzrlib.errors.NoSuchRevision:
36
        return False
37
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
38
1393 by Robert Collins
reenable remotebranch tests
39
def fetch_steps(self, br_a, br_b, writable_a):
40
    """A foreign test method for testing fetch locally and remotely."""
41
    def new_branch(name):
42
        os.mkdir(name)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
43
        return WorkingTree.create_standalone(name).branch
1393 by Robert Collins
reenable remotebranch tests
44
            
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
45
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
46
    self.assert_(has_revision(br_b, br_a.revision_history()[2]))
47
    self.assertEquals(len(br_b.revision_history()), 7)
48
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[2])[0], 0)
1393 by Robert Collins
reenable remotebranch tests
49
50
    # greedy_fetch is not supposed to alter the revision history
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
51
    self.assertEquals(len(br_b.revision_history()), 7)
52
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
53
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
54
    self.assertEquals(len(br_b.revision_history()), 7)
55
    self.assertEquals(greedy_fetch(br_b, br_a, br_a.revision_history()[3])[0], 1)
56
    self.assert_(has_revision(br_b, br_a.revision_history()[3]))
57
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
58
    self.assert_(has_revision(br_a, br_b.revision_history()[5]))
1393 by Robert Collins
reenable remotebranch tests
59
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
60
    # When a non-branch ancestor is missing, it should be unlisted...
1415 by Robert Collins
remove the ancestry weave file
61
    # as its not reference from the inventory weave.
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
62
    br_b4 = new_branch('br_4')
63
    count, failures = greedy_fetch(br_b4, br_b)
64
    self.assertEqual(count, 7)
65
    self.assertEqual(failures, [])
1393 by Robert Collins
reenable remotebranch tests
66
67
    self.assertEqual(greedy_fetch(writable_a, br_b)[0], 1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
68
    self.assert_(has_revision(br_a, br_b.revision_history()[3]))
69
    self.assert_(has_revision(br_a, br_b.revision_history()[4]))
1393 by Robert Collins
reenable remotebranch tests
70
        
71
    br_b2 = new_branch('br_b2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
72
    self.assertEquals(greedy_fetch(br_b2, br_b)[0], 7)
73
    self.assert_(has_revision(br_b2, br_b.revision_history()[4]))
74
    self.assert_(has_revision(br_b2, br_a.revision_history()[2]))
75
    self.assertFalse(has_revision(br_b2, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
76
77
    br_a2 = new_branch('br_a2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
78
    self.assertEquals(greedy_fetch(br_a2, br_a)[0], 9)
79
    self.assert_(has_revision(br_a2, br_b.revision_history()[4]))
80
    self.assert_(has_revision(br_a2, br_a.revision_history()[3]))
81
    self.assert_(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
82
83
    br_a3 = new_branch('br_a3')
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):
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
86
        self.assertFalse(has_revision(br_a3, br_a.revision_history()[revno]))
1393 by Robert Collins
reenable remotebranch tests
87
    self.assertEqual(greedy_fetch(br_a3, br_a2, br_a.revision_history()[2])[0], 3)
88
    fetched = greedy_fetch(br_a3, br_a2, br_a.revision_history()[3])[0]
1185.64.1 by Goffredo Baroncelli
function file_involved added
89
    self.assertEquals(fetched, 6, "fetched %d instead of 6" % fetched)
1393 by Robert Collins
reenable remotebranch tests
90
    # InstallFailed should be raised if the branch is missing the revision
91
    # that was requested.
92
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
93
                      br_a2, 'pizza')
94
    # InstallFailed should be raised if the branch is missing a revision
95
    # from its own revision history
96
    br_a2.append_revision('a-b-c')
97
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
98
                      br_a2)
99
1238 by Martin Pool
- remove a lot of dead code from fetch
100
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
102
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
103
class TestFetch(TestCaseWithTransport):
1392 by Robert Collins
reinstate testfetch test case
104
105
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
106
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
107
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
108
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
109
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
110
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
111
class TestMergeFetch(TestCaseWithTransport):
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
112
113
    def test_merge_fetches_unrelated(self):
114
        """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.
115
        wt1 = self.make_branch_and_tree('br1')
116
        br1 = wt1.branch
117
        wt1.commit(message='rev 1-1', rev_id='1-1')
118
        wt1.commit(message='rev 1-2', rev_id='1-2')
119
        wt2 = self.make_branch_and_tree('br2')
120
        br2 = wt2.branch
121
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
122
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
123
              this_dir='br2')
124
        self._check_revs_present(br2)
125
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
126
    def test_merge_fetches(self):
127
        """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.
128
        wt1 = self.make_branch_and_tree('br1')
129
        br1 = wt1.branch
130
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.28 by Robert Collins
first cut at merge from integration.
131
        br2 = br1.clone('br2')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
132
        wt1.commit(message='rev 1-2', rev_id='1-2')
133
        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
134
        merge(other_revision=['br1', -1], base_revision=[None, None], 
135
              this_dir='br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
136
        self._check_revs_present(br2)
137
138
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
139
        for rev_id in '1-1', '1-2', '2-1':
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
140
            self.assertTrue(br2.repository.has_revision(rev_id))
141
            rev = br2.repository.get_revision(rev_id)
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
142
            self.assertEqual(rev.revision_id, rev_id)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
143
            self.assertTrue(br2.repository.get_inventory(rev_id))
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
144
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
145
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
146
class TestMergeFileHistory(TestCaseWithTransport):
147
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
148
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
149
        super(TestMergeFileHistory, self).setUp()
150
        wt1 = self.make_branch_and_tree('br1')
151
        br1 = wt1.branch
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
152
        self.build_tree_contents([('br1/file', 'original contents\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
153
        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.
154
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.28 by Robert Collins
first cut at merge from integration.
155
        br2 = br1.clone('br2')
156
        wt2 = WorkingTree('br2', br2)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
157
        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.
158
        wt1.commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
159
        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.
160
        wt1.commit(message='rev 1-3', rev_id='1-3')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
161
        self.build_tree_contents([('br2/file', 'contents in 2\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
162
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
163
        self.build_tree_contents([('br2/file', 'agreement\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
164
        wt2.commit(message='rev 2-2', rev_id='2-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
165
166
    def test_merge_fetches_file_history(self):
167
        """Merge brings across file histories"""
168
        br2 = Branch.open('br2')
169
        merge(other_revision=['br1', -1], base_revision=[None, None], 
170
              this_dir='br2')
171
        for rev_id, text in [('1-2', 'original from 1\n'),
172
                             ('1-3', 'agreement\n'),
173
                             ('2-1', 'contents in 2\n'),
174
                             ('2-2', 'agreement\n')]:
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
175
            self.assertEqualDiff(
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
176
                br2.repository.revision_tree(
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
177
                    rev_id).get_file_text('this-file-id'), text)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
178
179
1404 by Robert Collins
only pull remote text weaves once per fetch operation
180
class TestHttpFetch(TestCaseWithWebserver):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
181
    # FIXME RBC 20060124 this really isn't web specific, perhaps an
182
    # instrumented readonly transport? Can we do an instrumented
183
    # adapter and use self.get_readonly_url ?
1404 by Robert Collins
only pull remote text weaves once per fetch operation
184
185
    def test_fetch(self):
186
        #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.
187
        print "TestHttpFetch.test_fetch disabled during transition."
188
        return
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
189
        br_a, br_b = make_branches(self)
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
190
        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
191
        fetch_steps(self, br_rem_a, br_b, br_a)
192
193
    def test_weaves_are_retrieved_once(self):
194
        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.
195
        wt = WorkingTree.create_standalone('source')
196
        branch = wt.branch
197
        wt.add(["file"], ["id"])
198
        wt.commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
199
        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.
200
        wt.commit("changed file")
201
        target = Branch.create("target/")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
202
        source = Branch.open(self.get_remote_url("source/"))
203
        self.assertEqual(greedy_fetch(target, source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
204
        # this is the path to the literal file. As format changes 
205
        # occur it needs to be updated. FIXME: ask the store for the
206
        # path.
207
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
1404 by Robert Collins
only pull remote text weaves once per fetch operation
208
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
209
            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
210
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
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(
1437 by Robert Collins
lock during fetch, which is a separate code path to the special case of cloning
213
                inventory_weave_suffix)]))
1417.1.12 by Robert Collins
cache revision history during read transactions
214
        # this r-h check test will prevent regressions, but it currently already 
215
        # passes, before the patch to cache-rh is applied :[
216
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
217
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
218
            len([log for log in self.server.logs if log.endswith(
1417.1.12 by Robert Collins
cache revision history during read transactions
219
                revision_history_suffix)]))
1530.1.18 by Robert Collins
unbreak test_fetch
220
        # FIXME naughty poking in there.
221
        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
222
        # check there is nothing more to fetch
223
        source = Branch.open(self.get_remote_url("source/"))
224
        self.assertEqual(greedy_fetch(target, source), (0, []))
1530.1.18 by Robert Collins
unbreak test_fetch
225
        self.failUnless(self.server.logs[0].endswith('branch-format HTTP/1.1" 200 -'))
226
        self.failUnless(self.server.logs[1].endswith('revision-history HTTP/1.1" 200 -'))
227
        self.assertEqual(2, len(self.server.logs))