transmission/tests/libtransmission/torrent-magnet-test.cc

98 lines
3.7 KiB
C++
Raw Normal View History

2022-08-27 22:06:20 +00:00
// This file Copyright (C) 2022 Mnemosyne LLC.
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
// or any future license endorsed by Mnemosyne LLC.
// License text can be found in the licenses/ folder.
2023-07-08 15:24:03 +00:00
#include <cstddef> // size_t
refactor: convert `tr_incomplete_metadata` to c++ class (#6383) * refactor: unset peer BEP-9 support if size hint is invalid * fix: open torrent file in binary mode * refactor: move metadata size check to method * refactor: remove duplicate checks * refactor: reduce temp variable scope in `parseLtepHandshake()` * refactor: convert `get_piece_length()` to method * refactor: convert `tr_torrentSetMetadataSizeHint()` to method * refactor: convert `tr_torrentGetMetadataPiece()` to method * refactor: convert `tr_torrentUseMetainfoFromFile()` to method * refactor: convert `tr_torrentSetMetadataPiece()` to method * refactor: convert `tr_torrentGetNextMetadataRequest()` to method * refactor: convert `tr_torrentGetMetadataPercent()` to method * refactor: add basic framework for MagnetMediator * refactor: initialise `tr_incomplete_metadata` fields in constructor * refactor: check metadata transfer completion in `set_metadata_piece()` * refactor: convert `use_new_metainfo()` and `on_have_all_metainfo()` to methods * refactor: move parts of `tr_torrent::set_metadata_piece()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_next_metadata_request()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_metadata_percent()` into `tr_incomplete_metadata` * refactor: hide all `tr_incomplete_metadata` fields * refactor: move `incomplete_metadata` to private * feat: add test for `set_metadata_piece()` * refactor: unify integer types * refactor: rename `tr_incomplete_metadata` to `tr_metadata_download` * chore: make clang-tidy happy libtransmission/torrent-magnet.cc:117:68: warning: comparison of integers of different signs: 'long' and 'const uint64_t' (aka 'const unsigned long') [clang-diagnostic-sign-compare] * refactor: pass log name to `tr_metadata_download` constructor * chore: iwyu * fix: thread-safe `TorrentMagnetTest.setMetadataPiece` * chore: housekeeping * Revert "fix: thread-safe `TorrentMagnetTest.setMetadataPiece`" This reverts commit 2a7fcd93a262888f9f55d542b1a9a2da9ca72cea. * fix: stop soon instead of stop now in `on_metainfo_completed()` This is unreachable code now, but if it is ever reached, Transmission will very likely crash. * fix: maybe fix OpenBSD test failure
2024-01-03 03:04:17 +00:00
#include <future>
2022-08-27 22:06:20 +00:00
#include <string>
#include <libtransmission/error.h>
#include <libtransmission/torrent-magnet.h>
#include <libtransmission/torrent-metainfo.h>
2022-08-27 22:06:20 +00:00
2023-07-08 15:24:03 +00:00
#include "gtest/gtest.h"
2022-08-27 22:06:20 +00:00
#include "test-fixtures.h"
namespace libtransmission::test
2022-08-27 22:06:20 +00:00
{
using TorrentMagnetTest = SessionTest;
TEST_F(TorrentMagnetTest, getMetadataPiece)
{
auto* tor = zeroTorrentInit(ZeroTorrentState::Complete);
EXPECT_NE(nullptr, tor);
auto benc = std::string{
"d8:announce31:http://www.example.com/announce10:created by25:Transmission/2.61 (13407)13:creation datei1358704075e8:encoding5:UTF-84:info"
};
auto piece = int{ 0 };
auto info_dict_size = size_t{ 0U };
for (;;)
{
refactor: convert `tr_incomplete_metadata` to c++ class (#6383) * refactor: unset peer BEP-9 support if size hint is invalid * fix: open torrent file in binary mode * refactor: move metadata size check to method * refactor: remove duplicate checks * refactor: reduce temp variable scope in `parseLtepHandshake()` * refactor: convert `get_piece_length()` to method * refactor: convert `tr_torrentSetMetadataSizeHint()` to method * refactor: convert `tr_torrentGetMetadataPiece()` to method * refactor: convert `tr_torrentUseMetainfoFromFile()` to method * refactor: convert `tr_torrentSetMetadataPiece()` to method * refactor: convert `tr_torrentGetNextMetadataRequest()` to method * refactor: convert `tr_torrentGetMetadataPercent()` to method * refactor: add basic framework for MagnetMediator * refactor: initialise `tr_incomplete_metadata` fields in constructor * refactor: check metadata transfer completion in `set_metadata_piece()` * refactor: convert `use_new_metainfo()` and `on_have_all_metainfo()` to methods * refactor: move parts of `tr_torrent::set_metadata_piece()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_next_metadata_request()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_metadata_percent()` into `tr_incomplete_metadata` * refactor: hide all `tr_incomplete_metadata` fields * refactor: move `incomplete_metadata` to private * feat: add test for `set_metadata_piece()` * refactor: unify integer types * refactor: rename `tr_incomplete_metadata` to `tr_metadata_download` * chore: make clang-tidy happy libtransmission/torrent-magnet.cc:117:68: warning: comparison of integers of different signs: 'long' and 'const uint64_t' (aka 'const unsigned long') [clang-diagnostic-sign-compare] * refactor: pass log name to `tr_metadata_download` constructor * chore: iwyu * fix: thread-safe `TorrentMagnetTest.setMetadataPiece` * chore: housekeeping * Revert "fix: thread-safe `TorrentMagnetTest.setMetadataPiece`" This reverts commit 2a7fcd93a262888f9f55d542b1a9a2da9ca72cea. * fix: stop soon instead of stop now in `on_metainfo_completed()` This is unreachable code now, but if it is ever reached, Transmission will very likely crash. * fix: maybe fix OpenBSD test failure
2024-01-03 03:04:17 +00:00
auto data = tor->get_metadata_piece(piece++);
if (!data)
2022-08-27 22:06:20 +00:00
{
break;
}
refactor: convert `tr_incomplete_metadata` to c++ class (#6383) * refactor: unset peer BEP-9 support if size hint is invalid * fix: open torrent file in binary mode * refactor: move metadata size check to method * refactor: remove duplicate checks * refactor: reduce temp variable scope in `parseLtepHandshake()` * refactor: convert `get_piece_length()` to method * refactor: convert `tr_torrentSetMetadataSizeHint()` to method * refactor: convert `tr_torrentGetMetadataPiece()` to method * refactor: convert `tr_torrentUseMetainfoFromFile()` to method * refactor: convert `tr_torrentSetMetadataPiece()` to method * refactor: convert `tr_torrentGetNextMetadataRequest()` to method * refactor: convert `tr_torrentGetMetadataPercent()` to method * refactor: add basic framework for MagnetMediator * refactor: initialise `tr_incomplete_metadata` fields in constructor * refactor: check metadata transfer completion in `set_metadata_piece()` * refactor: convert `use_new_metainfo()` and `on_have_all_metainfo()` to methods * refactor: move parts of `tr_torrent::set_metadata_piece()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_next_metadata_request()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_metadata_percent()` into `tr_incomplete_metadata` * refactor: hide all `tr_incomplete_metadata` fields * refactor: move `incomplete_metadata` to private * feat: add test for `set_metadata_piece()` * refactor: unify integer types * refactor: rename `tr_incomplete_metadata` to `tr_metadata_download` * chore: make clang-tidy happy libtransmission/torrent-magnet.cc:117:68: warning: comparison of integers of different signs: 'long' and 'const uint64_t' (aka 'const unsigned long') [clang-diagnostic-sign-compare] * refactor: pass log name to `tr_metadata_download` constructor * chore: iwyu * fix: thread-safe `TorrentMagnetTest.setMetadataPiece` * chore: housekeeping * Revert "fix: thread-safe `TorrentMagnetTest.setMetadataPiece`" This reverts commit 2a7fcd93a262888f9f55d542b1a9a2da9ca72cea. * fix: stop soon instead of stop now in `on_metainfo_completed()` This is unreachable code now, but if it is ever reached, Transmission will very likely crash. * fix: maybe fix OpenBSD test failure
2024-01-03 03:04:17 +00:00
benc.append(reinterpret_cast<char const*>(std::data(*data)), std::size(*data));
info_dict_size += std::size(*data);
2022-08-27 22:06:20 +00:00
}
benc.append("e");
EXPECT_EQ(tor->info_dict_size(), info_dict_size);
2022-08-27 22:06:20 +00:00
auto torrent_metainfo = tr_torrent_metainfo{};
auto error = tr_error{};
EXPECT_TRUE(torrent_metainfo.parse_benc(benc, &error));
EXPECT_FALSE(error) << error.message();
2022-08-27 22:06:20 +00:00
EXPECT_EQ(tor->piece_hash(0), torrent_metainfo.piece_hash(0));
2022-08-27 22:06:20 +00:00
}
refactor: convert `tr_incomplete_metadata` to c++ class (#6383) * refactor: unset peer BEP-9 support if size hint is invalid * fix: open torrent file in binary mode * refactor: move metadata size check to method * refactor: remove duplicate checks * refactor: reduce temp variable scope in `parseLtepHandshake()` * refactor: convert `get_piece_length()` to method * refactor: convert `tr_torrentSetMetadataSizeHint()` to method * refactor: convert `tr_torrentGetMetadataPiece()` to method * refactor: convert `tr_torrentUseMetainfoFromFile()` to method * refactor: convert `tr_torrentSetMetadataPiece()` to method * refactor: convert `tr_torrentGetNextMetadataRequest()` to method * refactor: convert `tr_torrentGetMetadataPercent()` to method * refactor: add basic framework for MagnetMediator * refactor: initialise `tr_incomplete_metadata` fields in constructor * refactor: check metadata transfer completion in `set_metadata_piece()` * refactor: convert `use_new_metainfo()` and `on_have_all_metainfo()` to methods * refactor: move parts of `tr_torrent::set_metadata_piece()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_next_metadata_request()` into `tr_incomplete_metadata` * refactor: move parts of `tr_torrent::get_metadata_percent()` into `tr_incomplete_metadata` * refactor: hide all `tr_incomplete_metadata` fields * refactor: move `incomplete_metadata` to private * feat: add test for `set_metadata_piece()` * refactor: unify integer types * refactor: rename `tr_incomplete_metadata` to `tr_metadata_download` * chore: make clang-tidy happy libtransmission/torrent-magnet.cc:117:68: warning: comparison of integers of different signs: 'long' and 'const uint64_t' (aka 'const unsigned long') [clang-diagnostic-sign-compare] * refactor: pass log name to `tr_metadata_download` constructor * chore: iwyu * fix: thread-safe `TorrentMagnetTest.setMetadataPiece` * chore: housekeeping * Revert "fix: thread-safe `TorrentMagnetTest.setMetadataPiece`" This reverts commit 2a7fcd93a262888f9f55d542b1a9a2da9ca72cea. * fix: stop soon instead of stop now in `on_metainfo_completed()` This is unreachable code now, but if it is ever reached, Transmission will very likely crash. * fix: maybe fix OpenBSD test failure
2024-01-03 03:04:17 +00:00
TEST_F(TorrentMagnetTest, setMetadataPiece)
{
static auto constexpr InfoDictBase64 =
"ZDU6ZmlsZXNsZDY6bGVuZ3RoaTEwNDg1NzZlNDpwYXRobDc6MTA0ODU3NmVlZDY6bGVuZ3RoaTQw"
"OTZlNDpwYXRobDQ6NDA5NmVlZDY6bGVuZ3RoaTUxMmU0OnBhdGhsMzo1MTJlZWU0Om5hbWUyNDpm"
"aWxlcy1maWxsZWQtd2l0aC16ZXJvZXMxMjpwaWVjZSBsZW5ndGhpMzI3NjhlNjpwaWVjZXM2NjA6"
"UYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv1726aj/wpP"
"1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv1726aj"
"/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv17"
"26aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGEx"
"Uv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJ"
"tGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GI"
"QxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZC"
"S1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8K"
"T9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9um"
"o/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9"
"e9umo/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRh"
"MVL9e9umo/8KT9ZCSzpX+QPk899JzAVbjTNoaVd8IP9dNzpwcml2YXRlaTBlZQ==";
auto* const tor = zeroTorrentMagnetInit();
EXPECT_NE(nullptr, tor);
EXPECT_FALSE(tor->has_metainfo());
auto promise = std::promise<void>{};
auto future = promise.get_future();
session_->run_in_session_thread(
[tor, &promise]()
{
auto const metainfo_benc = tr_base64_decode(InfoDictBase64);
auto const metainfo_size = std::size(metainfo_benc);
EXPECT_LE(metainfo_size, MetadataPieceSize);
tor->maybe_start_metadata_transfer(metainfo_size);
tor->set_metadata_piece(0, std::data(metainfo_benc), metainfo_size);
EXPECT_TRUE(tor->has_metainfo());
EXPECT_EQ(tor->info_dict_size(), metainfo_size);
EXPECT_EQ(tor->get_metadata_percent(), 1.0);
promise.set_value();
});
future.wait();
}
} // namespace libtransmission::test