forked from premiere/premiere-libtorrent
move test_trackers_extensions over to a simulation and some minor metadata extension and tracker re-announce fixes
This commit is contained in:
parent
2c89fa40e2
commit
225b82d9a0
|
@ -243,7 +243,7 @@ namespace libtorrent
|
|||
{
|
||||
if (url < e.url) return true;
|
||||
if (url > e.url) return false;
|
||||
return type < e.type;
|
||||
return type < e.type;
|
||||
}
|
||||
|
||||
// The URL of the web seed
|
||||
|
|
|
@ -29,5 +29,6 @@ alias libtorrent-sims :
|
|||
[ run test_dht.cpp ]
|
||||
[ run test_pe_crypto.cpp ]
|
||||
[ run test_metadata_extension.cpp ]
|
||||
[ run test_trackers_extension.cpp ]
|
||||
;
|
||||
|
||||
|
|
|
@ -33,10 +33,17 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "libtorrent/io_service.hpp"
|
||||
#include "libtorrent/settings_pack.hpp"
|
||||
#include "libtorrent/add_torrent_params.hpp"
|
||||
#include "libtorrent/torrent_handle.hpp"
|
||||
|
||||
#ifndef TORRENT_SWARM_SETUP_PROVIDER_HPP_INCLUDED
|
||||
#define TORRENT_SWARM_SETUP_PROVIDER_HPP_INCLUDED
|
||||
|
||||
namespace libtorrent
|
||||
{
|
||||
class alert;
|
||||
class session;
|
||||
}
|
||||
|
||||
struct swarm_setup_provider
|
||||
{
|
||||
// can be used to check expected end conditions
|
||||
|
|
|
@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "libtorrent/time.hpp"
|
||||
#include "setup_swarm.hpp"
|
||||
#include "settings.hpp"
|
||||
#include "setup_transfer.hpp" // for create_torrent
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
|
|
|
@ -31,8 +31,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
*/
|
||||
|
||||
#include "test.hpp"
|
||||
#include "setup_transfer.hpp"
|
||||
#include "test_utils.hpp"
|
||||
#include "test_utils.hpp"
|
||||
#include "swarm_config.hpp"
|
||||
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2008-2015, Arvid Norberg
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the author nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include "setup_swarm.hpp"
|
||||
#include "swarm_config.hpp"
|
||||
#include "libtorrent/alert.hpp"
|
||||
#include "libtorrent/extensions/lt_trackers.hpp"
|
||||
#include "test.hpp"
|
||||
|
||||
enum flags
|
||||
{
|
||||
no_metadata = 1
|
||||
};
|
||||
|
||||
struct test_swarm_config : swarm_config
|
||||
{
|
||||
test_swarm_config(int flags)
|
||||
: swarm_config()
|
||||
, m_flags(flags)
|
||||
{}
|
||||
|
||||
void on_session_added(int idx, session& ses) override
|
||||
{
|
||||
ses.add_extension(create_lt_trackers_plugin);
|
||||
}
|
||||
|
||||
virtual libtorrent::add_torrent_params add_torrent(int idx) override
|
||||
{
|
||||
add_torrent_params p = swarm_config::add_torrent(idx);
|
||||
|
||||
if (m_flags & no_metadata)
|
||||
{
|
||||
p.info_hash = sha1_hash("aaaaaaaaaaaaaaaaaaaa");
|
||||
p.ti.reset();
|
||||
}
|
||||
|
||||
// make sure neither peer has any content
|
||||
// TODO: it would be more efficient to not create the content in the first
|
||||
// place
|
||||
p.save_path = save_path(1);
|
||||
|
||||
if (idx == 1)
|
||||
{
|
||||
p.trackers.push_back("http://test.non-existent.com/announce");
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
bool on_alert(libtorrent::alert const* alert
|
||||
, int session_idx
|
||||
, std::vector<libtorrent::torrent_handle> const& handles
|
||||
, libtorrent::session& ses) override
|
||||
{
|
||||
|
||||
if ((m_flags & no_metadata) == 0)
|
||||
{
|
||||
if (handles[0].trackers().size() == 1
|
||||
&& handles[1].trackers().size() == 1)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual void on_exit(std::vector<torrent_handle> const& torrents) override
|
||||
{
|
||||
TEST_CHECK(torrents.size() > 0);
|
||||
|
||||
// a peer that does not have metadata should not exchange trackers, since
|
||||
// it may be a private torrent
|
||||
if (m_flags & no_metadata)
|
||||
{
|
||||
TEST_EQUAL(torrents[0].trackers().size(), 0);
|
||||
TEST_EQUAL(torrents[1].trackers().size(), 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
TEST_EQUAL(torrents[0].trackers().size(), 1);
|
||||
TEST_EQUAL(torrents[1].trackers().size(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
int m_flags;
|
||||
};
|
||||
|
||||
TORRENT_TEST(plain)
|
||||
{
|
||||
test_swarm_config cfg(0);
|
||||
setup_swarm(2, cfg);
|
||||
}
|
||||
|
||||
TORRENT_TEST(no_metadata)
|
||||
{
|
||||
test_swarm_config cfg(no_metadata);
|
||||
setup_swarm(2, cfg);
|
||||
}
|
||||
|
|
@ -3156,7 +3156,7 @@ namespace libtorrent
|
|||
// a warning if there isn't one
|
||||
std::string protocol = req.url.substr(0, req.url.find(':'));
|
||||
int proxy_type = settings().get_int(settings_pack::proxy_type);
|
||||
|
||||
|
||||
// http can run over any proxy, so as long as one is used
|
||||
// it's OK. If no proxy is configured, skip this tracker
|
||||
if ((protocol == "http" || protocol == "https")
|
||||
|
|
|
@ -669,7 +669,7 @@ namespace libtorrent
|
|||
// event, we need to let this announce through
|
||||
bool need_send_complete = is_seed && !complete_sent;
|
||||
|
||||
return now > next_announce
|
||||
return now >= next_announce
|
||||
&& (now >= min_announce || need_send_complete)
|
||||
&& (fails < fail_limit || fail_limit == 0)
|
||||
&& !updating;
|
||||
|
|
|
@ -382,7 +382,8 @@ namespace libtorrent { namespace
|
|||
m_pc.peer_log(peer_log_alert::info, "UT_METADATA"
|
||||
, "have: %d invalid piece %d metadata size: %d"
|
||||
, int(m_torrent.valid_metadata()), piece
|
||||
, int(m_tp.get_metadata_size()));
|
||||
, m_torrent.valid_metadata()
|
||||
? int(m_tp.get_metadata_size()) : 0);
|
||||
#endif
|
||||
write_metadata_packet(metadata_dont_have, piece);
|
||||
return true;
|
||||
|
@ -495,7 +496,7 @@ namespace libtorrent { namespace
|
|||
// request queues
|
||||
std::vector<int> m_sent_requests;
|
||||
std::vector<int> m_incoming_requests;
|
||||
|
||||
|
||||
torrent& m_torrent;
|
||||
bt_peer_connection& m_pc;
|
||||
ut_metadata_plugin& m_tp;
|
||||
|
@ -559,7 +560,7 @@ namespace libtorrent { namespace
|
|||
m_torrent.add_redundant_bytes(size, torrent::piece_unknown);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!m_metadata)
|
||||
{
|
||||
// verify the total_size
|
||||
|
@ -567,7 +568,7 @@ namespace libtorrent { namespace
|
|||
{
|
||||
#ifndef TORRENT_DISABLE_LOGGING
|
||||
source.m_pc.peer_log(peer_log_alert::info, "UT_METADATA"
|
||||
, "metadata size too big: %d", total_size);
|
||||
, "metadata size too big: %d", total_size);
|
||||
#endif
|
||||
// #error post alert
|
||||
return false;
|
||||
|
@ -582,7 +583,7 @@ namespace libtorrent { namespace
|
|||
{
|
||||
#ifndef TORRENT_DISABLE_LOGGING
|
||||
source.m_pc.peer_log(peer_log_alert::info, "UT_METADATA"
|
||||
, "piece: %d INVALID", piece);
|
||||
, "piece: %d INVALID", piece);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
@ -592,7 +593,7 @@ namespace libtorrent { namespace
|
|||
#ifndef TORRENT_DISABLE_LOGGING
|
||||
source.m_pc.peer_log(peer_log_alert::info, "UT_METADATA"
|
||||
, "total_size: %d INCONSISTENT WITH: %d"
|
||||
, total_size, m_metadata_size);
|
||||
, total_size, m_metadata_size);
|
||||
#endif
|
||||
// they disagree about the size!
|
||||
return false;
|
||||
|
@ -600,7 +601,7 @@ namespace libtorrent { namespace
|
|||
|
||||
if (piece * 16 * 1024 + size > m_metadata_size)
|
||||
{
|
||||
// this piece is invalid
|
||||
// this piece is invalid
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -177,7 +177,6 @@ test-suite libtorrent :
|
|||
[ run test_http_connection.cpp ]
|
||||
[ run test_torrent.cpp ]
|
||||
[ run test_transfer.cpp ]
|
||||
[ run test_trackers_extension.cpp ]
|
||||
[ run test_time_critical.cpp ]
|
||||
[ run test_pex.cpp ]
|
||||
[ run test_priority.cpp ]
|
||||
|
|
|
@ -22,7 +22,6 @@ test_programs = \
|
|||
test_time_critical \
|
||||
test_torrent \
|
||||
test_tracker \
|
||||
test_trackers_extension \
|
||||
test_transfer \
|
||||
enum_if \
|
||||
test_utp \
|
||||
|
@ -176,7 +175,6 @@ test_resume_SOURCES = test_resume.cpp
|
|||
test_ssl_SOURCES = test_ssl.cpp
|
||||
test_torrent_SOURCES = test_torrent.cpp
|
||||
test_tracker_SOURCES = test_tracker.cpp
|
||||
test_trackers_extension_SOURCES = test_trackers_extension.cpp
|
||||
test_transfer_SOURCES = test_transfer.cpp
|
||||
enum_if_SOURCES = enum_if.cpp
|
||||
test_utp_SOURCES = test_utp.cpp
|
||||
|
|
|
@ -154,6 +154,24 @@ void test_running_torrent(boost::shared_ptr<torrent_info> info, boost::int64_t f
|
|||
}
|
||||
}
|
||||
|
||||
TORRENT_TEST(long_names)
|
||||
{
|
||||
entry info;
|
||||
info["pieces"] = "aaaaaaaaaaaaaaaaaaaa";
|
||||
info["name"] = "slightly shorter name, it's kind of sad that people started the trend of incorrectly encoding the regular name field and then adding another one with correct encoding";
|
||||
info["name.utf-8"] = "this is a long ass name in order to try to make make_magnet_uri overflow and hopefully crash. Although, by the time you read this that particular bug should have been fixed";
|
||||
info["piece length"] = 16 * 1024;
|
||||
info["length"] = 3245;
|
||||
entry torrent;
|
||||
torrent["info"] = info;
|
||||
|
||||
std::vector<char> buf;
|
||||
bencode(std::back_inserter(buf), torrent);
|
||||
error_code ec;
|
||||
boost::shared_ptr<torrent_info> ti(boost::make_shared<torrent_info>(&buf[0], buf.size(), boost::ref(ec)));
|
||||
TEST_CHECK(!ec);
|
||||
}
|
||||
|
||||
TORRENT_TEST(total_wanted)
|
||||
{
|
||||
file_storage fs;
|
||||
|
|
|
@ -1,147 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2008, Arvid Norberg
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the author nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include "libtorrent/session.hpp"
|
||||
#include "libtorrent/hasher.hpp"
|
||||
#include "libtorrent/thread.hpp"
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
|
||||
#include "test.hpp"
|
||||
#include "setup_transfer.hpp"
|
||||
#include "libtorrent/extensions/metadata_transfer.hpp"
|
||||
#include "libtorrent/extensions/ut_metadata.hpp"
|
||||
#include "libtorrent/extensions/lt_trackers.hpp"
|
||||
#include "libtorrent/bencode.hpp"
|
||||
|
||||
using boost::tuples::ignore;
|
||||
|
||||
TORRENT_TEST(trackers_extension)
|
||||
{
|
||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||
using namespace libtorrent;
|
||||
namespace lt = libtorrent;
|
||||
|
||||
// these are declared before the session objects
|
||||
// so that they are destructed last. This enables
|
||||
// the sessions to destruct in parallel
|
||||
session_proxy p1;
|
||||
session_proxy p2;
|
||||
|
||||
settings_pack s;
|
||||
s.set_bool(settings_pack::enable_upnp, false);
|
||||
s.set_bool(settings_pack::enable_natpmp, false);
|
||||
s.set_bool(settings_pack::enable_lsd, false);
|
||||
s.set_bool(settings_pack::enable_dht, false);
|
||||
s.set_str(settings_pack::listen_interfaces, "0.0.0.0:48130");
|
||||
|
||||
lt::session ses1(s, 0);
|
||||
|
||||
s.set_str(settings_pack::listen_interfaces, "0.0.0.0:49130");
|
||||
lt::session ses2(s, 0);
|
||||
|
||||
ses1.add_extension(create_lt_trackers_plugin);
|
||||
ses2.add_extension(create_lt_trackers_plugin);
|
||||
|
||||
add_torrent_params atp;
|
||||
atp.flags &= ~add_torrent_params::flag_paused;
|
||||
atp.flags &= ~add_torrent_params::flag_auto_managed;
|
||||
atp.info_hash = sha1_hash("12345678901234567890");
|
||||
atp.save_path = "./";
|
||||
error_code ec;
|
||||
torrent_handle tor1 = ses1.add_torrent(atp, ec);
|
||||
atp.trackers.push_back("http://test.non-existent.com/announce");
|
||||
torrent_handle tor2 = ses2.add_torrent(atp, ec);
|
||||
|
||||
tor2.connect_peer(tcp::endpoint(address_v4::from_string("127.0.0.1"), ses1.listen_port()));
|
||||
|
||||
// trackers are NOT supposed to be exchanged for torrents that we
|
||||
// don't have metadata for, since they might be private
|
||||
for (int i = 0; i < 10; ++i)
|
||||
{
|
||||
// make sure this function can be called on
|
||||
// torrents without metadata
|
||||
print_alerts(ses1, "ses1", false, true);
|
||||
print_alerts(ses2, "ses2", false, true);
|
||||
|
||||
if (tor1.trackers().size() != 0) break;
|
||||
test_sleep(1000);
|
||||
}
|
||||
|
||||
TEST_CHECK(tor1.trackers().size() == 0);
|
||||
|
||||
entry info;
|
||||
info["pieces"] = "aaaaaaaaaaaaaaaaaaaa";
|
||||
info["name"] = "slightly shorter name, it's kind of sad that people started the trend of incorrectly encoding the regular name field and then adding another one with correct encoding";
|
||||
info["name.utf-8"] = "this is a long ass name in order to try to make make_magnet_uri overflow and hopefully crash. Although, by the time you read this that particular bug should have been fixed";
|
||||
info["piece length"] = 16 * 1024;
|
||||
info["length"] = 3245;
|
||||
entry torrent;
|
||||
torrent["info"] = info;
|
||||
|
||||
std::vector<char> buf;
|
||||
bencode(std::back_inserter(buf), torrent);
|
||||
boost::shared_ptr<torrent_info> ti(boost::make_shared<torrent_info>(&buf[0], buf.size(), boost::ref(ec)));
|
||||
TEST_CHECK(!ec);
|
||||
|
||||
atp.ti = ti;
|
||||
atp.info_hash.clear();
|
||||
atp.save_path = "./";
|
||||
atp.trackers.clear();
|
||||
|
||||
tor1 = ses1.add_torrent(atp, ec);
|
||||
atp.trackers.push_back("http://test.non-existent.com/announce");
|
||||
tor2 = ses2.add_torrent(atp, ec);
|
||||
tor2.connect_peer(tcp::endpoint(address_v4::from_string("127.0.0.1"), ses1.listen_port()));
|
||||
|
||||
TEST_CHECK(tor1.trackers().size() == 0);
|
||||
|
||||
for (int i = 0; i < 60; ++i)
|
||||
{
|
||||
// make sure this function can be called on
|
||||
// torrents without metadata
|
||||
print_alerts(ses1, "ses1", false, true);
|
||||
print_alerts(ses2, "ses2", false, true);
|
||||
|
||||
if (tor1.trackers().size() == 1) break;
|
||||
test_sleep(1000);
|
||||
}
|
||||
|
||||
TEST_CHECK(tor1.trackers().size() == 1);
|
||||
|
||||
// this allows shutting down the sessions in parallel
|
||||
p1 = ses1.abort();
|
||||
p2 = ses2.abort();
|
||||
#endif // TORRENT_DISABLE_EXTENSIONS
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue