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.assertFileRenameFails;
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.createFakeTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createHiddenTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewNamedTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createNewTestFile;
import static com.limegroup.gnutella.library.FileManagerTestUtils.createPartialCopy;
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 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.util.TestUtils;
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 LibraryTest extends LimeTestCase {
private LibraryImpl fileList;
private UrnValidator urnValidator;
private Injector injector;
private File f1, f2, f3, f4, f5;
private List<FileDesc> fds;
public LibraryTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(LibraryTest.class);
}
@Override
protected void setUp() throws Exception {
injector = LimeTestUtils.createInjectorNonEagerly();
fileList = (LibraryImpl) injector.getInstance(Library.class);
urnValidator = injector.getInstance(UrnValidator.class);
fileList.initialize();
}
public void testNoManagedFiles() {
assertEquals(0, fileList.size());
assertFalse(fileList.iterator().hasNext());
assertFalse(fileList.pausableIterable().iterator().hasNext());
}
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 testOneManagedFile() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1);
assertEquals(1, fileList.size());
assertFalse(fileList.remove(f3));
assertEquals(f1, fileList.getFileDescForIndex(0).getFile());
assertLoads(fileList);
assertEquals(1, fileList.size());
assertEquals(f1, fileList.getFileDescForIndex(0).getFile());
}
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());
assertFalse(fileList.remove(f3));
assertTrue(fileList.remove(f2));
assertEquals(1, fileList.size());
assertLoads(fileList);
assertEquals(1, fileList.size());
assertTrue(fileList.contains(f1));
}
public void testAddAnotherFileDifferentIndex() 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(2, fileList.size());
assertNotNull(fileList.getFileDescForIndex(0));
assertNotNull(fileList.getFileDescForIndex(2));
assertNull(fileList.getFileDescForIndex(1));
fds = CollectionUtils.listOf(fileList);
assertContainsFiles(fds, f1, f3);
assertLoads(fileList);
fds = CollectionUtils.listOf(fileList);
assertContainsFiles(fds, f1, f3);
}
public void testRenameFiles() throws Exception {
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(3, _scratchDir);
f3 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f3);
assertEquals(2, fileList.size());
assertFileRenameFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, fileList, f1, new File(_scratchDir, "!<invalid file>"));
assertEquals(1, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f3);
assertFileRenames(fileList, f3, f2);
assertEquals(1, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f2);
assertFileRenameFails(FileViewChangeFailedException.Reason.OLD_WASNT_MANAGED, fileList, f1, f3);
assertLoads(fileList);
assertEquals(1, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f2);
}
public void testChangeFile() 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.getFileDescsMatching(urn).get(0));
change(f1);
assertFileChanges(fileList, f1);
assertEquals(1, fileList.size());
assertNotEquals(urn, fileList.getFileDesc(f1).getSHA1Urn());
assertNotSame(fd, fileList.getFileDesc(f1));
assertNotSame(fd, fileList.getFileDescsMatching(fileList.getFileDesc(f1).getSHA1Urn()).get(0));
f1.delete();
assertFileChangedFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, fileList, f1);
assertEquals(0, fileList.size());
assertFileChangedFails(FileViewChangeFailedException.Reason.OLD_WASNT_MANAGED, fileList, f2);
assertEquals(0, fileList.size());
assertLoads(fileList);
assertEquals(0, fileList.size());
}
public void testIgnoreHugeFiles() throws Exception {
long maxSize = 0xFFFFFFFFFFL; // 1TB.
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(11, _scratchDir);
assertAdds(fileList, f1, f2);
// Try to add a huge file. (It will be ignored.)
f3 = createFakeTestFile(maxSize + 1l, _scratchDir);
assertAddFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, fileList, f3);
// Add really big files.
f4 = createFakeTestFile(maxSize - 1, _scratchDir);
f5 = createFakeTestFile(maxSize, _scratchDir);
assertAdds(fileList, f4, f5);
assertEquals(4, fileList.size());
assertLoads(fileList);
assertEquals(4, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f1, f2, f4, f5);
}
public void testIgnoreHiddenFiles() throws Exception {
// Create some ordinary files and add them
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(1, _scratchDir);
assertAdds(fileList, f1, f2);
assertEquals(2, fileList.size());
// Try to add a hidden file
f3 = createHiddenTestFile(1, _scratchDir);
assertAddFails(FileViewChangeFailedException.Reason.NOT_MANAGEABLE, fileList, f3);
assertEquals(2, fileList.size());
assertLoads(fileList);
assertEquals(2, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f1, f2);
}
public void testIgnoreMisnamedFiles() throws Exception {
// Create some ordinary files and add them
f1 = createNewTestFile(1, _scratchDir);
f2 = createNewTestFile(1, _scratchDir);
assertAdds(fileList, f1, f2);
assertEquals(2, fileList.size());
// Try to add a misnamed file - it's an ASF but claims to be a FOO.
// The test file is in the public domain:
// http://www.archive.org/details/DovKaplanKolNidreKolNidrewma
File asf =
TestUtils.getResourceFile("com/limegroup/gnutella/resources/Kol_Nidre.wma");
f3 = createPartialCopy(asf, "foo", _scratchDir, 1024);
assertAddFails(FileViewChangeFailedException.Reason.DANGEROUS_FILE, fileList, f3);
assertEquals(2, fileList.size());
assertLoads(fileList);
assertEquals(2, fileList.size());
assertContainsFiles(CollectionUtils.listOf(fileList), f1, f2);
}
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, f3);
it = fileList.pausableIterable().iterator();
assertTrue(it.hasNext());
it.next();
assertTrue(it.hasNext());
assertLoads(fileList);
assertFalse(it.hasNext());
try {
it.next();
fail("should have thrown");
} catch(NoSuchElementException expected) {}
}
}