~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_fetch.py

sync with bzr.dev mainline

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
import sys
19
19
 
20
20
import bzrlib.errors
21
 
from bzrlib.selftest.testrevision import make_branches
 
21
from bzrlib.tests.test_revision import make_branches
22
22
from bzrlib.trace import mutter
23
23
from bzrlib.branch import Branch
24
24
from bzrlib.fetch import greedy_fetch
 
25
from bzrlib.merge import merge
 
26
from bzrlib.clone import copy_branch
25
27
 
26
 
from bzrlib.selftest import TestCaseInTempDir
27
 
from bzrlib.selftest.HTTPTestUtil import TestCaseWithWebserver
 
28
from bzrlib.tests import TestCaseInTempDir
 
29
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
28
30
 
29
31
 
30
32
def has_revision(branch, revision_id):
31
33
    try:
32
 
        branch.get_revision_xml_file(revision_id)
 
34
        branch.get_revision_xml(revision_id)
33
35
        return True
34
36
    except bzrlib.errors.NoSuchRevision:
35
37
        return False
40
42
        os.mkdir(name)
41
43
        return Branch.initialize(name)
42
44
            
43
 
    assert not has_revision(br_b, br_a.revision_history()[3])
44
 
    assert has_revision(br_b, br_a.revision_history()[2])
45
 
    assert len(br_b.revision_history()) == 7
46
 
    assert greedy_fetch(br_b, br_a, br_a.revision_history()[2])[0] == 0
 
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)
47
49
 
48
50
    # greedy_fetch is not supposed to alter the revision history
49
 
    assert len(br_b.revision_history()) == 7
50
 
    assert not has_revision(br_b, br_a.revision_history()[3])
 
51
    self.assertEquals(len(br_b.revision_history()), 7)
 
52
    self.assertFalse(has_revision(br_b, br_a.revision_history()[3]))
51
53
 
52
 
    assert len(br_b.revision_history()) == 7
53
 
    assert greedy_fetch(br_b, br_a, br_a.revision_history()[3])[0] == 1
54
 
    assert has_revision(br_b, br_a.revision_history()[3])
55
 
    assert not has_revision(br_a, br_b.revision_history()[6])
56
 
    assert has_revision(br_a, br_b.revision_history()[5])
 
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]))
57
59
 
58
60
    # When a non-branch ancestor is missing, it should be unlisted...
59
61
    # as its not reference from the inventory weave.
63
65
    self.assertEqual(failures, [])
64
66
 
65
67
    self.assertEqual(greedy_fetch(writable_a, br_b)[0], 1)
66
 
    assert has_revision(br_a, br_b.revision_history()[3])
67
 
    assert has_revision(br_a, br_b.revision_history()[4])
 
68
    self.assert_(has_revision(br_a, br_b.revision_history()[3]))
 
69
    self.assert_(has_revision(br_a, br_b.revision_history()[4]))
68
70
        
69
71
    br_b2 = new_branch('br_b2')
70
 
    assert greedy_fetch(br_b2, br_b)[0] == 7
71
 
    assert has_revision(br_b2, br_b.revision_history()[4])
72
 
    assert has_revision(br_b2, br_a.revision_history()[2])
73
 
    assert not has_revision(br_b2, br_a.revision_history()[3])
 
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]))
74
76
 
75
77
    br_a2 = new_branch('br_a2')
76
 
    assert greedy_fetch(br_a2, br_a)[0] == 9
77
 
    assert has_revision(br_a2, br_b.revision_history()[4])
78
 
    assert has_revision(br_a2, br_a.revision_history()[3])
79
 
    assert has_revision(br_a2, br_a.revision_history()[2])
 
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]))
80
82
 
81
83
    br_a3 = new_branch('br_a3')
82
 
    assert greedy_fetch(br_a3, br_a2)[0] == 0
 
84
    self.assertEquals(greedy_fetch(br_a3, br_a2)[0], 0)
83
85
    for revno in range(4):
