~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
1115 by Martin Pool
- split fetch tests into a separate file
20
import bzrlib.errors
21
from bzrlib.selftest.testrevision import make_branches
22
from bzrlib.trace import mutter
23
from bzrlib.branch import Branch
1238 by Martin Pool
- remove a lot of dead code from fetch
24
from bzrlib.fetch import greedy_fetch
1115 by Martin Pool
- split fetch tests into a separate file
25
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
26
from bzrlib.selftest import TestCaseInTempDir
1404 by Robert Collins
only pull remote text weaves once per fetch operation
27
from bzrlib.selftest.HTTPTestUtil import TestCaseWithWebserver
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:
32
        branch.get_revision_xml_file(revision_id)
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
            
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
47
48
    # 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
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])
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)
66
    assert has_revision(br_a, br_b.revision_history()[3])
67
    assert has_revision(br_a, br_b.revision_history()[4])
68
        
69
    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])
74
75
    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])
80
81
    br_a3 = new_branch('br_a3')
82
    assert greedy_fetch(br_a3, br_a2)[0] == 0
83
    for revno in range(4):
84
        assert not has_revision(br_a3, br_a.revision_history()[revno])
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]
87
    assert fetched == 3, "fetched %d instead of 3" % fetched
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
105
        br_a, br_b = make_branches()
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
108
109
class TestHttpFetch(TestCaseWithWebserver):
110
111
    def setUp(self):
112
        super(TestHttpFetch, self).setUp()
113
        self.weblogs = []
114
115
    def test_fetch(self):
116
        #highest indices a: 5, b: 7
117
        br_a, br_b = make_branches()
118
        br_rem_a = Branch.open(self.get_remote_url(br_a._transport.base))
119
        fetch_steps(self, br_rem_a, br_b, br_a)
120
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
    def test_weaves_are_retrieved_once(self):
128
        self.build_tree(("source/", "source/file", "target/"))
129
        branch = Branch.initialize("source")
130
        branch.add(["file"], ["id"])
131
        branch.commit("added file")
132
        print >>open("source/file", 'w'), "blah"
133
        branch.commit("changed file")
134
        target = Branch.initialize("target/")
135
        source = Branch.open(self.get_remote_url("source/"))
136
        self.assertEqual(greedy_fetch(target, source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
137
        # this is the path to the literal file. As format changes 
138
        # occur it needs to be updated. FIXME: ask the store for the
139
        # path.
140
        weave_suffix = 'weaves/ce/id.weave HTTP/1.1" 200 -'
1404 by Robert Collins
only pull remote text weaves once per fetch operation
141
        self.assertEqual(1,
142
            len([log for log in self.weblogs if log.endswith(weave_suffix)]))
1437 by Robert Collins
lock during fetch, which is a separate code path to the special case of cloning
143
        inventory_weave_suffix = 'inventory.weave HTTP/1.1" 200 -'
144
        self.assertEqual(1,
145
            len([log for log in self.weblogs if log.endswith(
146
                inventory_weave_suffix)]))
1417.1.12 by Robert Collins
cache revision history during read transactions
147
        # this r-h check test will prevent regressions, but it currently already 
148
        # passes, before the patch to cache-rh is applied :[
149
        revision_history_suffix = 'revision-history HTTP/1.1" 200 -'
150
        self.assertEqual(1,
151
            len([log for log in self.weblogs if log.endswith(
152
                revision_history_suffix)]))
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
153
        self.weblogs = []
154
        # check there is nothing more to fetch
155
        source = Branch.open(self.get_remote_url("source/"))
156
        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))