forked from premiere/premiere-libtorrent
add unit test for read_resume_data
This commit is contained in:
parent
b581fef437
commit
d599bef0ee
|
@ -402,7 +402,7 @@ namespace libtorrent
|
|||
m_seed_mode = (p.flags & add_torrent_params::flag_seed_mode) != 0
|
||||
&& std::count(p.file_priorities.begin(), p.file_priorities.end(), 0) == 0
|
||||
&& std::count(p.piece_priorities.begin(), p.piece_priorities.end(), 0) == 0
|
||||
&& p.have_pieces.count() == 0;
|
||||
&& std::count(p.have_pieces.begin(), p.have_pieces.end(), 0) == 0;
|
||||
|
||||
m_connections_initialized = true;
|
||||
m_block_size_shift = root2((std::min)(block_size, m_torrent_file->piece_length()));
|
||||
|
|
|
@ -165,6 +165,7 @@ test-suite libtorrent :
|
|||
[ run test_fast_extension.cpp ]
|
||||
[ run test_privacy.cpp ]
|
||||
[ run test_recheck.cpp ]
|
||||
[ run test_read_resume.cpp ]
|
||||
[ run test_resume.cpp ]
|
||||
[ run test_ssl.cpp ]
|
||||
[ run test_tracker.cpp ]
|
||||
|
|
|
@ -19,6 +19,7 @@ test_programs = \
|
|||
test_pex \
|
||||
test_read_piece \
|
||||
test_resume \
|
||||
test_read_resume \
|
||||
test_ssl \
|
||||
test_storage \
|
||||
test_time_critical \
|
||||
|
|
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2016, Arvid Norberg
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the author nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include "test.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "libtorrent/entry.hpp"
|
||||
#include "libtorrent/torrent_info.hpp"
|
||||
#include "libtorrent/random.hpp"
|
||||
#include "libtorrent/create_torrent.hpp"
|
||||
#include "libtorrent/bencode.hpp"
|
||||
#include "libtorrent/add_torrent_params.hpp"
|
||||
#include "libtorrent/read_resume_data.hpp"
|
||||
|
||||
using namespace libtorrent;
|
||||
namespace lt = libtorrent;
|
||||
|
||||
TORRENT_TEST(read_resume)
|
||||
{
|
||||
entry rd;
|
||||
|
||||
rd["file-format"] = "libtorrent resume file";
|
||||
rd["file-version"] = 1;
|
||||
rd["info-hash"] = "abcdefghijklmnopqrst";
|
||||
rd["pieces"] = "\x01\x01\x01\x01\x01\x01";
|
||||
|
||||
rd["total_uploaded"] = 1337;
|
||||
rd["total_downloaded"] = 1338;
|
||||
rd["active_time"] = 1339;
|
||||
rd["seeding_time"] = 1340;
|
||||
rd["upload_rate_limit"] = 1343;
|
||||
rd["download_rate_limit"] = 1344;
|
||||
rd["max_connections"] = 1345;
|
||||
rd["max_uploads"] = 1346;
|
||||
rd["seed_mode"] = 0;
|
||||
rd["super_seeding"] = 0;
|
||||
rd["added_time"] = 1347;
|
||||
rd["completed_time"] = 1348;
|
||||
rd["finished_time"] = 1352;
|
||||
|
||||
rd["piece_priority"] = "\x01\x02\x03\x04\x05\x06";
|
||||
rd["auto_managed"] = 0;
|
||||
rd["sequential_download"] = 0;
|
||||
rd["paused"] = 0;
|
||||
|
||||
std::vector<char> resume_data;
|
||||
bencode(std::back_inserter(resume_data), rd);
|
||||
|
||||
error_code ec;
|
||||
add_torrent_params atp = read_resume_data(&resume_data[0], resume_data.size(), ec);
|
||||
|
||||
TEST_CHECK(!ec);
|
||||
|
||||
TEST_EQUAL(atp.info_hash, sha1_hash("abcdefghijklmnopqrst"));
|
||||
TEST_EQUAL(atp.have_pieces.size(), 6);
|
||||
TEST_EQUAL(atp.have_pieces.count(), 6);
|
||||
|
||||
TEST_EQUAL(atp.total_uploaded, 1337);
|
||||
TEST_EQUAL(atp.total_downloaded, 1338);
|
||||
TEST_EQUAL(atp.active_time, 1339);
|
||||
TEST_EQUAL(atp.seeding_time, 1340);
|
||||
TEST_EQUAL(atp.upload_limit, 1343);
|
||||
TEST_EQUAL(atp.download_limit, 1344);
|
||||
TEST_EQUAL(atp.max_connections, 1345);
|
||||
TEST_EQUAL(atp.max_uploads, 1346);
|
||||
TEST_CHECK((atp.flags & add_torrent_params::flag_seed_mode) == 0);
|
||||
TEST_CHECK((atp.flags & add_torrent_params::flag_super_seeding) == 0);
|
||||
TEST_CHECK((atp.flags & add_torrent_params::flag_auto_managed) == 0);
|
||||
TEST_CHECK((atp.flags & add_torrent_params::flag_sequential_download) == 0);
|
||||
TEST_CHECK((atp.flags & add_torrent_params::flag_paused) == 0);
|
||||
TEST_EQUAL(atp.added_time, 1347);
|
||||
TEST_EQUAL(atp.completed_time, 1348);
|
||||
TEST_EQUAL(atp.finished_time, 1352);
|
||||
|
||||
TEST_EQUAL(atp.piece_priorities.size(), 6);
|
||||
TEST_EQUAL(atp.piece_priorities[0], 1);
|
||||
TEST_EQUAL(atp.piece_priorities[1], 2);
|
||||
TEST_EQUAL(atp.piece_priorities[2], 3);
|
||||
TEST_EQUAL(atp.piece_priorities[3], 4);
|
||||
TEST_EQUAL(atp.piece_priorities[4], 5);
|
||||
TEST_EQUAL(atp.piece_priorities[5], 6);
|
||||
}
|
||||
|
||||
TORRENT_TEST(read_resume_missing_info_hash)
|
||||
{
|
||||
entry rd;
|
||||
|
||||
rd["file-format"] = "libtorrent resume file";
|
||||
rd["file-version"] = 1;
|
||||
// missing info-hash
|
||||
|
||||
std::vector<char> resume_data;
|
||||
bencode(std::back_inserter(resume_data), rd);
|
||||
|
||||
error_code ec;
|
||||
add_torrent_params atp = read_resume_data(&resume_data[0], resume_data.size(), ec);
|
||||
TEST_EQUAL(ec, error_code(errors::missing_info_hash, get_libtorrent_category()));
|
||||
}
|
||||
|
||||
TORRENT_TEST(read_resume_missing_file_format)
|
||||
{
|
||||
entry rd;
|
||||
|
||||
// missing file-format
|
||||
rd["file-version"] = 1;
|
||||
rd["info-hash"] = "abcdefghijklmnopqrst";
|
||||
|
||||
std::vector<char> resume_data;
|
||||
bencode(std::back_inserter(resume_data), rd);
|
||||
|
||||
error_code ec;
|
||||
add_torrent_params atp = read_resume_data(&resume_data[0], resume_data.size(), ec);
|
||||
TEST_EQUAL(ec, error_code(errors::invalid_file_tag, get_libtorrent_category()));
|
||||
}
|
||||
|
||||
TORRENT_TEST(read_resume_mismatching_torrent)
|
||||
{
|
||||
entry rd;
|
||||
|
||||
rd["file-format"] = "libtorrent resume file";
|
||||
rd["file-version"] = 1;
|
||||
rd["info-hash"] = "abcdefghijklmnopqrst";
|
||||
entry& info = rd["info"];
|
||||
info["piece length"] = 16384 * 16;
|
||||
info["name"] = "test";
|
||||
|
||||
|
||||
std::vector<char> resume_data;
|
||||
bencode(std::back_inserter(resume_data), rd);
|
||||
|
||||
// the info-hash field does not match the torrent in the "info" field, so it
|
||||
// will be ignored
|
||||
error_code ec;
|
||||
add_torrent_params atp = read_resume_data(&resume_data[0], resume_data.size(), ec);
|
||||
TEST_CHECK(!ec);
|
||||
TEST_CHECK(!atp.ti);
|
||||
}
|
||||
|
||||
boost::shared_ptr<torrent_info> generate_torrent()
|
||||
{
|
||||
file_storage fs;
|
||||
fs.add_file("test_resume/tmp1", 128 * 1024 * 8);
|
||||
fs.add_file("test_resume/tmp2", 128 * 1024);
|
||||
fs.add_file("test_resume/tmp3", 128 * 1024);
|
||||
lt::create_torrent t(fs, 128 * 1024, 6);
|
||||
|
||||
t.add_tracker("http://torrent_file_tracker.com/announce");
|
||||
t.add_url_seed("http://torrent_file_url_seed.com/");
|
||||
|
||||
int num = t.num_pieces();
|
||||
TEST_CHECK(num > 0);
|
||||
for (int i = 0; i < num; ++i)
|
||||
{
|
||||
sha1_hash ph;
|
||||
for (int k = 0; k < 20; ++k) ph[k] = lt::random();
|
||||
t.set_hash(i, ph);
|
||||
}
|
||||
|
||||
std::vector<char> buf;
|
||||
bencode(std::back_inserter(buf), t.generate());
|
||||
return boost::make_shared<torrent_info>(&buf[0], buf.size());
|
||||
}
|
||||
|
||||
TORRENT_TEST(read_resume_torrent)
|
||||
{
|
||||
boost::shared_ptr<torrent_info> ti = generate_torrent();
|
||||
|
||||
entry rd;
|
||||
rd["file-format"] = "libtorrent resume file";
|
||||
rd["file-version"] = 1;
|
||||
rd["info-hash"] = ti->info_hash().to_string();
|
||||
rd["info"] = bdecode(ti->metadata().get(), ti->metadata().get() + ti->metadata_size());
|
||||
|
||||
std::vector<char> resume_data;
|
||||
bencode(std::back_inserter(resume_data), rd);
|
||||
|
||||
// the info-hash field does not match the torrent in the "info" field, so it
|
||||
// will be ignored
|
||||
error_code ec;
|
||||
add_torrent_params atp = read_resume_data(&resume_data[0], resume_data.size(), ec);
|
||||
TEST_CHECK(!ec);
|
||||
TEST_CHECK(atp.ti);
|
||||
|
||||
TEST_EQUAL(atp.ti->info_hash(), ti->info_hash());
|
||||
TEST_EQUAL(atp.ti->name(), ti->name());
|
||||
}
|
|
@ -89,8 +89,6 @@ std::vector<char> generate_resume_data(torrent_info* ti
|
|||
rd["total_downloaded"] = 1338;
|
||||
rd["active_time"] = 1339;
|
||||
rd["seeding_time"] = 1340;
|
||||
rd["num_seeds"] = 1341;
|
||||
rd["num_downloaders"] = 1342;
|
||||
rd["upload_rate_limit"] = 1343;
|
||||
rd["download_rate_limit"] = 1344;
|
||||
rd["max_connections"] = 1345;
|
||||
|
|
Loading…
Reference in New Issue