Skip to content

Commit 7a3cbd7

Browse files
committed
add tests for streaming, fix bugs
1 parent b537403 commit 7a3cbd7

3 files changed

Lines changed: 31 additions & 6 deletions

File tree

lbry/torrent/session.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(self, loop, executor, handle):
2626
self.started = asyncio.Event(loop=loop)
2727
self.finished = asyncio.Event(loop=loop)
2828
self.metadata_completed = asyncio.Event(loop=loop)
29-
self.size = 0
29+
self.size = handle.status().total_wanted
3030
self.total_wanted_done = 0
3131
self.name = ''
3232
self.tasks = []
@@ -70,10 +70,10 @@ def byte_range_to_piece_range(
7070

7171
async def stream_range_as_completed(self, file_index, start, end):
7272
first_piece, final_piece = self.byte_range_to_piece_range(file_index, start, end)
73-
start_piece_offset = final_piece.start
73+
start_piece_offset = first_piece.start
7474
piece_size = self._torrent_info.piece_length()
75-
log.info("Streaming torrent from piece %d to %d (bytes: %d -> %d): %s",
76-
first_piece.piece, final_piece.piece, start, end, self.name)
75+
log.info("Streaming torrent from piece %d to %d (bytes: %d -> %d, piece size: %d): %s",
76+
first_piece.piece, final_piece.piece, start, end, piece_size, self.name)
7777
self.prioritize(file_index, start, end)
7878
await self.resume()
7979
for piece_index in range(first_piece.piece, final_piece.piece + 1):

lbry/torrent/torrent_manager.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,11 @@ async def stream_file(self, request):
113113
with open(self.full_path, 'rb') as infile:
114114
infile.seek(start)
115115
async for read_size in self.torrent_session.stream_largest_file(self.identifier, start, end):
116-
if start + read_size < end:
116+
if infile.tell() + read_size < end:
117117
await response.write(infile.read(read_size))
118118
else:
119-
await response.write_eof(infile.read(end - infile.tell()))
119+
await response.write_eof(infile.read(end - infile.tell() + 1))
120+
return response
120121

121122
def _prepare_range_response_headers(self, get_range: str) -> typing.Tuple[typing.Dict[str, str], int, int]:
122123
if '=' in get_range:

tests/integration/datanetwork/test_file_commands.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import os
55
from binascii import hexlify
66

7+
import aiohttp.web
8+
79
from lbry.schema import Claim
810
from lbry.stream.background_downloader import BackgroundDownloader
911
from lbry.stream.descriptor import StreamDescriptor
1012
from lbry.testcase import CommandTestCase
1113
from lbry.extras.daemon.components import TorrentSession, BACKGROUND_DOWNLOADER_COMPONENT
14+
from lbry.utils import aiohttp_request
1215
from lbry.wallet import Transaction
1316
from lbry.torrent.tracker import UDPTrackerServerProtocol
1417

@@ -51,6 +54,23 @@ async def initialize_torrent(self, tx_to_update=None):
5154
self.addCleanup(task.cancel)
5255
return tx, btih
5356

57+
async def assert_torrent_streaming_works(self, btih):
58+
url = f'http://{self.daemon.conf.streaming_host}:{self.daemon.conf.streaming_port}/get/torrent'
59+
if self.daemon.streaming_runner.server is None:
60+
await self.daemon.streaming_runner.setup()
61+
site = aiohttp.web.TCPSite(self.daemon.streaming_runner, self.daemon.conf.streaming_host,
62+
self.daemon.conf.streaming_port)
63+
await site.start()
64+
async with aiohttp_request('get', url) as req:
65+
self.assertEqual(req.headers.get('Content-Type'), 'application/octet-stream')
66+
content_range = req.headers.get('Content-Range')
67+
content_length = int(req.headers.get('Content-Length'))
68+
streamed_bytes = await req.content.read()
69+
expected_size = self.seeder_session.get_size(btih)
70+
self.assertEqual(expected_size, len(streamed_bytes))
71+
self.assertEqual(content_length, len(streamed_bytes))
72+
self.assertEqual(f"bytes 0-{expected_size - 1}/{expected_size}", content_range)
73+
5474
@skipIf(TorrentSession is None, "libtorrent not installed")
5575
async def test_download_torrent(self):
5676
tx, btih = await self.initialize_torrent()
@@ -61,6 +81,10 @@ async def test_download_torrent(self):
6181
self.assertItemCount(await self.daemon.jsonrpc_file_list(), 1)
6282
self.assertEqual((await self.daemon.jsonrpc_file_list())['items'][0].identifier, btih)
6383
self.assertIn(btih, self.client_session._handles)
84+
85+
# stream over streaming API (full range of the largest file)
86+
await self.assert_torrent_streaming_works(btih)
87+
6488
tx, new_btih = await self.initialize_torrent(tx)
6589
self.assertNotEqual(btih, new_btih)
6690
# claim now points to another torrent, update to it

0 commit comments

Comments
 (0)