1485
1485
self.assertEqual(d[2], (0, '0'))
1486
1486
self.assertEqual(d[3], (3, '34'))
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
1497
content = osutils.rand_bytes(200*1024)
1498
if transport.is_readonly():
1499
file('a', 'w').write(content)
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])
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))
1530
data_len = len(result[0][1])
1531
self.assertEqual(0, result[0][0])
1532
self.assertTrue(data_len >= 30)
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)
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():