00001
00002
00003
00004
00005 #include "libtorrent/storage.hpp"
00006 #include "libtorrent/file_pool.hpp"
00007 #include "libtorrent/hasher.hpp"
00008 #include "libtorrent/session.hpp"
00009 #include "libtorrent/aux_/session_impl.hpp"
00010
00011 #include <boost/utility.hpp>
00012 #include <boost/filesystem/operations.hpp>
00013 #include <boost/filesystem/convenience.hpp>
00014 #include <boost/thread/mutex.hpp>
00015
00016 #include "test.hpp"
00017
00018 using namespace libtorrent;
00019 using namespace boost::filesystem;
00020
00021 const int piece_size = 16;
00022
00023 void run_storage_tests(torrent_info& info)
00024 {
00025 const int half = piece_size / 2;
00026
00027 char piece0[piece_size] =
00028 { 6, 6, 6, 6, 6, 6, 6, 6
00029 , 9, 9, 9, 9, 9, 9, 9, 9};
00030
00031 char piece1[piece_size] =
00032 { 0, 0, 0, 0, 0, 0, 0, 0
00033 , 1, 1, 1, 1, 1, 1, 1, 1};
00034
00035 char piece2[piece_size] =
00036 { 0, 0, 1, 0, 0, 0, 0, 0
00037 , 1, 1, 1, 1, 1, 1, 1, 1};
00038
00039 info.set_hash(0, hasher(piece0, piece_size).final());
00040 info.set_hash(1, hasher(piece1, piece_size).final());
00041 info.set_hash(2, hasher(piece2, piece_size).final());
00042
00043 info.create_torrent();
00044
00045 create_directory(initial_path() / "temp_storage");
00046
00047 int num_pieces = (1 + 612 + 17 + piece_size - 1) / piece_size;
00048 TEST_CHECK(info.num_pieces() == num_pieces);
00049
00050 char piece[piece_size];
00051
00052 {
00053 file_pool fp;
00054 storage s(info, initial_path(), fp);
00055
00056
00057 s.write(piece1, 0, 0, half);
00058 s.write(piece1 + half, 0, half, half);
00059
00060
00061 TEST_CHECK(s.read(piece, 0, 0, piece_size) == piece_size);
00062 TEST_CHECK(std::equal(piece, piece + piece_size, piece1));
00063
00064
00065 s.write(piece0, 1, 0, piece_size);
00066 s.write(piece2, 2, 0, piece_size);
00067
00068
00069 TEST_CHECK(s.read(piece, 1, 0, piece_size) == piece_size);
00070 TEST_CHECK(std::equal(piece, piece + piece_size, piece0));
00071
00072 s.read(piece, 2, 0, piece_size);
00073 TEST_CHECK(std::equal(piece, piece + piece_size, piece2));
00074
00075 s.release_files();
00076 }
00077
00078
00079 {
00080 file_pool fp;
00081 piece_manager pm(info, initial_path(), fp);
00082 boost::mutex lock;
00083 libtorrent::aux::piece_checker_data d;
00084
00085 std::vector<bool> pieces;
00086 num_pieces = 0;
00087 TEST_CHECK(pm.check_fastresume(d, pieces, num_pieces, true) == false);
00088 bool finished = false;
00089 float progress;
00090 num_pieces = 0;
00091 boost::recursive_mutex mutex;
00092 while (!finished)
00093 boost::tie(finished, progress) = pm.check_files(pieces, num_pieces, mutex);
00094
00095 TEST_CHECK(num_pieces == std::count(pieces.begin(), pieces.end()
00096 , true));
00097
00098 pm.move_storage("temp_storage2");
00099 TEST_CHECK(!exists("temp_storage"));
00100 TEST_CHECK(exists("temp_storage2/temp_storage"));
00101 pm.move_storage(".");
00102 TEST_CHECK(!exists("temp_storage2/temp_storage"));
00103 remove_all("temp_storage2");
00104
00105 TEST_CHECK(pm.read(piece, 0, 0, piece_size) == piece_size);
00106 TEST_CHECK(std::equal(piece, piece + piece_size, piece0));
00107
00108 TEST_CHECK(pm.read(piece, 1, 0, piece_size) == piece_size);
00109 TEST_CHECK(std::equal(piece, piece + piece_size, piece1));
00110
00111 TEST_CHECK(pm.read(piece, 2, 0, piece_size) == piece_size);
00112 TEST_CHECK(std::equal(piece, piece + piece_size, piece2));
00113 pm.release_files();
00114
00115 }
00116 }
00117
00118 int test_main()
00119 {
00120 torrent_info info;
00121 info.set_piece_size(piece_size);
00122 info.add_file("temp_storage/test1.tmp", 17);
00123 info.add_file("temp_storage/test2.tmp", 612);
00124 info.add_file("temp_storage/test3.tmp", 0);
00125 info.add_file("temp_storage/test4.tmp", 0);
00126 info.add_file("temp_storage/test5.tmp", 1);
00127
00128 run_storage_tests(info);
00129
00130
00131 TEST_CHECK(file_size(initial_path() / "temp_storage" / "test1.tmp") == 17);
00132 TEST_CHECK(file_size(initial_path() / "temp_storage" / "test2.tmp") == 31);
00133 TEST_CHECK(exists("temp_storage/test3.tmp"));
00134 TEST_CHECK(exists("temp_storage/test4.tmp"));
00135 remove_all(initial_path() / "temp_storage");
00136
00137 info = torrent_info();
00138 info.set_piece_size(piece_size);
00139 info.add_file("temp_storage/test1.tmp", 17 + 612 + 1);
00140
00141 run_storage_tests(info);
00142
00143
00144 TEST_CHECK(file_size(initial_path() / "temp_storage" / "test1.tmp") == 48);
00145 remove_all(initial_path() / "temp_storage");
00146
00147 return 0;
00148 }
00149