mirror of
https://github.com/aria2/aria2.git
synced 2025-04-05 05:27:38 +03: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
230 lines
6.1 KiB
C++
230 lines
6.1 KiB
C++
#include "DefaultPeerStorage.h"
|
|
#include "DefaultBtContext.h"
|
|
#include "Util.h"
|
|
#include "Exception.h"
|
|
#include "Peer.h"
|
|
#include "Option.h"
|
|
#include "BtRuntime.h"
|
|
#include <algorithm>
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
namespace aria2 {
|
|
|
|
class DefaultPeerStorageTest:public CppUnit::TestFixture {
|
|
|
|
CPPUNIT_TEST_SUITE(DefaultPeerStorageTest);
|
|
CPPUNIT_TEST(testCountPeer);
|
|
CPPUNIT_TEST(testDeleteUnusedPeer);
|
|
CPPUNIT_TEST(testAddPeer);
|
|
CPPUNIT_TEST(testGetUnusedPeer);
|
|
CPPUNIT_TEST(testIsPeerAvailable);
|
|
CPPUNIT_TEST(testActivatePeer);
|
|
CPPUNIT_TEST(testCalculateStat);
|
|
CPPUNIT_TEST(testReturnPeer);
|
|
CPPUNIT_TEST(testOnErasingPeer);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
private:
|
|
SharedHandle<BtContext> btContext;
|
|
SharedHandle<BtRuntime> btRuntime;
|
|
Option* option;
|
|
public:
|
|
DefaultPeerStorageTest():btContext(0) {}
|
|
|
|
void setUp() {
|
|
btContext = new DefaultBtContext();
|
|
btContext->load("test.torrent");
|
|
option = new Option();
|
|
btRuntime = SharedHandle<BtRuntime>(new BtRuntime());
|
|
}
|
|
|
|
void testCountPeer();
|
|
void testDeleteUnusedPeer();
|
|
void testAddPeer();
|
|
void testGetUnusedPeer();
|
|
void testIsPeerAvailable();
|
|
void testActivatePeer();
|
|
void testCalculateStat();
|
|
void testReturnPeer();
|
|
void testOnErasingPeer();
|
|
};
|
|
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(DefaultPeerStorageTest);
|
|
|
|
void DefaultPeerStorageTest::testCountPeer() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)0,
|
|
ps.countPeer());
|
|
|
|
SharedHandle<Peer> peer(new Peer("192.168.0.1", 6889));
|
|
|
|
ps.addPeer(peer);
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1,
|
|
ps.countPeer());
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testDeleteUnusedPeer() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
|
|
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
|
|
SharedHandle<Peer> peer3(new Peer("192.168.0.3", 6889));
|
|
|
|
ps.addPeer(peer1);
|
|
ps.addPeer(peer2);
|
|
ps.addPeer(peer3);
|
|
|
|
ps.deleteUnusedPeer(2);
|
|
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1, ps.countPeer());
|
|
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.3"),
|
|
ps.getPeer("192.168.0.3", 6889)->ipaddr);
|
|
|
|
ps.addPeer(peer1);
|
|
ps.addPeer(peer2);
|
|
|
|
peer2->usedBy(1);
|
|
|
|
ps.deleteUnusedPeer(3);
|
|
|
|
// peer2 has been in use, so it did't deleted.
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)1, ps.countPeer());
|
|
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"),
|
|
ps.getPeer("192.168.0.2", 6889)->ipaddr);
|
|
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testAddPeer() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
|
|
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
|
|
SharedHandle<Peer> peer3(new Peer("192.168.0.3", 6889));
|
|
|
|
ps.addPeer(peer1);
|
|
ps.addPeer(peer2);
|
|
ps.addPeer(peer3);
|
|
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)3, ps.countPeer());
|
|
|
|
// this returns false, because peer1 is already in the container
|
|
CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer1));
|
|
// the number of peers doesn't change.
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)3, ps.countPeer());
|
|
|
|
ps.setMaxPeerListSize(3);
|
|
|
|
SharedHandle<Peer> peer4(new Peer("192.168.0.4", 6889));
|
|
|
|
peer1->usedBy(1);
|
|
CPPUNIT_ASSERT(ps.addPeer(peer4));
|
|
// peer2 was deleted. While peer1 is oldest, its cuid is not 0.
|
|
CPPUNIT_ASSERT_EQUAL((int32_t)3, ps.countPeer());
|
|
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2) == ps.getPeers().end());
|
|
|
|
SharedHandle<Peer> peer5(new Peer("192.168.0.4", 0));
|
|
|
|
peer5->port = 6889;
|
|
|
|
// this returns false because the peer which has same ip and port has already added
|
|
CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer5));
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testGetUnusedPeer() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
ps.setBtRuntime(btRuntime);
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
|
|
|
|
ps.addPeer(peer1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"),
|
|
ps.getUnusedPeer()->ipaddr);
|
|
|
|
peer1->usedBy(1);
|
|
|
|
CPPUNIT_ASSERT(ps.getUnusedPeer().isNull());
|
|
|
|
peer1->resetStatus();
|
|
peer1->startBadCondition();
|
|
|
|
CPPUNIT_ASSERT(ps.getUnusedPeer().isNull());
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testIsPeerAvailable() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
ps.setBtRuntime(btRuntime);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, ps.isPeerAvailable());
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
|
|
|
|
ps.addPeer(peer1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, ps.isPeerAvailable());
|
|
|
|
peer1->usedBy(1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, ps.isPeerAvailable());
|
|
|
|
peer1->resetStatus();
|
|
|
|
peer1->startBadCondition();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, ps.isPeerAvailable());
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testActivatePeer() {
|
|
DefaultPeerStorage ps(btContext, option);
|
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, ps.getActivePeers().size());
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
|
|
|
|
ps.addPeer(peer1);
|
|
|
|
std::deque<SharedHandle<Peer> > activePeer = ps.getActivePeers();
|
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, ps.getActivePeers().size());
|
|
|
|
peer1->allocateSessionResource(btContext->getPieceLength(),
|
|
btContext->getTotalLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getActivePeers().size());
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testCalculateStat() {
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testReturnPeer()
|
|
{
|
|
DefaultPeerStorage ps(btContext, option);
|
|
|
|
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 0));
|
|
peer1->allocateSessionResource(btContext->getPieceLength(),
|
|
btContext->getTotalLength());
|
|
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
|
|
peer2->allocateSessionResource(btContext->getPieceLength(),
|
|
btContext->getTotalLength());
|
|
SharedHandle<Peer> peer3(new Peer("192.168.0.1", 6889));
|
|
ps.addPeer(peer1);
|
|
ps.addPeer(peer2);
|
|
ps.addPeer(peer3);
|
|
|
|
ps.returnPeer(peer2);
|
|
// peer2 is moved to the end of container
|
|
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"),
|
|
ps.getPeers().back()->ipaddr);
|
|
|
|
ps.returnPeer(peer1); // peer1 is removed from the container
|
|
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
|
|
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
|
|
}
|
|
|
|
void DefaultPeerStorageTest::testOnErasingPeer()
|
|
{
|
|
// test this
|
|
}
|
|
|
|
} // namespace aria2
|