package com.limegroup.bittorrent; import java.io.File; import java.net.Socket; import java.net.URI; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import junit.framework.Assert; import junit.framework.Test; import org.limewire.core.api.download.DownloadAction; import org.limewire.core.api.download.SaveLocationException; import org.limewire.core.settings.ConnectionSettings; import org.limewire.http.httpclient.LimeHttpClient; import org.limewire.http.httpclient.SimpleLimeHttpClient; import org.limewire.io.Address; import org.limewire.io.GUID; import org.limewire.io.IpPort; import org.limewire.listener.EventListener; import org.limewire.net.ConnectionDispatcher; import org.limewire.util.TestUtils; import com.google.inject.Provider; import com.limegroup.gnutella.ActivityCallback; import com.limegroup.gnutella.DownloadManager; import com.limegroup.gnutella.DownloadManagerEvent; import com.limegroup.gnutella.Downloader; import com.limegroup.gnutella.NoOpSaveLocationManager; import com.limegroup.gnutella.RemoteFileDesc; import com.limegroup.gnutella.URN; import com.limegroup.gnutella.Uploader; import com.limegroup.gnutella.Downloader.DownloadState; import com.limegroup.gnutella.browser.MagnetOptions; import com.limegroup.gnutella.downloader.CantResumeException; import com.limegroup.gnutella.downloader.CoreDownloader; import com.limegroup.gnutella.downloader.DownloadStateEvent; import com.limegroup.gnutella.downloader.IncompleteFileManager; import com.limegroup.gnutella.downloader.Visitor; import com.limegroup.gnutella.http.DefaultHttpExecutor; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.util.LimeTestCase; import com.limegroup.gnutella.version.DownloadInformation; import com.limegroup.mozilla.MozillaDownload; public class BTTorrentFileDownloaderImplTest extends LimeTestCase { private static final int TEST_PORT = 8080; /** * A directory containing the torrent data for this unit test. */ public static final File TORRENT_DIR = TestUtils .getResourceFile("org/limewire/swarm/bittorrent/public_html/torrents"); /** * A directory containing the download data for this unit test. */ public static final File FILE_DIR = TestUtils .getResourceFile("org/limewire/swarm/bittorrent/public_html"); private boolean localIsPrivateBackup = false; private boolean forceIPAddressBackup = false; private String forceIPAddressStringBackup = null; private FileServer fileServer = null; public BTTorrentFileDownloaderImplTest(String name) { super(name); } public static Test suite() { return buildTestSuite(BTTorrentFileDownloaderImplTest.class); } @Override protected void setUp() throws Exception { localIsPrivateBackup = ConnectionSettings.LOCAL_IS_PRIVATE.getValue(); ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false); forceIPAddressBackup = ConnectionSettings.FORCE_IP_ADDRESS.getValue(); ConnectionSettings.FORCE_IP_ADDRESS.setValue(true); forceIPAddressStringBackup = ConnectionSettings.FORCED_IP_ADDRESS_STRING.getValue(); ConnectionSettings.FORCED_IP_ADDRESS_STRING.setValue("127.0.0.1"); fileServer = new FileServer(TEST_PORT, FILE_DIR); fileServer.start(); super.setUp(); } @Override protected void tearDown() throws Exception { ConnectionSettings.LOCAL_IS_PRIVATE.setValue(localIsPrivateBackup); ConnectionSettings.FORCE_IP_ADDRESS.setValue(forceIPAddressBackup); ConnectionSettings.FORCED_IP_ADDRESS_STRING.setValue(forceIPAddressStringBackup); fileServer.stop(); fileServer.destroy(); super.tearDown(); } public void testTorrentDownload() throws Exception { URI uri = new URI("http://localhost:8080/torrents/test-peer-dl-single-file.torrent"); BTTorrentFileDownloader btTorrentFileDownloader = createDownloader(uri); btTorrentFileDownloader.startDownload(); finishDownload(btTorrentFileDownloader); BTMetaInfo btMetaInfo = btTorrentFileDownloader.getBtMetaInfo(); Assert.assertNotNull(btMetaInfo); } private void finishDownload(BTTorrentFileDownloader btTorrentFileDownloader) throws InterruptedException { final CountDownLatch countDownLatch = new CountDownLatch(1); btTorrentFileDownloader.addListener(new EventListener<DownloadStateEvent>() { @Override public void handleEvent(DownloadStateEvent event) { if(DownloadState.COMPLETE == event.getType()) { countDownLatch.countDown(); } } }); countDownLatch.await(5, TimeUnit.SECONDS); } private BTTorrentFileDownloader createDownloader(URI uri) { BTTorrentFileDownloader torrentFileDownloaderImpl = new BTTorrentFileDownloaderImpl(new DownloadManager() { @Override public boolean acceptPushedSocket(String file, int index, byte[] clientGUID, Socket socket) { return false; } @Override public void addNewDownloader(CoreDownloader downloader) { } @Override public void bumpPriority(Downloader downl, boolean up, int amt) { } @Override public boolean conflicts(URN urn, long fileSize, File... fileName) { return false; } @Override public Downloader download(RemoteFileDesc[] files, List<? extends RemoteFileDesc> alts, GUID queryGUID, boolean overwrite, File saveDir, String fileName) throws SaveLocationException { return null; } @Override public Downloader download(MagnetOptions magnet, boolean overwrite, File saveDir, String fileName) throws IllegalArgumentException, SaveLocationException { return null; } @Override public Downloader download(File incompleteFile) throws CantResumeException, SaveLocationException { return null; } @Override public Downloader download(DownloadInformation info, long now) throws SaveLocationException { return null; } @Override public Downloader downloadFromMozilla(MozillaDownload listener) { return null; } @Override public Downloader downloadFromStore(RemoteFileDesc rfd, boolean overwrite, File saveDir, String fileName) throws IllegalArgumentException, SaveLocationException { return null; } @Override public Downloader downloadTorrent(URI torrentURI, boolean overwrite) throws SaveLocationException { return null; } @Override public Downloader downloadTorrent(File torrentFile, boolean overwrite) throws SaveLocationException { return null; } @Override public Downloader downloadTorrent(BTMetaInfo info, boolean overwrite) throws SaveLocationException { return null; } @Override public int downloadsInProgress() { return 0; } @Override public Iterable<CoreDownloader> getAllDownloaders() { return null; } @Override public float getAverageBandwidth() { return 0; } @Override public Downloader getDownloaderForIncompleteFile(File file) { return null; } @Override public Downloader getDownloaderForURN(URN sha1) { return null; } @Override public IncompleteFileManager getIncompleteFileManager() { return null; } @Override public float getLastMeasuredBandwidth() { return 0; } @Override public float getMeasuredBandwidth() { return 0; } @Override public int getNumActiveDownloads() { return 0; } @Override public int getNumIndividualDownloaders() { return 0; } @Override public int getNumWaitingDownloads() { return 0; } @Override public boolean hasInNetworkDownload() { return false; } @Override public boolean isActivelyDownloading(URN urn) { return false; } @Override public boolean isGuidForQueryDownloading(GUID guid) { return false; } @Override public boolean isIncomplete(URN urn) { return false; } @Override public boolean isSaveLocationTaken(File candidateFile) { return false; } @Override public boolean isSavedDownloadsLoaded() { return false; } @Override public void killDownloadersNotListed(Collection<? extends DownloadInformation> updates) { } @Override public void loadSavedDownloadsAndScheduleWriting() { } @Override public void measureBandwidth() { } @Override public void remove(CoreDownloader downloader, boolean completed) { } @Override public void sendQuery(QueryRequest query) { } @Override public void start() { } @Override public void writeSnapshot() { } @Override public void visitDownloads(Visitor<CoreDownloader> d) { } @Override public void addListener(EventListener<DownloadManagerEvent> listener) { } @Override public boolean removeListener(EventListener<DownloadManagerEvent> listener) { return false; } @Override public void handleQueryReply(QueryReply qr, Address address) { } @Override public boolean contains(Downloader downloader) { return false; } },new NoOpSaveLocationManager(), new DefaultHttpExecutor(new Provider<LimeHttpClient>() { @Override public LimeHttpClient get() { return new SimpleLimeHttpClient(); } }), new TorrentManager() { @Override public boolean allowNewTorrent() { return false; } @Override public int getMaxTorrentConnections() { return 0; } @Override public int getNumActiveTorrents() { return 0; } @Override public File getSharedTorrentMetaDataFile(BTMetaInfo info) { return null; } @Override public ManagedTorrent getTorrentForHash(byte[] infoHash) { return null; } @Override public ManagedTorrent getTorrentForURN(URN urn) { return null; } @Override public boolean hasNonSeeding() { return false; } @Override public void initialize(ConnectionDispatcher dispatcher) { } @Override public boolean killTorrentForFile(File f) { return false; } @Override public void shareTorrentFile(BTMetaInfo m, byte[] body) { } @Override public boolean releaseLock(File file) { return false; } @Override public void acceptConnection(String word, Socket s) { } @Override public boolean isBlocking() { return false; } @Override public void handleTorrentEvent(TorrentEvent evt) { } @Override public void addEventListener(TorrentEventListener listener) { } @Override public void dispatchEvent(TorrentEvent event) { } @Override public void removeEventListener(TorrentEventListener listener) { } },new BTMetaInfoFactoryImpl(), new ActivityCallback() { @Override public void addUpload(Uploader u) { } @Override public void handleMagnets(MagnetOptions[] magnets) { } @Override public void handleQueryResult(RemoteFileDesc rfd, QueryReply queryReply, Set<? extends IpPort> locs) { } @Override public void handleQuery(QueryRequest query, String address, int port) { } public void handleSharedFileUpdate(File file) { } @Override public void handleTorrent(File torrentFile) { } @Override public void installationCorrupted() { } @Override public boolean isQueryAlive(GUID guid) { return false; } @Override public void removeUpload(Uploader u) { } @Override public void restoreApplication() { } @Override public String translate(String s) { return null; } @Override public void uploadsComplete() { } @Override public void addDownload(Downloader d) { } @Override public void downloadsComplete() { } @Override public void promptAboutCorruptDownload(Downloader dloader) { } @Override public void downloadCompleted(Downloader d) { } @Override public void handleSaveLocationException(DownloadAction downLoadAction, SaveLocationException sle, boolean supportsNewSaveDir) { } @Override public void promptTorrentUploadCancel(ManagedTorrent torrent) { } }); torrentFileDownloaderImpl.initDownloadInformation(uri, true); return torrentFileDownloaderImpl; } }