/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_groupcompress.py

  • Committer: John Arbash Meinel
  • Date: 2009-07-08 14:37:25 UTC
  • mfrom: (4516 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4517.
  • Revision ID: john@arbash-meinel.com-20090708143725-sc9sjy3mz4cxwxzz
Merge bzr.dev 4516

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
import zlib
20
20
 
21
21
from bzrlib import (
 
22
    btree_index,
22
23
    groupcompress,
23
24
    errors,
 
25
    index as _mod_index,
24
26
    osutils,
25
27
    tests,
 
28
    trace,
26
29
    versionedfile,
27
30
    )
28
31
from bzrlib.osutils import sha_string
361
364
        raw_bytes = zlib.decompress(remaining_bytes)
362
365
        self.assertEqual(content, raw_bytes)
363
366
 
 
367
        # we should get the same results if using the chunked version
 
368
        gcb = groupcompress.GroupCompressBlock()
 
369
        gcb.set_chunked_content(['this is some content\n'
 
370
                                 'this content will be compressed\n'],
 
371
                                 len(content))
 
372
        old_bytes = bytes
 
373
        bytes = gcb.to_bytes()
 
374
        self.assertEqual(old_bytes, bytes)
 
375
 
364
376
    def test_partial_decomp(self):
365
377
        content_chunks = []
366
378
        # We need a sufficient amount of data so that zlib.decompress has
463
475
class TestCaseWithGroupCompressVersionedFiles(tests.TestCaseWithTransport):
464
476
 
465
477
    def make_test_vf(self, create_graph, keylength=1, do_cleanup=True,
466
 
                     dir='.'):
 
478
                     dir='.', inconsistency_fatal=True):
467
479
        t = self.get_transport(dir)
468
480
        t.ensure_base()
469
481
        vf = groupcompress.make_pack_factory(graph=create_graph,
470
 
            delta=False, keylength=keylength)(t)
 
482
            delta=False, keylength=keylength,
 
483
            inconsistency_fatal=inconsistency_fatal)(t)
471
484
        if do_cleanup:
472
485
            self.addCleanup(groupcompress.cleanup_pack_group, vf)
473
486
        return vf
475
488
 
476
489
class TestGroupCompressVersionedFiles(TestCaseWithGroupCompressVersionedFiles):
477
490
 
 
491
    def make_g_index(self, name, ref_lists=0, nodes=[]):
 
492
        builder = btree_index.BTreeBuilder(ref_lists)
 
493
        for node, references, value in nodes:
 
494
            builder.add_node(node, references, value)
 
495
        stream = builder.finish()
 
496
        trans = self.get_transport()
 
497
        size = trans.put_file(name, stream)
 
498
        return btree_index.BTreeGraphIndex(trans, name, size)
 
499
 
 
500
    def make_g_index_missing_parent(self):
 
501
        graph_index = self.make_g_index('missing_parent', 1,
 
502
            [(('parent', ), '2 78 2 10', ([],)),
 
503
             (('tip', ), '2 78 2 10',
 
504
              ([('parent', ), ('missing-parent', )],)),
 
505
              ])
 
506
        return graph_index
 
507
 
478
508
    def test_get_record_stream_as_requested(self):
479
509
        # Consider promoting 'as-requested' to general availability, and
480
510
        # make this a VF interface test
606
636
            else:
607
637
                self.assertIs(block, record._manager._block)
608
638
 
 
639
    def test_add_missing_noncompression_parent_unvalidated_index(self):
 
640
        unvalidated = self.make_g_index_missing_parent()
 
641
        combined = _mod_index.CombinedGraphIndex([unvalidated])
 
642
        index = groupcompress._GCGraphIndex(combined,
 
643
            is_locked=lambda: True, parents=True,
 
644
            track_external_parent_refs=True)
 
645
        index.scan_unvalidated_index(unvalidated)
 
646
        self.assertEqual(
 
647
            frozenset([('missing-parent',)]), index.get_missing_parents())
 
648
 
 
649
    def test_track_external_parent_refs(self):
 
650
        g_index = self.make_g_index('empty', 1, [])
 
651
        mod_index = btree_index.BTreeBuilder(1, 1)
 
652
        combined = _mod_index.CombinedGraphIndex([g_index, mod_index])
 
653
        index = groupcompress._GCGraphIndex(combined,
 
654
            is_locked=lambda: True, parents=True,
 
655
            add_callback=mod_index.add_nodes,
 
656
            track_external_parent_refs=True)
 
657
        index.add_records([
 
658
            (('new-key',), '2 10 2 10', [(('parent-1',), ('parent-2',))])])
 
659
        self.assertEqual(
 
660
            frozenset([('parent-1',), ('parent-2',)]),
 
661
            index.get_missing_parents())
 
662
 
 
663
    def make_source_with_b(self, a_parent, path):
 
664
        source = self.make_test_vf(True, dir=path)
 
665
        source.add_lines(('a',), (), ['lines\n'])
 
666
        if a_parent:
 
667
            b_parents = (('a',),)
 
668
        else:
 
669
            b_parents = ()
 
670
        source.add_lines(('b',), b_parents, ['lines\n'])
 
671
        return source
 
672
 
 
673
    def do_inconsistent_inserts(self, inconsistency_fatal):
 
674
        target = self.make_test_vf(True, dir='target',
 
675
                                   inconsistency_fatal=inconsistency_fatal)
 
676
        for x in range(2):
 
677
            source = self.make_source_with_b(x==1, 'source%s' % x)
 
678
            target.insert_record_stream(source.get_record_stream(
 
679
                [('b',)], 'unordered', False))
 
680
 
 
681
    def test_inconsistent_redundant_inserts_warn(self):
 
682
        """Should not insert a record that is already present."""
 
683
        warnings = []
 
684
        def warning(template, args):
 
685
            warnings.append(template % args)
 
686
        _trace_warning = trace.warning
 
687
        trace.warning = warning
 
688
        try:
 
689
            self.do_inconsistent_inserts(inconsistency_fatal=False)
 
690
        finally:
 
691
            trace.warning = _trace_warning
 
692
        self.assertEqual(["inconsistent details in skipped record: ('b',)"
 
693
                          " ('42 32 0 8', ((),)) ('74 32 0 8', ((('a',),),))"],
 
694
                         warnings)
 
695
 
 
696
    def test_inconsistent_redundant_inserts_raises(self):
 
697
        e = self.assertRaises(errors.KnitCorrupt, self.do_inconsistent_inserts,
 
698
                              inconsistency_fatal=True)
 
699
        self.assertContainsRe(str(e), "Knit.* corrupt: inconsistent details"
 
700
                              " in add_records:"
 
701
                              " \('b',\) \('42 32 0 8', \(\(\),\)\) \('74 32"
 
702
                              " 0 8', \(\(\('a',\),\),\)\)")
 
703
 
609
704
 
610
705
class TestLazyGroupCompress(tests.TestCaseWithTransport):
611
706