~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_knit.py

  • Committer: Andrew Bennetts
  • Date: 2007-07-17 06:07:00 UTC
  • mto: (2535.4.4 streaming-smart-fetch)
  • mto: This revision was merged to the branch mainline in revision 2906.
  • Revision ID: andrew.bennetts@canonical.com-20070717060700-blzcnto7drjgc7yc
[broken] Closer to a working Repository.fetch_revisions smart request.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1092
1092
        """Get a data stream for an empty knit file."""
1093
1093
        k1 = self.make_test_knit()
1094
1094
        format, data_list, reader_callable = k1.get_data_stream([])
1095
 
        self.assertEqual('knit-delta-plain', format)
 
1095
        self.assertEqual('knit-plain', format)
1096
1096
        self.assertEqual([], data_list)
1097
1097
        content = reader_callable(None)
1098
1098
        self.assertEqual('', content)
1114
1114
            k1.add_lines(version_id, parents, split_lines(lines))
1115
1115
 
1116
1116
        format, data_list, reader_callable = k1.get_data_stream(['text-a'])
1117
 
        self.assertEqual('knit-delta-plain', format)
 
1117
        self.assertEqual('knit-plain', format)
1118
1118
        self.assertEqual(expected_data_list, data_list)
1119
1119
        # There's only one record in the knit, so the content should be the
1120
1120
        # entire knit data file's contents.
1143
1143
            k1.add_lines(version_id, parents, split_lines(lines))
1144
1144
 
1145
1145
        format, data_list, reader_callable = k1.get_data_stream(['text-m'])
1146
 
        self.assertEqual('knit-delta-plain', format)
 
1146
        self.assertEqual('knit-plain', format)
1147
1147
        self.assertEqual(expected_data_list, data_list)
1148
1148
        self.assertRecordContentEqual(k1, 'text-m', reader_callable(None))
1149
1149
        
1161
1161
            ]
1162
1162
        
1163
1163
        format, data_list, reader_callable = k1.get_data_stream(['text-b'])
1164
 
        self.assertEqual('knit-delta-plain', format)
 
1164
        self.assertEqual('knit-plain', format)
1165
1165
        self.assertEqual(expected_data_list, data_list)
1166
1166
        self.assertRecordContentEqual(k1, 'text-b', reader_callable(None))
1167
1167
    
1190
1190
        # case, they'll be in the order they were inserted into the knit.
1191
1191
        format, data_list, reader_callable = k1.get_data_stream(
1192
1192
            ['text-d', 'text-b'])
1193
 
        self.assertEqual('knit-delta-plain', format)
 
1193
        self.assertEqual('knit-plain', format)
1194
1194
        self.assertEqual(expected_data_list, data_list)
1195
1195
        self.assertRecordContentEqual(k1, 'text-b', reader_callable(84))
1196
1196
        self.assertRecordContentEqual(k1, 'text-d', reader_callable(84))
1228
1228
 
1229
1229
        format, data_list, reader_callable = k1.get_data_stream(
1230
1230
            ['text-a', 'text-b', 'text-c', 'text-d', 'text-m'])
1231
 
        self.assertEqual('knit-delta-plain', format)
 
1231
        self.assertEqual('knit-plain', format)
1232
1232
        self.assertEqual(expected_data_list, data_list)
1233
1233
        for version_id, options, length, parents in expected_data_list:
1234
1234
            bytes = reader_callable(length)
1243
1243
        bytes = k1.get_stream_as_bytes(['text-a'])
1244
1244
        data = bencode.bdecode(bytes)
1245
1245
        format, record = data
1246
 
        self.assertEqual('knit-delta-plain', format)
 
1246
        self.assertEqual('knit-plain', format)
1247
1247
        self.assertEqual(['text-a', ['fulltext'], []], record[:3])
1248
1248
        self.assertRecordContentEqual(k1, 'text-a', record[3])
1249
1249
 
1278
1278
 
1279
1279
        data = bencode.bdecode(bytes)
1280
1280
        format = data.pop(0)
1281
 
        self.assertEqual('knit-delta-plain', format)
 
1281
        self.assertEqual('knit-plain', format)
1282
1282
 
1283
1283
        for expected, actual in zip(expected_data_list, data):
1284
1284
            expected_version = expected[0]
1436
1436
            errors.KnitDataStreamIncompatible,
1437
1437
            target.insert_data_stream, data_stream)
1438
1438
 
