merged back async_io branch into trunk

This commit is contained in:
Arvid Norberg
2007-06-10 20:46:09 +00:00
parent 36031f82ed
commit 3b8670626a
45 changed files with 1532 additions and 831 deletions

View File

@@ -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()));

View File

@@ -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

View File

@@ -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());

View File

@@ -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());

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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());

View File

@@ -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());