first steps towards supporting SSL over uTP. moved the TODO comment and made it describe the next step. Optimized session destruction in unit tests, hopefully shaving off a bit of test run-time (and now supports asio-debugging of unit tests)
This commit is contained in:
parent
ea4dbf603f
commit
b6083fbc28
|
@ -271,6 +271,12 @@ public:
|
||||||
do_connect(endpoint, &utp_stream::on_connect);
|
do_connect(endpoint, &utp_stream::on_connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Handler>
|
||||||
|
void async_read_some(boost::asio::null_buffers const& buffers, Handler const& handler)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(false);
|
||||||
|
}
|
||||||
|
|
||||||
template <class Mutable_Buffers, class Handler>
|
template <class Mutable_Buffers, class Handler>
|
||||||
void async_read_some(Mutable_Buffers const& buffers, Handler const& handler)
|
void async_read_some(Mutable_Buffers const& buffers, Handler const& handler)
|
||||||
{
|
{
|
||||||
|
@ -286,14 +292,24 @@ public:
|
||||||
m_io_service.post(boost::bind<void>(handler, asio::error::operation_not_supported, 0));
|
m_io_service.post(boost::bind<void>(handler, asio::error::operation_not_supported, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int bytes_added = 0;
|
||||||
for (typename Mutable_Buffers::const_iterator i = buffers.begin()
|
for (typename Mutable_Buffers::const_iterator i = buffers.begin()
|
||||||
, end(buffers.end()); i != end; ++i)
|
, end(buffers.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(buffer_size(*i) > 0);
|
if (buffer_size(*i) == 0) continue;
|
||||||
using asio::buffer_cast;
|
using asio::buffer_cast;
|
||||||
using asio::buffer_size;
|
using asio::buffer_size;
|
||||||
add_read_buffer(buffer_cast<void*>(*i), buffer_size(*i));
|
add_read_buffer(buffer_cast<void*>(*i), buffer_size(*i));
|
||||||
|
bytes_added += buffer_size(*i);
|
||||||
}
|
}
|
||||||
|
if (bytes_added == 0)
|
||||||
|
{
|
||||||
|
// if we're reading 0 bytes, post handler immediately
|
||||||
|
// asio's SSL layer depends on this behavior
|
||||||
|
m_io_service.post(boost::bind<void>(handler, error_code(), 0));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_read_handler = handler;
|
m_read_handler = handler;
|
||||||
set_read_handler(&utp_stream::on_read);
|
set_read_handler(&utp_stream::on_read);
|
||||||
}
|
}
|
||||||
|
@ -374,6 +390,12 @@ public:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template <class Handler>
|
||||||
|
void async_write_some(boost::asio::null_buffers const& buffers, Handler const& handler)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(false);
|
||||||
|
}
|
||||||
|
|
||||||
template <class Const_Buffers, class Handler>
|
template <class Const_Buffers, class Handler>
|
||||||
void async_write_some(Const_Buffers const& buffers, Handler const& handler)
|
void async_write_some(Const_Buffers const& buffers, Handler const& handler)
|
||||||
{
|
{
|
||||||
|
@ -390,13 +412,22 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bytes_added = 0;
|
||||||
for (typename Const_Buffers::const_iterator i = buffers.begin()
|
for (typename Const_Buffers::const_iterator i = buffers.begin()
|
||||||
, end(buffers.end()); i != end; ++i)
|
, end(buffers.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(buffer_size(*i) > 0);
|
if (buffer_size(*i) == 0) continue;
|
||||||
using asio::buffer_cast;
|
using asio::buffer_cast;
|
||||||
using asio::buffer_size;
|
using asio::buffer_size;
|
||||||
add_write_buffer((void*)buffer_cast<void const*>(*i), buffer_size(*i));
|
add_write_buffer((void*)buffer_cast<void const*>(*i), buffer_size(*i));
|
||||||
|
bytes_added += buffer_size(*i);
|
||||||
|
}
|
||||||
|
if (bytes_added == 0)
|
||||||
|
{
|
||||||
|
// if we're reading 0 bytes, post handler immediately
|
||||||
|
// asio's SSL layer depends on this behavior
|
||||||
|
m_io_service.post(boost::bind<void>(handler, error_code(), 0));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
m_write_handler = handler;
|
m_write_handler = handler;
|
||||||
set_write_handler(&utp_stream::on_write);
|
set_write_handler(&utp_stream::on_write);
|
||||||
|
|
|
@ -659,6 +659,11 @@ namespace aux {
|
||||||
#endif
|
#endif
|
||||||
, m_external_udp_port(0)
|
, m_external_udp_port(0)
|
||||||
, m_udp_socket(m_io_service, m_half_open)
|
, m_udp_socket(m_io_service, m_half_open)
|
||||||
|
// TODO: 4 in order to support SSL over uTP, the utp_socket manager either
|
||||||
|
// needs to be able to receive packets on multiple ports, or we need to
|
||||||
|
// peek into the first few bytes the payload stream of a socket to determine
|
||||||
|
// whether or not it's an SSL connection. (The former is simpler but won't
|
||||||
|
// do as well with NATs)
|
||||||
, m_utp_socket_manager(m_settings, m_udp_socket
|
, m_utp_socket_manager(m_settings, m_udp_socket
|
||||||
, boost::bind(&session_impl::incoming_connection, this, _1))
|
, boost::bind(&session_impl::incoming_connection, this, _1))
|
||||||
, m_boost_connections(0)
|
, m_boost_connections(0)
|
||||||
|
@ -2623,7 +2628,6 @@ retry:
|
||||||
str = c->get<stream_socket>();
|
str = c->get<stream_socket>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined TORRENT_ASIO_DEBUGGING
|
#if defined TORRENT_ASIO_DEBUGGING
|
||||||
add_outstanding_async("session_impl::on_accept_connection");
|
add_outstanding_async("session_impl::on_accept_connection");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5797,9 +5797,6 @@ namespace libtorrent
|
||||||
userdata = m_ssl_ctx.get();
|
userdata = m_ssl_ctx.get();
|
||||||
// SSL handshakes are slow
|
// SSL handshakes are slow
|
||||||
timeout_extend = 10;
|
timeout_extend = 10;
|
||||||
|
|
||||||
// TODO: 3 support SSL over uTP
|
|
||||||
sm = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -159,10 +159,14 @@ int main()
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
|
||||||
remove_all(test_dir, ec);
|
int ret = print_failures();
|
||||||
if (ec)
|
if (ret == 0)
|
||||||
fprintf(stderr, "failed to remove test dir: %s\n", ec.message().c_str());
|
{
|
||||||
|
remove_all(test_dir, ec);
|
||||||
|
if (ec)
|
||||||
|
fprintf(stderr, "failed to remove test dir: %s\n", ec.message().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return print_failures();
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,13 @@ void test_transfer(bool clear_files, bool disconnect
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace 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;
|
||||||
|
session_proxy p3;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48100, 49000), "0.0.0.0", 0);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48100, 49000), "0.0.0.0", 0);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49100, 50000), "0.0.0.0", 0);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49100, 50000), "0.0.0.0", 0);
|
||||||
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50100, 51000), "0.0.0.0", 0);
|
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50100, 51000), "0.0.0.0", 0);
|
||||||
|
@ -102,6 +109,11 @@ void test_transfer(bool clear_files, bool disconnect
|
||||||
TEST_CHECK(tor2.status().is_seeding);
|
TEST_CHECK(tor2.status().is_seeding);
|
||||||
if (tor2.status().is_seeding) std::cerr << "done\n";
|
if (tor2.status().is_seeding) std::cerr << "done\n";
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
|
p3 = ses3.abort();
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
remove_all("tmp1_meta", ec);
|
remove_all("tmp1_meta", ec);
|
||||||
remove_all("tmp2_meta", ec);
|
remove_all("tmp2_meta", ec);
|
||||||
|
|
|
@ -72,6 +72,12 @@ void test_transfer(libtorrent::pe_settings::enc_policy policy,
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace 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;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48800, 49000), "0.0.0.0", 0);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48800, 49000), "0.0.0.0", 0);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49800, 50000), "0.0.0.0", 0);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49800, 50000), "0.0.0.0", 0);
|
||||||
pe_settings s;
|
pe_settings s;
|
||||||
|
@ -119,6 +125,10 @@ void test_transfer(libtorrent::pe_settings::enc_policy policy,
|
||||||
ses1.remove_torrent(tor1);
|
ses1.remove_torrent(tor1);
|
||||||
ses2.remove_torrent(tor2);
|
ses2.remove_torrent(tor2);
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
remove_all("tmp1_pe", ec);
|
remove_all("tmp1_pe", ec);
|
||||||
remove_all("tmp2_pe", ec);
|
remove_all("tmp2_pe", ec);
|
||||||
|
|
|
@ -45,6 +45,13 @@ void test_pex()
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace 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;
|
||||||
|
session_proxy p3;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48200, 49000), "0.0.0.0", 0);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48200, 49000), "0.0.0.0", 0);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49200, 50000), "0.0.0.0", 0);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49200, 50000), "0.0.0.0", 0);
|
||||||
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50200, 51000), "0.0.0.0", 0);
|
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50200, 51000), "0.0.0.0", 0);
|
||||||
|
@ -135,6 +142,11 @@ void test_pex()
|
||||||
TEST_CHECK(st1.num_peers == 2 && st2.num_peers == 2 && st3.num_peers == 2)
|
TEST_CHECK(st1.num_peers == 2 && st2.num_peers == 2 && st3.num_peers == 2)
|
||||||
|
|
||||||
if (!tor2.status().is_seeding && tor3.status().is_seeding) std::cerr << "done\n";
|
if (!tor2.status().is_seeding && tor3.status().is_seeding) std::cerr << "done\n";
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
|
p3 = ses3.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
|
|
|
@ -101,11 +101,17 @@ bool on_alert(alert* a)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_ssl(int test_idx)
|
void test_ssl(int test_idx, bool use_utp)
|
||||||
{
|
{
|
||||||
|
// 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;
|
||||||
|
|
||||||
test_config_t const& test = test_config[test_idx];
|
test_config_t const& test = test_config[test_idx];
|
||||||
|
|
||||||
fprintf(stderr, "\n%s TEST: %s\n\n", time_now_string(), test.name);
|
fprintf(stderr, "\n%s TEST: %s Protocol: %s\n\n", time_now_string(), test.name, use_utp ? "uTP": "TCP");
|
||||||
|
|
||||||
#ifndef TORRENT_USE_OPENSSL
|
#ifndef TORRENT_USE_OPENSSL
|
||||||
if (test.use_ssl_ports)
|
if (test.use_ssl_ports)
|
||||||
|
@ -128,6 +134,11 @@ void test_ssl(int test_idx)
|
||||||
|
|
||||||
session_settings sett;
|
session_settings sett;
|
||||||
|
|
||||||
|
sett.enable_incoming_utp = use_utp;
|
||||||
|
sett.enable_outgoing_utp = use_utp;
|
||||||
|
sett.enable_incoming_tcp = !use_utp;
|
||||||
|
sett.enable_outgoing_tcp = !use_utp;
|
||||||
|
|
||||||
sett.ssl_listen = 1024 + rand() % 50000;
|
sett.ssl_listen = 1024 + rand() % 50000;
|
||||||
|
|
||||||
ses1.set_settings(sett);
|
ses1.set_settings(sett);
|
||||||
|
@ -227,14 +238,19 @@ void test_ssl(int test_idx)
|
||||||
fprintf(stderr, "%s: EXPECT: %s\n", time_now_string(), test.expected_to_complete ? "SUCCEESS" : "FAILURE");
|
fprintf(stderr, "%s: EXPECT: %s\n", time_now_string(), test.expected_to_complete ? "SUCCEESS" : "FAILURE");
|
||||||
fprintf(stderr, "%s: RESULT: %s\n", time_now_string(), tor2.status().is_seeding ? "SUCCEESS" : "FAILURE");
|
fprintf(stderr, "%s: RESULT: %s\n", time_now_string(), tor2.status().is_seeding ? "SUCCEESS" : "FAILURE");
|
||||||
TEST_CHECK(tor2.status().is_seeding == test.expected_to_complete);
|
TEST_CHECK(tor2.status().is_seeding == test.expected_to_complete);
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
// No support for SSL/uTP yet, so always pass in false
|
||||||
for (int i = 0; i < sizeof(test_config)/sizeof(test_config[0]); ++i)
|
for (int i = 0; i < sizeof(test_config)/sizeof(test_config[0]); ++i)
|
||||||
test_ssl(i);
|
test_ssl(i, false);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
remove_all("tmp1_ssl", ec);
|
remove_all("tmp1_ssl", ec);
|
||||||
|
|
|
@ -52,6 +52,13 @@ void test_swarm(bool super_seeding = false, bool strict = false, bool seed_mode
|
||||||
remove_all("tmp2_swarm", ec);
|
remove_all("tmp2_swarm", ec);
|
||||||
remove_all("tmp3_swarm", ec);
|
remove_all("tmp3_swarm", ec);
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
session_proxy p3;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48000, 49000), "0.0.0.0", 0);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48000, 49000), "0.0.0.0", 0);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49000, 50000), "0.0.0.0", 0);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49000, 50000), "0.0.0.0", 0);
|
||||||
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50000, 51000), "0.0.0.0", 0);
|
session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50000, 51000), "0.0.0.0", 0);
|
||||||
|
@ -182,6 +189,12 @@ void test_swarm(bool super_seeding = false, bool strict = false, bool seed_mode
|
||||||
std::cerr << ret->message() << std::endl;
|
std::cerr << ret->message() << std::endl;
|
||||||
start = time_now();
|
start = time_now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
|
p3 = ses3.abort();
|
||||||
|
|
||||||
TEST_CHECK(time_now_hires() - start < seconds(3));
|
TEST_CHECK(time_now_hires() - start < seconds(3));
|
||||||
TEST_CHECK(time_now_hires() - start >= seconds(2));
|
TEST_CHECK(time_now_hires() - start >= seconds(2));
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,12 @@ void test_rate()
|
||||||
remove_all("tmp1_transfer_moved", ec);
|
remove_all("tmp1_transfer_moved", ec);
|
||||||
remove_all("tmp2_transfer_moved", ec);
|
remove_all("tmp2_transfer_moved", ec);
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48575, 49000), "0.0.0.0", 0, alert_mask);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48575, 49000), "0.0.0.0", 0, alert_mask);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49575, 50000), "0.0.0.0", 0, alert_mask);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49575, 50000), "0.0.0.0", 0, alert_mask);
|
||||||
|
|
||||||
|
@ -125,6 +131,10 @@ void test_rate()
|
||||||
|
|
||||||
std::cerr << "average download rate: " << (t->total_size() / (std::max)(total_milliseconds(dt), 1))
|
std::cerr << "average download rate: " << (t->total_size() / (std::max)(total_milliseconds(dt), 1))
|
||||||
<< " kB/s" << std::endl;
|
<< " kB/s" << std::endl;
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_alert(std::auto_ptr<alert>)
|
void print_alert(std::auto_ptr<alert>)
|
||||||
|
@ -249,6 +259,12 @@ void test_transfer(int proxy_type, bool test_disk_full = false, bool test_allowe
|
||||||
remove_all("tmp1_transfer_moved", ec);
|
remove_all("tmp1_transfer_moved", ec);
|
||||||
remove_all("tmp2_transfer_moved", ec);
|
remove_all("tmp2_transfer_moved", ec);
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48075, 49000), "0.0.0.0", 0, alert_mask);
|
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48075, 49000), "0.0.0.0", 0, alert_mask);
|
||||||
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49075, 50000), "0.0.0.0", 0, alert_mask);
|
session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49075, 50000), "0.0.0.0", 0, alert_mask);
|
||||||
|
|
||||||
|
@ -589,12 +605,17 @@ void test_transfer(int proxy_type, bool test_disk_full = false, bool test_allowe
|
||||||
|
|
||||||
TEST_CHECK(tor2.status().is_seeding);
|
TEST_CHECK(tor2.status().is_seeding);
|
||||||
|
|
||||||
|
// this allows shutting down the sessions in parallel
|
||||||
|
p1 = ses1.abort();
|
||||||
|
p2 = ses2.abort();
|
||||||
|
|
||||||
if (test_priorities)
|
if (test_priorities)
|
||||||
{
|
{
|
||||||
stop_tracker();
|
stop_tracker();
|
||||||
stop_web_server();
|
stop_web_server();
|
||||||
}
|
}
|
||||||
if (proxy_type) stop_proxy(ps.port);
|
if (proxy_type) stop_proxy(ps.port);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
|
|
Loading…
Reference in New Issue