#include "SegmentMan.h" #include #include "DownloadContext.h" #include "UnknownLengthPieceStorage.h" #include "DefaultPieceStorage.h" #include "Segment.h" #include "Option.h" #include "PieceSelector.h" namespace aria2 { class SegmentManTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(SegmentManTest); CPPUNIT_TEST(testNullBitfield); CPPUNIT_TEST(testCompleteSegment); CPPUNIT_TEST(testGetSegment_sameFileEntry); CPPUNIT_TEST(testRegisterPeerStat); CPPUNIT_TEST_SUITE_END(); private: public: void setUp() { } void testNullBitfield(); void testCompleteSegment(); void testGetPeerStat(); void testGetSegment_sameFileEntry(); void testRegisterPeerStat(); }; CPPUNIT_TEST_SUITE_REGISTRATION( SegmentManTest ); void SegmentManTest::testNullBitfield() { Option op; SharedHandle dctx (new DownloadContext(0, 0, "aria2.tar.bz2")); SharedHandle ps (new UnknownLengthPieceStorage(dctx, &op)); SegmentMan segmentMan(&op, dctx, ps); SharedHandle segment = segmentMan.getSegment(1); CPPUNIT_ASSERT(!segment.isNull()); CPPUNIT_ASSERT_EQUAL((size_t)0, segment->getIndex()); CPPUNIT_ASSERT_EQUAL((size_t)0, segment->getLength()); CPPUNIT_ASSERT_EQUAL((size_t)0, segment->getSegmentLength()); CPPUNIT_ASSERT_EQUAL((size_t)0, segment->getWrittenLength()); SharedHandle segment2 = segmentMan.getSegment(2); CPPUNIT_ASSERT(segment2.isNull()); segmentMan.cancelSegment(1); CPPUNIT_ASSERT(!segmentMan.getSegment(2).isNull()); } void SegmentManTest::testCompleteSegment() { Option op; size_t pieceLength = 1024*1024; uint64_t totalLength = 64*1024*1024; SharedHandle dctx (new DownloadContext(pieceLength, totalLength, "aria2.tar.bz2")); SharedHandle ps(new DefaultPieceStorage(dctx, &op)); SegmentMan segmentMan(&op, dctx, ps); CPPUNIT_ASSERT(!segmentMan.getSegment(1, 0).isNull()); SharedHandle seg = segmentMan.getSegment(1, 1); CPPUNIT_ASSERT(!seg.isNull()); CPPUNIT_ASSERT(!segmentMan.getSegment(1, 2).isNull()); seg->updateWrittenLength(pieceLength); segmentMan.completeSegment(1, seg); std::deque > segments; segmentMan.getInFlightSegment(segments, 1); CPPUNIT_ASSERT_EQUAL((size_t)2, segments.size()); CPPUNIT_ASSERT_EQUAL((size_t)0, segments[0]->getIndex()); CPPUNIT_ASSERT_EQUAL((size_t)2, segments[1]->getIndex()); } void SegmentManTest::testGetSegment_sameFileEntry() { Option op; SharedHandle dctx(new DownloadContext()); dctx->setPieceLength(2); SharedHandle fileEntries[] = { SharedHandle(new FileEntry("file1", 3, 0)), SharedHandle(new FileEntry("file2", 6, 3)), SharedHandle(new FileEntry("file3", 1, 9)) }; dctx->setFileEntries(&fileEntries[0], &fileEntries[3]); SharedHandle ps(new DefaultPieceStorage(dctx, &op)); SegmentMan segman(&op, dctx, ps); std::deque > segments; segman.getSegment(segments, 1, fileEntries[1], 4); // See 3 segments are returned, not 4 because the part of file1 is // not filled in segment#1 CPPUNIT_ASSERT_EQUAL((size_t)3, segments.size()); SharedHandle segmentNo1 = segman.getSegment(2, 1); // Fill the part of file1 in segment#1 segmentNo1->updateWrittenLength(1); segman.cancelSegment(2); segman.cancelSegment(1); segments.clear(); segman.getSegment(segments, 1, fileEntries[1], 4); CPPUNIT_ASSERT_EQUAL((size_t)4, segments.size()); segman.cancelSegment(1); SharedHandle segmentNo4 = segman.getSegment(1, 4); // Fill the part of file2 in segment#4 segmentNo4->updateWrittenLength(1); segman.cancelSegment(1); segments.clear(); segman.getSegment(segments, 1, fileEntries[1], 4); // segment#4 is not returned because the part of file2 is filled. CPPUNIT_ASSERT_EQUAL((size_t)3, segments.size()); } void SegmentManTest::testRegisterPeerStat() { Option op; SharedHandle dctx(new DownloadContext()); SharedHandle ps(new DefaultPieceStorage(dctx, &op)); SegmentMan segman(&op, dctx, ps); SharedHandle p1(new PeerStat(0, "host1", "http")); segman.registerPeerStat(p1); CPPUNIT_ASSERT_EQUAL((size_t)1, segman.getPeerStats().size()); SharedHandle p2(new PeerStat(0, "host2", "http")); segman.registerPeerStat(p2); CPPUNIT_ASSERT_EQUAL((size_t)1, segman.getPeerStats().size()); p2->downloadStart(); segman.registerPeerStat(p1); CPPUNIT_ASSERT_EQUAL((size_t)2, segman.getPeerStats().size()); } } // namespace aria2