package com.limegroup.gnutella;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import junit.framework.Test;
import org.limewire.collection.IntervalSet;
import org.limewire.collection.Range;
import org.limewire.gnutella.tests.LimeTestCase;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.util.PrivilegedAccessor;
import com.google.inject.Injector;
import com.limegroup.gnutella.downloader.VerifyingFile;
import com.limegroup.gnutella.downloader.VerifyingFileFactory;
import com.limegroup.gnutella.helpers.UrnHelper;
import com.limegroup.gnutella.library.FileDescFactory;
import com.limegroup.gnutella.library.IncompleteFileDesc;
@SuppressWarnings("unchecked")
public class IncompleteFileDescTest extends LimeTestCase {
private IncompleteFileDesc ifd;
private String fileName = "ifd.txt";
private URN urn;
private Set urns;
private VerifyingFile vf;
private VerifyingFileFactory verifyingFileFactory;
private FileDescFactory fileDescFactory;
public IncompleteFileDescTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(IncompleteFileDescTest.class);
}
@Override
public void setUp() throws Exception {
urn = URN.createSHA1Urn("urn:sha1:GLSTHIPQGSSZTS5FJUPAKPZWUGYQYPFB");
urns = new HashSet(1);
urns.add(urn);
Injector injector = LimeTestUtils.createInjectorNonEagerly();
verifyingFileFactory = injector.getInstance(VerifyingFileFactory.class);
fileDescFactory = injector.getInstance(FileDescFactory.class);
vf = verifyingFileFactory.createVerifyingFile();
ifd = fileDescFactory.createIncompleteFileDesc(
new File(fileName),
urns,
0,
fileName,
1981, vf);
}
public void testGetAvailableRanges() throws Exception {
// no ranges now.
assertEquals("bytes", ifd.getAvailableRanges());
// add a small range and ensure it doesn't get listed.
Range small = Range.createRange(0);
addInterval(small);
assertEquals(ifd.getAvailableRanges(),
"bytes", ifd.getAvailableRanges());
Range notLargeEnough = Range.createRange(0, 102398);
addInterval(notLargeEnough);
assertEquals(ifd.getAvailableRanges(),
"bytes", ifd.getAvailableRanges());
// extend from the middle ...
Range extended = Range.createRange(102300, 102500);
addInterval(extended);
assertEquals(ifd.getAvailableRanges(),
"bytes 0-102499", ifd.getAvailableRanges());
// add one not connected ...
Range other = Range.createRange(102550, 204950);
addInterval(other);
assertEquals(ifd.getAvailableRanges(),
"bytes 0-102499, 102550-204949", ifd.getAvailableRanges());
}
public void testLoadResponseRanges() throws Exception {
Range small = Range.createRange(0, 200000);
addUnverifiedInterval(small);
urns.add(UrnHelper.TTROOT);
ifd = fileDescFactory.createIncompleteFileDesc(
new File(fileName),
urns,
0,
fileName,
1981, vf);
IntervalSet i = new IntervalSet();
assertFalse(ifd.loadResponseRanges(i));
assertEquals(1,i.getNumberOfIntervals());
assertEquals(0,i.getFirst().getLow());
assertEquals(200000,i.getFirst().getHigh());
// now add some verified ranges
Range verified = Range.createRange(300000, 500000);
addInterval(verified);
// should only return the verified range
i = new IntervalSet();
assertTrue(ifd.loadResponseRanges(i));
assertEquals(1,i.getNumberOfIntervals());
assertEquals(300000,i.getFirst().getLow());
assertEquals(500000,i.getFirst().getHigh());
}
public void testisRangeSatisfiable() throws Exception {
// no ranges.
assertFalse( ifd.isRangeSatisfiable(0, 0) );
assertFalse( ifd.isRangeSatisfiable(0, 150) );
// add a range.
Range small = Range.createRange(0);
addInterval(small);
assertTrue( ifd.isRangeSatisfiable(0, 0) );
Range medium = Range.createRange(0, 102399);
addInterval(medium);
assertTrue( ifd.isRangeSatisfiable(0, 102399) );
assertTrue( ifd.isRangeSatisfiable(50,100000) );
assertFalse( ifd.isRangeSatisfiable(0, 102401) );
assertFalse( ifd.isRangeSatisfiable( 102399, 102401) );
assertFalse( ifd.isRangeSatisfiable(102400, 102500) );
// extend from the middle ...
Range extended = Range.createRange(102300, 102500);
addInterval(extended);
assertTrue( ifd.isRangeSatisfiable(0, 102500) );
assertFalse( ifd.isRangeSatisfiable(1,102501) );
// add one not connected ...
Range other = Range.createRange(102550, 204950);
addInterval(other);
assertTrue( ifd.isRangeSatisfiable( 102550, 204950) );
assertFalse( ifd.isRangeSatisfiable(102399, 102550) );
}
private void addInterval(Range i) throws Exception {
IntervalSet set = (IntervalSet)
PrivilegedAccessor.getValue(vf,"verifiedBlocks");
set.add(i);
}
private void addUnverifiedInterval(Range i) throws Exception {
IntervalSet set = (IntervalSet)
PrivilegedAccessor.getValue(vf,"partialBlocks");
set.add(i);
}
}