14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
22
from bzrlib import (
23
30
from bzrlib.branch import Branch
31
from bzrlib.bzrdir import BzrDir
24
32
from bzrlib.repofmt import knitrepo
25
33
from bzrlib.tests import TestCaseWithTransport
34
from bzrlib.tests.http_utils import TestCaseWithWebserver
26
35
from bzrlib.tests.test_revision import make_branches
36
from bzrlib.trace import mutter
27
37
from bzrlib.upgrade import Convert
28
38
from bzrlib.workingtree import WorkingTree
238
248
rev_id).get_file_text('this-file-id'), text)
251
class TestHttpFetch(TestCaseWithWebserver):
252
# FIXME RBC 20060124 this really isn't web specific, perhaps an
253
# instrumented readonly transport? Can we do an instrumented
254
# adapter and use self.get_readonly_url ?
256
def test_fetch(self):
257
#highest indices a: 5, b: 7
258
br_a, br_b = make_branches(self)
259
br_rem_a = Branch.open(self.get_readonly_url('branch1'))
260
fetch_steps(self, br_rem_a, br_b, br_a)
262
def _count_log_matches(self, target, logs):
263
"""Count the number of times the target file pattern was fetched in an http log"""
264
get_succeeds_re = re.compile(
265
'.*"GET .*%s HTTP/1.1" 20[06] - "-" "bzr/%s' %
266
( target, bzrlib.__version__))
269
if get_succeeds_re.match(line):
273
def test_weaves_are_retrieved_once(self):
274
self.build_tree(("source/", "source/file", "target/"))
275
# This test depends on knit dasta storage.
276
wt = self.make_branch_and_tree('source', format='dirstate-tags')
278
wt.add(["file"], ["id"])
279
wt.commit("added file")
280
open("source/file", 'w').write("blah\n")
281
wt.commit("changed file")
282
target = BzrDir.create_branch_and_repo("target/")
283
source = Branch.open(self.get_readonly_url("source/"))
285
# this is the path to the literal file. As format changes
286
# occur it needs to be updated. FIXME: ask the store for the
288
self.log("web server logs are:")
289
http_logs = self.get_readonly_server().logs
290
self.log('\n'.join(http_logs))
291
# unfortunately this log entry is branch format specific. We could
292
# factor out the 'what files does this format use' to a method on the
293
# repository, which would let us to this generically. RBC 20060419
294
# RBC 20080408: Or perhaps we can assert that no files are fully read
296
self.assertEqual(1, self._count_log_matches('/ce/id.kndx', http_logs))
297
self.assertEqual(1, self._count_log_matches('/ce/id.knit', http_logs))
298
self.assertEqual(1, self._count_log_matches('inventory.kndx', http_logs))
299
# this r-h check test will prevent regressions, but it currently already
300
# passes, before the patch to cache-rh is applied :[
301
self.assertTrue(1 >= self._count_log_matches('revision-history',
303
self.assertTrue(1 >= self._count_log_matches('last-revision',
305
# FIXME naughty poking in there.
306
self.get_readonly_server().logs = []
307
# check there is nothing more to fetch. We take care to re-use the
308
# existing transport so that the request logs we're about to examine
309
# aren't cluttered with redundant probes for a smart server.
310
# XXX: Perhaps this further parameterisation: test http with smart
311
# server, and test http without smart server?
312
source = Branch.open(
313
self.get_readonly_url("source/"),
314
possible_transports=[source.bzrdir.root_transport])
316
# should make just two requests
317
http_logs = self.get_readonly_server().logs
318
self.log("web server logs are:")
319
self.log('\n'.join(http_logs))
320
self.assertEqual(1, self._count_log_matches('branch-format', http_logs))
321
self.assertEqual(1, self._count_log_matches('branch/format', http_logs))
322
self.assertEqual(1, self._count_log_matches('repository/format',
324
self.assertEqual(1, self._count_log_matches('revisions.kndx',
326
self.assertTrue(1 >= self._count_log_matches('revision-history',
328
self.assertTrue(1 >= self._count_log_matches('last-revision',
330
self.assertLength(5, http_logs)
241
333
class TestKnitToPackFetch(TestCaseWithTransport):
243
335
def find_get_record_stream(self, calls, expected_count=1):