merged back async_io branch into trunk
This commit is contained in:
@@ -11,11 +11,20 @@
|
||||
using boost::filesystem::remove_all;
|
||||
using boost::filesystem::create_directory;
|
||||
|
||||
void sleep(int msec)
|
||||
void test_sleep(int millisec)
|
||||
{
|
||||
boost::xtime xt;
|
||||
boost::xtime_get(&xt, boost::TIME_UTC);
|
||||
xt.nsec += msec * 1000000;
|
||||
xt.nsec += millisec * 1000000;
|
||||
boost::uint64_t nanosec = (millisec % 1000) * 1000000 + xt.nsec;
|
||||
int sec = millisec / 1000;
|
||||
if (nanosec > 1000000000)
|
||||
{
|
||||
nanosec -= 1000000000;
|
||||
sec++;
|
||||
}
|
||||
xt.nsec = nanosec;
|
||||
xt.sec += sec;
|
||||
boost::thread::sleep(xt);
|
||||
}
|
||||
|
||||
@@ -70,6 +79,7 @@ setup_transfer(session* ses1, session* ses2, session* ses3
|
||||
// they should not use the same save dir, because the
|
||||
// file pool will complain if two torrents are trying to
|
||||
// use the same files
|
||||
sha1_hash info_hash = t.info_hash();
|
||||
torrent_handle tor1 = ses1->add_torrent(t, "./tmp1");
|
||||
torrent_handle tor2;
|
||||
torrent_handle tor3;
|
||||
@@ -81,7 +91,10 @@ setup_transfer(session* ses1, session* ses2, session* ses3
|
||||
else
|
||||
tor2 = ses2->add_torrent(t, "./tmp2");
|
||||
|
||||
sleep(100);
|
||||
assert(ses1->get_torrents().size() == 1);
|
||||
assert(ses2->get_torrents().size() == 1);
|
||||
|
||||
test_sleep(100);
|
||||
|
||||
std::cerr << "connecting peer\n";
|
||||
tor1.connect_peer(tcp::endpoint(address::from_string("127.0.0.1")
|
||||
@@ -91,7 +104,7 @@ setup_transfer(session* ses1, session* ses2, session* ses3
|
||||
{
|
||||
// give the other peers some time to get an initial
|
||||
// set of pieces before they start sharing with each-other
|
||||
sleep(10000);
|
||||
test_sleep(10000);
|
||||
tor3.connect_peer(tcp::endpoint(
|
||||
address::from_string("127.0.0.1")
|
||||
, ses2->listen_port()));
|
||||
|
@@ -5,7 +5,8 @@
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
|
||||
|
||||
void sleep(int msec);
|
||||
void test_sleep(int millisec);
|
||||
|
||||
boost::tuple<libtorrent::torrent_handle, libtorrent::torrent_handle
|
||||
, libtorrent::torrent_handle>
|
||||
setup_transfer(libtorrent::session* ses1, libtorrent::session* ses2
|
||||
|
@@ -40,7 +40,7 @@ void test_transfer(bool clear_files = true, bool disconnect = false)
|
||||
|
||||
if (disconnect && tor2.is_valid()) ses2.remove_torrent(tor2);
|
||||
if (!disconnect && tor2.has_metadata()) break;
|
||||
sleep(100);
|
||||
test_sleep(100);
|
||||
}
|
||||
|
||||
if (disconnect) return;
|
||||
@@ -52,7 +52,7 @@ void test_transfer(bool clear_files = true, bool disconnect = false)
|
||||
{
|
||||
tor2.status();
|
||||
if (tor2.is_seed()) break;
|
||||
sleep(100);
|
||||
test_sleep(100);
|
||||
}
|
||||
|
||||
TEST_CHECK(tor2.is_seed());
|
||||
|
@@ -75,7 +75,6 @@ void test_transfer(libtorrent::pe_settings::enc_policy policy,
|
||||
bool pref_rc4 = false)
|
||||
{
|
||||
using namespace libtorrent;
|
||||
using boost::tuples::ignore;
|
||||
using std::cerr;
|
||||
|
||||
session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48000, 49000));
|
||||
@@ -104,6 +103,7 @@ void test_transfer(libtorrent::pe_settings::enc_policy policy,
|
||||
torrent_handle tor1;
|
||||
torrent_handle tor2;
|
||||
|
||||
using boost::tuples::ignore;
|
||||
boost::tie(tor1, tor2, ignore) = setup_transfer(&ses1, &ses2, 0, true, false);
|
||||
|
||||
std::cerr << "waiting for transfer to complete\n";
|
||||
@@ -121,7 +121,7 @@ void test_transfer(libtorrent::pe_settings::enc_policy policy,
|
||||
std::cerr << "ses2: " << a->msg() << "\n";
|
||||
|
||||
if (tor2.is_seed()) break;
|
||||
sleep(100);
|
||||
test_sleep(100);
|
||||
}
|
||||
|
||||
TEST_CHECK(tor2.is_seed());
|
||||
|
@@ -26,13 +26,14 @@ int test_main()
|
||||
|
||||
partial.index = 1;
|
||||
partial.info = blocks;
|
||||
partial.info[0].finished = true;
|
||||
partial.info[2].finished = true;
|
||||
partial.info[0].state = piece_picker::block_info::state_finished;
|
||||
partial.info[2].state = piece_picker::block_info::state_finished;
|
||||
unfinished.push_back(partial);
|
||||
|
||||
p.files_checked(have, unfinished);
|
||||
TEST_CHECK(p.is_downloading(piece_block(1, 0)));
|
||||
TEST_CHECK(p.is_downloading(piece_block(1, 2)));
|
||||
std::vector<int> verify_pieces;
|
||||
p.files_checked(have, unfinished, verify_pieces);
|
||||
TEST_CHECK(p.is_finished(piece_block(1, 0)));
|
||||
TEST_CHECK(p.is_finished(piece_block(1, 2)));
|
||||
|
||||
p.set_piece_priority(4, 0);
|
||||
|
||||
@@ -151,27 +152,21 @@ int test_main()
|
||||
std::vector<piece_picker::downloading_piece> const& downloads = p.get_download_queue();
|
||||
TEST_CHECK(downloads.size() == 2);
|
||||
TEST_CHECK(downloads[0].index == 1);
|
||||
TEST_CHECK(downloads[0].info[0].finished == 1);
|
||||
TEST_CHECK(downloads[0].info[1].finished == 0);
|
||||
TEST_CHECK(downloads[0].info[2].finished == 1);
|
||||
TEST_CHECK(downloads[0].info[3].finished == 0);
|
||||
TEST_CHECK(downloads[0].info[1].requested == 1);
|
||||
TEST_CHECK(downloads[0].info[3].requested == 1);
|
||||
TEST_CHECK(downloads[0].info[0].state == piece_picker::block_info::state_finished);
|
||||
TEST_CHECK(downloads[0].info[1].state == piece_picker::block_info::state_requested);
|
||||
TEST_CHECK(downloads[0].info[2].state == piece_picker::block_info::state_finished);
|
||||
TEST_CHECK(downloads[0].info[3].state == piece_picker::block_info::state_requested);
|
||||
|
||||
TEST_CHECK(downloads[1].index == 2);
|
||||
TEST_CHECK(downloads[1].info[0].finished == 0);
|
||||
TEST_CHECK(downloads[1].info[1].finished == 0);
|
||||
TEST_CHECK(downloads[1].info[2].finished == 0);
|
||||
TEST_CHECK(downloads[1].info[3].finished == 0);
|
||||
TEST_CHECK(downloads[1].info[0].requested == 1);
|
||||
TEST_CHECK(downloads[1].info[1].requested == 0);
|
||||
TEST_CHECK(downloads[1].info[2].requested == 0);
|
||||
TEST_CHECK(downloads[1].info[3].requested == 0);
|
||||
TEST_CHECK(downloads[1].info[0].state == piece_picker::block_info::state_requested);
|
||||
TEST_CHECK(downloads[1].info[1].state == piece_picker::block_info::state_none);
|
||||
TEST_CHECK(downloads[1].info[2].state == piece_picker::block_info::state_none);
|
||||
TEST_CHECK(downloads[1].info[3].state == piece_picker::block_info::state_none);
|
||||
|
||||
TEST_CHECK(p.is_downloading(piece_block(1, 1)));
|
||||
TEST_CHECK(p.is_downloading(piece_block(1, 3)));
|
||||
TEST_CHECK(p.is_downloading(piece_block(2, 0)));
|
||||
TEST_CHECK(!p.is_downloading(piece_block(2, 1)));
|
||||
TEST_CHECK(p.is_requested(piece_block(1, 1)));
|
||||
TEST_CHECK(p.is_requested(piece_block(1, 3)));
|
||||
TEST_CHECK(p.is_requested(piece_block(2, 0)));
|
||||
TEST_CHECK(!p.is_requested(piece_block(2, 1)));
|
||||
|
||||
picked.clear();
|
||||
p.pick_pieces(peer1, picked, 1, false, tcp::endpoint(), piece_picker::fast);
|
||||
|
@@ -10,12 +10,19 @@
|
||||
#include <boost/thread/mutex.hpp>
|
||||
|
||||
#include "test.hpp"
|
||||
#include "setup_transfer.hpp"
|
||||
|
||||
using namespace libtorrent;
|
||||
using namespace boost::filesystem;
|
||||
|
||||
const int piece_size = 16;
|
||||
|
||||
void on_read_piece(int ret, disk_io_job const& j, char const* data, int size)
|
||||
{
|
||||
TEST_CHECK(ret == size);
|
||||
TEST_CHECK(std::equal(j.buffer, j.buffer + ret, data));
|
||||
}
|
||||
|
||||
void run_storage_tests(torrent_info& info, bool compact_allocation = true)
|
||||
{
|
||||
const int half = piece_size / 2;
|
||||
@@ -75,41 +82,47 @@ void run_storage_tests(torrent_info& info, bool compact_allocation = true)
|
||||
// make sure the piece_manager can identify the pieces
|
||||
{
|
||||
file_pool fp;
|
||||
piece_manager pm(info, initial_path(), fp, default_storage_constructor);
|
||||
disk_io_thread io;
|
||||
boost::shared_ptr<int> dummy(new int);
|
||||
boost::intrusive_ptr<piece_manager> pm = new piece_manager(dummy, info
|
||||
, initial_path(), fp, io, default_storage_constructor);
|
||||
boost::mutex lock;
|
||||
libtorrent::aux::piece_checker_data d;
|
||||
|
||||
std::vector<bool> pieces;
|
||||
num_pieces = 0;
|
||||
TEST_CHECK(pm.check_fastresume(d, pieces, num_pieces
|
||||
TEST_CHECK(pm->check_fastresume(d, pieces, num_pieces
|
||||
, compact_allocation) == false);
|
||||
bool finished = false;
|
||||
float progress;
|
||||
num_pieces = 0;
|
||||
boost::recursive_mutex mutex;
|
||||
while (!finished)
|
||||
boost::tie(finished, progress) = pm.check_files(pieces, num_pieces, mutex);
|
||||
boost::tie(finished, progress) = pm->check_files(pieces, num_pieces, mutex);
|
||||
|
||||
TEST_CHECK(num_pieces == std::count(pieces.begin(), pieces.end()
|
||||
, true));
|
||||
|
||||
TEST_CHECK(exists("temp_storage"));
|
||||
pm.move_storage("temp_storage2");
|
||||
pm->async_move_storage("temp_storage2");
|
||||
test_sleep(2000);
|
||||
TEST_CHECK(!exists("temp_storage"));
|
||||
TEST_CHECK(exists("temp_storage2/temp_storage"));
|
||||
pm.move_storage(".");
|
||||
pm->async_move_storage(".");
|
||||
test_sleep(2000);
|
||||
TEST_CHECK(!exists("temp_storage2/temp_storage"));
|
||||
remove_all("temp_storage2");
|
||||
|
||||
TEST_CHECK(pm.read(piece, 0, 0, piece_size) == piece_size);
|
||||
TEST_CHECK(std::equal(piece, piece + piece_size, piece0));
|
||||
|
||||
TEST_CHECK(pm.read(piece, 1, 0, piece_size) == piece_size);
|
||||
TEST_CHECK(std::equal(piece, piece + piece_size, piece1));
|
||||
|
||||
TEST_CHECK(pm.read(piece, 2, 0, piece_size) == piece_size);
|
||||
TEST_CHECK(std::equal(piece, piece + piece_size, piece2));
|
||||
pm.release_files();
|
||||
peer_request r;
|
||||
r.piece = 0;
|
||||
r.start = 0;
|
||||
r.length = piece_size;
|
||||
pm->async_read(r, bind(&on_read_piece, _1, _2, piece0, piece_size));
|
||||
r.piece = 1;
|
||||
pm->async_read(r, bind(&on_read_piece, _1, _2, piece1, piece_size));
|
||||
r.piece = 2;
|
||||
pm->async_read(r, bind(&on_read_piece, _1, _2, piece2, piece_size));
|
||||
pm->async_release_files();
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -92,7 +92,7 @@ void test_swarm()
|
||||
<< std::endl;
|
||||
|
||||
if (tor2.is_seed() && tor3.is_seed()) break;
|
||||
sleep(1000);
|
||||
test_sleep(1000);
|
||||
}
|
||||
|
||||
TEST_CHECK(tor2.is_seed());
|
||||
|
@@ -58,21 +58,22 @@ void test_transfer()
|
||||
torrent_file.create_torrent();
|
||||
|
||||
session ses;
|
||||
ses.set_severity_level(alert::debug);
|
||||
ses.listen_on(std::make_pair(49000, 50000));
|
||||
remove_all("./tmp1");
|
||||
torrent_handle th = ses.add_torrent(torrent_file, "./tmp1");
|
||||
|
||||
for (int i = 0; i < 70; ++i)
|
||||
for (int i = 0; i < 30; ++i)
|
||||
{
|
||||
torrent_status s = th.status();
|
||||
std::cerr << s.progress << " " << (s.download_rate / 1000.f) << "\r";
|
||||
std::cerr << s.progress << " " << (s.download_rate / 1000.f) << std::endl;
|
||||
std::auto_ptr<alert> a;
|
||||
a = ses.pop_alert();
|
||||
if (a.get())
|
||||
std::cerr << a->msg() << "\n";
|
||||
|
||||
if (th.is_seed()) break;
|
||||
sleep(999);
|
||||
test_sleep(1000);
|
||||
}
|
||||
|
||||
TEST_CHECK(th.is_seed());
|
||||
|
Reference in New Issue
Block a user