aria2/test/TorrentManTest.cc
Tatsuhiro Tsujikawa 9a52be6a29 2006-04-06 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To print ETA:

	* src/TorrentDownloadEngine.cc (afterEachIteration): Added 
download
	completion handling when dealing with
	TorrentMan::isPartialDownloadingMode() == true.
	* src/TorrentDownloadEngine.h (onPartialDownloadingCompletes):
	New function.
	* src/TorrentConsoleDownloadEngine.h (startup): New variable.
	(sessionDownloadLength): New variable.
	(avgSpeed): New variable.
	(eta): New variable.
	* src/TorrentConsoleDownloadEngine.cc (initStatistics): 
Initialized
	new variables: eta, avgSpeed, startup.
	(calculateSpeed): Calculate average speed and ETA.
	(printStatistics): Added ETA.

	* src/Util.h (secfmt): New function.
	* src/Util.cc (secfmt): New function.
	
2006-04-05  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>

	To detect "keep alive" flooding:

	* src/PeerInteractionCommand.h (keepAliveCount): New variable
	* src/PeerInteractionCommand.cc (Constructor): Initialized new
	variable: keepAliveCount.
	(detectMessageFlooding): Added "keep alive" flooding detection.
	(receiveMessage): Increase keepAliveCount when "keep alive" 
message
	received.
	
	To add the ability to download only specified files in 
multi-file
	torrent:

	* src/BitfieldMan.h (filterBitfield): New variable.
	(filterEnabled): New variable.
	(setFilterBit): New function.
	(enableFilter): New function.
	(disableFilter): New function.
	(isFilterEnabled): New function.
	(getFilteredTotalLength): New function.
	(getCompletedLength): New function.
	* src/BitfieldMan.cc (Constructor): Initialized new variable:
	filterBitfield, filterEnabled.
	(CopyConstructor): Added filterBitfield and filterEnabled.
	(operator==): Added filterBitfield and filterEnabled.
	(Destructor): Added filterBitfield.
	(getMissingIndex): Use filterBitfield.
	(getMissingUnusedIndex): Use filterBitfield.
	(getFirstMissingUnusedIndex): Use filterBitfield.
	(getFirstMissingUnusedIndex): Use filterBitfield.
	(getAllMissingIndexes): Use filterBitfield.
	(countMissingBlock): Use filterBitfield.
	(countBlock): Use filterBitfield.
	(setBitInternal): Added new argument on.
	(setUseBit): Use setBitInternal.
	(unsetUseBit): Use setBitInternal.
	(setBit): Use setBitInternal.
	(unsetBit): Use setBitInternal.
	(isAllBitSet): Use filterBitfield.
	(setFilterBit): New function.
	(addFilter): New function.
	(enableFilter): New function.
	(disableFilter): New function.
	(clearFilter): New function.
	(isFilterEnabled): New function.
	(getFilteredTotalLength): New function.
	(getCompletedLength): New function.

	* src/TorrentMan.h [FileEntry](Constructor): Updated signature.
	Initalized newly added variables.
	[FileEntry](offset): New variable.
	[FileEntry](extracted): New variable.
	[FileEntry](requested): New variable.
	(readFileEntry): New function.
	(option): New variable.
	(splitMultiFile): Removed const qualifier.
	(fixFilename): Removed const qualifier.
	(readFileEntryFromMetaInfoFile): New function.
	(finishPartialDownloadingMode): New function.
	(isPartialDownloadingMode): New function.
	(setFileEntriesToDownload): New function.
	(getCompletedLength): New function.
	(getPartialTotalLength): New function.
	* src/TorrentMan.cc (readFileEntry): New function.
	(setup): Use readFileEntry. If no-preallocation option is 
specified,
	use DefaultDiskWriter.
	(readFileEntryFromMetaInfoFile): New function.
	(fixFilename): Removed const qualifier.
	(splitMultiFile): Removed const qualifier.
	(setFileEntriesToDownload): New function.
	(isPartialDownloadingMode): New function.
	(finishPartialDownloadingMode): New function.
	(getCompletedLength): New function.
	(getPartialTotalLength): New function.
	
	* src/TorrentConsoleDownloadEngine.h 