1439
 
    def test_insert_data_stream_buffering_limit(self):
1440
 
        """insert_data_stream will batch the incoming records up to a certain
1441
 
        size.
1442
 
 
1443
 
        This isn't testing correctness in the way other tests in this file do,
1444
 
        just a performance/resource-use characteristic.
1445
 
        """
1446
 
        target = self.make_test_knit(name='target')
1447
 
        # Instrument target.  We want to log the size of writes, and not
1448
 
        # actually perform the insert because we aren't using real data.
1449
 
        add_raw_records_calls = []
1450
 
        def fake_add_raw_records(records, bytes):
1451
 
            add_raw_records_calls.append(len(bytes))
1452
 
        target._add_raw_records = fake_add_raw_records
1453
 
        
1454
 
        data_stream = (
1455
 
            target.get_format_signature(),
1456
 
            [('v1', [], 30, []), ('v2', [], 30, []), ('v3', [], 30, [])],
1457
 
            StringIO('x' * 90).read
1458
 
            )
1459
 
 
1460
 
        # Insert 3 records of size 30, when bufsize is 64.  No individual write
1461
 
        # should exceed 64, so in this case we expect [60, 30] (i.e. the first
1462
 
        # two records will be read and written in one go).
1463
 
        target.insert_data_stream(data_stream, buffer_size=64)
1464
 
        self.assertEqual([60, 30], add_raw_records_calls)
1465
 
 
1466
 
    def test_insert_data_stream_buffering_large_records(self):
1467
 
        """insert_data_stream's batching copes with records larger than the
1468
 
        buffer size.
1469
 
        """
1470
 
        target = self.make_test_knit(name='target')
1471
 
        # Instrument target.  We want to log the size of writes, and not
1472
 
        # actually perform the insert because we aren't using real data.
1473
 
        add_raw_records_calls = []
1474
 
        def fake_add_raw_records(records, bytes):
1475
 
            add_raw_records_calls.append(len(bytes))
1476
 
        target._add_raw_records = fake_add_raw_records
1477
 
        
1478
 
        data_stream = (
1479
 
            target.get_format_signature(),
1480
 
            [('v1', [], 100, []), ('v2', [], 100, [])],
1481
 
            StringIO('x' * 200).read
1482
 
            )
1483
 
 
1484
 
        # Insert 1 record of size 100, when the buffer_size is much smaller than
1485
 
        # that.  Note that _add_raw_records is never called with no records,
1486
 
        # i.e. if the buffer is empty, then flushing it does not trigger an
1487
 
        # empty write.
1488
 
        target.insert_data_stream(data_stream, buffer_size=20)
1489
 
        self.assertEqual([100, 100], add_raw_records_calls)
1490
 
 
1491
 
    def test_insert_data_stream_buffering_flushed_by_known_record(self):
1492
 
        """insert_data_stream's flushes its buffers (if any) when it needs to do
1493
 
        consistency checks on a record from the stream.
1494
 
        """
1495
 
        target = self.make_test_knit(name='target')
1496
 
        # Insert a record real record.
1497
 
        target.add_lines('v1', [], split_lines(TEXT_1))
1498
 
        # Now instrument target.  We want to log the size of writes, and not
1499
 
        # actually perform the insert because we aren't using real data.
1500
 
        add_raw_records_calls = []
1501
 
        def fake_add_raw_records(records, bytes):
1502
 
            add_raw_records_calls.append(len(bytes))
1503
 
        target._add_raw_records = fake_add_raw_records
1504
 
        
1505
 
        # Create a file with a superficially valid knit header, gzip it.
1506
 
        sio = StringIO()
1507
 
        gzip_file = gzip.GzipFile(mode='wb', fileobj=sio)
1508
 
        gzip_file.write('xx v1 yy %s\n' % target.get_sha1('v1'))
1509
 
        gzip_file.close()
1510
 
        sio.seek(0)
1511
 
        data_stream = (
1512
 
            target.get_format_signature(),
1513
 
            [('v1', [], len(sio.getvalue()), [])],
1514
 
            sio.read,
1515
 
            )
1516
 
 
1517
 
        # Nothing is written; the buffer had nothing to flush.
1518
 
        target.insert_data_stream(data_stream)
1519
 
        self.assertEqual([], add_raw_records_calls)
1520
 
 
 
1439
#    def test_insert_data_stream_buffering_limit(self):
 
1440
#        """insert_data_stream will batch the incoming records up to a certain
 
1441
#        size.
 
