diff --git a/src/torrent.cpp b/src/torrent.cpp index e9b2cd79e..08176c6e0 100755 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -775,6 +775,8 @@ namespace libtorrent if (total_done >= m_torrent_file->total_size()) { + // Thist happens when a piece has been downloaded completely + // but not yet verified against the hash std::copy(m_have_pieces.begin(), m_have_pieces.end() , std::ostream_iterator(std::cerr, " ")); std::cerr << std::endl; diff --git a/test/Jamfile b/test/Jamfile index 58d5ffb02..5ae0123f0 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -32,6 +32,7 @@ test-suite libtorrent : [ run test_hasher.cpp ] [ run test_metadata_extension.cpp ] [ run test_swarm.cpp ] + [ run test_lsd.cpp ] [ run test_web_seed.cpp ] [ run test_bandwidth_limiter.cpp ] ; diff --git a/test/setup_transfer.cpp b/test/setup_transfer.cpp index a0b79580b..5b9a423e3 100644 --- a/test/setup_transfer.cpp +++ b/test/setup_transfer.cpp @@ -40,7 +40,7 @@ boost::intrusive_ptr clone_ptr(boost::intrusive_ptr const& ptr) boost::tuple setup_transfer(session* ses1, session* ses2, session* ses3 - , bool clear_files, bool use_metadata_transfer) + , bool clear_files, bool use_metadata_transfer, bool connect_peers) { using namespace boost::filesystem; @@ -105,20 +105,23 @@ setup_transfer(session* ses1, session* ses2, session* ses3 test_sleep(100); - std::cerr << "connecting peer\n"; - tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1") - , ses2->listen_port())); - - if (ses3) + if (connect_peers) { - // give the other peers some time to get an initial - // set of pieces before they start sharing with each-other - tor3.connect_peer(tcp::endpoint( - address::from_string("127.0.0.1") + std::cerr << "connecting peer\n"; + tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1") , ses2->listen_port())); - tor3.connect_peer(tcp::endpoint( - address::from_string("127.0.0.1") - , ses1->listen_port())); + + if (ses3) + { + // give the other peers some time to get an initial + // set of pieces before they start sharing with each-other + tor3.connect_peer(tcp::endpoint( + address::from_string("127.0.0.1") + , ses2->listen_port())); + tor3.connect_peer(tcp::endpoint( + address::from_string("127.0.0.1") + , ses1->listen_port())); + } } return boost::make_tuple(tor1, tor2, tor3); diff --git a/test/setup_transfer.hpp b/test/setup_transfer.hpp index c679bb600..e218acfd7 100644 --- a/test/setup_transfer.hpp +++ b/test/setup_transfer.hpp @@ -10,7 +10,8 @@ void test_sleep(int millisec); boost::tuple setup_transfer(libtorrent::session* ses1, libtorrent::session* ses2 - , libtorrent::session* ses3, bool clear_files, bool use_metadata_transfer = true); + , libtorrent::session* ses3, bool clear_files, bool use_metadata_transfer = true + , bool connect = true); #endif diff --git a/test/test_lsd.cpp b/test/test_lsd.cpp new file mode 100644 index 000000000..4edf9b9de --- /dev/null +++ b/test/test_lsd.cpp @@ -0,0 +1,118 @@ +#include "libtorrent/session.hpp" +#include "libtorrent/session_settings.hpp" +#include "libtorrent/hasher.hpp" +#include +#include +#include + +#include "test.hpp" +#include "setup_transfer.hpp" + +using boost::filesystem::remove_all; + +void test_swarm() +{ + using namespace libtorrent; + + session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48000, 49000)); + session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49000, 50000)); + session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50000, 51000)); + + // this is to avoid everything finish from a single peer + // immediately. To make the swarm actually connect all + // three peers before finishing. + float rate_limit = 90000; + ses1.set_upload_rate_limit(int(rate_limit)); + ses2.set_download_rate_limit(int(rate_limit)); + ses3.set_download_rate_limit(int(rate_limit)); + ses2.set_upload_rate_limit(int(rate_limit / 2)); + ses3.set_upload_rate_limit(int(rate_limit / 2)); + + session_settings settings; + settings.allow_multiple_connections_per_ip = true; + ses1.set_settings(settings); + ses2.set_settings(settings); + ses3.set_settings(settings); + + ses1.start_lsd(); + ses2.start_lsd(); + ses3.start_lsd(); + +#ifndef TORRENT_DISABLE_ENCRYPTION + pe_settings pes; + pes.out_enc_policy = pe_settings::disabled; + pes.in_enc_policy = pe_settings::disabled; + ses1.set_pe_settings(pes); + ses2.set_pe_settings(pes); + ses3.set_pe_settings(pes); +#endif + + torrent_handle tor1; + torrent_handle tor2; + torrent_handle tor3; + + boost::tie(tor1, tor2, tor3) = setup_transfer(&ses1, &ses2, &ses3, true, false, false); + + for (int i = 0; i < 10; ++i) + { + std::auto_ptr a; + a = ses1.pop_alert(); + if (a.get()) + std::cerr << "ses1: " << a->msg() << "\n"; + + a = ses2.pop_alert(); + if (a.get()) + std::cerr << "ses2: " << a->msg() << "\n"; + + a = ses3.pop_alert(); + if (a.get()) + std::cerr << "ses3: " << a->msg() << "\n"; + + torrent_status st1 = tor1.status(); + torrent_status st2 = tor2.status(); + torrent_status st3 = tor3.status(); + + std::cerr + << "\033[33m" << int(st1.upload_payload_rate / 1000.f) << "kB/s " + << st1.num_peers << ": " + << "\033[32m" << int(st2.download_payload_rate / 1000.f) << "kB/s " + << "\033[31m" << int(st2.upload_payload_rate / 1000.f) << "kB/s " + << "\033[0m" << int(st2.progress * 100) << "% " + << st2.num_peers << " - " + << "\033[32m" << int(st3.download_payload_rate / 1000.f) << "kB/s " + << "\033[31m" << int(st3.upload_payload_rate / 1000.f) << "kB/s " + << "\033[0m" << int(st3.progress * 100) << "% " + << st3.num_peers + << std::endl; + + if (tor2.is_seed() && tor3.is_seed()) break; + test_sleep(1000); + } + + TEST_CHECK(tor2.is_seed()); + TEST_CHECK(tor3.is_seed()); + + if (tor2.is_seed() && tor3.is_seed()) std::cerr << "done\n"; +} + +int test_main() +{ + using namespace libtorrent; + using namespace boost::filesystem; + + // in case the previous run was terminated + try { remove_all("./tmp1"); } catch (std::exception&) {} + try { remove_all("./tmp2"); } catch (std::exception&) {} + try { remove_all("./tmp3"); } catch (std::exception&) {} + + test_swarm(); + + remove_all("./tmp1"); + remove_all("./tmp2"); + remove_all("./tmp3"); + + return 0; +} + + +