move time_now_string out to the unit test library (basically unused in libtorrent itself)

This commit is contained in:
Arvid Norberg 2015-04-24 03:48:08 +00:00
parent 91e66f65d3
commit 3ea67e2bf5
21 changed files with 202 additions and 100 deletions

View File

@ -359,7 +359,7 @@ if(build_tests)
FILE(GLOB tests RELATIVE "${PROJECT_SOURCE_DIR}" "test/test_*.cpp") FILE(GLOB tests RELATIVE "${PROJECT_SOURCE_DIR}" "test/test_*.cpp")
add_library(test_common STATIC test/main.cpp test/setup_transfer.cpp add_library(test_common STATIC test/main.cpp test/setup_transfer.cpp
test/dht_server.cpp test/udp_tracker.cpp test/peer_server.cpp test/dht_server.cpp test/udp_tracker.cpp test/peer_server.cpp
test/web_seed_suite.cpp) test/web_seed_suite.cpp test/test_utils.cpp)
enable_testing() enable_testing()
foreach(s ${tests}) foreach(s ${tests})

View File

@ -40,10 +40,6 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent { namespace aux namespace libtorrent { namespace aux
{ {
// TODO: 3 this is only used for debug logging. It should probably not
// be included unconditionally
TORRENT_EXTRA_EXPORT char const* time_now_string();
std::string log_time(); std::string log_time();
// returns the current time, as represented by time_point. The // returns the current time, as represented by time_point. The

View File

@ -394,8 +394,8 @@ int snprintf(char* buf, int len, char const* fmt, ...)
// at the highest warning level, clang actually warns about functions // at the highest warning level, clang actually warns about functions
// that could be marked noreturn. There seems to be versions of GCC // that could be marked noreturn. There seems to be versions of GCC
// that declare being // that declare being
#if defined __clang__ && defined __cplusplus && __cplusplus >= 199711L #if defined __clang__ || defined __GNUC__
#define TORRENT_NO_RETURN [[noreturn]] #define TORRENT_NO_RETURN __attribute((noreturn))
#else #else
#define TORRENT_NO_RETURN #define TORRENT_NO_RETURN
#endif #endif

View File

@ -34,6 +34,9 @@ POSSIBILITY OF SUCH DAMAGE.
#define TORRENT_TIME_HPP_INCLUDED #define TORRENT_TIME_HPP_INCLUDED
#include "libtorrent/config.hpp" #include "libtorrent/config.hpp"
#include "libtorrent/aux_/disable_warnings_push.hpp"
#include <boost/cstdint.hpp> #include <boost/cstdint.hpp>
#if defined BOOST_ASIO_HAS_STD_CHRONO #if defined BOOST_ASIO_HAS_STD_CHRONO
@ -42,6 +45,8 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/chrono.hpp> #include <boost/chrono.hpp>
#endif #endif
#include "libtorrent/aux_/disable_warnings_pop.hpp"
namespace libtorrent { namespace libtorrent {
#if defined BOOST_ASIO_HAS_STD_CHRONO #if defined BOOST_ASIO_HAS_STD_CHRONO

View File

@ -36,11 +36,12 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent { namespace dht namespace libtorrent { namespace dht
{ {
// TODO: 3 replace this logging with alerts
log_event::log_event(log& log) log_event::log_event(log& log)
: log_(log) : log_(log)
{ {
if (log_.enabled()) if (log_.enabled())
log_ << libtorrent::aux::time_now_string() << " [" << log.id() << "] "; log_ << libtorrent::aux::log_time() << " [" << log.id() << "] ";
} }
log_event::~log_event() log_event::~log_event()

View File

@ -222,7 +222,7 @@ namespace libtorrent { namespace
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
std::stringstream log_line; std::stringstream log_line;
log_line << aux::time_now_string() << " <== LT_TEX [ " log_line << " <== LT_TEX [ "
"added: "; "added: ";
#endif #endif
@ -327,7 +327,7 @@ namespace libtorrent { namespace
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
std::stringstream log_line; std::stringstream log_line;
log_line << aux::time_now_string() << " ==> LT_TEX [ " log_line << " ==> LT_TEX [ "
"added: "; "added: ";
#endif #endif
entry tex; entry tex;

View File

@ -39,10 +39,6 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/time.hpp" #include "libtorrent/time.hpp"
#include "libtorrent/aux_/time.hpp" #include "libtorrent/aux_/time.hpp"
#ifndef _WIN32
#include <unistd.h>
#endif
namespace libtorrent { namespace aux namespace libtorrent { namespace aux
{ {
// used to cache the current time // used to cache the current time
@ -54,22 +50,6 @@ namespace libtorrent { namespace aux
time_point const& time_now() { return aux::g_current_time; } time_point const& time_now() { return aux::g_current_time; }
TORRENT_EXTRA_EXPORT char const* time_now_string()
{
static const time_point start = clock_type::now();
static char ret[200];
int t = total_milliseconds(clock_type::now() - start);
int h = t / 1000 / 60 / 60;
t -= h * 60 * 60 * 1000;
int m = t / 1000 / 60;
t -= m * 60 * 1000;
int s = t / 1000;
t -= s * 1000;
int ms = t;
snprintf(ret, sizeof(ret), "%02d:%02d:%02d.%03d", h, m, s, ms);
return ret;
}
std::string log_time() std::string log_time()
{ {
static const time_point start = clock_type::now(); static const time_point start = clock_type::now();

View File

@ -56,6 +56,7 @@ lib libtorrent_test
peer_server.cpp peer_server.cpp
web_seed_suite.cpp web_seed_suite.cpp
swarm_suite.cpp swarm_suite.cpp
test_utils.cpp
: # requirements : # requirements
# this is used to determine whether # this is used to determine whether

View File

@ -128,7 +128,8 @@ EXTRA_DIST = Jamfile \
EXTRA_PROGRAMS = $(test_programs) EXTRA_PROGRAMS = $(test_programs)
noinst_HEADERS = test.hpp setup_transfer.hpp dht_server.hpp \ noinst_HEADERS = test.hpp setup_transfer.hpp dht_server.hpp \
peer_server.hpp udp_tracker.hpp web_seed_suite.hpp swarm_suite.hpp peer_server.hpp udp_tracker.hpp web_seed_suite.hpp swarm_suite.hpp \
test_utils.hpp
libtest_la_SOURCES = main.cpp \ libtest_la_SOURCES = main.cpp \
setup_transfer.cpp \ setup_transfer.cpp \
@ -136,7 +137,8 @@ libtest_la_SOURCES = main.cpp \
udp_tracker.cpp \ udp_tracker.cpp \
peer_server.cpp \ peer_server.cpp \
web_seed_suite.cpp \ web_seed_suite.cpp \
swarm_suite.cpp swarm_suite.cpp \
test_utils.cpp
test_bitfield_SOURCES = test_bitfield.cpp test_bitfield_SOURCES = test_bitfield.cpp
test_crc32_SOURCES = test_crc32.cpp test_crc32_SOURCES = test_crc32.cpp

View File

@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/socket.hpp" #include "libtorrent/socket.hpp"
#include "libtorrent/aux_/time.hpp" #include "libtorrent/aux_/time.hpp"
#include "dht_server.hpp" #include "dht_server.hpp"
#include "test_utils.hpp"
#include <boost/detail/atomic_count.hpp> #include <boost/detail/atomic_count.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
@ -86,7 +87,7 @@ struct dht_server
return; return;
} }
fprintf(stderr, "%s: DHT initialized on port %d\n", aux::time_now_string(), m_port); fprintf(stderr, "%s: DHT initialized on port %d\n", time_now_string(), m_port);
m_thread.reset(new thread(boost::bind(&dht_server::thread_fun, this))); m_thread.reset(new thread(boost::bind(&dht_server::thread_fun, this)));
} }
@ -171,8 +172,8 @@ int num_dht_hits()
void stop_dht() void stop_dht()
{ {
fprintf(stderr, "%s: stop_dht()\n", aux::time_now_string()); fprintf(stderr, "%s: stop_dht()\n", time_now_string());
g_dht.reset(); g_dht.reset();
fprintf(stderr, "%s: stop_dht() done\n", aux::time_now_string()); fprintf(stderr, "%s: stop_dht() done\n", time_now_string());
} }

View File

@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/socket.hpp" #include "libtorrent/socket.hpp"
#include "libtorrent/aux_/time.hpp" #include "libtorrent/aux_/time.hpp"
#include "peer_server.hpp" #include "peer_server.hpp"
#include "test_utils.hpp"
#include <boost/detail/atomic_count.hpp> #include <boost/detail/atomic_count.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
@ -88,7 +89,7 @@ struct peer_server
return; return;
} }
fprintf(stderr, "%s: PEER peer initialized on port %d\n", aux::time_now_string(), m_port); fprintf(stderr, "%s: PEER peer initialized on port %d\n", time_now_string(), m_port);
m_thread.reset(new thread(boost::bind(&peer_server::thread_fun, this))); m_thread.reset(new thread(boost::bind(&peer_server::thread_fun, this)));
} }
@ -135,7 +136,7 @@ struct peer_server
return; return;
} }
fprintf(stderr, "%s: PEER incoming peer connection\n", aux::time_now_string()); fprintf(stderr, "%s: PEER incoming peer connection\n", time_now_string());
++m_peer_requests; ++m_peer_requests;
socket.close(ec); socket.close(ec);
} }
@ -159,8 +160,8 @@ int num_peer_hits()
void stop_peer() void stop_peer()
{ {
fprintf(stderr, "%s: PEER stop_peer()\n", aux::time_now_string()); fprintf(stderr, "%s: PEER stop_peer()\n", time_now_string());
g_peer.reset(); g_peer.reset();
fprintf(stderr, "%s: PEER stop_peer() done\n", aux::time_now_string()); fprintf(stderr, "%s: PEER stop_peer() done\n", time_now_string());
} }

View File

@ -47,6 +47,8 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/make_shared.hpp> #include <boost/make_shared.hpp>
#include "test.hpp" #include "test.hpp"
#include "test_utils.hpp"
#include "libtorrent/assert.hpp" #include "libtorrent/assert.hpp"
#include "libtorrent/alert_types.hpp" #include "libtorrent/alert_types.hpp"
#include "libtorrent/create_torrent.hpp" #include "libtorrent/create_torrent.hpp"
@ -156,7 +158,7 @@ alert const* wait_for_alert(lt::session& ses, int type, char const* name)
for (std::vector<alert*>::iterator i = alerts.begin() for (std::vector<alert*>::iterator i = alerts.begin()
, end(alerts.end()); i != end; ++i) , end(alerts.end()); i != end; ++i)
{ {
fprintf(stderr, "%s: %s: [%s] %s\n", aux::time_now_string(), name fprintf(stderr, "%s: %s: [%s] %s\n", time_now_string(), name
, (*i)->what(), (*i)->message().c_str()); , (*i)->what(), (*i)->message().c_str());
if ((*i)->type() == type) if ((*i)->type() == type)
{ {
@ -265,14 +267,14 @@ bool print_alerts(lt::session& ses, char const* name
if (predicate && predicate(*i)) ret = true; if (predicate && predicate(*i)) ret = true;
if (peer_disconnected_alert const* p = alert_cast<peer_disconnected_alert>(*i)) if (peer_disconnected_alert const* p = alert_cast<peer_disconnected_alert>(*i))
{ {
fprintf(stderr, "%s: %s: [%s] (%s): %s\n", aux::time_now_string(), name, (*i)->what(), print_endpoint(p->ip).c_str(), p->message().c_str()); fprintf(stderr, "%s: %s: [%s] (%s): %s\n", time_now_string(), name, (*i)->what(), print_endpoint(p->ip).c_str(), p->message().c_str());
} }
else if ((*i)->message() != "block downloading" else if ((*i)->message() != "block downloading"
&& (*i)->message() != "block finished" && (*i)->message() != "block finished"
&& (*i)->message() != "piece finished" && (*i)->message() != "piece finished"
&& !no_output) && !no_output)
{ {
fprintf(stderr, "%s: %s: [%s] %s\n", aux::time_now_string(), name, (*i)->what(), (*i)->message().c_str()); fprintf(stderr, "%s: %s: [%s] %s\n", time_now_string(), name, (*i)->what(), (*i)->message().c_str());
} }
TEST_CHECK(alert_cast<fastresume_rejected_alert>(*i) == 0 || allow_failed_fastresume); TEST_CHECK(alert_cast<fastresume_rejected_alert>(*i) == 0 || allow_failed_fastresume);
@ -280,7 +282,7 @@ bool print_alerts(lt::session& ses, char const* name
peer_error_alert const* pea = alert_cast<peer_error_alert>(*i); peer_error_alert const* pea = alert_cast<peer_error_alert>(*i);
if (pea) if (pea)
{ {
fprintf(stderr, "%s: peer error: %s\n", aux::time_now_string(), pea->error.message().c_str()); fprintf(stderr, "%s: peer error: %s\n", time_now_string(), pea->error.message().c_str());
TEST_CHECK((!handles.empty() && h.status().is_seeding) TEST_CHECK((!handles.empty() && h.status().is_seeding)
|| pea->error.message() == "connecting to peer" || pea->error.message() == "connecting to peer"
|| pea->error.message() == "closing connection to ourself" || pea->error.message() == "closing connection to ourself"
@ -543,13 +545,13 @@ int start_proxy(int proxy_type)
char buf[512]; char buf[512];
snprintf(buf, sizeof(buf), "%s --port %d%s", cmd, port, auth); snprintf(buf, sizeof(buf), "%s --port %d%s", cmd, port, auth);
fprintf(stderr, "%s starting proxy on port %d (%s %s)...\n", aux::time_now_string(), port, type, auth); fprintf(stderr, "%s starting proxy on port %d (%s %s)...\n", time_now_string(), port, type, auth);
fprintf(stderr, "%s\n", buf); fprintf(stderr, "%s\n", buf);
pid_type r = async_run(buf); pid_type r = async_run(buf);
if (r == 0) exit(1); if (r == 0) exit(1);
proxy_t t = { r, proxy_type }; proxy_t t = { r, proxy_type };
running_proxies.insert(std::make_pair(port, t)); running_proxies.insert(std::make_pair(port, t));
fprintf(stderr, "%s launched\n", aux::time_now_string()); fprintf(stderr, "%s launched\n", time_now_string());
test_sleep(500); test_sleep(500);
return port; return port;
} }
@ -823,7 +825,7 @@ setup_transfer(lt::session* ses1, lt::session* ses2, lt::session* ses3
port = ses2->listen_port(); port = ses2->listen_port();
fprintf(stderr, "%s: ses1: connecting peer port: %d\n" fprintf(stderr, "%s: ses1: connecting peer port: %d\n"
, aux::time_now_string(), port); , time_now_string(), port);
tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec) tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec)
, port)); , port));
@ -869,13 +871,13 @@ int start_web_server(bool ssl, bool chunked_encoding, bool keepalive)
snprintf(buf, sizeof(buf), "python ../web_server.py %d %d %d %d" snprintf(buf, sizeof(buf), "python ../web_server.py %d %d %d %d"
, port, chunked_encoding , ssl, keepalive); , port, chunked_encoding , ssl, keepalive);
fprintf(stderr, "%s starting web_server on port %d...\n", aux::time_now_string(), port); fprintf(stderr, "%s starting web_server on port %d...\n", time_now_string(), port);
fprintf(stderr, "%s\n", buf); fprintf(stderr, "%s\n", buf);
pid_type r = async_run(buf); pid_type r = async_run(buf);
if (r == 0) exit(1); if (r == 0) exit(1);
web_server_pid = r; web_server_pid = r;
fprintf(stderr, "%s launched\n", aux::time_now_string()); fprintf(stderr, "%s launched\n", time_now_string());
test_sleep(500); test_sleep(500);
return port; return port;
} }

View File

@ -32,6 +32,8 @@ POSSIBILITY OF SUCH DAMAGE.
#include "test.hpp" #include "test.hpp"
#include "setup_transfer.hpp" #include "setup_transfer.hpp"
#include "test_utils.hpp"
#include "libtorrent/socket.hpp" #include "libtorrent/socket.hpp"
#include "libtorrent/io.hpp" #include "libtorrent/io.hpp"
#include "libtorrent/alloca.hpp" #include "libtorrent/alloca.hpp"
@ -63,7 +65,7 @@ void log(char const* fmt, ...)
va_end(v); va_end(v);
fprintf(stderr, "\x1b[1m\x1b[36m%s: %s\x1b[0m\n" fprintf(stderr, "\x1b[1m\x1b[36m%s: %s\x1b[0m\n"
, aux::time_now_string(), buf); , time_now_string(), buf);
} }
void print_session_log(lt::session& ses) void print_session_log(lt::session& ses)

View File

@ -31,11 +31,13 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "test.hpp" #include "test.hpp"
#include "setup_transfer.hpp"
#include "test_utils.hpp"
#include "libtorrent/socket.hpp" #include "libtorrent/socket.hpp"
#include "libtorrent/socket_io.hpp" // print_endpoint #include "libtorrent/socket_io.hpp" // print_endpoint
#include "libtorrent/http_connection.hpp" #include "libtorrent/http_connection.hpp"
#include "libtorrent/resolver.hpp" #include "libtorrent/resolver.hpp"
#include "setup_transfer.hpp"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
@ -55,12 +57,12 @@ char data_buffer[4000];
void print_http_header(http_parser const& p) void print_http_header(http_parser const& p)
{ {
std::cerr << aux::time_now_string() << " < " << p.status_code() << " " << p.message() << std::endl; std::cerr << time_now_string() << " < " << p.status_code() << " " << p.message() << std::endl;
for (std::multimap<std::string, std::string>::const_iterator i for (std::multimap<std::string, std::string>::const_iterator i
= p.headers().begin(), end(p.headers().end()); i != end; ++i) = p.headers().begin(), end(p.headers().end()); i != end; ++i)
{ {
std::cerr << aux::time_now_string() << " < " << i->first << ": " << i->second << std::endl; std::cerr << time_now_string() << " < " << i->first << ": " << i->second << std::endl;
} }
} }
@ -69,7 +71,7 @@ void http_connect_handler(http_connection& c)
++connect_handler_called; ++connect_handler_called;
TEST_CHECK(c.socket().is_open()); TEST_CHECK(c.socket().is_open());
error_code ec; error_code ec;
std::cerr << aux::time_now_string() << " connected to: " << print_endpoint(c.socket().remote_endpoint(ec)) std::cerr << time_now_string() << " connected to: " << print_endpoint(c.socket().remote_endpoint(ec))
<< std::endl; << std::endl;
// this is not necessarily true when using a proxy and proxying hostnames // this is not necessarily true when using a proxy and proxying hostnames
// TEST_CHECK(c.socket().remote_endpoint(ec).address() == address::from_string("127.0.0.1", ec)); // TEST_CHECK(c.socket().remote_endpoint(ec).address() == address::from_string("127.0.0.1", ec));
@ -111,7 +113,7 @@ void run_test(std::string const& url, int size, int status, int connected
std::cerr << " ===== TESTING: " << url << " =====" << std::endl; std::cerr << " ===== TESTING: " << url << " =====" << std::endl;
std::cerr << aux::time_now_string() std::cerr << time_now_string()
<< " expecting: size: " << size << " expecting: size: " << size
<< " status: " << status << " status: " << status
<< " connected: " << connected << " connected: " << connected
@ -124,14 +126,14 @@ void run_test(std::string const& url, int size, int status, int connected
ios.reset(); ios.reset();
error_code e; error_code e;
ios.run(e); ios.run(e);
if (e) std::cerr << aux::time_now_string() << " run failed: " << e.message() << std::endl; if (e) std::cerr << time_now_string() << " run failed: " << e.message() << std::endl;
std::cerr << aux::time_now_string() << " connect_handler_called: " << connect_handler_called << std::endl; std::cerr << time_now_string() << " connect_handler_called: " << connect_handler_called << std::endl;
std::cerr << aux::time_now_string() << " handler_called: " << handler_called << std::endl; std::cerr << time_now_string() << " handler_called: " << handler_called << std::endl;
std::cerr << aux::time_now_string() << " status: " << http_status << std::endl; std::cerr << time_now_string() << " status: " << http_status << std::endl;
std::cerr << aux::time_now_string() << " size: " << data_size << std::endl; std::cerr << time_now_string() << " size: " << data_size << std::endl;
std::cerr << aux::time_now_string() << " expected-size: " << size << std::endl; std::cerr << time_now_string() << " expected-size: " << size << std::endl;
std::cerr << aux::time_now_string() << " error_code: " << g_error_code.message() << std::endl; std::cerr << time_now_string() << " error_code: " << g_error_code.message() << std::endl;
TEST_CHECK(connect_handler_called == connected); TEST_CHECK(connect_handler_called == connected);
TEST_CHECK(handler_called == 1); TEST_CHECK(handler_called == 1);
TEST_CHECK(data_size == size || size == -1); TEST_CHECK(data_size == size || size == -1);

View File

@ -30,16 +30,18 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "test.hpp"
#include "setup_transfer.hpp"
#include "test_utils.hpp"
#include "test_utils.hpp"
#include "libtorrent/session.hpp" #include "libtorrent/session.hpp"
#include "libtorrent/hasher.hpp" #include "libtorrent/hasher.hpp"
#include "libtorrent/thread.hpp" #include "libtorrent/thread.hpp"
#include <boost/tuple/tuple.hpp>
#include "test.hpp"
#include "setup_transfer.hpp"
#include "libtorrent/extensions/metadata_transfer.hpp" #include "libtorrent/extensions/metadata_transfer.hpp"
#include "libtorrent/extensions/ut_metadata.hpp" #include "libtorrent/extensions/ut_metadata.hpp"
#include <iostream>
#include <boost/tuple/tuple.hpp>
using boost::tuples::ignore; using boost::tuples::ignore;
@ -137,7 +139,7 @@ void test_transfer(int flags
error_code ec; error_code ec;
int port = seed->listen_port(); int port = seed->listen_port();
fprintf(stderr, "%s: downloader: connecting peer port: %d\n" fprintf(stderr, "%s: downloader: connecting peer port: %d\n"
, aux::time_now_string(), port); , time_now_string(), port);
tor2.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec) tor2.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec)
, port)); , port));
} }
@ -146,7 +148,7 @@ void test_transfer(int flags
error_code ec; error_code ec;
int port = downloader->listen_port(); int port = downloader->listen_port();
fprintf(stderr, "%s: seed: connecting peer port: %d\n" fprintf(stderr, "%s: seed: connecting peer port: %d\n"
, aux::time_now_string(), port); , time_now_string(), port);
tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec) tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec)
, port)); , port));
} }
@ -171,7 +173,7 @@ void test_transfer(int flags
if (flags & upload_only) goto done; if (flags & upload_only) goto done;
std::cerr << "waiting for transfer to complete\n"; fprintf(stderr, "waiting for transfer to complete\n");
for (int i = 0; i < timeout * 10; ++i) for (int i = 0; i < timeout * 10; ++i)
{ {
@ -187,7 +189,7 @@ void test_transfer(int flags
} }
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) fprintf(stderr, "done\n");
done: done:

View File

@ -35,6 +35,8 @@ POSSIBILITY OF SUCH DAMAGE.
#include "dht_server.hpp" #include "dht_server.hpp"
#include "peer_server.hpp" #include "peer_server.hpp"
#include "udp_tracker.hpp" #include "udp_tracker.hpp"
#include "test_utils.hpp"
#include "libtorrent/alert.hpp" #include "libtorrent/alert.hpp"
#include "libtorrent/random.hpp" #include "libtorrent/random.hpp"
#include "libtorrent/alert_types.hpp" #include "libtorrent/alert_types.hpp"
@ -229,7 +231,7 @@ session_proxy test_proxy(settings_pack::proxy_type_t proxy_type, int flags)
if (flags & expect_http_reject) if (flags & expect_http_reject)
TEST_CHECK(std::find(rejected_trackers.begin(), rejected_trackers.end(), http_tracker_url) != rejected_trackers.end()); TEST_CHECK(std::find(rejected_trackers.begin(), rejected_trackers.end(), http_tracker_url) != rejected_trackers.end());
fprintf(stderr, "%s: ~session\n", aux::time_now_string()); fprintf(stderr, "%s: ~session\n", time_now_string());
session_proxy pr = s->abort(); session_proxy pr = s->abort();
delete s; delete s;

View File

@ -30,6 +30,10 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "test.hpp"
#include "setup_transfer.hpp"
#include "test_utils.hpp"
#include "libtorrent/storage.hpp" #include "libtorrent/storage.hpp"
#include "libtorrent/file_pool.hpp" #include "libtorrent/file_pool.hpp"
#include "libtorrent/hasher.hpp" #include "libtorrent/hasher.hpp"
@ -42,8 +46,6 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/make_shared.hpp> #include <boost/make_shared.hpp>
#include <boost/utility.hpp> #include <boost/utility.hpp>
#include "test.hpp"
#include "setup_transfer.hpp"
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
@ -62,33 +64,33 @@ char* piece3 = page_aligned_allocator::malloc(piece_size);
void signal_bool(bool* b, char const* string) void signal_bool(bool* b, char const* string)
{ {
*b = true; *b = true;
std::cerr << aux::time_now_string() << " " << string << std::endl; std::cerr << time_now_string() << " " << string << std::endl;
} }
void on_read_piece(int ret, disk_io_job const& j, char const* data, int size) void on_read_piece(int ret, disk_io_job const& j, char const* data, int size)
{ {
std::cerr << aux::time_now_string() << " on_read_piece piece: " << j.piece << std::endl; std::cerr << time_now_string() << " on_read_piece piece: " << j.piece << std::endl;
TEST_EQUAL(ret, size); TEST_EQUAL(ret, size);
if (ret > 0) TEST_CHECK(std::equal(j.buffer, j.buffer + ret, data)); if (ret > 0) TEST_CHECK(std::equal(j.buffer, j.buffer + ret, data));
} }
void on_check_resume_data(disk_io_job const* j, bool* done) void on_check_resume_data(disk_io_job const* j, bool* done)
{ {
std::cerr << aux::time_now_string() << " on_check_resume_data ret: " << j->ret; std::cerr << time_now_string() << " on_check_resume_data ret: " << j->ret;
switch (j->ret) switch (j->ret)
{ {
case piece_manager::no_error: case piece_manager::no_error:
std::cerr << aux::time_now_string() << " success" << std::endl; std::cerr << time_now_string() << " success" << std::endl;
break; break;
case piece_manager::fatal_disk_error: case piece_manager::fatal_disk_error:
std::cerr << aux::time_now_string() << " disk error: " << j->error.ec.message() std::cerr << time_now_string() << " disk error: " << j->error.ec.message()
<< " file: " << j->error.file << std::endl; << " file: " << j->error.file << std::endl;
break; break;
case piece_manager::need_full_check: case piece_manager::need_full_check:
std::cerr << aux::time_now_string() << " need full check" << std::endl; std::cerr << time_now_string() << " need full check" << std::endl;
break; break;
case piece_manager::disk_check_aborted: case piece_manager::disk_check_aborted:
std::cerr << aux::time_now_string() << " aborted" << std::endl; std::cerr << time_now_string() << " aborted" << std::endl;
break; break;
} }
std::cerr << std::endl; std::cerr << std::endl;
@ -98,7 +100,7 @@ void on_check_resume_data(disk_io_job const* j, bool* done)
void print_error(char const* call, int ret, storage_error const& ec) void print_error(char const* call, int ret, storage_error const& ec)
{ {
fprintf(stderr, "%s: %s() returned: %d error: \"%s\" in file: %d operation: %d\n" fprintf(stderr, "%s: %s() returned: %d error: \"%s\" in file: %d operation: %d\n"
, aux::time_now_string(), call, ret, ec.ec.message().c_str(), ec.file, ec.operation); , time_now_string(), call, ret, ec.ec.message().c_str(), ec.file, ec.operation);
} }
void run_until(io_service& ios, bool const& done) void run_until(io_service& ios, bool const& done)
@ -113,7 +115,7 @@ void run_until(io_service& ios, bool const& done)
std::cerr << "run_one: " << ec.message().c_str() << std::endl; std::cerr << "run_one: " << ec.message().c_str() << std::endl;
return; return;
} }
std::cerr << aux::time_now_string() << " done: " << done << std::endl; std::cerr << time_now_string() << " done: " << done << std::endl;
} }
} }

