piece tracking

pull/4/head
Zlatin Balevsky 2019-05-29 00:25:01 +01:00
parent c849629358
commit 16bf1e3fac
2 changed files with 53 additions and 0 deletions

View File

@ -0,0 +1,30 @@
package com.muwire.core.download
class Pieces {
private final BitSet bitSet
private final int nPieces
private final Random random = new Random()
Pieces(int nPieces) {
this.nPieces = nPieces
bitSet = new BitSet(nPieces)
}
synchronized int getRandomPiece() {
if (isComplete())
return -1
while(true) {
int start = random.nextInt(nPieces)
while(bitSet.get(start) && ++start < nPieces);
return start
}
}
synchronized void markDownloaded(int piece) {
bitSet.set(piece)
}
synchronized boolean isComplete() {
bitSet.cardinality() == nPieces
}
}

View File

@ -0,0 +1,23 @@
package com.muwire.core.download
import org.junit.Test
class PiecesTest {
Pieces pieces
@Test
public void testEmpty() {
pieces = new Pieces(20)
assert !pieces.isComplete()
}
@Test
public void testSinglePiece() {
pieces = new Pieces(1)
assert !pieces.isComplete()
assert pieces.getRandomPiece() == 0
pieces.markDownloaded(0)
assert pieces.isComplete()
}
}