mirror of
https://github.com/aria2/aria2.git
synced 2025-02-26 08:22:11 +00:00
Extract the Peer class's member variables, which are only needed after PeerInteractionCommand, into PeerSessionResource class. This class is instantiated in PeerInteractionCommand class's ctor and released in its dtor. This will make Peer class lightweight and uses less memory for peers which are not connected and wait in the queue. * src/PeerChokeCommand.cc * src/PeerSessionResource.{h, cc} * src/PeerInteractionCommand.cc * src/PeerAbstractCommand.cc: Note: 0 is given to onAbort() function. * src/DefaultBtInteractive.cc * src/BtPieceMessage.cc * src/BtInterestedMessage.cc * src/BtUnchokeMessage.cc * src/DefaultPeerStorage.{h, cc} * src/PeerInitiateConnectionCommand.cc * src/ActivePeerConnectionCommand.cc * src/BtNotInterestedMessage.cc * src/DefaultBtMessageDispatcher.cc * src/BtChokeMessage.cc * src/BtRequestMessage.cc * src/Peer.{h, cc} * src/BtRegistry.h * src/TrackerWatcherCommand.cc * src/PeerReceiveHandshakeCommand.cc * test/BtExtendedMessageTest.cc * test/BtAllowedFastMessageTest.cc * test/BtCancelMessageTest.cc * test/DefaultPieceStorageTest.cc * test/BtBitfieldMessageTest.cc * test/BtHaveMessageTest.cc * test/BtNotInterestedMessageTest.cc * test/BtRequestMessageTest.cc * test/PeerSessionResourceTest.cc * test/DefaultBtMessageDispatcherTest.cc * test/PeerTest.cc * test/BtInterestedMessageTest.cc * test/BtRejectMessageTest.cc * test/BtChokeMessageTest.cc * test/DefaultPeerStorageTest.cc * test/BtHaveNoneMessageTest.cc * test/BtHaveAllMessageTest.cc * test/DefaultExtensionMessageFactoryTest.cc * test/BtUnchokeMessageTest.cc * test/DefaultBtMessageFactoryTest.cc * test/HandshakeExtensionMessageTest.cc * test/UTPexExtensionMessageTest.cc * test/DefaultBtRequestFactoryTest.cc * test/BtPieceMessageTest.cc Removed typedef PeerStats. * src/PeerStat.h * src/SegmentMan.cc
304 lines
10 KiB
C++
304 lines
10 KiB
C++
#include "BtPieceMessage.h"
|
|
#include "PeerMessageUtil.h"
|
|
#include "MockBtContext.h"
|
|
#include "MockBtMessage.h"
|
|
#include "MockBtMessageFactory.h"
|
|
#include "MockBtMessageDispatcher.h"
|
|
#include "BtChokingEvent.h"
|
|
#include "BtCancelSendingPieceEvent.h"
|
|
#include "FileEntry.h"
|
|
#include "Peer.h"
|
|
#include "Piece.h"
|
|
#include "BtRegistry.h"
|
|
#include "PeerObject.h"
|
|
#include "BtMessageReceiver.h"
|
|
#include "BtRequestFactory.h"
|
|
#include "PeerConnection.h"
|
|
#include "ExtensionMessageFactory.h"
|
|
#include <cstring>
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
namespace aria2 {
|
|
|
|
class BtPieceMessageTest:public CppUnit::TestFixture {
|
|
|
|
CPPUNIT_TEST_SUITE(BtPieceMessageTest);
|
|
CPPUNIT_TEST(testCreate);
|
|
CPPUNIT_TEST(testGetMessageHeader);
|
|
CPPUNIT_TEST(testChokingEvent);
|
|
CPPUNIT_TEST(testChokingEvent_allowedFastEnabled);
|
|
CPPUNIT_TEST(testChokingEvent_inAmAllowedIndexSet);
|
|
CPPUNIT_TEST(testChokingEvent_invalidate);
|
|
CPPUNIT_TEST(testChokingEvent_sendingInProgress);
|
|
CPPUNIT_TEST(testCancelSendingPieceEvent);
|
|
CPPUNIT_TEST(testCancelSendingPieceEvent_noMatch);
|
|
CPPUNIT_TEST(testCancelSendingPieceEvent_allowedFastEnabled);
|
|
CPPUNIT_TEST(testCancelSendingPieceEvent_invalidate);
|
|
CPPUNIT_TEST(testCancelSendingPieceEvent_sendingInProgress);
|
|
CPPUNIT_TEST(testToString);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
public:
|
|
BtPieceMessageTest():btMessageDispatcher(0), peer(0), msg(0) {}
|
|
|
|
void testCreate();
|
|
void testGetMessageHeader();
|
|
void testChokingEvent();
|
|
void testChokingEvent_allowedFastEnabled();
|
|
void testChokingEvent_inAmAllowedIndexSet();
|
|
void testChokingEvent_invalidate();
|
|
void testChokingEvent_sendingInProgress();
|
|
void testCancelSendingPieceEvent();
|
|
void testCancelSendingPieceEvent_noMatch();
|
|
void testCancelSendingPieceEvent_allowedFastEnabled();
|
|
void testCancelSendingPieceEvent_invalidate();
|
|
void testCancelSendingPieceEvent_sendingInProgress();
|
|
void testToString();
|
|
|
|
class MockBtMessage2 : public MockBtMessage {
|
|
public:
|
|
int32_t index;
|
|
int32_t begin;
|
|
int32_t length;
|
|
public:
|
|
MockBtMessage2(int32_t index, int32_t begin, int32_t length):index(index), begin(begin), length(length) {}
|
|
|
|
};
|
|
|
|
class MockBtMessageFactory2 : public MockBtMessageFactory {
|
|
public:
|
|
virtual SharedHandle<BtMessage>
|
|
createRejectMessage(int32_t index,
|
|
int32_t begin,
|
|
int32_t length) {
|
|
SharedHandle<MockBtMessage2> msg = new MockBtMessage2(index, begin, length);
|
|
return msg;
|
|
}
|
|
};
|
|
|
|
SharedHandle<MockBtMessageDispatcher> btMessageDispatcher;
|
|
SharedHandle<Peer> peer;
|
|
SharedHandle<BtPieceMessage> msg;
|
|
|
|
void setUp() {
|
|
BtRegistry::unregisterAll();
|
|
|
|
SharedHandle<MockBtContext> btContext;
|
|
btContext->setInfoHash((const unsigned char*)"12345678901234567890");
|
|
btContext->setPieceLength(16*1024);
|
|
btContext->setTotalLength(256*1024);
|
|
|
|
peer = new Peer("host", 6969);
|
|
peer->allocateSessionResource(btContext->getPieceLength(),
|
|
btContext->getTotalLength());
|
|
BtRegistry::registerPeerObjectCluster(btContext->getInfoHashAsString(),
|
|
new PeerObjectCluster());
|
|
PEER_OBJECT_CLUSTER(btContext)->registerHandle(peer->getID(), new PeerObject());
|
|
btMessageDispatcher = new MockBtMessageDispatcher();
|
|
PEER_OBJECT(btContext, peer)->btMessageDispatcher = btMessageDispatcher;
|
|
PEER_OBJECT(btContext, peer)->btMessageFactory = new MockBtMessageFactory2();
|
|
|
|
msg = new BtPieceMessage();
|
|
msg->setIndex(1);
|
|
msg->setBegin(1024);
|
|
msg->setBlockLength(16*1024);
|
|
msg->setBtContext(btContext);
|
|
msg->setPeer(peer);
|
|
msg->setBtMessageDispatcher(btMessageDispatcher);
|
|
msg->setBtMessageFactory(BT_MESSAGE_FACTORY(btContext, peer));
|
|
}
|
|
};
|
|
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(BtPieceMessageTest);
|
|
|
|
void BtPieceMessageTest::testCreate() {
|
|
unsigned char msg[13+2];
|
|
unsigned char data[2];
|
|
memset(data, 0xff, sizeof(data));
|
|
PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 11, 7);
|
|
PeerMessageUtil::setIntParam(&msg[5], 12345);
|
|
PeerMessageUtil::setIntParam(&msg[9], 256);
|
|
memcpy(&msg[13], data, sizeof(data));
|
|
SharedHandle<BtPieceMessage> pm = BtPieceMessage::create(&msg[4], 11);
|
|
CPPUNIT_ASSERT_EQUAL((int8_t)7, pm->getId());
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)12345, pm->getIndex());
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)256, pm->getBegin());
|
|
CPPUNIT_ASSERT(memcmp(data, pm->getBlock(), sizeof(data)) == 0);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)2, pm->getBlockLength());
|
|
|
|
// case: payload size is wrong
|
|
try {
|
|
unsigned char msg[13];
|
|
PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 9, 7);
|
|
BtPieceMessage::create(&msg[4], 9);
|
|
CPPUNIT_FAIL("exception must be thrown.");
|
|
} catch(...) {
|
|
}
|
|
// case: id is wrong
|
|
try {
|
|
unsigned char msg[13+2];
|
|
PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 11, 8);
|
|
BtPieceMessage::create(&msg[4], 11);
|
|
CPPUNIT_FAIL("exception must be thrown.");
|
|
} catch(...) {
|
|
}
|
|
}
|
|
|
|
void BtPieceMessageTest::testGetMessageHeader() {
|
|
BtPieceMessage msg;
|
|
msg.setIndex(12345);
|
|
msg.setBegin(256);
|
|
msg.setBlockLength(1024);
|
|
unsigned char data[13];
|
|
PeerMessageUtil::createPeerMessageString(data, sizeof(data), 9+1024, 7);
|
|
PeerMessageUtil::setIntParam(&data[5], 12345);
|
|
PeerMessageUtil::setIntParam(&data[9], 256);
|
|
CPPUNIT_ASSERT(memcmp(msg.getMessageHeader(), data, 13) == 0);
|
|
}
|
|
|
|
void BtPieceMessageTest::testChokingEvent() {
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isInAmAllowedIndexSet(1));
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtChokingEvent());
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, btMessageDispatcher->messageQueue.size());
|
|
}
|
|
|
|
void BtPieceMessageTest::testChokingEvent_allowedFastEnabled() {
|
|
peer->setFastExtensionEnabled(true);
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isInAmAllowedIndexSet(1));
|
|
CPPUNIT_ASSERT(peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtChokingEvent());
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)1, btMessageDispatcher->messageQueue.size());
|
|
MockBtMessage2* rej = (MockBtMessage2*)btMessageDispatcher->messageQueue.front().get();
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1, rej->index);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1024, rej->begin);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)16*1024, rej->length);
|
|
}
|
|
|
|
void BtPieceMessageTest::testChokingEvent_inAmAllowedIndexSet() {
|
|
peer->setFastExtensionEnabled(true);
|
|
peer->addAmAllowedIndex(1);
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(peer->isInAmAllowedIndexSet(1));
|
|
CPPUNIT_ASSERT(peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtChokingEvent());
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, btMessageDispatcher->messageQueue.size());
|
|
}
|
|
|
|
void BtPieceMessageTest::testChokingEvent_invalidate() {
|
|
msg->setInvalidate(true);
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isInAmAllowedIndexSet(1));
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtChokingEvent());
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, btMessageDispatcher->messageQueue.size());
|
|
}
|
|
|
|
void BtPieceMessageTest::testChokingEvent_sendingInProgress() {
|
|
msg->setSendingInProgress(true);
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isInAmAllowedIndexSet(1));
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtChokingEvent());
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, btMessageDispatcher->messageQueue.size());
|
|
}
|
|
|
|
void BtPieceMessageTest::testCancelSendingPieceEvent() {
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 1024, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
}
|
|
|
|
void BtPieceMessageTest::testCancelSendingPieceEvent_noMatch() {
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(0, 1024, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 0, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 1024, 0));
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
}
|
|
|
|
void BtPieceMessageTest::testCancelSendingPieceEvent_allowedFastEnabled() {
|
|
peer->setFastExtensionEnabled(true);
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 1024, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)1, btMessageDispatcher->messageQueue.size());
|
|
MockBtMessage2* rej = (MockBtMessage2*)btMessageDispatcher->messageQueue.front().get();
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1, rej->index);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1024, rej->begin);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)16*1024, rej->length);
|
|
}
|
|
|
|
void BtPieceMessageTest::testCancelSendingPieceEvent_invalidate() {
|
|
msg->setInvalidate(true);
|
|
peer->setFastExtensionEnabled(true);
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT(!msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 1024, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(msg->isInvalidate());
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, btMessageDispatcher->messageQueue.size());
|
|
}
|
|
|
|
void BtPieceMessageTest::testCancelSendingPieceEvent_sendingInProgress() {
|
|
msg->setSendingInProgress(true);
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
CPPUNIT_ASSERT(msg->isSendingInProgress());
|
|
CPPUNIT_ASSERT(!peer->isFastExtensionEnabled());
|
|
|
|
msg->handleEvent(new BtCancelSendingPieceEvent(1, 1024, 16*1024));
|
|
|
|
CPPUNIT_ASSERT(!msg->isInvalidate());
|
|
}
|
|
|
|
void BtPieceMessageTest::testToString() {
|
|
CPPUNIT_ASSERT_EQUAL(std::string("piece index=1, begin=1024, length=16384"),
|
|
msg->toString());
|
|
}
|
|
|
|
} // namespace aria2
|