View File

@ -38,11 +38,14 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/thread.hpp" #include "libtorrent/thread.hpp"
#include "libtorrent/time.hpp" #include "libtorrent/time.hpp"
#include "libtorrent/file.hpp" #include "libtorrent/file.hpp"
#include <boost/tuple/tuple.hpp>
#include <boost/bind.hpp>
#include "test.hpp" #include "test.hpp"
#include "setup_transfer.hpp" #include "setup_transfer.hpp"
#include "test_utils.hpp"
#include <boost/tuple/tuple.hpp>
#include <boost/bind.hpp>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
@ -306,7 +309,7 @@ void test_transfer(int proxy_type, settings_pack const& sett
// at this point we probably disconnected the seed // at this point we probably disconnected the seed
// so we need to reconnect as well // so we need to reconnect as well
fprintf(stderr, "%s: reconnecting peer\n", aux::time_now_string()); fprintf(stderr, "%s: reconnecting peer\n", time_now_string());
error_code ec; error_code ec;
tor2.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec) tor2.connect_peer(tcp::endpoint(address::from_string("127.0.0.1", ec)
, ses1.listen_port())); , ses1.listen_port()));
@ -314,7 +317,7 @@ void test_transfer(int proxy_type, settings_pack const& sett
TEST_CHECK(tor2.status().is_finished == false); TEST_CHECK(tor2.status().is_finished == false);
fprintf(stderr, "disconnects: %d\n", peer_disconnects); fprintf(stderr, "disconnects: %d\n", peer_disconnects);
TEST_CHECK(peer_disconnects >= 2); TEST_CHECK(peer_disconnects >= 2);
fprintf(stderr, "%s: discovered disk full mode. Raise limit and disable upload-mode\n", aux::time_now_string()); fprintf(stderr, "%s: discovered disk full mode. Raise limit and disable upload-mode\n", time_now_string());
peer_disconnects = 0; peer_disconnects = 0;
continue; continue;
} }

