import 'mocha' ; import magnetUtil from 'magnet-uri' ; import WebTorrent from 'webtorrent' ; import { cleanupTests , createSingleServer , killallServers , PeerTubeServer , setAccessTokensToServers } from '@shared/server-commands' ; describe ( 'Test tracker' , function ( ) { let server ; let badMagnet ; let goodMagnet ; before ( async function ( ) { this . timeout ( 60000 ) ; server = await createSingleServer ( 1 ) ; await setAccessTokensToServers ( [ server ] ) ; { const { uuid } = await server . videos . upload ( ) ; const video = await server . videos . get ( { id : uuid } ) ; goodMagnet = video . files [ 0 ] . magnetUri ; const parsed = magnetUtil . decode ( goodMagnet ) ; parsed . infoHash = '010597bb88b1968a5693a4fa8267c592ca65f2e9' ; badMagnet = magnetUtil . encode ( parsed ) ; } } ) ; it ( 'Should succeed with the correct infohash' , function ( done ) { this . timeout ( 10000 ) ; const webtorrent = new WebTorrent ( ) ; const torrent = webtorrent . add ( goodMagnet ) ; torrent . on ( 'error' , done ) ; torrent . on ( 'warning' , warn => { const message = typeof warn === 'string' ? warn : warn . message ; if ( message . includes ( 'Unknown infoHash ' ) ) return done ( new Error ( 'Error on infohash' ) ) ; } ) ; torrent . on ( 'done' , done ) ; } ) ; it ( 'Should disable the tracker' , function ( done ) { this . timeout ( 20000 ) ; const errCb = ( ) => done ( new Error ( 'Tracker is enabled' ) ) ; killallServers ( [ server ] ) . then ( ( ) => server . run ( { tracker : { enabled : false } } ) ) . then ( ( ) => { const webtorrent = new WebTorrent ( ) ; const torrent = webtorrent . add ( goodMagnet ) ; torrent . on ( 'error' , done ) ; torrent . on ( 'warning' , warn => { const message = typeof warn === 'string' ? warn : warn . message ; if ( message . includes ( 'disabled ' ) ) { torrent . off ( 'done' , errCb ) ; return done ( ) ; } } ) ; torrent . on ( 'done' , errCb ) ; } ) ; } ) ; it ( 'Should return an error when adding an incorrect infohash' , function ( done ) { this . timeout ( 20000 ) ; killallServers ( [ server ] ) . then ( ( ) => server . run ( ) ) . then ( ( ) => { const webtorrent = new WebTorrent ( ) ; const torrent = webtorrent . add ( badMagnet ) ; torrent . on ( 'error' , done ) ; torrent . on ( 'warning' , warn => { const message = typeof warn === 'string' ? warn : warn . message ; if ( message . includes ( 'Unknown infoHash ' ) ) return done ( ) ; } ) ; torrent . on ( 'done' , ( ) => done ( new Error ( 'No error on infohash' ) ) ) ; } ) ; } ) ; it ( 'Should block the IP after the failed infohash' , function ( done ) { const webtorrent = new WebTorrent ( ) ; const torrent = webtorrent . add ( goodMagnet ) ; torrent . on ( 'error' , done ) ; torrent . on ( 'warning' , warn => { const message = typeof warn === 'string' ? warn : warn . message ; if ( message . includes ( 'Unsupported tracker protocol' ) ) return done ( ) ; } ) ; } ) ; after ( async function ( ) { await cleanupTests ( [ server ] ) ; } ) ; } ) ;