~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1115 by Martin Pool
- split fetch tests into a separate file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1115 by Martin Pool
- split fetch tests into a separate file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1115 by Martin Pool
- split fetch tests into a separate file
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
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
18
import re
1238 by Martin Pool
- remove a lot of dead code from fetch
19
import sys
20
2323.8.2 by Aaron Bentley
Give a nicer error on fetch when repos are in incompatible formats
21
from bzrlib import (
22
    bzrdir,
23
    errors,
24
    repository,
25
    )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
26
from bzrlib.branch import Branch
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
27
from bzrlib.bzrdir import BzrDir
1534.1.16 by Robert Collins
Merge from jam-integration.
28
from bzrlib.builtins import merge
1115 by Martin Pool
- split fetch tests into a separate file
29
import bzrlib.errors
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
30
from bzrlib.repofmt import knitrepo
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
31
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
32
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.
33
from bzrlib.tests.test_revision import make_branches
34
from bzrlib.trace import mutter
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
35
from bzrlib.upgrade import Convert
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
36
from bzrlib.workingtree import WorkingTree
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
37
1115 by Martin Pool
- split fetch tests into a separate file
38
1238 by Martin Pool
- remove a lot of dead code from fetch
39
def has_revision(branch, revision_id):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
40
    return branch.repository.has_revision(revision_id)
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
41
1393 by Robert Collins
reenable remotebranch tests
42
def fetch_steps(self, br_a, br_b, writable_a):
43
    """A foreign test method for testing fetch locally and remotely."""
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
44
     
45
    # TODO RBC 20060201 make this a repository test.
46
    repo_b = br_b.repository
47
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
48
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
49
    self.assertEquals(len(br_b.revision_history()), 7)
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
50
    self.assertEquals(br_b.fetch(br_a, br_a.revision_history()[2])[0], 0)
51
    # branch.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)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
