/*******************************************************************************
* Copyright (c) 2012 The PDT Extension Group (https://github.com/pdt-eg)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.getcomposer.core.test;
import java.io.InputStream;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import junit.framework.TestCase;
import org.junit.Test;
import com.dubture.getcomposer.core.ComposerConstants;
import com.dubture.getcomposer.core.MinimalPackage;
import com.dubture.getcomposer.core.RepositoryPackage;
import com.dubture.getcomposer.packages.AsyncDownloader;
import com.dubture.getcomposer.packages.AsyncPackageSearch;
import com.dubture.getcomposer.packages.AsyncPackagistDownloader;
import com.dubture.getcomposer.packages.AsyncPackagistSearch;
import com.dubture.getcomposer.packages.AsyncPharDownloader;
import com.dubture.getcomposer.packages.DownloadListenerAdapater;
import com.dubture.getcomposer.packages.PackageListenerInterface;
import com.dubture.getcomposer.packages.PackageSearch;
import com.dubture.getcomposer.packages.PackageSearchListenerInterface;
import com.dubture.getcomposer.packages.PackagistDownloader;
import com.dubture.getcomposer.packages.PackagistSearch;
import com.dubture.getcomposer.packages.PharDownloader;
import com.dubture.getcomposer.packages.SearchResult;
public class PackagesTest extends TestCase {
private final static int TIMEOUT = 10;
private CountDownLatch counter;
private Object asyncResult;
private String asyncQuery;
private int asyncCounter;
private int asyncAborts;
public void setUp() {
counter = new CountDownLatch(1);
asyncResult = null;
asyncQuery = "";
asyncCounter = 0;
asyncAborts = 0;
}
@Test
public void testAsyncDownloader() {
try {
AsyncDownloader downloader = new AsyncDownloader(ComposerConstants.PHAR_URL);
downloader.addDownloadListener(new DownloadListenerAdapater() {
public void dataReceived(InputStream content, String url) {
asyncResult = content;
counter.countDown();
}
public void errorOccured(Exception e) {
e.printStackTrace();
}
});
downloader.download();
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
public void testComposerDownload() {
try {
PharDownloader downloader = new PharDownloader();
InputStream content = downloader.download();
assertNotNull(content);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testAsyncComposerDownload() {
try {
AsyncPharDownloader downloader = new AsyncPharDownloader();
downloader.addDownloadListener(new DownloadListenerAdapater() {
public void dataReceived(InputStream content, String url) {
asyncResult = content;
counter.countDown();
}
public void errorOccured(Exception e) {
e.printStackTrace();
}
});
downloader.download();
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testPackageDownloader() {
try {
PackagistDownloader downloader = new PackagistDownloader();
RepositoryPackage pkg = downloader.loadPackage("gossi/ldap");
assertNotNull(pkg);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testAsyncPackageDownloader() {
try {
AsyncPackagistDownloader downloader = new AsyncPackagistDownloader();
downloader.addPackageListener(new PackageListenerInterface() {
public void packageLoaded(RepositoryPackage repositoryPackage) {
asyncResult = repositoryPackage;
counter.countDown();
}
public void aborted(String url) {}
public void errorOccured(Exception e) {
e.printStackTrace();
fail();
}
});
String pkg = "symfony/symfony";
downloader.loadPackage(pkg);
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
assertEquals(pkg, ((RepositoryPackage)asyncResult).getName());
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testPackage() {
try {
RepositoryPackage resource = RepositoryPackage.fromPackagist("react/react");
assertTrue(resource != null);
assertEquals("react/react", resource.getName());
assertEquals("Nuclear Reactor written in PHP.", resource.getDescription());
assertNotNull(resource.getVersions());
assertTrue(resource.getVersions().size() > 1);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testSearch() {
try {
assertSearchResult("html");
assertSearchResult("react");
assertSearchResult("foo bar");
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
protected void assertSearchResult(String query) throws Exception {
PackageSearch downloader = new PackagistSearch();
downloader.setPageLimit(1);
List<MinimalPackage> packages = downloader.search(query);
assertNotNull(packages);
assertTrue(packages.size() > 0);
for (MinimalPackage phpPackage : packages) {
assertNotNull(phpPackage);
assertNotNull(phpPackage.getName());
assertNotNull(phpPackage.getDescription());
}
}
@Test
public void testAsyncSearch() {
try {
AsyncPackageSearch downloader = new AsyncPackagistSearch();
downloader.addPackageSearchListener(new PackageSearchListenerInterface() {
public void packagesFound(List<MinimalPackage> packages, String query, SearchResult result) {
asyncResult = packages;
asyncQuery = query;
asyncCounter++;
counter.countDown();
}
public void aborted(String url) {}
public void errorOccured(Exception e) {}
});
String query = "gossi/ldap";
downloader.search(query);
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
assertEquals(query, asyncQuery);
} catch(Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testAsyncSearchWithPages() {
try {
final int pages = 3;
AsyncPackageSearch downloader = new AsyncPackagistSearch();
downloader.addPackageSearchListener(new PackageSearchListenerInterface() {
public void packagesFound(List<MinimalPackage> packages, String query, SearchResult result) {
asyncResult = packages;
asyncQuery = query;
asyncCounter++;
//
// if (asyncCounter == pages) {
// counter.countDown();
// }
}
public void aborted(String url) {}
public void errorOccured(Exception e) {}
});
String query = "symfony";
downloader.setPageLimit(pages);
downloader.search(query);
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
assertEquals(query, asyncQuery);
assertEquals(pages, asyncCounter);
} catch(Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testAsyncSearchAbortNDownload() {
try {
final int pages = 1;
AsyncPackageSearch downloader = new AsyncPackagistSearch();
downloader.addPackageSearchListener(new PackageSearchListenerInterface() {
public void packagesFound(List<MinimalPackage> packages, String query, SearchResult result) {
asyncResult = packages;
asyncQuery = query;
asyncCounter++;
if (asyncCounter == pages) {
counter.countDown();
}
}
public void aborted(String url) {
// System.out.println("testAsyncSearchAbortNDownload aborted on: " + url);
}
public void errorOccured(Exception e) {
e.printStackTrace();
}
});
String query = "symfony";
downloader.setPageLimit(pages);
downloader.search(query);
downloader.abort();
query = "zend";
downloader.search(query);
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertNotNull(asyncResult);
assertEquals(query, asyncQuery);
assertEquals(pages, asyncCounter);
} catch(Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testAsyncAbort() {
try {
AsyncPackageSearch downloader = new AsyncPackagistSearch();
downloader.addPackageSearchListener(new PackageSearchListenerInterface() {
public void packagesFound(List<MinimalPackage> packages, String query, SearchResult result) {
asyncResult = packages;
asyncQuery = query;
asyncCounter++;
if (asyncAborts == 1 && asyncCounter == 1) {
counter.countDown();
}
}
public void aborted(String url) {
asyncAborts++;
if (asyncAborts == 1 && asyncCounter == 1) {
counter.countDown();
}
}
public void errorOccured(Exception e) {}
});
downloader.setPageLimit(1);
downloader.search("test");
downloader.abort();
downloader.search("symfony");
counter.await(TIMEOUT, TimeUnit.SECONDS);
assertEquals("Aborts: ", 1, asyncAborts);
assertEquals("Searches:", 1, asyncCounter);
assertEquals("symfony", asyncQuery);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
}