84
 
        assert not has_revision(br_a3, br_a.revision_history()[revno])
 
86
        self.assertFalse(has_revision(br_a3, br_a.revision_history()[revno]))
85
87
    self.assertEqual(greedy_fetch(br_a3, br_a2, br_a.revision_history()[2])[0], 3)
86
88
    fetched = greedy_fetch(br_a3, br_a2, br_a.revision_history()[3])[0]
87
 
    assert fetched == 3, "fetched %d instead of 3" % fetched
 
89
    self.assertEquals(fetched, 3, "fetched %d instead of 3" % fetched)
88
90
    # InstallFailed should be raised if the branch is missing the revision
89
91
    # that was requested.
90
92
    self.assertRaises(bzrlib.errors.InstallFailed, greedy_fetch, br_a3,
102
104
 
103
105
    def test_fetch(self):
104
106
        #highest indices a: 5, b: 7
105
 
        br_a, br_b = make_branches()
 
107
        br_a, br_b = make_branches(self)
106
108
        fetch_steps(self, br_a, br_b, br_a)
107
109
 
108
110
 
 
111
class TestMergeFetch(TestCaseInTempDir):
 
112
 
 
113
    def test_merge_fetches_unrelated(self):
 
114
        """Merge brings across history from unrelated source"""
 
115
        os.mkdir('br1')
 
116
        br1 = Branch.initialize('br1')
 
117
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
 
118
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
 
119
        os.mkdir('br2')
 
120
        br2 = Branch.initialize('br2')
 
121
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
 
122
        merge(other_revision=['br1', -1], base_revision=['br1', 0],
 
123
              this_dir='br2')
 
124
        self._check_revs_present(br2)
 
125
 
 
126
    def test_merge_fetches(self):
 
127
        """Merge brings across history from source"""
 
128
        os.mkdir('br1')
 
129
        br1 = Branch.initialize('br1')
 
130
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
 
131
        copy_branch(br1, 'br2')
 
132
        br2 = Branch.open('br2')
 
133
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
 
134
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
 
135
        merge(other_revision=['br1', -1], base_revision=[None, None], 
 
136
              this_dir='br2')
 
137
        self._check_revs_present(br2)
 
138
 
 
139
    def _check_revs_present(self, br2):
 
140
        for rev_id in '1-1', '1-2', '2-1':
 
141
            self.assertTrue(br2.has_revision(rev_id))
 
142
            rev = br2.get_revision(rev_id)
 
143
            self.assertEqual(rev.revision_id, rev_id)
 
144
            self.assertTrue(br2.get_inventory(rev_id))
 
145
 
 
146
 
 
147
 
 
148
class TestMergeFileHistory(TestCaseInTempDir):
 
149
    def setUp(self):
 
150
        TestCaseInTempDir.setUp(self)
 
151
        os.mkdir('br1')
 
152
        br1 = Branch.initialize('br1')
 
153
        self.build_tree_contents([('br1/file', 'original contents\n')])
 
154
        br1.working_tree().add(['file'], ['this-file-id'])
 
155
        br1.working_tree().commit(message='rev 1-1', rev_id='1-1')
 
156
        copy_branch(br1, 'br2')
 
157
        br2 = Branch.open('br2')
 
158
        self.build_tree_contents([('br1/file', 'original from 1\n')])
 
159
        br1.working_tree().commit(message='rev 1-2', rev_id='1-2')
 
160
        self.build_tree_contents([('br1/file', 'agreement\n')])
 
161
        br1.working_tree().commit(message='rev 1-3', rev_id='1-3')
 
162
        self.build_tree_contents([('br2/file', 'contents in 2\n')])
 
163
        br2.working_tree().commit(message='rev 2-1', rev_id='2-1')
 
164
        self.build_tree_contents([('br2/file', 'agreement\n')])
 
165
        br2.working_tree().commit(message='rev 2-2', rev_id='2-2')
 
166
 
 
167
    def test_merge_fetches_file_history(self):
 
168
        """Merge brings across file histories"""
 
169
        br2 = Branch.open('br2')
 
170
        merge(other_revision=['br1', -1], base_revision=[None, None], 
 
171
              this_dir='br2')
 
172
        for rev_id, text in [('1-2', 'original from 1\n'),
 
173
                             ('1-3', 'agreement\n'),
 
174
                             ('2-1', 'contents in 2\n'),
 
175
                             ('2-2', 'agreement\n')]:
 
176
            self.assertEqualDiff(br2.revision_tree(rev_id).get_file_text('this-file-id'),
 
177
                                 text)
 
178
 
 
179
 
 
180
 
 
181
 
109
182
class TestHttpFetch(TestCaseWithWebserver):
110
183
 
111
 
    def setUp(self):
112
 
        super(TestHttpFetch, self).setUp()
113
 
        self.weblogs = []
114
 
 
115
184
    def test_fetch(self):
116
185
        #highest indices a: 5, b: 7
117
 
        br_a, br_b = make_branches()
 
186
        br_a, br_b = make_branches(self)
118
187
        br_rem_a = Branch.open(self.get_remote_url(br_a._transport.base))
119
188
        fetch_steps(self, br_rem_a, br_b, br_a)
120
189
 
121
 
    def log(self, *args):
122
 
        """Capture web server log messages for introspection."""
123
 
        super(TestHttpFetch, self).log(*args)
124
 
        if args[0].startswith("webserver"):
125
 
            self.weblogs.append(args[0])
126
 
 
127
190
    def test_weaves_are_retrieved_once(self):
128
191
        self.build_tree(("source/", "source/file", "target/"))
129
192
        branch = Branch.initialize("source")
130
 
        branch.add(["file"], ["id"])
131
 
        branch.commit("added file")
 
193
        branch.working_tree().add(["file"], ["id"])
 
194
        branch.working_tree().commit("added file")
132
195
        print >>open("source/file", 'w'), "blah"
133
 
        branch.commit("changed file")
 
196
        branch.working_tree().commit("changed file")
134
197
        target = Branch.initialize("target/")
135
198
        source = Branch.open(self.get_remote_url("source/"))
136
199
        self.assertEqual(greedy_fetch(target, source), (2, []))
139
202
        # path.
140
203
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
141
204
        self.assertEqual(1,
142
 
            len([log for log in self.weblogs if log.endswith(weave_suffix)]))
 
205
            len([log for log in self.server.logs if log.endswith(weave_suffix)]))
143
206
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
144
207
        self.assertEqual(1,
145
 
            len([log for log in self.weblogs if log.endswith(
 
208
            len([log for log in self.server.logs if log.endswith(
146
209
                inventory_weave_suffix)]))
147
210
        # this r-h check test will prevent regressions, but it currently already 
148
211
        # passes, before the patch to cache-rh is applied :[
149
212
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
150
213
        self.assertEqual(1,
151
 
            len([log for log in self.weblogs if log.endswith(
 
214
            len([log for log in self.server.logs if log.endswith(
152
215
                revision_history_suffix)]))
153
 
        self.weblogs = []
 
216
        # FIXME naughty poking in there.
 
217
        self.server.logs = []
154
218
        # check there is nothing more to fetch
155
219
        source = Branch.open(self.get_remote_url("source/"))
156
220
        self.assertEqual(greedy_fetch(target, source), (0, []))
157
 
        self.failUnless(self.weblogs[0].endswith('branch-format HTTP/1.1" 200 -'))
158
 
        self.failUnless(self.weblogs[1].endswith('revision-history HTTP/1.1" 200 -'))
159
 
        self.assertEqual(2, len(self.weblogs))
 
221
        self.failUnless(self.server.logs[0].endswith('branch-format HTTP/1.1" 200 -'))
 
222
        self.failUnless(self.server.logs[1].endswith('revision-history HTTP/1.1" 200 -'))
 
223
        self.assertEqual(2, len(self.server.logs))