diff --git a/test/setup_transfer.cpp b/test/setup_transfer.cpp index a394f516d..c37ff97a7 100644 --- a/test/setup_transfer.cpp +++ b/test/setup_transfer.cpp @@ -494,7 +494,7 @@ void stop_web_server() { if (web_server && web_ios) { - web_ios->stop(); + web_ios->post(boost::bind(&io_service::stop, web_ios)); web_server->join(); web_server.reset(); web_ios = 0; diff --git a/test/test_storage.cpp b/test/test_storage.cpp index 13b6f4324..6a8307b4f 100644 --- a/test/test_storage.cpp +++ b/test/test_storage.cpp @@ -57,6 +57,12 @@ char* piece0 = page_aligned_allocator::malloc(piece_size); char* piece1 = page_aligned_allocator::malloc(piece_size); char* piece2 = page_aligned_allocator::malloc(piece_size); +void signal_bool(bool* b, char const* string) +{ + *b = true; + std::cerr << string << std::endl; +} + void on_read_piece(int ret, disk_io_job const& j, char const* data, int size) { std::cerr << "on_read_piece piece: " << j.piece << std::endl; @@ -69,11 +75,19 @@ void on_check_resume_data(int ret, disk_io_job const& j, bool* done) std::cerr << "on_check_resume_data ret: " << ret; switch (ret) { - case 0: std::cerr << " success" << std::endl; break; - case -1: std::cerr << " need full check" << std::endl; break; - case -2: std::cerr << " disk error: " << j.str - << " file: " << j.error_file << std::endl; break; - case -3: std::cerr << " aborted" << std::endl; break; + case piece_manager::no_error: + std::cerr << " success" << std::endl; + break; + case piece_manager::fatal_disk_error: + std::cerr << " disk error: " << j.str + << " file: " << j.error_file << std::endl; + break; + case piece_manager::need_full_check: + std::cerr << " need full check" << std::endl; + break; + case piece_manager::disk_check_aborted: + std::cerr << " aborted" << std::endl; + break; } *done = true; } @@ -84,11 +98,23 @@ void on_check_files(int ret, disk_io_job const& j, bool* done) switch (ret) { - case 0: std::cerr << " done" << std::endl; *done = true; break; - case -1: std::cerr << " current slot: " << j.piece << " have: " << j.offset << std::endl; break; - case -2: std::cerr << " disk error: " << j.str - << " file: " << j.error_file << std::endl; *done = true; break; - case -3: std::cerr << " aborted" << std::endl; *done = true; break; + case piece_manager::no_error: + std::cerr << " done" << std::endl; + *done = true; + break; + case piece_manager::fatal_disk_error: + std::cerr << " disk error: " << j.str + << " file: " << j.error_file << std::endl; + *done = true; + break; + case piece_manager::need_full_check: + std::cerr << " current slot: " << j.piece + << " have: " << j.offset << std::endl; + break; + case piece_manager::disk_check_aborted: + std::cerr << " aborted" << std::endl; + *done = true; + break; } } @@ -105,11 +131,12 @@ void on_read(int ret, disk_io_job const& j, bool* done) } } -void on_move_storage(int ret, disk_io_job const& j, std::string path) +void on_move_storage(int ret, bool* done, disk_io_job const& j, std::string path) { std::cerr << "on_move_storage ret: " << ret << " path: " << j.str << std::endl; TEST_EQUAL(ret, 0); TEST_EQUAL(j.str, path); + *done = true; } void print_error(int ret, boost::scoped_ptr const& s) @@ -390,6 +417,22 @@ void run_elevator_test() } } +void run_until(io_service& ios, bool const& done) +{ + while (!done) + { + ios.reset(); + error_code ec; + ios.run_one(ec); + if (ec) + { + std::cerr << "run_one: " << ec.message() << std::endl; + return; + } + std::cerr << "done: " << done << std::endl; + } +} + void run_storage_tests(boost::intrusive_ptr info , file_storage& fs , std::string const& test_path @@ -514,12 +557,9 @@ void run_storage_tests(boost::intrusive_ptr info TEST_CHECK(exists(combine_path(test_path, "temp_storage/test1.tmp"))); TEST_CHECK(!exists(combine_path(test_path, "part0"))); boost::function none; - pm->async_rename_file(0, "part0", none); - - test_sleep(1000); - ios.reset(); - ios.poll(ec); - if (ec) std::cerr << "poll: " << ec.message() << std::endl; + done = false; + pm->async_rename_file(0, "part0", boost::bind(&signal_bool, &done, "rename_file")); + run_until(ios, done); TEST_CHECK(!exists(combine_path(test_path, "temp_storage/test1.tmp"))); TEST_CHECK(!exists(combine_path(test_path, "temp_storage2"))); @@ -527,13 +567,11 @@ void run_storage_tests(boost::intrusive_ptr info // test move_storage with two files in the root directory TEST_CHECK(exists(combine_path(test_path, "temp_storage"))); - pm->async_move_storage(combine_path(test_path, "temp_storage2") - , boost::bind(on_move_storage, _1, _2, combine_path(test_path, "temp_storage2"))); - test_sleep(2000); - ios.reset(); - ios.poll(ec); - if (ec) std::cerr << "poll: " << ec.message() << std::endl; + done = false; + pm->async_move_storage(combine_path(test_path, "temp_storage2") + , boost::bind(on_move_storage, _1, &done, _2, combine_path(test_path, "temp_storage2"))); + run_until(ios, done); if (fs.num_files() > 1) { @@ -542,12 +580,9 @@ void run_storage_tests(boost::intrusive_ptr info } TEST_CHECK(exists(combine_path(test_path, "temp_storage2/part0"))); - pm->async_move_storage(test_path, boost::bind(on_move_storage, _1, _2, test_path)); - - test_sleep(2000); - ios.reset(); - ios.poll(ec); - if (ec) std::cerr << "poll: " << ec.message() << std::endl; + done = false; + pm->async_move_storage(test_path, boost::bind(on_move_storage, _1, &done, _2, test_path)); + run_until(ios, done); TEST_CHECK(exists(combine_path(test_path, "part0"))); TEST_CHECK(!exists(combine_path(test_path, "temp_storage2/temp_storage"))); @@ -561,21 +596,19 @@ void run_storage_tests(boost::intrusive_ptr info pm->async_read(r, boost::bind(&on_read_piece, _1, _2, piece1, block_size)); r.piece = 2; pm->async_read(r, boost::bind(&on_read_piece, _1, _2, piece2, block_size)); - pm->async_release_files(none); + std::cerr << "async_release_files" << std::endl; + done = false; + pm->async_release_files(boost::bind(&signal_bool, &done, "async_release_files")); + run_until(ios, done); - pm->async_rename_file(0, "temp_storage/test1.tmp", none); - test_sleep(2000); - ios.reset(); - ios.poll(ec); - if (ec) std::cerr << "poll: " << ec.message() << std::endl; + std::cerr << "async_rename_file" << std::endl; + done = false; + pm->async_rename_file(0, "temp_storage/test1.tmp", boost::bind(&signal_bool, &done, "rename_file")); + run_until(ios, done); TEST_CHECK(!exists(combine_path(test_path, "part0"))); TEST_CHECK(exists(combine_path(test_path, "temp_storage/test1.tmp"))); - ios.reset(); - ios.poll(ec); - if (ec) std::cerr << "poll: " << ec.message() << std::endl; - io.abort(); io.join(); remove_all(combine_path(test_path, "temp_storage2"), ec); @@ -637,14 +670,15 @@ namespace { std::cerr << "check_files_fill_array ret: " << ret << " piece: " << j.piece + << " have: " << j.offset << " str: " << j.str + << " e: " << j.error.message() << std::endl; if (j.offset >= 0) array[j.offset] = true; - if (ret != -1) + if (ret != piece_manager::need_full_check) { *done = true; - return; } } } @@ -714,14 +748,9 @@ void test_check_files(std::string const& test_path bool pieces[4] = {false, false, false, false}; done = false; - pm->async_check_files(boost::bind(&check_files_fill_array, _1, _2, pieces, &done)); - while (!done) - { - ios.reset(); - ios.run_one(ec); - if (ec) std::cerr << "run_one: " << ec.message() << std::endl; - } + run_until(ios, done); + TEST_EQUAL(pieces[0], true); TEST_EQUAL(pieces[1], false); TEST_EQUAL(pieces[2], false);