00001
00002
00003
00004
00005 #include "libtorrent/piece_picker.hpp"
00006
00007 #include "test.hpp"
00008
00009 using namespace libtorrent;
00010
00011 int test_main()
00012 {
00013 using namespace libtorrent;
00014
00015 {
00016 const int num_pieces = 6;
00017
00018
00019 piece_picker p(4, num_pieces * 4);
00020
00021
00022 std::vector<bool> have(num_pieces, false);
00023 have[0] = true;
00024
00025 std::vector<piece_picker::downloading_piece> unfinished;
00026 piece_picker::downloading_piece partial;
00027 partial.index = 1;
00028 partial.finished_blocks[0] = true;
00029 partial.finished_blocks[2] = true;
00030 unfinished.push_back(partial);
00031
00032 p.files_checked(have, unfinished);
00033
00034 p.mark_as_filtered(4);
00035
00036 TEST_CHECK(p.is_filtered(4) == true);
00037 TEST_CHECK(p.is_filtered(3) == false);
00038
00039 p.mark_as_filtered(3);
00040 TEST_CHECK(p.is_filtered(3) == true);
00041 p.mark_as_unfiltered(3);
00042 TEST_CHECK(p.is_filtered(3) == false);
00043
00044 TEST_CHECK(p.num_filtered() == 1);
00045 TEST_CHECK(p.num_have_filtered() == 0);
00046
00047 std::vector<bool> filtered_pieces;
00048 p.filtered_pieces(filtered_pieces);
00049 bool expected1[] = {false, false, false, false, true, false};
00050 TEST_CHECK(std::equal(filtered_pieces.begin()
00051 , filtered_pieces.end(), expected1));
00052
00053 std::vector<bool> peer1(num_pieces, false);
00054 std::vector<bool> peer2(num_pieces, false);
00055 std::vector<bool> peer3(num_pieces, false);
00056
00057 peer1[2] = true;
00058 p.inc_refcount(2);
00059
00060 peer1[3] = true;
00061 peer2[3] = true;
00062 p.inc_refcount(3);
00063 p.inc_refcount(3);
00064
00065 peer1[4] = true;
00066 peer2[4] = true;
00067 peer3[4] = true;
00068 p.inc_refcount(4);
00069 p.inc_refcount(4);
00070 p.inc_refcount(4);
00071
00072 peer1[5] = true;
00073 peer2[5] = true;
00074 peer3[5] = true;
00075 p.inc_refcount(5);
00076 p.inc_refcount(5);
00077 p.inc_refcount(5);
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 std::vector<piece_block> picked;
00092 picked.clear();
00093 p.pick_pieces(peer1, picked, 1, false, tcp::endpoint());
00094 TEST_CHECK(picked.size() == 1);
00095 TEST_CHECK(picked.front().piece_index == 2);
00096
00097
00098
00099 picked.clear();
00100 p.pick_pieces(peer2, picked, 1, false, tcp::endpoint());
00101 TEST_CHECK(picked.size() == 1);
00102 TEST_CHECK(picked.front().piece_index == 3);
00103
00104
00105
00106 picked.clear();
00107 p.pick_pieces(peer3, picked, 1, false, tcp::endpoint());
00108 TEST_CHECK(picked.size() == 1);
00109 TEST_CHECK(picked.front().piece_index == 5);
00110
00111
00112
00113 peer1[1] = true;
00114 peer2[1] = true;
00115 peer3[1] = true;
00116 p.inc_refcount(1);
00117 p.inc_refcount(1);
00118 p.inc_refcount(1);
00119
00120 picked.clear();
00121 p.pick_pieces(peer3, picked, 1, false, tcp::endpoint());
00122 TEST_CHECK(picked.size() == 1);
00123 TEST_CHECK(picked.front().piece_index == 1);
00124
00125
00126
00127 TEST_CHECK(picked.front().block_index != 0);
00128 TEST_CHECK(picked.front().block_index != 2);
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 p.mark_as_downloading(piece_block(1, 1), tcp::endpoint(address::from_string("1.1.1.1"), 0));
00146 p.mark_as_downloading(piece_block(1, 3), tcp::endpoint(address::from_string("1.1.1.1"), 0));
00147 p.mark_as_downloading(piece_block(2, 0), tcp::endpoint(address::from_string("1.1.1.1"), 0));
00148
00149 std::vector<piece_picker::downloading_piece> const& downloads = p.get_download_queue();
00150 TEST_CHECK(downloads.size() == 2);
00151 TEST_CHECK(downloads[0].index == 1);
00152 TEST_CHECK(downloads[0].finished_blocks[0] == 1);
00153 TEST_CHECK(downloads[0].finished_blocks[1] == 0);
00154 TEST_CHECK(downloads[0].finished_blocks[2] == 1);
00155 TEST_CHECK(downloads[0].finished_blocks[3] == 0);
00156 TEST_CHECK(downloads[0].requested_blocks[1] == 1);
00157 TEST_CHECK(downloads[0].requested_blocks[3] == 1);
00158
00159 TEST_CHECK(downloads[1].index == 2);
00160 TEST_CHECK(downloads[1].finished_blocks[0] == 0);
00161 TEST_CHECK(downloads[1].finished_blocks[1] == 0);
00162 TEST_CHECK(downloads[1].finished_blocks[2] == 0);
00163 TEST_CHECK(downloads[1].finished_blocks[3] == 0);
00164 TEST_CHECK(downloads[1].requested_blocks[0] == 1);
00165 TEST_CHECK(downloads[1].requested_blocks[1] == 0);
00166 TEST_CHECK(downloads[1].requested_blocks[2] == 0);
00167 TEST_CHECK(downloads[1].requested_blocks[3] == 0);
00168
00169 TEST_CHECK(p.is_downloading(piece_block(1, 1)));
00170 TEST_CHECK(p.is_downloading(piece_block(1, 3)));
00171 TEST_CHECK(p.is_downloading(piece_block(2, 0)));
00172 TEST_CHECK(!p.is_downloading(piece_block(2, 1)));
00173
00174 picked.clear();
00175 p.pick_pieces(peer1, picked, 1, false, tcp::endpoint());
00176 TEST_CHECK(picked.size() == 2);
00177
00178 piece_block expected3[] = { piece_block(2, 0), piece_block(2, 1) };
00179 TEST_CHECK(std::equal(picked.begin()
00180 , picked.end(), expected3));
00181
00182
00183
00184
00185
00186
00187 picked.clear();
00188 p.pick_pieces(peer1, picked, 1, true, tcp::endpoint());
00189
00190
00191
00192 TEST_CHECK(picked.size() == 4);
00193
00194 piece_block expected4[] =
00195 {
00196 piece_block(3, 0), piece_block(3, 1)
00197 , piece_block(3, 2), piece_block(3, 3)
00198 };
00199 TEST_CHECK(std::equal(picked.begin()
00200 , picked.end(), expected4));
00201
00202
00203
00204
00205 picked.clear();
00206 p.pick_pieces(peer1, picked, 100, true, tcp::endpoint());
00207
00208 TEST_CHECK(picked.size() == 14);
00209
00210 piece_block expected5[] =
00211 {
00212 piece_block(3, 0), piece_block(3, 1)
00213 , piece_block(3, 2), piece_block(3, 3)
00214 , piece_block(5, 0), piece_block(5, 1)
00215 , piece_block(5, 2), piece_block(5, 3)
00216 , piece_block(2, 0), piece_block(2, 1)
00217 , piece_block(2, 2), piece_block(2, 3)
00218 , piece_block(1, 1), piece_block(1, 3)
00219 };
00220
00221 TEST_CHECK(std::equal(picked.begin()
00222 , picked.end(), expected5));
00223
00224
00225
00226
00227 picked.clear();
00228 p.pick_pieces(peer1, picked, 100, true, tcp::endpoint(address::from_string("1.1.1.1"), 0));
00229
00230 TEST_CHECK(picked.size() == 11);
00231
00232 piece_block expected6[] =
00233 {
00234 piece_block(2, 1), piece_block(2, 2)
00235 , piece_block(2, 3)
00236 , piece_block(3, 0), piece_block(3, 1)
00237 , piece_block(3, 2), piece_block(3, 3)
00238 , piece_block(5, 0), piece_block(5, 1)
00239 , piece_block(5, 2), piece_block(5, 3)
00240 };
00241
00242 TEST_CHECK(std::equal(picked.begin()
00243 , picked.end(), expected6));
00244
00245
00246
00247 p.mark_as_finished(piece_block(4, 2), tcp::endpoint());
00248 }
00249
00250 return 0;
00251 }
00252