From d599bef0eed2aa9d4bb7381f50ebb1476a0834a1 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 20 Feb 2016 02:38:03 -0500 Subject: [PATCH] add unit test for read_resume_data --- src/torrent.cpp | 2 +- test/Jamfile | 1 + test/Makefile.am | 1 + test/test_read_resume.cpp | 216 ++++++++++++++++++++++++++++++++++++++ test/test_resume.cpp | 2 - 5 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 test/test_read_resume.cpp diff --git a/src/torrent.cpp b/src/torrent.cpp index de17a816d..ef7f8e28a 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -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())); diff --git a/test/Jamfile b/test/Jamfile index e96abf4f3..4957244d2 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -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 ] diff --git a/test/Makefile.am b/test/Makefile.am index 4e6ae74b2..e99ba9339 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -19,6 +19,7 @@ test_programs = \ test_pex \ test_read_piece \ test_resume \ + test_read_resume \ test_ssl \ test_storage \ test_time_critical \ diff --git a/test/test_read_resume.cpp b/test/test_read_resume.cpp new file mode 100644 index 000000000..c3d96de3a --- /dev/null +++ b/test/test_read_resume.cpp @@ -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 + +#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 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 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 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 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 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 buf; + bencode(std::back_inserter(buf), t.generate()); + return boost::make_shared(&buf[0], buf.size()); +} + +TORRENT_TEST(read_resume_torrent) +{ + boost::shared_ptr 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 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()); +} diff --git a/test/test_resume.cpp b/test/test_resume.cpp index 504ad5130..83e54744c 100644 --- a/test/test_resume.cpp +++ b/test/test_resume.cpp @@ -89,8 +89,6 @@ std::vector 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;