55
test/test_utils.cpp Normal file
View File

@ -0,0 +1,55 @@
/*
Copyright (c) 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 "test_utils.hpp"
#include "libtorrent/time.hpp"
namespace libtorrent
{
char const* time_now_string()
{
static const time_point start = clock_type::now();
static char ret[200];
int t = total_milliseconds(clock_type::now() - start);
int h = t / 1000 / 60 / 60;
t -= h * 60 * 60 * 1000;
int m = t / 1000 / 60;
t -= m * 60 * 1000;
int s = t / 1000;
t -= s * 1000;
int ms = t;
snprintf(ret, sizeof(ret), "%02d:%02d:%02d.%03d", h, m, s, ms);
return ret;
}
}

44
test/test_utils.hpp Normal file
View File

@ -0,0 +1,44 @@
/*
Copyright (c) 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.
*/
#ifndef TEST_UTILS_HPP
#define TEST_UTILS_HPP
#include "test.hpp"
namespace libtorrent
{
EXPORT char const* time_now_string();
}
#endif

View File

@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/io.hpp" #include "libtorrent/io.hpp"
#include "libtorrent/aux_/time.hpp" #include "libtorrent/aux_/time.hpp"
#include "udp_tracker.hpp" #include "udp_tracker.hpp"
#include "test_utils.hpp"
#include <boost/detail/atomic_count.hpp> #include <boost/detail/atomic_count.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
@ -66,17 +67,17 @@ struct udp_tracker
{ {
if (ec) if (ec)
{ {
fprintf(stderr, "%s: UDP tracker, read failed: %s\n", aux::time_now_string(), ec.message().c_str()); fprintf(stderr, "%s: UDP tracker, read failed: %s\n", time_now_string(), ec.message().c_str());
return; return;
} }
if (bytes_transferred < 16) if (bytes_transferred < 16)
{ {
fprintf(stderr, "%s: UDP message too short (from: %s)\n", aux::time_now_string(), print_endpoint(*from).c_str()); fprintf(stderr, "%s: UDP message too short (from: %s)\n", time_now_string(), print_endpoint(*from).c_str());
return; return;
} }
fprintf(stderr, "%s: UDP message %d bytes\n", aux::time_now_string(), int(bytes_transferred)); fprintf(stderr, "%s: UDP message %d bytes\n", time_now_string(), int(bytes_transferred));
char* ptr = buffer; char* ptr = buffer;
detail::read_uint64(ptr); detail::read_uint64(ptr);
@ -89,7 +90,7 @@ struct udp_tracker
{ {
case 0: // connect case 0: // connect
fprintf(stderr, "%s: UDP connect from %s\n", aux::time_now_string() fprintf(stderr, "%s: UDP connect from %s\n", time_now_string()
, print_endpoint(*from).c_str()); , print_endpoint(*from).c_str());
ptr = buffer; ptr = buffer;
detail::write_uint32(0, ptr); // action = connect detail::write_uint32(0, ptr); // action = connect
@ -97,15 +98,15 @@ struct udp_tracker
detail::write_uint64(10, ptr); // connection_id detail::write_uint64(10, ptr); // connection_id
m_socket.send_to(asio::buffer(buffer, 16), *from, 0, e); m_socket.send_to(asio::buffer(buffer, 16), *from, 0, e);
if (e) fprintf(stderr, "%s: UDP send_to failed. ERROR: %s\n" if (e) fprintf(stderr, "%s: UDP send_to failed. ERROR: %s\n"
, aux::time_now_string(), e.message().c_str()); , time_now_string(), e.message().c_str());
else fprintf(stderr, "%s: UDP sent response to: %s\n" else fprintf(stderr, "%s: UDP sent response to: %s\n"
, aux::time_now_string(), print_endpoint(*from).c_str()); , time_now_string(), print_endpoint(*from).c_str());
break; break;
case 1: // announce case 1: // announce
++m_udp_announces; ++m_udp_announces;
fprintf(stderr, "%s: UDP announce [%d]\n", aux::time_now_string() fprintf(stderr, "%s: UDP announce [%d]\n", time_now_string()
, int(m_udp_announces)); , int(m_udp_announces));
ptr = buffer; ptr = buffer;
detail::write_uint32(1, ptr); // action = announce detail::write_uint32(1, ptr); // action = announce
@ -116,16 +117,16 @@ struct udp_tracker
// 0 peers // 0 peers
m_socket.send_to(asio::buffer(buffer, 20), *from, 0, e); m_socket.send_to(asio::buffer(buffer, 20), *from, 0, e);
if (e) fprintf(stderr, "%s: UDP send_to failed. ERROR: %s\n" if (e) fprintf(stderr, "%s: UDP send_to failed. ERROR: %s\n"
, aux::time_now_string(), e.message().c_str()); , time_now_string(), e.message().c_str());
else fprintf(stderr, "%s: UDP sent response to: %s\n" else fprintf(stderr, "%s: UDP sent response to: %s\n"
, aux::time_now_string(), print_endpoint(*from).c_str()); , time_now_string(), print_endpoint(*from).c_str());
break; break;
case 2: case 2:
// ignore scrapes // ignore scrapes
fprintf(stderr, "%s: UDP scrape (ignored)\n", aux::time_now_string()); fprintf(stderr, "%s: UDP scrape (ignored)\n", time_now_string());
break; break;
default: default:
fprintf(stderr, "%s: UDP unknown message: %d\n", aux::time_now_string() fprintf(stderr, "%s: UDP unknown message: %d\n", time_now_string()
, action); , action);
break; break;
} }
@ -161,7 +162,7 @@ struct udp_tracker
return; return;
} }
fprintf(stderr, "%s: UDP tracker initialized on port %d\n", aux::time_now_string(), m_port); fprintf(stderr, "%s: UDP tracker initialized on port %d\n", time_now_string(), m_port);
m_thread.reset(new thread(boost::bind(&udp_tracker::thread_fun, this))); m_thread.reset(new thread(boost::bind(&udp_tracker::thread_fun, this)));
} }
@ -223,8 +224,8 @@ int num_udp_announces()
void stop_udp_tracker() void stop_udp_tracker()
{ {
fprintf(stderr, "%s: UDP stop_udp_tracker()\n", aux::time_now_string()); fprintf(stderr, "%s: UDP stop_udp_tracker()\n", time_now_string());
g_udp_tracker.reset(); g_udp_tracker.reset();
fprintf(stderr, "%s: UDP stop_udp_tracker() done\n", aux::time_now_string()); fprintf(stderr, "%s: UDP stop_udp_tracker() done\n", time_now_string());
} }