~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_weave.py

  • Committer: Robert Collins
  • Date: 2005-10-30 00:00:09 UTC
  • mfrom: (1185.16.134)
  • Revision ID: robertc@robertcollins.net-20051030000009-9db99a338a0dfdac
MergeĀ fromĀ Martin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
import bzrlib.errors as errors
29
29
from bzrlib.weave import Weave, WeaveFormatError, WeaveError, reweave
30
30
from bzrlib.weavefile import write_weave, read_weave
31
 
from bzrlib.tests import TestCase
 
31
from bzrlib.selftest import TestCase
32
32
from bzrlib.osutils import sha_string
33
33
 
34
34
 
38
38
          "A second line"]
39
39
 
40
40
 
 
41
 
41
42
class TestBase(TestCase):
42
43
    def check_read_write(self, k):
43
44
        """Check the weave k can be written & re-read."""
84
85
        self.assertEqual(idx, 0)
85
86
 
86
87
 
 
88
 
87
89
class AnnotateOne(TestBase):
88
90
    def runTest(self):
89
91
        k = Weave()
106
108
        self.assertEqual(k.get(1), TEXT_1)
107
109
 
108
110
 
 
111
 
109
112
class AddWithGivenSha(TestBase):
110
113
    def runTest(self):
111
114
        """Add with caller-supplied SHA-1"""
115
118
        k.add('text0', [], [t], sha1=sha_string(t))
116
119
 
117
120
 
118
 
class GetSha1(TestBase):
119
 
    def test_get_sha1(self):
120
 
        k = Weave()
121
 
        k.add('text0', [], 'text0')
122
 
        self.assertEqual('34dc0e430c642a26c3dd1c2beb7a8b4f4445eb79',
123
 
                         k.get_sha1('text0'))
124
 
        self.assertRaises(errors.WeaveRevisionNotPresent,
125
 
                          k.get_sha1, 0)
126
 
        self.assertRaises(errors.WeaveRevisionNotPresent,
127
 
                          k.get_sha1, 'text1')
128
 
                        
129
121
 
130
122
class InvalidAdd(TestBase):
131
123
    """Try to use invalid version number during add."""
148
140
        self.assertEqual(idx, idx2)
149
141
 
150
142
 
 
143
 
151
144
class InvalidRepeatedAdd(TestBase):
152
145
    def runTest(self):
153
146
        k = Weave()
164
157
                          TEXT_0)
165
158
        
166
159
 
 
160
 
167
161
class InsertLines(TestBase):
168
162
    """Store a revision that adds one line to the original.
169
163
 
220
214
                          (4, 'ccc')])
221
215
 
222
216
 
 
217
 
223
218
class DeleteLines(TestBase):
224
219
    """Deletion of lines from existing text.
225
220
 
249
244
        for i in range(len(texts)):
250
245
            self.assertEqual(k.get(i+1),
251
246
                             texts[i])
 
247
            
 
248
 
252
249
 
253
250
 
254
251
class SuicideDelete(TestBase):
274
271
                          0)        
275
272
 
276
273
 
 
274
 
277
275
class CannedDelete(TestBase):
278
276
    """Unpack canned weave with deleted lines."""
279
277
    def runTest(self):
290
288
                'last line',
291
289
                ('}', 0),
292
290
                ]
293
 
        k._sha1s = [sha_string('first lineline to be deletedlast line')
294
 
                  , sha_string('first linelast line')]
295
291
 
296
292
        self.assertEqual(k.get(0),
297
293
                         ['first line',
305
301
                          ])
306
302
 
307
303
 
 
304
 
308
305
class CannedReplacement(TestBase):
309
306
    """Unpack canned weave with deleted lines."""
310
307
    def runTest(self):
324
321
                'last line',
325
322
                ('}', 0),
326
323
                ]
327
 
        k._sha1s = [sha_string('first lineline to be deletedlast line')
328
 
                  , sha_string('first linereplacement linelast line')]
329
324
 
330
325
        self.assertEqual(k.get(0),
331
326
                         ['first line',
340
335
                          ])
341
336
 
342
337
 
 
338
 
343
339
class BadWeave(TestBase):
344
340
    """Test that we trap an insert which should not occur."""
345
341
    def runTest(self):
425
421
                '}',
426
422
                ('}', 0)]
427
423
 
428
 
        k._sha1s = [sha_string('foo {}')
429
 
                  , sha_string('foo {  added in version 1  also from v1}')
430
 
                  , sha_string('foo {  added in v2}')
431
 
                  , sha_string('foo {  added in version 1  added in v2  also from v1}')
432
 
                  ]
433
 
 
434
424
        self.assertEqual(k.get(0),
435
425
                         ['foo {',
436
426
                          '}'])
454
444
                          '}'])
455
445
                         
456
446
 
 
447
 
457
448
class DeleteLines2(TestBase):
458
449
    """Test recording revisions that delete lines.
459
450
 
481
472
                          (0, "fine")])
482
473
 
483
474
 
 
475
 
484
476
class IncludeVersions(TestBase):
485
477
    """Check texts that are stored across multiple revisions.
486
478
 
502
494
                "second line",
503
495
                ('}', 1)]
504
496
 
505
 
        k._sha1s = [sha_string('first line')
506
 
                  , sha_string('first linesecond line')]
507
 
 
508
497
        self.assertEqual(k.get(1),
509
498
                         ["first line",
510
499
                          "second line"])
534
523
                ('}', 2),                
535
524
                ]
536
525
 
537
 
        k._sha1s = [sha_string('first line')
538
 
                  , sha_string('first linesecond line')
539
 
                  , sha_string('first linealternative second line')]
540
 
 
541
526
        self.assertEqual(k.get(0),
542
527
                         ["first line"])
543
528
 
553
538
                         [0, 2])
