2008-11-27 21:51:59 +01:00
/*
Copyright ( c ) 2008 , 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 "libtorrent/session.hpp"
# include "libtorrent/hasher.hpp"
2009-11-02 03:00:41 +01:00
# include "libtorrent/thread.hpp"
2014-07-06 21:18:00 +02:00
# include <boost/make_shared.hpp>
2008-11-27 21:51:59 +01:00
# include <boost/tuple/tuple.hpp>
# include "test.hpp"
# include "setup_transfer.hpp"
# include "libtorrent/extensions/metadata_transfer.hpp"
# include "libtorrent/extensions/ut_metadata.hpp"
# include "libtorrent/extensions/lt_trackers.hpp"
2013-04-28 00:54:58 +02:00
# include "libtorrent/bencode.hpp"
2008-11-27 21:51:59 +01:00
using boost : : tuples : : ignore ;
2015-05-30 06:31:23 +02:00
TORRENT_TEST ( trackers_extension )
2008-11-27 21:51:59 +01:00
{
2015-06-05 08:31:52 +02:00
# ifndef TORRENT_DISABLE_EXTENSIONS
2008-11-27 21:51:59 +01:00
using namespace libtorrent ;
2014-07-06 21:18:00 +02:00
namespace lt = libtorrent ;
2008-11-27 21:51:59 +01:00
2013-09-01 20:00:01 +02:00
// these are declared before the session objects
// so that they are destructed last. This enables
// the sessions to destruct in parallel
session_proxy p1 ;
session_proxy p2 ;
2015-08-02 01:55:28 +02:00
settings_pack s ;
s . set_bool ( settings_pack : : enable_upnp , false ) ;
s . set_bool ( settings_pack : : enable_natpmp , false ) ;
s . set_bool ( settings_pack : : enable_lsd , false ) ;
s . set_bool ( settings_pack : : enable_dht , false ) ;
s . set_str ( settings_pack : : listen_interfaces , " 0.0.0.0:48130 " ) ;
lt : : session ses1 ( s , 0 ) ;
s . set_str ( settings_pack : : listen_interfaces , " 0.0.0.0:49130 " ) ;
lt : : session ses2 ( s , 0 ) ;
2008-11-27 21:51:59 +01:00
ses1 . add_extension ( create_lt_trackers_plugin ) ;
ses2 . add_extension ( create_lt_trackers_plugin ) ;
add_torrent_params atp ;
2015-06-10 07:22:01 +02:00
atp . flags & = ~ add_torrent_params : : flag_paused ;
atp . flags & = ~ add_torrent_params : : flag_auto_managed ;
2008-11-27 21:51:59 +01:00
atp . info_hash = sha1_hash ( " 12345678901234567890 " ) ;
atp . save_path = " ./ " ;
2009-12-15 14:11:07 +01:00
error_code ec ;
torrent_handle tor1 = ses1 . add_torrent ( atp , ec ) ;
2012-03-19 05:02:13 +01:00
atp . trackers . push_back ( " http://test.non-existent.com/announce " ) ;
2009-12-15 14:11:07 +01:00
torrent_handle tor2 = ses2 . add_torrent ( atp , ec ) ;
2015-08-02 01:55:28 +02:00
2008-11-27 21:51:59 +01:00
tor2 . connect_peer ( tcp : : endpoint ( address_v4 : : from_string ( " 127.0.0.1 " ) , ses1 . listen_port ( ) ) ) ;
2013-04-28 00:54:58 +02:00
// trackers are NOT supposed to be exchanged for torrents that we
// don't have metadata for, since they might be private
for ( int i = 0 ; i < 10 ; + + i )
{
// make sure this function can be called on
// torrents without metadata
print_alerts ( ses1 , " ses1 " , false , true ) ;
print_alerts ( ses2 , " ses2 " , false , true ) ;
if ( tor1 . trackers ( ) . size ( ) ! = 0 ) break ;
test_sleep ( 1000 ) ;
}
TEST_CHECK ( tor1 . trackers ( ) . size ( ) = = 0 ) ;
entry info ;
info [ " pieces " ] = " aaaaaaaaaaaaaaaaaaaa " ;
info [ " name " ] = " slightly shorter name, it's kind of sad that people started the trend of incorrectly encoding the regular name field and then adding another one with correct encoding " ;
info [ " name.utf-8 " ] = " this is a long ass name in order to try to make make_magnet_uri overflow and hopefully crash. Although, by the time you read this that particular bug should have been fixed " ;
info [ " piece length " ] = 16 * 1024 ;
info [ " length " ] = 3245 ;
entry torrent ;
torrent [ " info " ] = info ;
std : : vector < char > buf ;
bencode ( std : : back_inserter ( buf ) , torrent ) ;
2014-07-06 21:18:00 +02:00
boost : : shared_ptr < torrent_info > ti ( boost : : make_shared < torrent_info > ( & buf [ 0 ] , buf . size ( ) , boost : : ref ( ec ) ) ) ;
2013-04-28 00:54:58 +02:00
TEST_CHECK ( ! ec ) ;
atp . ti = ti ;
atp . info_hash . clear ( ) ;
atp . save_path = " ./ " ;
atp . trackers . clear ( ) ;
tor1 = ses1 . add_torrent ( atp , ec ) ;
atp . trackers . push_back ( " http://test.non-existent.com/announce " ) ;
tor2 = ses2 . add_torrent ( atp , ec ) ;
tor2 . connect_peer ( tcp : : endpoint ( address_v4 : : from_string ( " 127.0.0.1 " ) , ses1 . listen_port ( ) ) ) ;
TEST_CHECK ( tor1 . trackers ( ) . size ( ) = = 0 ) ;
for ( int i = 0 ; i < 60 ; + + i )
2008-11-27 21:51:59 +01:00
{
// make sure this function can be called on
// torrents without metadata
print_alerts ( ses1 , " ses1 " , false , true ) ;
print_alerts ( ses2 , " ses2 " , false , true ) ;
if ( tor1 . trackers ( ) . size ( ) = = 1 ) break ;
test_sleep ( 1000 ) ;
}
TEST_CHECK ( tor1 . trackers ( ) . size ( ) = = 1 ) ;
2013-04-28 00:54:58 +02:00
2013-09-01 20:00:01 +02:00
// this allows shutting down the sessions in parallel
p1 = ses1 . abort ( ) ;
p2 = ses2 . abort ( ) ;
2015-06-05 08:31:52 +02:00
# endif // TORRENT_DISABLE_EXTENSIONS
2008-11-27 21:51:59 +01:00
}
2013-12-21 07:20:16 +01:00