package com.limegroup.gnutella.library;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertAdds;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertFileChangedFails;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertFileChanges;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertFileRenames;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertLoads;
import static com.limegroup.gnutella.library.FileManagerTestUtils.change;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewNamedTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewTestFile;
import java.io.File;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import junit.framework.Test;
import org.limewire.gnutella.tests.LimeTestCase;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.lifecycle.ServiceRegistry;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.messages.QueryRequestFactory;
public class SharedFileKeywordsIndexImplIntegrationTest extends LimeTestCase {
@Inject private QueryRequestFactory queryRequestFactory;
@Inject private Library managedList;
@Inject @GnutellaFiles private FileCollection fileList;
@Inject private SharedFilesKeywordIndex keywordIndex;
private Response[] responses;
@Inject private Injector injector;
private File f1, f2, f3;
public SharedFileKeywordsIndexImplIntegrationTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(SharedFileKeywordsIndexImplIntegrationTest.class);
}
@Override
protected void setUp() throws Exception {
LimeTestUtils.createInjectorNonEagerly(LimeTestUtils.createModule(this));
injector.getInstance(ServiceRegistry.class).initialize();
assertLoads(managedList); // Ensure it starts up & schemas load & all.
}
public void testOneSharedFile() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
assertAdds(fileList, f1);
// it is important to check the query at all bounds,
// // including tests for case.
QueryRequestFactory queryRequestFactory = injector.getInstance(QueryRequestFactory.class);
responses = keywordIndex.query(queryRequestFactory.createQuery("unit", (byte) 3));
assertEquals("Unexpected number of responses", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("FileManager", (byte) 3));
assertEquals("Unexpected number of responses", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("test", (byte) 3));
assertEquals("Unexpected number of responses", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("file", (byte) 3));
assertEquals("Unexpected number of responses", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("FileManager UNIT tEsT",
(byte) 3));
assertEquals("Unexpected number of responses", 1, responses.length);
}
public void testAddAnotherSharedFile() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
assertAdds(fileList, f1, f2);
responses = keywordIndex.query(queryRequestFactory.createQuery("unit", (byte) 3));
assertNotEquals("responses gave same index", responses[0].getIndex(), responses[1].getIndex());
for (int i = 0; i < responses.length; i++) {
assertTrue("responses should be expected indexes",
responses[i].getIndex() == 0 || responses[i].getIndex() == 1);
}
}
public void testRemovingOneSharedFile() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f2);
// Remove file that's shared. Back to 1 file.
fileList.remove(f2);
responses = keywordIndex.query(queryRequestFactory.createQuery("unit", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
}
public void testAddAnotherSharedFileDifferentIndex() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f2);
fileList.remove(f2);
assertAdds(fileList, f3);
responses = keywordIndex.query(queryRequestFactory.createQuery("unit", (byte) 3));
assertEquals("unexpected response length", 2, responses.length);
assertNotEquals("unexpected response[0] index", 1, responses[0].getIndex());
assertNotEquals("unexpected response[1] index", 1, responses[1].getIndex());
responses = keywordIndex.query(queryRequestFactory.createQuery("*unit*", (byte) 3));
assertEquals("unexpected responses length", 2, responses.length);
}
public void testRenameFiles() throws Exception {
f1 = createNewNamedTestFile(1, "1111", _scratchDir);
f2 = createNewNamedTestFile(3, "2222", _scratchDir);
f3 = createNewNamedTestFile(11, "3333", _scratchDir);
assertAdds(fileList, f1, f3);
assertEquals(2, fileList.size());
responses = keywordIndex.query(queryRequestFactory.createQuery("1111", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("2222", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("3333", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
try {
managedList.fileRenamed(f1, new File(_scratchDir, "!<invalid file>")).get(1, TimeUnit.SECONDS);
fail("should have failed");
} catch(ExecutionException expected) {}
responses = keywordIndex.query(queryRequestFactory.createQuery("1111", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("2222", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("3333", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
assertFileRenames(managedList, f3, f2);
responses = keywordIndex.query(queryRequestFactory.createQuery("1111", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("2222", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("3333", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
try {
managedList.fileRenamed(f1, f3).get(1, TimeUnit.SECONDS);
fail("should have failed");
} catch(ExecutionException expected) {}
responses = keywordIndex.query(queryRequestFactory.createQuery("1111", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("2222", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
responses = keywordIndex.query(queryRequestFactory.createQuery("3333", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
}
public void testChangeSharedFile() throws Exception {
f1 = createNewNamedTestFile(100, "name", _scratchDir);
f2 = createNewTestFile(10, _scratchDir);
assertAdds(fileList, f1);
responses = keywordIndex.query(queryRequestFactory.createQuery("name", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
change(f1);
assertFileChanges(managedList, f1);
responses = keywordIndex.query(queryRequestFactory.createQuery("name", (byte) 3));
assertEquals("unexpected response length", 1, responses.length);
f1.delete();
assertFileChangedFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, managedList, f1);
responses = keywordIndex.query(queryRequestFactory.createQuery("name", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
assertFileChangedFails(FileViewChangeFailedException.Reason.OLD_WASNT_MANAGED, managedList, f2);
responses = keywordIndex.query(queryRequestFactory.createQuery("name", (byte) 3));
assertEquals("unexpected response length", 0, responses.length);
}
}