// proxy: 0=none, 1=socks4, 2=socks5, 3=socks5_pw 4=http 5=http_pw void test_transfer(boost::intrusive_ptr<torrent_info> torrent_file , int proxy, int port, char const* protocol, bool url_seed, bool chunked_encoding, bool test_ban) { using namespace libtorrent; session ses(fingerprint(" ", 0,0,0,0), 0); session_settings settings; settings.max_queued_disk_bytes = 256 * 1024; ses.set_settings(settings); ses.set_alert_mask(~(alert::progress_notification | alert::stats_notification)); error_code ec; ses.listen_on(std::make_pair(51000, 52000), ec); if (ec) fprintf(stderr, "listen_on failed: %s\n", ec.message().c_str()); remove_all("tmp2_web_seed", ec); char const* test_name[] = {"no", "SOCKS4", "SOCKS5", "SOCKS5 password", "HTTP", "HTTP password"}; fprintf(stderr, "\n\n ==== TESTING === proxy: %s ==== protocol: %s ==== seed: %s === transfer-encoding: %s === corruption: %s\n\n\n" , test_name[proxy], protocol, url_seed ? "URL seed" : "HTTP seed", chunked_encoding ? "chunked": "none", test_ban ? "yes" : "no"); if (proxy) { start_proxy(8002, proxy); proxy_settings ps; ps.hostname = "127.0.0.1"; ps.port = 8002; ps.username = "******"; ps.password = "******"; ps.type = (proxy_settings::proxy_type)proxy; ses.set_proxy(ps); } add_torrent_params p; p.flags &= ~add_torrent_params::flag_paused; p.flags &= ~add_torrent_params::flag_auto_managed; p.ti = torrent_file; p.save_path = "tmp2_web_seed"; p.storage_mode = storage_mode_compact; torrent_handle th = ses.add_torrent(p, ec); std::vector<announce_entry> empty; th.replace_trackers(empty); const size_type total_size = torrent_file->total_size(); float rate_sum = 0.f; float ses_rate_sum = 0.f; cache_status cs; file_storage const& fs = torrent_file->files(); int pad_file_size = 0; for (int i = 0; i < fs.num_files(); ++i) { file_entry f = fs.at(i); if (f.pad_file) pad_file_size += f.size; } for (int i = 0; i < 30; ++i) { torrent_status s = th.status(); session_status ss = ses.status(); rate_sum += s.download_payload_rate; ses_rate_sum += ss.payload_download_rate; sha1_hash ih(0); ses.get_cache_info(ih, &cs); if (cs.blocks_read < 1) cs.blocks_read = 1; if (cs.blocks_written < 1) cs.blocks_written = 1; /* std::cerr << (s.progress * 100.f) << " %" << " torrent rate: " << (s.download_rate / 1000.f) << " kB/s" << " session rate: " << (ss.download_rate / 1000.f) << " kB/s" << " session total: " << ss.total_payload_download << " torrent total: " << s.total_payload_download << " rate sum:" << ses_rate_sum << " w-cache: " << cs.write_cache_size << " r-cache: " << cs.read_cache_size << " buffers: " << cs.total_used_buffers << std::endl; */ print_alerts(ses, " >> ses", test_ban, false, false, 0, true); if (test_ban && th.url_seeds().empty()) { // when we don't have any web seeds left, we know we successfully banned it break; } if (s.is_seeding /* && ss.download_rate == 0.f*/) { TEST_EQUAL(s.total_payload_download - s.total_redundant_bytes, total_size - pad_file_size); // we need to sleep here a bit to let the session sync with the torrent stats test_sleep(1000); TEST_EQUAL(ses.status().total_payload_download - ses.status().total_redundant_bytes , total_size - pad_file_size); break; } test_sleep(500); } // for test_ban tests, make sure we removed // the url seed (i.e. banned it) TEST_CHECK(!test_ban || th.url_seeds().empty()); TEST_EQUAL(cs.read_cache_size, torrent_file->total_size() / 0x4000); TEST_EQUAL(cs.total_used_buffers, torrent_file->total_size() / 0x4000); std::cerr << "total_size: " << total_size << " rate_sum: " << rate_sum << " session_rate_sum: " << ses_rate_sum << " session total download: " << ses.status().total_payload_download << " torrent total download: " << th.status().total_payload_download << " redundant: " << th.status().total_redundant_bytes << std::endl; // the rates for each second should sum up to the total, with a 10% error margin // TEST_CHECK(fabs(rate_sum - total_size) < total_size * .1f); // TEST_CHECK(fabs(ses_rate_sum - total_size) < total_size * .1f); // if test_ban is true, we're not supposed to have completed the download // otherwise, we are supposed to have TEST_CHECK(th.status().is_seeding == !test_ban); if (proxy) stop_proxy(8002); TEST_CHECK(exists(combine_path("tmp2_web_seed", torrent_file->files().file_path( torrent_file->file_at(0)))) || test_ban); remove_all("tmp2_web_seed", ec); }
// proxy: 0=none, 1=socks4, 2=socks5, 3=socks5_pw 4=http 5=http_pw void test_transfer(boost::intrusive_ptr<torrent_info> torrent_file , int proxy, int port, char const* protocol, bool url_seed, bool chunked_encoding) { using namespace libtorrent; session ses(fingerprint(" ", 0,0,0,0), 0); session_settings settings; settings.max_queued_disk_bytes = 256 * 1024; ses.set_settings(settings); ses.set_alert_mask(~(alert::progress_notification | alert::stats_notification)); error_code ec; ses.listen_on(std::make_pair(51000, 52000), ec); if (ec) fprintf(stderr, "listen_on failed: %s\n", ec.message().c_str()); remove_all("./tmp2_web_seed", ec); char const* test_name[] = {"no", "SOCKS4", "SOCKS5", "SOCKS5 password", "HTTP", "HTTP password"}; fprintf(stderr, "\n\n ==== TESTING === proxy: %s ==== protocol: %s ==== seed: %s === transfer-encoding: %s\n\n\n" , test_name[proxy], protocol, url_seed ? "URL seed" : "HTTP seed", chunked_encoding ? "chunked": "none"); if (proxy) { start_proxy(8002, proxy); proxy_settings ps; ps.hostname = "127.0.0.1"; ps.port = 8002; ps.username = "******"; ps.password = "******"; ps.type = (proxy_settings::proxy_type)proxy; ses.set_proxy(ps); } add_torrent_params p; p.auto_managed = false; p.paused = false; p.ti = torrent_file; p.save_path = "./tmp2_web_seed"; p.storage_mode = storage_mode_compact; torrent_handle th = ses.add_torrent(p, ec); std::vector<announce_entry> empty; th.replace_trackers(empty); const size_type total_size = torrent_file->total_size(); float rate_sum = 0.f; float ses_rate_sum = 0.f; cache_status cs; for (int i = 0; i < 30; ++i) { torrent_status s = th.status(); session_status ss = ses.status(); rate_sum += s.download_payload_rate; ses_rate_sum += ss.payload_download_rate; cs = ses.get_cache_status(); if (cs.blocks_read < 1) cs.blocks_read = 1; if (cs.blocks_written < 1) cs.blocks_written = 1; /* std::cerr << (s.progress * 100.f) << " %" << " torrent rate: " << (s.download_rate / 1000.f) << " kB/s" << " session rate: " << (ss.download_rate / 1000.f) << " kB/s" << " session total: " << ss.total_payload_download << " torrent total: " << s.total_payload_download << " rate sum:" << ses_rate_sum << " cache: " << cs.cache_size << " rcache: " << cs.read_cache_size << " buffers: " << cs.total_used_buffers << std::endl; */ print_alerts(ses, " >> ses", false, false, false, 0, true); if (s.is_seeding /* && ss.download_rate == 0.f*/) { TEST_EQUAL(s.total_payload_download - s.total_redundant_bytes, total_size); // we need to sleep here a bit to let the session sync with the torrent stats test_sleep(1000); TEST_EQUAL(ses.status().total_payload_download - ses.status().total_redundant_bytes , total_size); break; } test_sleep(500); } TEST_EQUAL(cs.cache_size, 0); TEST_EQUAL(cs.total_used_buffers, 0); std::cerr << "total_size: " << total_size << " rate_sum: " << rate_sum << " session_rate_sum: " << ses_rate_sum << " session total download: " << ses.status().total_payload_download << " torrent total download: " << th.status().total_payload_download << " redundant: " << th.status().total_redundant_bytes << std::endl; // the rates for each second should sum up to the total, with a 10% error margin // TEST_CHECK(fabs(rate_sum - total_size) < total_size * .1f); // TEST_CHECK(fabs(ses_rate_sum - total_size) < total_size * .1f); TEST_CHECK(th.status().is_seeding); if (proxy) stop_proxy(8002); TEST_CHECK(exists(combine_path("./tmp2_web_seed", torrent_file->files().file_path( torrent_file->file_at(0))))); remove_all("./tmp2_web_seed", ec); }