554
539
 
555
540
 
 
541
 
556
542
class ReplaceLine(TestBase):
557
543
    def runTest(self):
558
544
        k = Weave()
569
555
        self.assertEqual(k.get(1), text1)
570
556
 
571
557
 
 
558
 
572
559
class Merge(TestBase):
573
560
    """Storage of versions that merge diverged parents"""
574
561
    def runTest(self):
625
612
                           [['bbb']]])
626
613
 
627
614
 
 
615
 
628
616
class NonConflict(TestBase):
629
617
    """Two descendants insert compatible changes.
630
618
 
637
625
        k.add([0], ['111', 'aaa', 'ccc', 'bbb'])
638
626
        k.add([1], ['aaa', 'ccc', 'bbb', '222'])
639
627
 
 
628
    
 
629
    
 
630
 
640
631
 
641
632
class AutoMerge(TestBase):
642
633
    def runTest(self):
660
651
                          'line from 1',
661
652
                          'bbb',
662
653
                          'line from 2', 'more from 2'])
 
654
        
663
655
 
664
656
 
665
657
class Khayyam(TestBase):
709
701
        self.check_read_write(k)
710
702
 
711
703
 
 
704
 
712
705
class MergeCases(TestBase):
713
706
    def doMerge(self, base, a, b, mp):
714
707
        from cStringIO import StringIO
888
881
        eq = self.assertEquals
889
882
        eq(sorted(wa.iter_names()), ['v1', 'v2', 'v3', 'x1',])
890
883
        eq(wa.get_text('x1'), 'line from x1\n')
891
 
 
892
 
 
893
 
class Corruption(TestCase):
894
 
 
895
 
    def test_detection(self):
896
 
        # Test weaves detect corruption.
897
 
        #
898
 
        # Weaves contain a checksum of their texts.
899
 
        # When a text is extracted, this checksum should be
900
 
        # verified.
901
 
 
902
 
        w = Weave()
903
 
        w.add('v1', [], ['hello\n'])
904
 
        w.add('v2', ['v1'], ['hello\n', 'there\n'])
905
 
 
906
 
        # We are going to invasively corrupt the text
907
 
        # Make sure the internals of weave are the same
908
 
        self.assertEqual([('{', 0)
909
 
                        , 'hello\n'
910
 
                        , ('}', None)
911
 
                        , ('{', 1)
912
 
                        , 'there\n'
913
 
                        , ('}', None)
914
 
                        ], w._weave)
915
 
 
916
 
        self.assertEqual(['f572d396fae9206628714fb2ce00f72e94f2258f'
917
 
                        , '90f265c6e75f1c8f9ab76dcf85528352c5f215ef'
918
 
                        ], w._sha1s)
919
 
        w.check()
920
 
 
921
 
        # Corrupted
922
 
        w._weave[4] = 'There\n'
923
 
 
924
 
        self.assertEqual('hello\n', w.get_text('v1'))
925
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2')
926
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2')
927
 
        self.assertRaises(errors.WeaveInvalidChecksum, list, w.get_iter('v2'))
928
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.check)
929
 
 
930
 
        # Corrected
931
 
        w._weave[4] = 'there\n'
932
 
        self.assertEqual('hello\nthere\n', w.get_text('v2'))
933
 
 
934
 
        #Invalid checksum, first digit changed
935
 
        w._sha1s[1] =  'f0f265c6e75f1c8f9ab76dcf85528352c5f215ef'
936
 
 
937
 
        self.assertEqual('hello\n', w.get_text('v1'))
938
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2')
939
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2')
940
 
        self.assertRaises(errors.WeaveInvalidChecksum, list, w.get_iter('v2'))
941
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.check)
942
 
 
943
 
    def test_written_detection(self):
944
 
        # Test detection of weave file corruption.
945
 
        #
946
 
        # Make sure that we can detect if a weave file has
947
 
        # been corrupted. This doesn't test all forms of corruption,
948
 
        # but it at least helps verify the data you get, is what you want.
949
 
        from cStringIO import StringIO
950
 
 
951
 
        w = Weave()
952
 
        w.add('v1', [], ['hello\n'])
953
 
        w.add('v2', ['v1'], ['hello\n', 'there\n'])
954
 
 
955
 
        tmpf = StringIO()
956
 
        write_weave(w, tmpf)
957
 
 
958
 
        # Because we are corrupting, we need to make sure we have the exact text
959
 
        self.assertEquals('# bzr weave file v5\n'
960
 
                          'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n'
961
 
                          'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n'
962
 
                          'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n',
963
 
                          tmpf.getvalue())
964
 
 
965
 
        # Change a single letter
966
 
        tmpf = StringIO('# bzr weave file v5\n'
967
 
                        'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n'
968
 
                        'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n'
969
 
                        'w\n{ 0\n. hello\n}\n{ 1\n. There\n}\nW\n')
970
 
 
971
 
        w = read_weave(tmpf)
972
 
 
973
 
        self.assertEqual('hello\n', w.get_text('v1'))
974
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2')
975
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2')
976
 
        self.assertRaises(errors.WeaveInvalidChecksum, list, w.get_iter('v2'))
977
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.check)
978
 
 
979
 
        # Change the sha checksum
980
 
        tmpf = StringIO('# bzr weave file v5\n'
981
 
                        'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n'
982
 
                        'i 0\n1 f0f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n'
983
 
                        'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n')
984
 
 
985
 
        w = read_weave(tmpf)
986
 
 
987
 
        self.assertEqual('hello\n', w.get_text('v1'))
988
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2')
989
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2')
990
 
        self.assertRaises(errors.WeaveInvalidChecksum, list, w.get_iter('v2'))
991
 
        self.assertRaises(errors.WeaveInvalidChecksum, w.check)
992
 
 
993