1442
#
 
1443
#        This isn't testing correctness in the way other tests in this file do,
 
1444
#        just a performance/resource-use characteristic.
 
1445
#        """
 
1446
#        target = self.make_test_knit(name='target')
 
1447
#        # Instrument target.  We want to log the size of writes, and not
 
1448
#        # actually perform the insert because we aren't using real data.
 
1449
#        add_raw_records_calls = []
 
1450
#        def fake_add_raw_records(records, bytes):
 
1451
#            add_raw_records_calls.append(len(bytes))
 
1452
#        target._add_raw_records = fake_add_raw_records
 
1453
#        
 
1454
#        data_stream = (
 
1455
#            target.get_format_signature(),
 
1456
#            [('v1', [], 30, []), ('v2', [], 30, []), ('v3', [], 30, [])],
 
1457
#            StringIO('x' * 90).read
 
1458
#            )
 
1459
#
 
1460
#        # Insert 3 records of size 30, when bufsize is 64.  No individual write
 
1461
#        # should exceed 64, so in this case we expect [60, 30] (i.e. the first
 
1462
#        # two records will be read and written in one go).
 
1463
#        target.insert_data_stream(data_stream, buffer_size=64)
 
1464
#        self.assertEqual([60, 30], add_raw_records_calls)
 
1465
#
 
1466
#    def test_insert_data_stream_buffering_large_records(self):
 
1467
#        """insert_data_stream's batching copes with records larger than the
 
1468
#        buffer size.
 
1469
#        """
 
1470
#        target = self.make_test_knit(name='target')
 
1471
#        # Instrument target.  We want to log the size of writes, and not
 
1472
#        # actually perform the insert because we aren't using real data.
 
1473
#        add_raw_records_calls = []
 
1474
#        def fake_add_raw_records(records, bytes):
 
1475
#            add_raw_records_calls.append(len(bytes))
 
1476
#        target._add_raw_records = fake_add_raw_records
 
1477
#        
 
1478
#        data_stream = (
 
1479
#            target.get_format_signature(),
 
1480
#            [('v1', [], 100, []), ('v2', [], 100, [])],
 
1481
#            StringIO('x' * 200).read
 
1482
#            )
 
1483
#
 
1484
#        # Insert 1 record of size 100, when the buffer_size is much smaller than
 
1485
#        # that.  Note that _add_raw_records is never called with no records,
 
1486
#        # i.e. if the buffer is empty, then flushing it does not trigger an
 
1487
#        # empty write.
 
1488
#        target.insert_data_stream(data_stream, buffer_size=20)
 
1489
#        self.assertEqual([100, 100], add_raw_records_calls)
 
1490
#
 
1491
#    def test_insert_data_stream_buffering_flushed_by_known_record(self):
 
1492
#        """insert_data_stream's flushes its buffers (if any) when it needs to do
 
1493
#        consistency checks on a record from the stream.
 
1494
#        """
 
1495
#        target = self.make_test_knit(name='target')
 
1496
#        # Insert a record real record.
 
1497
#        target.add_lines('v1', [], split_lines(TEXT_1))
 
1498
#        # Now instrument target.  We want to log the size of writes, and not
 
1499
#        # actually perform the insert because we aren't using real data.
 
1500
#        add_raw_records_calls = []
 
1501
#        def fake_add_raw_records(records, bytes):
 
1502
#            add_raw_records_calls.append(len(bytes))
 
1503
#        target._add_raw_records = fake_add_raw_records
 
1504
#        
 
1505
#        # Create a file with a superficially valid knit header, gzip it.
 
1506
#        sio = StringIO()
 
1507
#        gzip_file = gzip.GzipFile(mode='wb', fileobj=sio)
 
1508
#        gzip_file.write('xx v1 yy %s\n' % target.get_sha1('v1'))
 
1509
#        gzip_file.close()
 
1510
#        sio.seek(0)
 
1511
#        data_stream = (
 
1512
#            target.get_format_signature(),
 
1513
#            [('v1', [], len(sio.getvalue()), [])],
 
1514
#            sio.read,
 
1515
#            )
 
1516
#
 
1517
#        # Nothing is written; the buffer had nothing to flush.
 
1518
#        target.insert_data_stream(data_stream)
 
1519
#        self.assertEqual([], add_raw_records_calls)
 
1520
#
1521
1521
    #  * test that a stream of "already present version, then new version"
1522
1522
    #    inserts correctly.
1523
1523