/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_transport_implementations.py

  • Committer: Robert Collins
  • Date: 2007-08-26 22:10:51 UTC
  • mto: (2592.3.117 repository)
  • mto: This revision was merged to the branch mainline in revision 2885.
  • Revision ID: robertc@robertcollins.net-20070826221051-46uq33p3oqkscdd0
* New parameter on ``bzrlib.transport.Transport.readv``
  ``adjust_for_latency`` which changes readv from returning strictly the
  requested data to inserted return larger ranges and in forward read order
  to reduce the effect of network latency. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1485
1485
        self.assertEqual(d[2], (0, '0'))
1486
1486
        self.assertEqual(d[3], (3, '34'))
1487
1487
 
 
1488
    def test_readv_with_adjust_for_latency(self):
 
1489
        transport = self.get_transport()
 
1490
        # the adjust for latency flag expands the data region returned
 
1491
        # according to a per-transport heuristic, so testing is a little
 
1492
        # tricky as we need more data than the largest combining that our
 
1493
        # transports do. To accomodate this we generate random data and cross
 
1494
        # reference the returned data with the random data. To avoid doing
 
1495
        # multiple large random byte look ups we do several tests on the same
 
1496
        # backing data.
 
1497
        content = osutils.rand_bytes(200*1024)
 
1498
        if transport.is_readonly():
 
1499
            file('a', 'w').write(content)
 
1500
        else:
 
1501
            transport.put_bytes('a', content)
 
1502
        def check_result_data(result_vector):
 
1503
            for item in result_vector:
 
1504
                data_len = len(item[1])
 
1505
                self.assertEqual(content[item[0]:item[0] + data_len], item[1])
 
1506
 
 
1507
        # start corner case
 
1508
        result = list(transport.readv('a', ((0, 30),),
 
1509
            adjust_for_latency=True))
 
1510
        # we expect 1 result, from 0, to something > 30
 
1511
        self.assertEqual(1, len(result))
 
1512
        self.assertEqual(0, result[0][0])
 
1513
        self.assertTrue(len(result[0][1]) >= 30)
 
1514
        check_result_data(result)
 
1515
        # end of file corner case
 
1516
        result = list(transport.readv('a', ((204700, 100),),
 
1517
            adjust_for_latency=True))
 
1518
        # we expect 1 result, from 204800- its length, to the end
 
1519
        self.assertEqual(1, len(result))
 
1520
        data_len = len(result[0][1])
 
1521
        self.assertEqual(204800-data_len, result[0][0])
 
1522
        self.assertTrue(data_len >= 100)
 
1523
        check_result_data(result)
 
1524
        # out of order ranges are made in order
 
1525
        result = list(transport.readv('a', ((204700, 100), (0, 50)),
 
1526
            adjust_for_latency=True))
 
1527
        # we expect 2 results, in order, start and end.
 
1528
        self.assertEqual(2, len(result))
 
1529
        # start
 
1530
        data_len = len(result[0][1])
 
1531
        self.assertEqual(0, result[0][0])
 
1532
        self.assertTrue(data_len >= 30)
 
1533
        # end
 
1534
        data_len = len(result[1][1])
 
1535
        self.assertEqual(204800-data_len, result[1][0])
 
1536
        self.assertTrue(data_len >= 100)
 
1537
        check_result_data(result)
 
1538
        # close ranges get combined (even if out of order)
 
1539
        for request_vector in [((400,50), (800, 234)), ((800, 234), (400,50))]:
 
1540
            result = list(transport.readv('a', request_vector,
 
1541
                adjust_for_latency=True))
 
1542
            self.assertEqual(1, len(result))
 
1543
            data_len = len(result[0][1])
 
1544
            # minimmum length is from 400 to 1034 - 634
 
1545
            self.assertTrue(data_len >= 634)
 
1546
            # must contain the region 400 to 1034
 
1547
            self.assertTrue(result[0][0] <= 400)
 
1548
            self.assertTrue(result[0][0] + data_len >= 1034)
 
1549
            check_result_data(result)
 
1550
        
 
1551
 
1488
1552
    def test_get_with_open_write_stream_sees_all_content(self):
1489
1553
        t = self.get_transport()
1490
1554
        if t.is_readonly():