From 225b82d9a0d715938c1a6b978474753d49bfa34c Mon Sep 17 00:00:00 2001 From: arvidn Date: Thu, 13 Aug 2015 23:06:59 -0400 Subject: [PATCH] move test_trackers_extensions over to a simulation and some minor metadata extension and tracker re-announce fixes --- include/libtorrent/torrent_info.hpp | 2 +- simulation/Jamfile | 1 + simulation/setup_swarm.hpp | 7 ++ simulation/swarm_config.hpp | 1 + simulation/test_metadata_extension.cpp | 2 - simulation/test_trackers_extension.cpp | 127 +++++++++++++++++++++ src/torrent.cpp | 2 +- src/torrent_info.cpp | 2 +- src/ut_metadata.cpp | 15 +-- test/Jamfile | 1 - test/Makefile.am | 2 - test/test_torrent.cpp | 18 +++ test/test_trackers_extension.cpp | 147 ------------------------- 13 files changed, 165 insertions(+), 162 deletions(-) create mode 100644 simulation/test_trackers_extension.cpp delete mode 100644 test/test_trackers_extension.cpp diff --git a/include/libtorrent/torrent_info.hpp b/include/libtorrent/torrent_info.hpp index 0a1200563..fac235f67 100644 --- a/include/libtorrent/torrent_info.hpp +++ b/include/libtorrent/torrent_info.hpp @@ -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 diff --git a/simulation/Jamfile b/simulation/Jamfile index 4711c1de2..cf1efbfcb 100644 --- a/simulation/Jamfile +++ b/simulation/Jamfile @@ -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 ] ; diff --git a/simulation/setup_swarm.hpp b/simulation/setup_swarm.hpp index 33431658c..fa3c23375 100644 --- a/simulation/setup_swarm.hpp +++ b/simulation/setup_swarm.hpp @@ -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 diff --git a/simulation/swarm_config.hpp b/simulation/swarm_config.hpp index 7a4b10ca5..1eb0650ad 100644 --- a/simulation/swarm_config.hpp +++ b/simulation/swarm_config.hpp @@ -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 #include diff --git a/simulation/test_metadata_extension.cpp b/simulation/test_metadata_extension.cpp index ebe8b48b5..41162ee55 100644 --- a/simulation/test_metadata_extension.cpp +++ b/simulation/test_metadata_extension.cpp @@ -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" diff --git a/simulation/test_trackers_extension.cpp b/simulation/test_trackers_extension.cpp new file mode 100644 index 000000000..bafa2997d --- /dev/null +++ b/simulation/test_trackers_extension.cpp @@ -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 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 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); +} + diff --git a/src/torrent.cpp b/src/torrent.cpp index 7526b64af..af4b5189c 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -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") diff --git a/src/torrent_info.cpp b/src/torrent_info.cpp index 7d14191f5..2c9c3a96c 100644 --- a/src/torrent_info.cpp +++ b/src/torrent_info.cpp @@ -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; diff --git a/src/ut_metadata.cpp b/src/ut_metadata.cpp index 8adde205f..bcf8a589a 100644 --- a/src/ut_metadata.cpp +++ b/src/ut_metadata.cpp @@ -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 m_sent_requests; std::vector 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; } diff --git a/test/Jamfile b/test/Jamfile index f21afd8c7..16ba55180 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -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 ] diff --git a/test/Makefile.am b/test/Makefile.am index 725034a65..df50f41fe 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -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 diff --git a/test/test_torrent.cpp b/test/test_torrent.cpp index fc0426efd..2f62bb333 100644 --- a/test/test_torrent.cpp +++ b/test/test_torrent.cpp @@ -154,6 +154,24 @@ void test_running_torrent(boost::shared_ptr 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 buf; + bencode(std::back_inserter(buf), torrent); + error_code ec; + boost::shared_ptr ti(boost::make_shared(&buf[0], buf.size(), boost::ref(ec))); + TEST_CHECK(!ec); +} + TORRENT_TEST(total_wanted) { file_storage fs; diff --git a/test/test_trackers_extension.cpp b/test/test_trackers_extension.cpp deleted file mode 100644 index 2fe12eb68..000000000 --- a/test/test_trackers_extension.cpp +++ /dev/null @@ -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 -#include - -#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 buf; - bencode(std::back_inserter(buf), torrent); - boost::shared_ptr ti(boost::make_shared(&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 -} - -