~bzr-pqm/bzr/bzr.dev

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.1.16 by Robert Collins
Merge from jam-integration.
20
from bzrlib.branch import Branch
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
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
24
from bzrlib.tests.test_revision import make_branches
25
from bzrlib.tests import TestCaseInTempDir
26
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
1534.1.16 by Robert Collins
Merge from jam-integration.
27
from bzrlib.trace import mutter
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
28
1115 by Martin Pool
- split fetch tests into a separate file
29
1238 by Martin Pool
- remove a lot of dead code from fetch
30
def has_revision(branch, revision_id):
31
    try:
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
32
        branch.repository.get_revision_xml_file(revision_id)
1238 by Martin Pool
- remove a lot of dead code from fetch
33
        return True
34
    except bzrlib.errors.NoSuchRevision:
35
        return False
36
1393 by Robert Collins
reenable remotebranch tests
37
def fetch_steps(self, br_a, br_b, writable_a):
38
    """A foreign test method for testing fetch locally and remotely."""
39
    def new_branch(name):
40
        os.mkdir(name)
41
        return Branch.initialize(name)
42
            
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
43
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
44
    self.assert_(has_revision(br_b, br_a.revision_history()[2]))
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)
50
    self.assertFalse(has_revision(br_b, 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)
54
    self.assert_(has_revision(br_b, br_a.revision_history()[3]))
55
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
56
    self.assert_(has_revision(br_a, 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)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
66
    self.assert_(has_revision(br_a, br_b.revision_history()[3]))
67
    self.assert_(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)
71
    self.assert_(has_revision(br_b2, br_b.revision_history()[4]))
72
    self.assert_(has_revision(br_b2, br_a.revision_history()[2]))
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)
77
    self.assert_(has_revision(br_a2, br_b.revision_history()[4]))
78
    self.assert_(has_revision(br_a2, br_a.revision_history()[3]))
79
    self.assert_(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
80
81
    br_a3 = new_branch('br_a3')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
82
    self.assertEquals(greedy_fetch(br_a3, br_a2)[0], 0)
1393 by Robert Collins
reenable remotebranch tests
83
    for revno in range(4):
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
84
        self.assertFalse(has_revision(br_a3, br_a.revision_history()[revno]))
1393 by Robert Collins
reenable remotebranch tests
85
    self.assertEqual(greedy_fetch(br_a3, br_a2, br_a.revision_history()[2])[0], 3)
86
    fetched = greedy_fetch(br_a3, br_a2, br_a.revision_history()[3])[0]
1185.64.1 by Goffredo Baroncelli
function file_involved added
87
    self.assertEquals(fetched, 6, "fetched %d instead of 6" % fetched)
1393 by Robert Collins
reenable remotebranch tests
88
    # InstallFailed should be raised if the branch is missing the revision
89
    # that was requested.
90
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
91
                      br_a2, 'pizza')
92
    # InstallFailed should be raised if the branch is missing a revision
93
    # from its own revision history
94
    br_a2.append_revision('a-b-c')
95
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
96
                      br_a2)
97
1238 by Martin Pool
- remove a lot of dead code from fetch
98
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
99
    #TODO: test that fetch correctly does reweaving when needed. RBC 20051008
100
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
101
class TestFetch(TestCaseInTempDir):
1392 by Robert Collins
reinstate testfetch test case
102
103
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
104
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
105
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
106
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
107
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
108
109
class TestMergeFetch(TestCaseInTempDir):
110
111
    def test_merge_fetches_unrelated(self):
112
        """Merge brings across history from unrelated source"""
113
        os.mkdir('br1')
114
        br1 = Branch.initialize('br1')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
115
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
116
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
117
        os.mkdir('br2')
118
        br2 = Branch.initialize('br2')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
119
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
120
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
121
              this_dir='br2')
122
        self._check_revs_present(br2)
123
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
124
    def test_merge_fetches(self):
125
        """Merge brings across history from source"""
126
        os.mkdir('br1')
127
        br1 = Branch.initialize('br1')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
128
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
129
        br1.clone('br2')
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
130
        br2 = Branch.open('br2')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
131
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
132
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
133
        merge(other_revision=['br1', -1], base_revision=[None, None], 
134
              this_dir='br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
135
        self._check_revs_present(br2)
136
137
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
138
        for rev_id in '1-1', '1-2', '2-1':
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
139
            self.assertTrue(br2.repository.has_revision(rev_id))
140
            rev = br2.repository.get_revision(rev_id)
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
141
            self.assertEqual(rev.revision_id, rev_id)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
142
            self.assertTrue(br2.repository.get_inventory(rev_id))
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
143
1404 by Robert Collins
only pull remote text weaves once per fetch operation
144
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
145
146
class TestMergeFileHistory(TestCaseInTempDir):
147
    def setUp(self):
148
        TestCaseInTempDir.setUp(self)
149
        os.mkdir('br1')
150
        br1 = Branch.initialize('br1')
151
        self.build_tree_contents([('br1/file', 'original contents\n')])
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
152
        br1.working_tree().add(['file'], ['this-file-id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
153
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
154
        br1.clone('br2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
155
        br2 = Branch.open('br2')
156
        self.build_tree_contents([('br1/file', 'original from 1\n')])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
157
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
158
        self.build_tree_contents([('br1/file', 'agreement\n')])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
159
        br1.working_tree().commit(message='rev 1-3', rev_id='1-3')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
160
        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)
161
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
162
        self.build_tree_contents([('br2/file', 'agreement\n')])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
163
        br2.working_tree().commit(message='rev 2-2', rev_id='2-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
164
165
    def test_merge_fetches_file_history(self):
166
        """Merge brings across file histories"""
167
        br2 = Branch.open('br2')
168
        merge(other_revision=['br1', -1], base_revision=[None, None], 
169
              this_dir='br2')
170
        for rev_id, text in [('1-2', 'original from 1\n'),
171
                             ('1-3', 'agreement\n'),
172
                             ('2-1', 'contents in 2\n'),
173
                             ('2-2', 'agreement\n')]:
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
174
            self.assertEqualDiff(
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
175
                br2.repository.revision_tree(
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
176
                    rev_id).get_file_text('this-file-id'), text)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
177
178
179
180
1404 by Robert Collins
only pull remote text weaves once per fetch operation
181
class TestHttpFetch(TestCaseWithWebserver):
182
183
    def test_fetch(self):
184
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
185
        br_a, br_b = make_branches(self)
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
186
        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
187
        fetch_steps(self, br_rem_a, br_b, br_a)
188
189
    def test_weaves_are_retrieved_once(self):
190
        self.build_tree(("source/", "source/file", "target/"))
191
        branch = Branch.initialize("source")
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
192
        branch.working_tree().add(["file"], ["id"])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
193
        branch.working_tree().commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
194
        print >>open("source/file", 'w'), "blah"
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
195
        branch.working_tree().commit("changed file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
196
        target = Branch.initialize("target/")
197
        source = Branch.open(self.get_remote_url("source/"))
198
        self.assertEqual(greedy_fetch(target, source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
199
        # this is the path to the literal file. As format changes 
200
        # occur it needs to be updated. FIXME: ask the store for the
201
        # path.
202
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
1404 by Robert Collins
only pull remote text weaves once per fetch operation
203
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
204
            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
205
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
206
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
207
            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
208
                inventory_weave_suffix)]))
1417.1.12 by Robert Collins
cache revision history during read transactions
209
        # this r-h check test will prevent regressions, but it currently already 
210
        # passes, before the patch to cache-rh is applied :[
211
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
212
        self.assertEqual(1,
1530.1.18 by Robert Collins
unbreak test_fetch
213
            len([log for log in self.server.logs if log.endswith(
1417.1.12 by Robert Collins
cache revision history during read transactions
214
                revision_history_suffix)]))
1530.1.18 by Robert Collins
unbreak test_fetch
215
        # FIXME naughty poking in there.
216
        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
217
        # check there is nothing more to fetch
218
        source = Branch.open(self.get_remote_url("source/"))
219
        self.assertEqual(greedy_fetch(target, source), (0, []))
1530.1.18 by Robert Collins
unbreak test_fetch
220
        self.failUnless(self.server.logs[0].endswith('branch-format HTTP/1.1" 200 -'))
221
        self.failUnless(self.server.logs[1].endswith('revision-history HTTP/1.1" 200 -'))
222
        self.assertEqual(2, len(self.server.logs))