package com.limegroup.gnutella.library;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertAddFails;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertAdds;
import static com.limegroup.gnutella.library.FileManagerTestUtils.assertContainsFiles;
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.change;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewNamedTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewTestStoreFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.getUrn;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import junit.framework.Test;
import org.limewire.collection.CollectionUtils;
import org.limewire.core.settings.ContentSettings;
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.URN;
import com.limegroup.gnutella.auth.ContentManager;
import com.limegroup.gnutella.auth.StubContentResponseObserver;
import com.limegroup.gnutella.auth.UrnValidator;
import com.limegroup.gnutella.messages.vendor.ContentResponse;
public class GnutellaFileCollectionImplTest extends LimeTestCase {
@Inject private LibraryImpl managedList;
@Inject @GnutellaFiles private FileView fileView;
@Inject @GnutellaFiles private FileCollection fileList;
@Inject private UrnValidator urnValidator;
@Inject private Injector injector;
private File f1, f2, f3, f4;
private List<FileDesc> sharedFiles;
public GnutellaFileCollectionImplTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(GnutellaFileCollectionImplTest.class);
}
@Override
protected void setUp() throws Exception {
LimeTestUtils.createInjector(LimeTestUtils.createModule(this));
injector.getInstance(ServiceRegistry.class).initialize();
}
public void testNoSharedFiles() {
assertEquals(0, fileList.size());
assertFalse(fileList.iterator().hasNext());
assertFalse(fileList.pausableIterable().iterator().hasNext());
assertEquals(0, fileList.getFilesInDirectory(_scratchDir).size());
assertEquals(0, fileList.getNumBytes());
}
public void testContentManagerActive() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
f4 = createNewTestFile(23, _scratchDir);
URN u1 = getUrn(f1);
URN u2 = getUrn(f2);
URN u3 = getUrn(f3);
URN u4 = getUrn(f4);
ContentSettings.CONTENT_MANAGEMENT_ACTIVE.setValue(true);
ContentSettings.USER_WANTS_MANAGEMENTS.setValue(true);
ContentManager cm = injector.getInstance(ContentManager.class);
cm.start();
// request the urn so we can use the response.
cm.request(u1, new StubContentResponseObserver(), 1000);
cm.handleContentResponse(new ContentResponse(u1, false));
assertAddFails(FileViewChangeFailedException.Reason.INVALID_URN, fileList, f1);
assertAdds(fileList, f2, f3, f4);
assertEquals("unexpected # of files", 3, fileList.size());
assertFalse(fileList.contains(f1));
assertTrue(fileList.contains(f2));
assertTrue(fileList.contains(f3));
assertTrue(fileList.contains(f4));
// test invalid content response.
urnValidator.validate(u2);
cm.handleContentResponse(new ContentResponse(u2, false));
assertFalse(fileList.contains(f2));
assertEquals(2, fileList.size());
// test valid content response.
urnValidator.validate(u3);
cm.handleContentResponse(new ContentResponse(u3, true));
assertTrue(fileList.contains(f3));
assertEquals(2, fileList.size());
// test valid content response.
urnValidator.validate(u4);
Thread.sleep(10000);
assertTrue(fileList.contains(f4));
assertEquals(2, fileList.size());
// Make sure adding a new file to be shared doesn't work if it
// returned bad before.
assertAddFails(FileViewChangeFailedException.Reason.INVALID_URN, fileList, f2);
assertFalse("shouldn't be shared", fileList.contains(f2));
}
public void testOneSharedFile() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1);
assertEquals(1, managedList.size());
assertEquals(1, fileList.size());
assertFalse(fileList.remove(f3));
assertEquals(f1, fileList.getFileDescForIndex(0).getFile());
assertEquals(f1, managedList.getFileDescForIndex(0).getFile());
sharedFiles = fileList.getFilesInDirectory(_scratchDir);
assertEquals(1, sharedFiles.size());
assertEquals(sharedFiles.get(0).getFile(), f1);
sharedFiles = fileList.getFilesInDirectory(_scratchDir.getParentFile());
assertEquals(0, sharedFiles.size());
}
public void testRemovingOneFile() 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.
assertEquals(2, fileList.size());
assertEquals(2, managedList.size());
assertFalse(fileList.remove(f3));
assertTrue(fileList.remove(f2));
assertEquals(1, fileList.size());
assertEquals(2, managedList.size());
}
public void testAddAnotherSharedFileDifferentIndex() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f2);
assertTrue(fileList.remove(f2));
assertAdds(fileList, f3);
assertEquals(12, fileList.getNumBytes());
assertEquals(2, fileList.size());
assertEquals(3, managedList.size());
assertNotNull(fileList.getFileDescForIndex(0));
assertNotNull(fileList.getFileDescForIndex(2));
assertNull(fileList.getFileDescForIndex(1));
assertNotNull(managedList.getFileDescForIndex(1));
sharedFiles = fileList.getFilesInDirectory(_scratchDir);
assertEquals("unexpected files length", 2, sharedFiles.size());
assertContainsFiles(sharedFiles, f1, f3);
sharedFiles = CollectionUtils.listOf(fileList);
assertContainsFiles(sharedFiles, f1, f3);
sharedFiles = CollectionUtils.listOf(managedList);
assertContainsFiles(sharedFiles, f1, f2, f3);
}
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());
assertContainsFiles(CollectionUtils.listOf(fileList), f1, f3);
try {
managedList.fileRenamed(f1, new File(_scratchDir, "!<invalid file>")).get(1, TimeUnit.SECONDS);
fail("should have failed");
} catch(ExecutionException expected) {}
assertContainsFiles(CollectionUtils.listOf(fileList), f3);
assertFileRenames(managedList, f3, f2);
assertContainsFiles(CollectionUtils.listOf(fileList), f2);
try {
managedList.fileRenamed(f1, f3).get(1, TimeUnit.SECONDS);
fail("should have failed");
} catch(ExecutionException expected) {}
assertContainsFiles(CollectionUtils.listOf(fileList), f2);
}
public void testChangeSharedFile() throws Exception {
f1 = createNewNamedTestFile(100, "name", _scratchDir);
f2 = createNewTestFile(10, _scratchDir);
assertAdds(fileList, f1);
assertEquals(1, fileList.size());
FileDesc fd = fileList.getFileDesc(f1);
URN urn = fd.getSHA1Urn();
assertSame(fd, fileList.getFileDesc(urn));
change(f1);
assertFileChanges(managedList, f1);
assertEquals(1, fileList.size());
assertNotEquals(urn, fileList.getFileDesc(f1).getSHA1Urn());
assertEquals(getUrn(f1), fileList.getFileDesc(f1).getSHA1Urn());
assertNotSame(fd, fileList.getFileDesc(f1));
assertNotSame(fd, fileList.getFileDesc(fileList.getFileDesc(f1).getSHA1Urn()));
f1.delete();
assertFileChangedFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, managedList, f1);
assertEquals(0, fileList.size());
assertFileChangedFails(FileViewChangeFailedException.Reason.OLD_WASNT_MANAGED, managedList, f2);
assertEquals(0, fileList.size());
}
public void testPausableIterator() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f2);
assertEquals(2, fileList.size());
Iterator<FileDesc> it = fileList.pausableIterable().iterator();
FileDesc fd = it.next();
assertEquals(fd.getFileName(), f1.getName());
fd = it.next();
assertEquals(fd.getFileName(), f2.getName());
assertFalse(it.hasNext());
try {
fd = it.next();
fail("Expected NoSuchElementException, got: " + fd);
} catch (NoSuchElementException expected) {}
it = fileList.pausableIterable().iterator();
assertTrue(it.hasNext());
assertTrue(it.hasNext());
assertTrue(it.hasNext());
it.next();
fileList.remove(f2);
assertFalse(it.hasNext());
it = fileList.pausableIterable().iterator();
fd = it.next();
assertFalse(it.hasNext());
assertAdds(fileList, f1, f3);
it = fileList.pausableIterable().iterator();
assertTrue(it.hasNext());
it.next();
assertTrue(it.hasNext());
it.next();
assertFalse(it.hasNext());
}
public void testStoreFileDoesntAddToView() throws Exception {
f1 = createNewTestStoreFile(_storeDir);
assertFalse(managedList.contains(f1));
assertAdds(fileList, f1);
assertTrue(managedList.contains(f1));
assertFalse(fileView.contains(f1));
f2 = createNewTestStoreFile(_scratchDir);
assertFalse(managedList.contains(f2));
assertAdds(fileList, f2);
assertTrue(managedList.contains(f2));
assertFalse(fileView.contains(f2));
}
// TODO: Test change from store -> non-store (become shared?)
// TODO: Test change non-store -> store (become unshared?)
// public void testAddFolder() throws Exception {
// f1 = createNewExtensionTestFile(1, "tmp", _scratchDir);
// f2 = createNewExtensionTestFile(3, "tmp", _scratchDir);
// f3 = createNewExtensionTestFile(11, "tmp2", _scratchDir);
//
// File dir1 = new File(_scratchDir, "sub1");
// File dir2 = new File(_scratchDir, "sub2");
// dir1.mkdirs();
// dir2.mkdirs();
//
// f4 = createNewExtensionTestFile(15, "tmp", dir1);
// f5 = createNewExtensionTestFile(15, "tmp2", dir2);
//
// managedList.setManagedExtensions(Collections.singletonList("tmp"));
//
// List<FileDesc> fdList;
//
// fdList = assertAddsFolder(fileList, _scratchDir);
// assertContainsFiles(fdList, f1, f2);
// assertContainsFiles(fileList, f1, f2);
// // TODO: The below check has a race-condition
// // ...The subdir might not be managed yet.
// assertContainsFiles(managedList, f1, f2, f4); // subdir managed, not shared!
//
// assertLoads(managedList);
// assertContainsFiles(fileList, f1, f2);
// assertContainsFiles(managedList, f1, f2, f4);
//
// assertFalse(fileList.contains(f5));
// assertFalse(managedList.contains(f5));
// }
}