~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_fetch.py

  • Committer: John Arbash Meinel
  • Date: 2008-08-18 22:34:21 UTC
  • mto: (3606.5.6 1.6)
  • mto: This revision was merged to the branch mainline in revision 3641.
  • Revision ID: john@arbash-meinel.com-20080818223421-todjny24vj4faj4t
Add tests for the fetching behavior.

The proper parameter passed is 'unordered' add an assert for it, and
fix callers that were passing 'unsorted' instead.
Add tests that we make the right get_record_stream call based
on the value of _fetch_uses_deltas.
Fix the fetch request for signatures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
    errors,
25
25
    merge,
26
26
    repository,
 
27
    versionedfile,
27
28
    )
28
29
from bzrlib.branch import Branch
29
30
from bzrlib.bzrdir import BzrDir
329
330
        self.assertEqual(4, len(http_logs))
330
331
 
331
332
 
 
333
class TestKnitToPackFetch(TestCaseWithTransport):
 
334
 
 
335
    def find_get_record_stream(self, calls):
 
336
        """In a list of calls, find 'get_record_stream' calls.
 
337
 
 
338
        This also ensures that there is only one get_record_stream call.
 
339
        """
 
340
        get_record_call = None
 
341
        for call in calls:
 
342
            if call[0] == 'get_record_stream':
 
343
                self.assertIs(None, get_record_call,
 
344
                              "there should only be one call to"
 
345
                              " get_record_stream")
 
346
                get_record_call = call
 
347
        self.assertIsNot(None, get_record_call,
 
348
                         "there should be exactly one call to "
 
349
                         " get_record_stream")
 
350
        return get_record_call
 
351
 
 
352
    def test_fetch_with_deltas_no_delta_closure(self):
 
353
        tree = self.make_branch_and_tree('source', format='dirstate')
 
354
        target = self.make_repository('target', format='pack-0.92')
 
355
        self.build_tree(['source/file'])
 
356
        tree.set_root_id('root-id')
 
357
        tree.add('file', 'file-id')
 
358
        tree.commit('one', rev_id='rev-one')
 
359
        source = tree.branch.repository
 
360
        source.texts = versionedfile.RecordingVersionedFilesDecorator(
 
361
                        source.texts)
 
362
        source.signatures = versionedfile.RecordingVersionedFilesDecorator(
 
363
                        source.signatures)
 
364
        source.revisions = versionedfile.RecordingVersionedFilesDecorator(
 
365
                        source.revisions)
 
366
        source.inventories = versionedfile.RecordingVersionedFilesDecorator(
 
367
                        source.inventories)
 
368
        # precondition
 
369
        self.assertTrue(target._fetch_uses_deltas)
 
370
        target.fetch(source, revision_id='rev-one')
 
371
        self.assertEqual(('get_record_stream', [('file-id', 'rev-one')],
 
372
                          target._fetch_order, False),
 
373
                         self.find_get_record_stream(source.texts.calls))
 
374
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
375
                          target._fetch_order, False),
 
376
                         self.find_get_record_stream(source.inventories.calls))
 
377
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
378
                          target._fetch_order, False),
 
379
                         self.find_get_record_stream(source.revisions.calls))
 
380
        # XXX: Signatures is special, and slightly broken. The
 
381
        # standard item_keys_introduced_by actually does a lookup for every
 
382
        # signature to see if it exists, rather than waiting to do them all at
 
383
        # once at the end. The fetch code then does an all-at-once and just
 
384
        # allows for some of them to be missing.
 
385
        # So we know there will be extra calls, but the *last* one is the one
 
386
        # we care about.
 
387
        signature_calls = source.signatures.calls[-1:]
 
388
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
389
                          target._fetch_order, False),
 
390
                         self.find_get_record_stream(signature_calls))
 
391
 
 
392
    def test_fetch_no_deltas_with_delta_closure(self):
 
393
        tree = self.make_branch_and_tree('source', format='dirstate')
 
394
        target = self.make_repository('target', format='pack-0.92')
 
395
        self.build_tree(['source/file'])
 
396
        tree.set_root_id('root-id')
 
397
        tree.add('file', 'file-id')
 
398
        tree.commit('one', rev_id='rev-one')
 
399
        source = tree.branch.repository
 
400
        source.texts = versionedfile.RecordingVersionedFilesDecorator(
 
401
                        source.texts)
 
402
        source.signatures = versionedfile.RecordingVersionedFilesDecorator(
 
403
                        source.signatures)
 
404
        source.revisions = versionedfile.RecordingVersionedFilesDecorator(
 
405
                        source.revisions)
 
406
        source.inventories = versionedfile.RecordingVersionedFilesDecorator(
 
407
                        source.inventories)
 
408
        target._fetch_uses_deltas = False
 
409
        target.fetch(source, revision_id='rev-one')
 
410
        self.assertEqual(('get_record_stream', [('file-id', 'rev-one')],
 
411
                          target._fetch_order, True),
 
412
                         self.find_get_record_stream(source.texts.calls))
 
413
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
414
                          target._fetch_order, True),
 
415
                         self.find_get_record_stream(source.inventories.calls))
 
416
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
417
                          target._fetch_order, True),
 
418
                         self.find_get_record_stream(source.revisions.calls))
 
419
        # XXX: Signatures is special, and slightly broken. The
 
420
        # standard item_keys_introduced_by actually does a lookup for every
 
421
        # signature to see if it exists, rather than waiting to do them all at
 
422
        # once at the end. The fetch code then does an all-at-once and just
 
423
        # allows for some of them to be missing.
 
424
        # So we know there will be extra calls, but the *last* one is the one
 
425
        # we care about.
 
426
        signature_calls = source.signatures.calls[-1:]
 
427
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
428
                          target._fetch_order, True),
 
429
                         self.find_get_record_stream(signature_calls))
 
430
 
 
431
 
332
432
class Test1To2Fetch(TestCaseWithTransport):
333
433
    """Tests for Model1To2 failure modes"""
334
434