diff --git a/lbry/torrent/session.py b/lbry/torrent/session.py index 164f963f9..a145a3132 100644 --- a/lbry/torrent/session.py +++ b/lbry/torrent/session.py @@ -42,16 +42,20 @@ class TorrentHandle: if self.torrent_file is None: return None index = self.largest_file_index - return os.path.join(self._base_path, self.torrent_file.file_path(index)) + return os.path.join(self.save_path, self.torrent_file.file_path(index)) @property def save_path(self) -> Optional[str]: + if not self._base_path: + self._base_path = self._handle.status().save_path return self._base_path @property def largest_file_index(self): largest_size, index = 0, 0 for file_num in range(self.torrent_file.num_files()): + if '.pad' in self.torrent_file.file_path(file_num): + continue # ignore padding files if self.torrent_file.file_size(file_num) > largest_size: largest_size = self.torrent_file.file_size(file_num) index = file_num @@ -150,9 +154,9 @@ class TorrentSession: self.tasks = [] self.wait_start = True - async def add_fake_torrent(self): + async def add_fake_torrent(self, file_count=1): tmpdir = mkdtemp() - info = _create_fake_torrent(tmpdir) + info = _create_fake_torrent(tmpdir, file_count=file_count) flags = libtorrent.add_torrent_params_flags_t.flag_seed_mode handle = self._session.add_torrent({ 'ti': info, 'save_path': tmpdir, 'flags': flags @@ -260,14 +264,17 @@ def get_magnet_uri(btih): return f"magnet:?xt=urn:btih:{btih}" -def _create_fake_torrent(tmpdir): - # beware, that's just for testing - path = os.path.join(tmpdir, 'tmp') - with open(path, 'wb') as myfile: - size = myfile.write(bytes([random.randint(0, 255) for _ in range(40)]) * 1024) +def _create_fake_torrent(tmpdir, file_count=1): + # layout: subdir/tmp{0..file_count-1} 40k files. v1+v2. automatic piece size. file_storage = libtorrent.file_storage() - file_storage.add_file('tmp', size) - t = libtorrent.create_torrent(file_storage, 0, 4 * 1024 * 1024) + subfolder = os.path.join(tmpdir, "subdir") + os.mkdir(subfolder) + for file_number in range(file_count): + file_name = f"tmp{file_number}" + with open(os.path.join(subfolder, file_name), 'wb') as myfile: + size = myfile.write(bytes([random.randint(0, 255) for _ in range(40)]) * 1024) + file_storage.add_file(os.path.join("subdir", file_name), size) + t = libtorrent.create_torrent(file_storage, 0, 0) libtorrent.set_piece_hashes(t, tmpdir) return libtorrent.torrent_info(t.generate()) diff --git a/tests/integration/datanetwork/test_file_commands.py b/tests/integration/datanetwork/test_file_commands.py index 48838dc18..d3af87fc0 100644 --- a/tests/integration/datanetwork/test_file_commands.py +++ b/tests/integration/datanetwork/test_file_commands.py @@ -32,7 +32,7 @@ class FileCommands(CommandTestCase): self.seeder_session = TorrentSession(self.loop, None) self.addCleanup(self.seeder_session.stop) await self.seeder_session.bind('127.0.0.1', port=4040) - btih = await self.seeder_session.add_fake_torrent() + btih = await self.seeder_session.add_fake_torrent(file_count=3) address = await self.account.receiving.get_or_create_usable_address() if not tx_to_update: claim = Claim() @@ -66,7 +66,7 @@ class FileCommands(CommandTestCase): content_range = req.headers.get('Content-Range') content_length = int(req.headers.get('Content-Length')) streamed_bytes = await req.content.read() - expected_size = self.seeder_session.get_size(btih) + expected_size = os.path.getsize(self.seeder_session.full_path(btih)) self.assertEqual(expected_size, len(streamed_bytes)) self.assertEqual(content_length, len(streamed_bytes)) self.assertEqual(f"bytes 0-{expected_size - 1}/{expected_size}", content_range)