53
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
54
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
55
    # fetching the next revision up in sample data copies one revision
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
56
    self.assertEquals(br_b.fetch(br_a, br_a.revision_history()[3])[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
57
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[3]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
58
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
59
    self.assertTrue(br_a.repository.has_revision(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.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
63
    br_b4 = self.make_branch('br_4')
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
64
    count, failures = br_b4.fetch(br_b)
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
65
    self.assertEqual(count, 7)
66
    self.assertEqual(failures, [])
1393 by Robert Collins
reenable remotebranch tests
67
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
68
    self.assertEqual(writable_a.fetch(br_b)[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
69
    self.assertTrue(has_revision(br_a, br_b.revision_history()[3]))
70
    self.assertTrue(has_revision(br_a, br_b.revision_history()[4]))
1393 by Robert Collins
reenable remotebranch tests
71
        
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
72
    br_b2 = self.make_branch('br_b2')
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
73
    self.assertEquals(br_b2.fetch(br_b)[0], 7)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
74
    self.assertTrue(has_revision(br_b2, br_b.revision_history()[4]))
75
    self.assertTrue(has_revision(br_b2, br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
76
    self.assertFalse(has_revision(br_b2, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
77
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
78
    br_a2 = self.make_branch('br_a2')
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
79
    self.assertEquals(br_a2.fetch(br_a)[0], 9)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
80
    self.assertTrue(has_revision(br_a2, br_b.revision_history()[4]))
81
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[3]))
82
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
83
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
84
    br_a3 = self.make_branch('br_a3')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
85
    # pulling a branch with no revisions grabs nothing, regardless of 
86
    # whats in the inventory.
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
87
    self.assertEquals(br_a3.fetch(br_a2)[0], 0)
1393 by Robert Collins
reenable remotebranch tests
88
    for revno in range(4):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
89
        self.assertFalse(
90
            br_a3.repository.has_revision(br_a.revision_history()[revno]))
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
91
    self.assertEqual(br_a3.fetch(br_a2, br_a.revision_history()[2])[0], 3)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
92
    # pull the 3 revisions introduced by a@u-0-3
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
93
    fetched = br_a3.fetch(br_a2, br_a.revision_history()[3])[0]
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
94
    self.assertEquals(fetched, 3, "fetched %d instead of 3" % fetched)
1393 by Robert Collins
reenable remotebranch tests
95
    # InstallFailed should be raised if the branch is missing the revision
96
    # that was requested.
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
97
    self.assertRaises(bzrlib.errors.InstallFailed, br_a3.fetch, br_a2, 'pizza')
1393 by Robert Collins
reenable remotebranch tests
98
    # InstallFailed should be raised if the branch is missing a revision
99
    # from its own revision history
2230.3.28 by Aaron Bentley
Restore default formats
100
    br_a2.append_revision('a-b-c')
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
101
    self.assertRaises(bzrlib.errors.InstallFailed, br_a3.fetch, br_a2)
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
102
2230.3.9 by Aaron Bentley
Fix most fetch tests
103
    # TODO: ADHB 20070116 Perhaps set_last_revision shouldn't accept
104
    #       revisions which are not present?  In that case, this test
105
    #       must be rewritten.
2230.3.12 by Aaron Bentley
Clean up trailing whitespace
106
    #
2230.3.9 by Aaron Bentley
Fix most fetch tests
107
    #       RBC 20060403 the way to do this is to uncommit the revision from
108
    #       the repository after the commit
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
109
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
110
    #TODO: test that fetch correctly does reweaving when needed. RBC 20051008
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
111
    # Note that this means - updating the weave when ghosts are filled in to 
112
    # add the right parents.
113
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
114
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
115
class TestFetch(TestCaseWithTransport):
1392 by Robert Collins
reinstate testfetch test case
116
117
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
118
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
119
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
120
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
121
1558.4.11 by Aaron Bentley
Allow merge against self, make fetching self a noop
122
    def test_fetch_self(self):
123
        wt = self.make_branch_and_tree('br')
124
        self.assertEqual(wt.branch.fetch(wt.branch), (0, []))
125
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
126
    def test_fetch_root_knit(self):
1551.8.43 by Aaron Bentley
Update from reviews
127
        """Ensure that knit2.fetch() updates the root knit
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
128
        
1551.8.43 by Aaron Bentley
Update from reviews
129
        This tests the case where the root has a new revision, but there are no
130
        corresponding filename, parent, contents or other changes.
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
131
        """
1551.8.43 by Aaron Bentley
Update from reviews
132
        knit1_format = bzrdir.BzrDirMetaFormat1()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
133
        knit1_format.repository_format = knitrepo.RepositoryFormatKnit1()
1551.8.43 by Aaron Bentley
Update from reviews
134
        knit2_format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
135
        knit2_format.repository_format = knitrepo.RepositoryFormatKnit3()
1551.8.43 by Aaron Bentley
Update from reviews
136
        # we start with a knit1 repository because that causes the
137
        # root revision to change for each commit, even though the content,
138
        # parent, name, and other attributes are unchanged.
139
        tree = self.make_branch_and_tree('tree', knit1_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
140
        tree.set_root_id('tree-root')
141
        tree.commit('rev1', rev_id='rev1')
142
        tree.commit('rev2', rev_id='rev2')
1551.8.43 by Aaron Bentley
Update from reviews
143
144
        # Now we convert it to a knit2 repository so that it has a root knit
145
        Convert(tree.basedir, knit2_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
146
        tree = WorkingTree.open(tree.basedir)
1551.8.43 by Aaron Bentley
Update from reviews
147
        branch = self.make_branch('branch', format=knit2_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
148
        branch.pull(tree.branch, stop_revision='rev1')
149
        repo = branch.repository
1551.8.43 by Aaron Bentley
Update from reviews
150
        root_knit = repo.weave_store.get_weave('tree-root',
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
151
                                                repo.get_transaction())
1551.8.43 by Aaron Bentley
Update from reviews
152
        # Make sure fetch retrieved only what we requested
153
        self.assertTrue('rev1' in root_knit)
154
        self.assertTrue('rev2' not in root_knit)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
155
        branch.pull(tree.branch)
1551.8.43 by Aaron Bentley
Update from reviews
156
        root_knit = repo.weave_store.get_weave('tree-root',
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
157
                                                repo.get_transaction())
1551.8.43 by Aaron Bentley
Update from reviews
158
        # Make sure that the next revision in the root knit was retrieved,
159
        # even though the text, name, parent_id, etc., were unchanged.
160
        self.assertTrue('rev2' in root_knit)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
161
2323.8.2 by Aaron Bentley
Give a nicer error on fetch when repos are in incompatible formats
162
    def test_fetch_incompatible(self):
163
        knit_tree = self.make_branch_and_tree('knit', format='knit')
164
        knit3_tree = self.make_branch_and_tree('knit3',
165
            format='dirstate-with-subtree')
166
        knit3_tree.commit('blah')
167
        self.assertRaises(errors.IncompatibleRepositories,
168
                          knit_tree.branch.fetch, knit3_tree.branch)
169
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
170
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
171
class TestMergeFetch(TestCaseWithTransport):
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
172
173
    def test_merge_fetches_unrelated(self):
174
        """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.
175
        wt1 = self.make_branch_and_tree('br1')
176
        br1 = wt1.branch
177
        wt1.commit(message='rev 1-1', rev_id='1-1')
178
        wt1.commit(message='rev 1-2', rev_id='1-2')
179
        wt2 = self.make_branch_and_tree('br2')
180
        br2 = wt2.branch
181
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
182
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
183
              this_dir='br2')
184
        self._check_revs_present(br2)
185
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
186
    def test_merge_fetches(self):
187
        """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.
188
        wt1 = self.make_branch_and_tree('br1')
189
        br1 = wt1.branch
190
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
191
        dir_2 = br1.bzrdir.sprout('br2')
192
        br2 = dir_2.open_branch()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
193
        wt1.commit(message='rev 1-2', rev_id='1-2')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
194
        dir_2.open_workingtree().commit(message='rev 2-1', rev_id='2-1')
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
195
        merge(other_revision=['br1', -1], base_revision=[None, None], 
196
              this_dir='br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
197
        self._check_revs_present(br2)
198
199
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
200
        for rev_id in '1-1', '1-2', '2-1':
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
201
            self.assertTrue(br2.repository.has_revision(rev_id))
202
            rev = br2.repository.get_revision(rev_id)
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
203
            self.assertEqual(rev.revision_id, rev_id)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
204
            self.assertTrue(br2.repository.get_inventory(rev_id))
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
205
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
206
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
207
class TestMergeFileHistory(TestCaseWithTransport):
208
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
209
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
210
        super(TestMergeFileHistory, self).setUp()
211
        wt1 = self.make_branch_and_tree('br1')
212
        br1 = wt1.branch
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
213
        self.build_tree_contents([('br1/file', 'original contents\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
214
        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.
215
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
216
        dir_2 = br1.bzrdir.sprout('br2')
217
        br2 = dir_2.open_branch()
218
        wt2 = dir_2.open_workingtree()
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
219
        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.
220
        wt1.commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
221
        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.
222
        wt1.commit(message='rev 1-3', rev_id='1-3')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
223
        self.build_tree_contents([('br2/file', 'contents in 2\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
224
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
225
        self.build_tree_contents([('br2/file', 'agreement\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
226
        wt2.commit(message='rev 2-2', rev_id='2-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
227
228
    def test_merge_fetches_file_history(self):
229
        """Merge brings across file histories"""
230
        br2 = Branch.open('br2')
231
        merge(other_revision=['br1', -1], base_revision=[None, None], 
232
              this_dir='br2')
233
        for rev_id, text in [('1-2', 'original from 1\n'),
234
                             ('1-3', 'agreement\n'),
235
                             ('2-1', 'contents in 2\n'),
236
                             ('2-2', 'agreement\n')]:
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
237
            self.assertEqualDiff(
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
238
                br2.repository.revision_tree(
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
239
                    rev_id).get_file_text('this-file-id'), text)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
240
241
1404 by Robert Collins
only pull remote text weaves once per fetch operation
242
class TestHttpFetch(TestCaseWithWebserver):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
243
    # FIXME RBC 20060124 this really isn't web specific, perhaps an
244
    # instrumented readonly transport? Can we do an instrumented
245
    # adapter and use self.get_readonly_url ?
1404 by Robert Collins
only pull remote text weaves once per fetch operation
246
247
    def test_fetch(self):
248
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
249
        br_a, br_b = make_branches(self)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
250
        br_rem_a = Branch.open(self.get_readonly_url('branch1'))
1404 by Robert Collins
only pull remote text weaves once per fetch operation
251
        fetch_steps(self, br_rem_a, br_b, br_a)
252
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
253
    def _count_log_matches(self, target, logs):
254
        """Count the number of times the target file pattern was fetched in an http log"""
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
255
        get_succeeds_re = re.compile(
256
            '.*"GET .*%s HTTP/1.1" 20[06] - "-" "bzr/%s' %
257
            (     target,                    bzrlib.__version__))
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
258
        c = 0
259
        for line in logs:
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
260
            if get_succeeds_re.match(line):
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
261
                c += 1
262
        return c
263
1404 by Robert Collins
only pull remote text weaves once per fetch operation
264
    def test_weaves_are_retrieved_once(self):
265
        self.build_tree(("source/", "source/file", "target/"))
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
266
        wt = self.make_branch_and_tree('source')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
267
        branch = wt.branch
268
        wt.add(["file"], ["id"])
269
        wt.commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
270
        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.
271
        wt.commit("changed file")
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
272
        target = BzrDir.create_branch_and_repo("target/")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
273
        source = Branch.open(self.get_readonly_url("source/"))
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
274
        self.assertEqual(target.fetch(source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
275
        # this is the path to the literal file. As format changes 
276
        # occur it needs to be updated. FIXME: ask the store for the
277
        # path.
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
278
        self.log("web server logs are:")
279
        http_logs = self.get_readonly_server().logs
280
        self.log('\n'.join(http_logs))
1666.1.6 by Robert Collins
Make knit the default format.
281
        # unfortunately this log entry is branch format specific. We could 
282
        # factor out the 'what files does this format use' to a method on the 
283
        # repository, which would let us to this generically. RBC 20060419
284
        self.assertEqual(1, self._count_log_matches('/ce/id.kndx', http_logs))
285
        self.assertEqual(1, self._count_log_matches('/ce/id.knit', http_logs))
286
        self.assertEqual(1, self._count_log_matches('inventory.kndx', http_logs))
1417.1.12 by Robert Collins
cache revision history during read transactions
287
        # this r-h check test will prevent regressions, but it currently already 
288
        # passes, before the patch to cache-rh is applied :[
2230.3.10 by Aaron Bentley
Genericised test_fetch to handle branch 6 retrieval patterns
289
        self.assertTrue(1 >= self._count_log_matches('revision-history',
290
                                                     http_logs))
291
        self.assertTrue(1 >= self._count_log_matches('last-revision',
292
                                                     http_logs))
1530.1.18 by Robert Collins
unbreak test_fetch
293
        # FIXME naughty poking in there.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
294
        self.get_readonly_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
295
        # check there is nothing more to fetch
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
296
        source = Branch.open(self.get_readonly_url("source/"))
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
297
        self.assertEqual(target.fetch(source), (0, []))
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
298
        # should make just two requests
299
        http_logs = self.get_readonly_server().logs
300
        self.log("web server logs are:")
301
        self.log('\n'.join(http_logs))
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
302
        self.assertEqual(1, self._count_log_matches('branch-format', http_logs))
303
        self.assertEqual(1, self._count_log_matches('branch/format', http_logs))
304
        self.assertEqual(1, self._count_log_matches('repository/format', http_logs))
2230.3.11 by Aaron Bentley
Fix line endings
305
        self.assertTrue(1 >= self._count_log_matches('revision-history',
306
                                                     http_logs))
307
        self.assertTrue(1 >= self._count_log_matches('last-revision',
308
                                                     http_logs))
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
309
        self.assertEqual(4, len(http_logs))