package com.limegroup.gnutella.library;
import java.io.File;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.gnutella.tests.LimeTestCase;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.io.LocalSocketAddressProvider;
import org.limewire.io.LocalSocketAddressProviderStub;
import org.limewire.lifecycle.ServiceRegistry;
import org.limewire.listener.EventListener;
import org.limewire.util.I18NConvert;
import org.limewire.util.StringUtils;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.messages.QueryRequestFactory;
import com.limegroup.gnutella.routing.QRPUpdater;
import com.limegroup.gnutella.xml.LimeXMLDocument;
import com.limegroup.gnutella.xml.LimeXMLDocumentFactory;
/**
* Tests for FileManager and handling of queries.
*/
public class FileManagerTestCase extends LimeTestCase {
public static final String SHARE_EXTENSION = "XYZ";
public static final String EXTENSION = SHARE_EXTENSION + ";mp3";
protected File f1 = null;
protected File f2 = null;
protected File f3 = null;
protected File f4 = null;
protected File f5 = null;
protected File f6 = null;
protected File store1 = null;
protected File store2 = null;
protected File store3 = null;
// protected so that subclasses can
// use these variables as well.
@Inject protected Library library;
@Inject protected FileViewManager fileViewManager;
@Inject @GnutellaFiles protected FileView gnutellaFileView;
@Inject protected QRPUpdater qrpUpdater = null;
protected Object loaded = new Object();
protected Response[] responses;
protected List<FileDesc> sharedFiles;
@Inject protected Injector injector;
@Inject protected SharedFilesKeywordIndex keywordIndex;
@Inject protected LimeXMLDocumentFactory limeXMLDocumentFactory;
@Inject protected CreationTimeCache creationTimeCache;
@Inject protected QueryRequestFactory queryRequestFactory;
@Inject @GnutellaFiles protected FileCollection gnutellaFileCollection;
public FileManagerTestCase(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
cleanFiles(_incompleteDir, false);
cleanFiles(_storeDir, false);
injector = LimeTestUtils.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(LocalSocketAddressProvider.class).to(LocalSocketAddressProviderStub.class);
}
}, LimeTestUtils.createModule(this));
injector.getInstance(ServiceRegistry.class).initialize();
injector.getInstance(FileManager.class).start();
}
@Override
protected void tearDown() {
if (f1!=null) f1.delete();
if (f2!=null) f2.delete();
if (f3!=null) f3.delete();
if (f4!=null) f4.delete();
if (f5!=null) f5.delete();
if (f6!=null) f6.delete();
if(store1!=null) store1.delete();
if(store2!=null) store2.delete();
if(store3!=null) store3.delete();
}
////////////////////////////////////////////////////////////////////////////////////
// helper methods for file creation
////////////////////////////////////////////////////////////////////////////////////
/**
* Helper function to create a new temporary file of the given size,
* with the given name, in the default shared directory.
*/
protected File createNewNamedTestFile(int size, String name) throws Exception {
return createNewNamedTestFile(size, name, _scratchDir);
}
protected File createNewNamedTestFile(int size, String name, File directory) throws Exception {
return FileManagerTestUtils.createNewNamedTestFile(size, name, SHARE_EXTENSION, directory);
}
protected QueryRequest get_qr(String xml) {
return queryRequestFactory.createQuery("", xml);
}
////////////////////////////////////////////////////////////////////////////////////
// additional helper methods
////////////////////////////////////////////////////////////////////////////////////
//helper function to create queryrequest with I18N
protected QueryRequest get_qr(File f) {
QueryRequestFactory queryRequestFactory = injector.getInstance(QueryRequestFactory.class);
String norm = I18NConvert.instance().getNorm(f.getName());
norm = StringUtils.replace(norm, "_", " ");
return queryRequestFactory.createQuery(norm);
}
// protected void addFilesToLibrary() throws Exception {
// String dirString = "com/limegroup/gnutella";
// File testDir = TestUtils.getResourceFile(dirString);
// testDir = testDir.getCanonicalFile();
// assertTrue("could not find the gnutella directory",
// testDir.isDirectory());
//
// File[] testFiles = testDir.listFiles(new FileFilter() {
// public boolean accept(File file) {
// // use files with a $ because they'll generally
// // trigger a single-response return, which is
// // easier to check
// return !file.isDirectory() && file.getName().indexOf("$")!=-1;
// }
// });
// assertNotNull("no files to test against", testFiles);
// assertNotEquals("no files to test against", 0, testFiles.length);
//
// for(int i=0; i<testFiles.length; i++) {
// if(!testFiles[i].isFile()) continue;
// File shared = new File(
// _sharedDir, testFiles[i].getName() + "." + SHARE_EXTENSION);
// assertTrue("unable to get file", FileUtils.copy( testFiles[i], shared));
// }
//
// waitForLoad();
//
//
// // the below test depends on the filemanager loading shared files in
// // alphabetical order, and listFiles returning them in alphabetical
// // order since neither of these must be true, a length check can
// // suffice instead.
// //for(int i=0; i<files.length; i++)
// // assertEquals(files[i].getName()+".tmp",
// // fman.get(i).getFile().getName());
//
// assertEquals("unexpected number of shared files",
// testFiles.length, fman.getGnutellaSharedFileList().size() );
// }
protected void waitForLoad() throws Exception {
FileManagerTestUtils.waitForLoad(library, 10000);
}
protected boolean responsesContain(LimeXMLDocument... doc) {
for (LimeXMLDocument myDoc : doc) {
boolean cuurentDocExistsInResponses = false;
for (Response response : responses) {
LimeXMLDocument respDoc = response.getDocument();
if ((respDoc != null) &&
(myDoc.getXMLString().equals(respDoc.getXMLString()))) {
cuurentDocExistsInResponses = true;
}
}
if (!cuurentDocExistsInResponses) {
return false;
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////
// classes and methods related to adding files to file manager
////////////////////////////////////////////////////////////////////////////////////
public static class Listener implements EventListener<FileViewChangeEvent> {
private final CountDownLatch latch = new CountDownLatch(1);
public FileViewChangeEvent evt;
public void handleEvent(FileViewChangeEvent fme) {
evt = fme;
latch.countDown();
fme.getFileView().removeListener(this);
}
void await(long timeout) throws Exception {
assertTrue(latch.await(timeout, TimeUnit.MILLISECONDS));
}
}
}