test picking file from claim file name
This commit is contained in:
parent
5cf63fa03e
commit
9d869820a3
1 changed files with 29 additions and 24 deletions
|
@ -22,62 +22,59 @@ class FileCommands(CommandTestCase):
|
||||||
super().__init__(*a, **kw)
|
super().__init__(*a, **kw)
|
||||||
self.skip_libtorrent = False
|
self.skip_libtorrent = False
|
||||||
self.streaming_port = 60818
|
self.streaming_port = 60818
|
||||||
|
self.seeder_session = None
|
||||||
|
|
||||||
async def add_forever(self):
|
async def initialize_torrent(self, tx_to_update=None, pick_a_file=True, name=None):
|
||||||
while True:
|
assert name is None or tx_to_update is None
|
||||||
for handle in self.client_session._handles.values():
|
if not self.seeder_session:
|
||||||
handle._handle.connect_peer(('127.0.0.1', 4040))
|
|
||||||
await asyncio.sleep(.1)
|
|
||||||
|
|
||||||
async def initialize_torrent(self, tx_to_update=None):
|
|
||||||
if not hasattr(self, 'seeder_session'):
|
|
||||||
self.seeder_session = TorrentSession(self.loop, None)
|
self.seeder_session = TorrentSession(self.loop, None)
|
||||||
self.addCleanup(self.seeder_session.stop)
|
self.addCleanup(self.seeder_session.stop)
|
||||||
await self.seeder_session.bind('127.0.0.1', port=4040)
|
await self.seeder_session.bind('127.0.0.1', port=4040)
|
||||||
btih = await self.seeder_session.add_fake_torrent(file_count=3)
|
btih = await self.seeder_session.add_fake_torrent(file_count=3)
|
||||||
|
files = [(size, path) for (path, size) in self.seeder_session.get_files(btih).items()]
|
||||||
|
files.sort()
|
||||||
|
# picking a file will pick something in the middle, while automatic selection will pick largest
|
||||||
|
self.expected_size, self.expected_path = files[1] if pick_a_file else files[-1]
|
||||||
|
|
||||||
address = await self.account.receiving.get_or_create_usable_address()
|
address = await self.account.receiving.get_or_create_usable_address()
|
||||||
|
claim = tx_to_update.outputs[0].claim if tx_to_update else Claim()
|
||||||
|
claim.stream.update(bt_infohash=btih)
|
||||||
|
if pick_a_file:
|
||||||
|
claim.stream.source.name = os.path.basename(self.expected_path)
|
||||||
if not tx_to_update:
|
if not tx_to_update:
|
||||||
claim = Claim()
|
|
||||||
claim.stream.update(bt_infohash=btih)
|
|
||||||
tx = await Transaction.claim_create(
|
tx = await Transaction.claim_create(
|
||||||
'torrent', claim, 1, address, [self.account], self.account
|
name or 'torrent', claim, 1, address, [self.account], self.account
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
claim = tx_to_update.outputs[0].claim
|
|
||||||
claim.stream.update(bt_infohash=btih)
|
|
||||||
tx = await Transaction.claim_update(
|
tx = await Transaction.claim_update(
|
||||||
tx_to_update.outputs[0], claim, 1, address, [self.account], self.account
|
tx_to_update.outputs[0], claim, 1, address, [self.account], self.account
|
||||||
)
|
)
|
||||||
await tx.sign([self.account])
|
await tx.sign([self.account])
|
||||||
await self.broadcast_and_confirm(tx)
|
await self.broadcast_and_confirm(tx)
|
||||||
self.client_session = self.daemon.file_manager.source_managers['torrent'].torrent_session
|
self.client_session = self.daemon.file_manager.source_managers['torrent'].torrent_session
|
||||||
self.client_session.wait_start = False # fixme: this is super slow on tests
|
|
||||||
task = asyncio.create_task(self.add_forever())
|
|
||||||
self.addCleanup(task.cancel)
|
|
||||||
return tx, btih
|
return tx, btih
|
||||||
|
|
||||||
async def assert_torrent_streaming_works(self, btih):
|
async def assert_torrent_streaming_works(self, btih):
|
||||||
url = f'http://{self.daemon.conf.streaming_host}:{self.streaming_port}/get/torrent'
|
url = f'http://{self.daemon.conf.streaming_host}:{self.streaming_port}/stream/{btih}'
|
||||||
if self.daemon.streaming_runner.server is None:
|
if self.daemon.streaming_runner.server is None:
|
||||||
await self.daemon.streaming_runner.setup()
|
await self.daemon.streaming_runner.setup()
|
||||||
site = aiohttp.web.TCPSite(self.daemon.streaming_runner, self.daemon.conf.streaming_host,
|
site = aiohttp.web.TCPSite(self.daemon.streaming_runner, self.daemon.conf.streaming_host,
|
||||||
self.streaming_port)
|
self.streaming_port)
|
||||||
await site.start()
|
await site.start()
|
||||||
async with aiohttp_request('get', url) as req:
|
async with aiohttp_request('get', url) as req:
|
||||||
|
self.assertEqual(req.status, 206)
|
||||||
self.assertEqual(req.headers.get('Content-Type'), 'application/octet-stream')
|
self.assertEqual(req.headers.get('Content-Type'), 'application/octet-stream')
|
||||||
content_range = req.headers.get('Content-Range')
|
content_range = req.headers.get('Content-Range')
|
||||||
content_length = int(req.headers.get('Content-Length'))
|
content_length = int(req.headers.get('Content-Length'))
|
||||||
streamed_bytes = await req.content.read()
|
streamed_bytes = await req.content.read()
|
||||||
expected_size = os.path.getsize(self.seeder_session.full_path(btih))
|
expected_size = self.expected_size
|
||||||
self.assertEqual(expected_size, len(streamed_bytes))
|
self.assertEqual(expected_size, len(streamed_bytes))
|
||||||
self.assertEqual(content_length, len(streamed_bytes))
|
self.assertEqual(content_length, len(streamed_bytes))
|
||||||
self.assertEqual(f"bytes 0-{expected_size - 1}/{expected_size}", content_range)
|
self.assertEqual(f"bytes 0-{expected_size - 1}/{expected_size}", content_range)
|
||||||
|
|
||||||
self.assertEqual(len(streamed_bytes), max(self.seeder_session.get_files(btih).values()))
|
|
||||||
|
|
||||||
@skipIf(TorrentSession is None, "libtorrent not installed")
|
@skipIf(TorrentSession is None, "libtorrent not installed")
|
||||||
async def test_download_torrent(self):
|
async def test_download_torrent(self):
|
||||||
tx, btih = await self.initialize_torrent()
|
tx, btih = await self.initialize_torrent(pick_a_file=False)
|
||||||
self.assertNotIn('error', await self.out(self.daemon.jsonrpc_get('torrent')))
|
self.assertNotIn('error', await self.out(self.daemon.jsonrpc_get('torrent')))
|
||||||
self.assertItemCount(await self.daemon.jsonrpc_file_list(), 1)
|
self.assertItemCount(await self.daemon.jsonrpc_file_list(), 1)
|
||||||
# second call, see its there and move on
|
# second call, see its there and move on
|
||||||
|
@ -91,10 +88,13 @@ class FileCommands(CommandTestCase):
|
||||||
# check json encoder fields for torrent sources
|
# check json encoder fields for torrent sources
|
||||||
file = (await self.out(self.daemon.jsonrpc_file_list()))['items'][0]
|
file = (await self.out(self.daemon.jsonrpc_file_list()))['items'][0]
|
||||||
self.assertEqual(btih, file['metadata']['source']['bt_infohash'])
|
self.assertEqual(btih, file['metadata']['source']['bt_infohash'])
|
||||||
self.assertAlmostEqual(time.time(), file['added_on'], delta=2)
|
self.assertAlmostEqual(time.time(), file['added_on'], delta=12)
|
||||||
self.assertEqual("application/octet-stream", file['mime_type'])
|
self.assertEqual("application/octet-stream", file['mime_type'])
|
||||||
self.assertEqual("tmp1", file['suggested_file_name'])
|
self.assertEqual(os.path.basename(self.expected_path), file['suggested_file_name'])
|
||||||
self.assertEqual("tmp1", file['stream_name'])
|
self.assertEqual(os.path.basename(self.expected_path), file['stream_name'])
|
||||||
|
while not file['completed']: # improve that
|
||||||
|
await asyncio.sleep(0.5)
|
||||||
|
file = (await self.out(self.daemon.jsonrpc_file_list()))['items'][0]
|
||||||
self.assertTrue(file['completed'])
|
self.assertTrue(file['completed'])
|
||||||
self.assertGreater(file['total_bytes_lower_bound'], 0)
|
self.assertGreater(file['total_bytes_lower_bound'], 0)
|
||||||
self.assertEqual(file['total_bytes_lower_bound'], file['total_bytes'])
|
self.assertEqual(file['total_bytes_lower_bound'], file['total_bytes'])
|
||||||
|
@ -126,6 +126,11 @@ class FileCommands(CommandTestCase):
|
||||||
self.assertItemCount(await self.daemon.jsonrpc_file_list(), 0)
|
self.assertItemCount(await self.daemon.jsonrpc_file_list(), 0)
|
||||||
self.assertNotIn(new_btih, self.client_session._handles)
|
self.assertNotIn(new_btih, self.client_session._handles)
|
||||||
|
|
||||||
|
await self.initialize_torrent(name='torrent2')
|
||||||
|
self.assertNotIn('error', await self.out(self.daemon.jsonrpc_get('torrent2')))
|
||||||
|
file = (await self.out(self.daemon.jsonrpc_file_list()))['items'][0]
|
||||||
|
self.assertEqual(os.path.basename(self.expected_path), file['stream_name'])
|
||||||
|
|
||||||
async def create_streams_in_range(self, *args, **kwargs):
|
async def create_streams_in_range(self, *args, **kwargs):
|
||||||
self.stream_claim_ids = []
|
self.stream_claim_ids = []
|
||||||
for i in range(*args, **kwargs):
|
for i in range(*args, **kwargs):
|
||||||
|
|
Loading…
Add table
Reference in a new issue