(partialDownloadLengthDiff):
	New variable.
	(partialTotalLength): New variable.
	(downloadLength): New variable.
	(totalLength): New variable.
	* src/TorrentConsoleDownloadEngine.cc 
(onPartialDownloadingCompletes):
	Added log.
	(initStatistics): Initialized new variables: 
partialDownloadLengthDiff,
	partialTotalLength, downloadLength, totalLength.
	(calculate): Calculate downloadLength and totalLength.
	
	* src/prefs.h :New definition PREF_NO_PREALLOCATION

	* src/main.cc (addCommand): Changed argument signature.
	(main): Added new variable: args. Added new option 
"torrent-show-files"
	"no-preallocation". Usage is not updated yet.
	
2006-04-02  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>

	* src/PeerMessage.cc (setBitfield): Fixed invalid memory 
de-allocation.
2006-04-06 12:52:16 +00:00

192 lines
5.2 KiB
C++

#include "TorrentMan.h"
#include <string>
#include <cppunit/extensions/HelperMacros.h>
using namespace std;
class TorrentManTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(TorrentManTest);
/*
CPPUNIT_TEST(testUpdatePeers);
//CPPUNIT_TEST(testUpdatePeer);
CPPUNIT_TEST(testGetPeer);
CPPUNIT_TEST(testGetMissingPiece);
CPPUNIT_TEST(testCancelPiece);
CPPUNIT_TEST(testAddPeer);
*/
CPPUNIT_TEST_SUITE_END();
private:
public:
void setUp() {
}
void testUpdatePeers();
//void testUpdatePeer();
void testGetPeer();
void testGetMissingPiece();
void testCancelPiece();
void testAddPeer();
};
CPPUNIT_TEST_SUITE_REGISTRATION( TorrentManTest );
Peers createPeers() {
Peers peers;
Peer* peer1 = new Peer("192.168.0.1", 6881, 512*1024, 5242870);
peer1->entryId = 1;
Peer* peer2 = new Peer("192.168.0.2", 6881, 512*1024, 5242870);
peer2->entryId = 2;
Peer* peer3 = new Peer("192.168.0.3", 6881, 512*1024, 5242870);
peer3->entryId = 3;
peers.push_back(peer1);
peers.push_back(peer2);
peers.push_back(peer3);
return peers;
}
/*
void TorrentManTest::testUpdatePeers() {
TorrentMan tm;
Peers peers = createPeers();
tm.updatePeers(peers);
const Peers& peersGot = tm.getPeers();
Peers::const_iterator itr = peersGot.begin();
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), (*itr)->ipaddr);
itr++;
CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"), (*itr)->ipaddr);
itr++;
CPPUNIT_ASSERT_EQUAL(string("192.168.0.3"), (*itr)->ipaddr);
itr++;
}
*/
/*
void TorrentManTest::testUpdatePeer() {
TorrentMan tm;
Peers peers = createPeers();
tm.updatePeers(peers);
Peer* peer = tm.getPeer(1);
peer->amChocking = true;
peer->amInterested = true;
tm.updatePeer(peer);
Peers::const_iterator itr = tm.getPeers().begin();
CPPUNIT_ASSERT_EQUAL(3, (int)tm.getPeers().size());
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), itr->ipaddr);
CPPUNIT_ASSERT_EQUAL(true, itr->amChocking);
CPPUNIT_ASSERT_EQUAL(true, itr->amInterested);
CPPUNIT_ASSERT_EQUAL(1, itr->cuid);
itr++;
CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"), itr->ipaddr);
CPPUNIT_ASSERT_EQUAL(false, itr->amChocking);
CPPUNIT_ASSERT_EQUAL(false, itr->amInterested);
CPPUNIT_ASSERT_EQUAL(0, itr->cuid);
itr++;
CPPUNIT_ASSERT_EQUAL(string("192.168.0.3"), itr->ipaddr);
CPPUNIT_ASSERT_EQUAL(false, itr->amChocking);
CPPUNIT_ASSERT_EQUAL(false, itr->amInterested);
CPPUNIT_ASSERT_EQUAL(0, itr->cuid);
itr++;
}
*/
/*
void TorrentManTest::testGetPeer() {
TorrentMan tm;
Peers peers = createPeers();
tm.updatePeers(peers);
CPPUNIT_ASSERT(tm.getPeer() != Peer::nullPeer);
CPPUNIT_ASSERT(tm.getPeer() != Peer::nullPeer);
CPPUNIT_ASSERT(tm.getPeer() != Peer::nullPeer);
CPPUNIT_ASSERT(tm.getPeer() == Peer::nullPeer);
}
void TorrentManTest::testGetMissingPiece() {
TorrentMan tm;
tm.pieceLength = 512*1024;
tm.pieces = 10;
tm.totalSize = 5242870;
tm.initBitfield();
unsigned char peerBitfield[2] = { 0xff, 0xff };
Piece piece1 = tm.getMissingPiece(peerBitfield, 2);
CPPUNIT_ASSERT_EQUAL(0, piece1.getIndex());
CPPUNIT_ASSERT_EQUAL(512*1024, piece1.getLength());
Piece piece2 = tm.getMissingPiece(peerBitfield, 2);
CPPUNIT_ASSERT_EQUAL(1, piece2.getIndex());
CPPUNIT_ASSERT_EQUAL(512*1024, piece2.getLength());
tm.completePiece(piece1);
int len = tm.getBitfieldLength();
const unsigned char* bitfield = tm.getBitfield();
CPPUNIT_ASSERT_EQUAL(2, len);
CPPUNIT_ASSERT(bitfield[0]&(1 << 7));
for(int i = 0; i < 7; i++) {
CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
}
tm.completePiece(piece2);
bitfield = tm.getBitfield();
CPPUNIT_ASSERT_EQUAL(2, len);
CPPUNIT_ASSERT(bitfield[0]&(1 << 7));
CPPUNIT_ASSERT(bitfield[0]&(1 << 6));
for(int i = 0; i < 6; i++) {
CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
}
for(int i = 0; i < 8; i++) {
CPPUNIT_ASSERT(!IS_NULL_PIECE(tm.getMissingPiece(peerBitfield, 2)));
}
CPPUNIT_ASSERT(IS_NULL_PIECE(tm.getMissingPiece(peerBitfield, 2)));
}
void TorrentManTest::testCancelPiece() {
TorrentMan tm;
tm.pieceLength = 512*1024;
tm.pieces = 10;
tm.totalSize = 5242870;
tm.initBitfield();
unsigned char peerBitfield[2] = { 0xff, 0xff };
Piece piece = tm.getMissingPiece(peerBitfield, 2);
CPPUNIT_ASSERT_EQUAL(0, piece.getIndex());
CPPUNIT_ASSERT_EQUAL(512*1024, piece.getLength());
tm.cancelPiece(piece);
int len = tm.getBitfieldLength();
const unsigned char* bitfield = tm.getBitfield();
for(int i = 0; i < 8; i++) {
CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
}
}
void TorrentManTest::testAddPeer() {
TorrentMan tm;
Peers peers = createPeers();
tm.updatePeers(peers);
// try to add already added peer
Peer* dupPeer = new Peer("192.168.0.2", 6881);
CPPUNIT_ASSERT(!tm.addPeer(dupPeer));
CPPUNIT_ASSERT_EQUAL(3, (int)tm.getPeers().size());
// duplicate flag on
CPPUNIT_ASSERT(tm.addPeer(dupPeer, true));
CPPUNIT_ASSERT_EQUAL(4, (int)tm.getPeers().size());
// cannot add error peer even though duplicte flag turns on
dupPeer->error = 1;
Peer* dupPeer2 = new Peer("192.168.0.2", 6881);
CPPUNIT_ASSERT(!tm.addPeer(dupPeer2, true));
CPPUNIT_ASSERT_EQUAL(4, (int)tm.getPeers().size());
// try to add new peer
Peer* newPeer = new Peer("10.1.0.1", 6881);
CPPUNIT_ASSERT(tm.addPeer(newPeer));
CPPUNIT_ASSERT_EQUAL(5, (int)tm.getPeers().size());
}
*/