diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/DefaultPieceStorageTest.cc | 110 | ||||
| -rw-r--r-- | test/Makefile.am | 3 | ||||
| -rw-r--r-- | test/Makefile.in | 34 | ||||
| -rw-r--r-- | test/PieceTest.cc | 106 |
4 files changed, 236 insertions, 17 deletions
diff --git a/test/DefaultPieceStorageTest.cc b/test/DefaultPieceStorageTest.cc index 237fd2b1..0a529788 100644 --- a/test/DefaultPieceStorageTest.cc +++ b/test/DefaultPieceStorageTest.cc @@ -7,6 +7,7 @@ #include "Piece.h" #include "Peer.h" #include "Option.h" +#include "MockBtContext.h" #include <cppunit/extensions/HelperMacros.h> using namespace std; @@ -22,6 +23,8 @@ class DefaultPieceStorageTest:public CppUnit::TestFixture { CPPUNIT_TEST(testGetPiece); CPPUNIT_TEST(testGetPieceInUsedPieces); CPPUNIT_TEST(testGetPieceCompletedPiece); + CPPUNIT_TEST(testGetMissingPiece_fileEntry); + CPPUNIT_TEST(testCancelPiece); CPPUNIT_TEST_SUITE_END(); private: BtContextHandle btContext; @@ -43,6 +46,12 @@ public: option = new Option(); } + void tearDown() + { + delete option; + option = 0; + } + void testGetTotalLength(); void testGetMissingPiece(); void testGetMissingFastPiece(); @@ -51,6 +60,8 @@ public: void testGetPiece(); void testGetPieceInUsedPieces(); void testGetPieceCompletedPiece(); + void testGetMissingPiece_fileEntry(); + void testCancelPiece(); }; @@ -153,3 +164,102 @@ void DefaultPieceStorageTest::testGetPieceCompletedPiece() { CPPUNIT_ASSERT_EQUAL((int32_t)128, pieceGot->getLength()); CPPUNIT_ASSERT_EQUAL(true, pieceGot->pieceComplete()); } + +void DefaultPieceStorageTest::testGetMissingPiece_fileEntry() +{ + // - 32KB + // +--------+ + // |11111222| + int32_t pieceLength = 256*1024; + int64_t totalLength = 1*pieceLength; + int32_t blockLength = 16*1024; + Strings uris1; + uris1.push_back("http://localhost/src/file1.txt"); + Strings uris2; + uris2.push_back("http://localhost/src/file2.txt"); + FileEntryHandle file1 = new FileEntry("src/file1.txt", 150*1024, 0/*, uris1*/); + FileEntryHandle file2 = new FileEntry("src/file2.txt", 106*1024, file1->getLength() /*, uris2*/); + + MockBtContextHandle dctx = new MockBtContext(); + dctx->setPieceLength(pieceLength); + dctx->setTotalLength(totalLength); + dctx->addFileEntry(file1); + dctx->addFileEntry(file2); + + DefaultPieceStorageHandle ps = new DefaultPieceStorage(dctx, option); + + PieceHandle p = ps->getMissingPiece(file1); + CPPUNIT_ASSERT(!p.isNull()); + CPPUNIT_ASSERT_EQUAL((int32_t)0, p->getIndex()); + + for(int32_t i = 0; i < 9; ++i) { + p->completeBlock(i); + } + PieceHandle subPiece = new Piece(9, blockLength, 1); + p->addSubPiece(subPiece); + + ps->cancelPiece(p); + + // Piece index = 0 should be retrieved again because the part of file1 is + // not complete + PieceHandle p2 = ps->getMissingPiece(file1); + CPPUNIT_ASSERT(!p2.isNull()); + CPPUNIT_ASSERT_EQUAL((int32_t)0, p2->getIndex()); + + // Make the part of file1 complete + for(int32_t i = 0; i < 6*1024; ++i) { + p2->getSubPiece(9)->completeBlock(i); + } + ps->cancelPiece(p2); + + // Null Piece should be retrieved + CPPUNIT_ASSERT(ps->getMissingPiece(file1).isNull()); + + // Next, I retrive the piece giving file2 + PieceHandle p3 = ps->getMissingPiece(file2); + CPPUNIT_ASSERT(!p3.isNull()); + CPPUNIT_ASSERT_EQUAL((int32_t)0, p3->getIndex()); + + // Make the part of file2 complete + for(int32_t i = 6*1024; i < 16*1024; ++i) { + p3->getSubPiece(9)->completeBlock(i); + } + for(int32_t i = 10; i < 16; ++i) { + p3->completeBlock(i); + } + ps->cancelPiece(p3); + + // Null Piece should be retrieved + CPPUNIT_ASSERT(ps->getMissingPiece(file2).isNull()); +} + +void DefaultPieceStorageTest::testCancelPiece() +{ + int32_t pieceLength = 256*1024; + int64_t totalLength = 32*pieceLength; // <-- make the number of piece greater than END_GAME_PIECE_NUM + int32_t blockLength = 16*1024; + Strings uris1; + uris1.push_back("http://localhost/src/file1.txt"); + FileEntryHandle file1 = new FileEntry("src/file1.txt", totalLength, 0 /*, uris1*/); + + MockBtContextHandle dctx = new MockBtContext(); + dctx->setPieceLength(pieceLength); + dctx->setTotalLength(totalLength); + dctx->addFileEntry(file1); + + DefaultPieceStorageHandle ps = new DefaultPieceStorage(dctx, option); + + PieceHandle p = ps->getMissingPiece(file1); + + PieceHandle subPiece = new Piece(0, blockLength, 1); + subPiece->completeBlock(0); + p->addSubPiece(subPiece); + + ps->cancelPiece(p); + + // See the sub piece is also hibernated... + PieceHandle p2 = ps->getMissingPiece(file1); + + CPPUNIT_ASSERT(!p2->getSubPiece(0).isNull()); + +} diff --git a/test/Makefile.am b/test/Makefile.am index 547f46c0..e99d16d4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,6 +1,8 @@ TESTS = aria2c check_PROGRAMS = $(TESTS) aria2c_SOURCES = AllTest.cc\ + PieceTest.cc\ + DefaultPieceStorageTest.cc\ SegmentTest.cc\ GrowSegmentTest.cc\ SingleFileAllocationIteratorTest.cc\ @@ -67,7 +69,6 @@ aria2c_SOURCES += BtAllowedFastMessageTest.cc\ DefaultBtContextTest.cc\ DefaultBtMessageDispatcherTest.cc\ DefaultBtRequestFactoryTest.cc\ - DefaultPieceStorageTest.cc\ MockBtMessage.h\ MockBtMessageDispatcher.h\ MockBtMessageFactory.h\ diff --git a/test/Makefile.in b/test/Makefile.in index 36855d64..047dafae 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -61,7 +61,6 @@ check_PROGRAMS = $(am__EXEEXT_1) @ENABLE_BITTORRENT_TRUE@ DefaultBtContextTest.cc\ @ENABLE_BITTORRENT_TRUE@ DefaultBtMessageDispatcherTest.cc\ @ENABLE_BITTORRENT_TRUE@ DefaultBtRequestFactoryTest.cc\ -@ENABLE_BITTORRENT_TRUE@ DefaultPieceStorageTest.cc\ @ENABLE_BITTORRENT_TRUE@ MockBtMessage.h\ @ENABLE_BITTORRENT_TRUE@ MockBtMessageDispatcher.h\ @ENABLE_BITTORRENT_TRUE@ MockBtMessageFactory.h\ @@ -112,7 +111,8 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__EXEEXT_1 = aria2c$(EXEEXT) -am__aria2c_SOURCES_DIST = AllTest.cc SegmentTest.cc GrowSegmentTest.cc \ +am__aria2c_SOURCES_DIST = AllTest.cc PieceTest.cc \ + DefaultPieceStorageTest.cc SegmentTest.cc GrowSegmentTest.cc \ SingleFileAllocationIteratorTest.cc \ DefaultBtProgressInfoFileTest.cc \ SingleFileDownloadContextTest.cc RequestGroupTest.cc \ @@ -140,17 +140,17 @@ am__aria2c_SOURCES_DIST = AllTest.cc SegmentTest.cc GrowSegmentTest.cc \ BtRequestMessageTest.cc BtSuggestPieceMessageTest.cc \ BtUnchokeMessageTest.cc DefaultBtAnnounceTest.cc \ DefaultBtContextTest.cc DefaultBtMessageDispatcherTest.cc \ - DefaultBtRequestFactoryTest.cc DefaultPieceStorageTest.cc \ - MockBtMessage.h MockBtMessageDispatcher.h \ - MockBtMessageFactory.h ShaVisitorTest.cc \ - DefaultPeerListProcessorTest.cc AnnounceListTest.cc \ - DefaultPeerStorageTest.cc MockPeerStorage.h DataTest.cc \ - DictionaryTest.cc ListTest.cc MetaFileUtilTest.cc \ - MultiDiskAdaptorTest.cc ByteArrayDiskWriterTest.cc PeerTest.cc \ - PeerMessageUtilTest.cc ShareRatioSeedCriteriaTest.cc \ - BtRegistryTest.cc MultiFileAllocationIteratorTest.cc \ - BtDependencyTest.cc BtPostDownloadHandlerTest.cc \ - TimeSeedCriteriaTest.cc MetalinkerTest.cc MetalinkEntryTest.cc \ + DefaultBtRequestFactoryTest.cc MockBtMessage.h \ + MockBtMessageDispatcher.h MockBtMessageFactory.h \ + ShaVisitorTest.cc DefaultPeerListProcessorTest.cc \ + AnnounceListTest.cc DefaultPeerStorageTest.cc \ + MockPeerStorage.h DataTest.cc DictionaryTest.cc ListTest.cc \ + MetaFileUtilTest.cc MultiDiskAdaptorTest.cc \ + ByteArrayDiskWriterTest.cc PeerTest.cc PeerMessageUtilTest.cc \ + ShareRatioSeedCriteriaTest.cc BtRegistryTest.cc \ + MultiFileAllocationIteratorTest.cc BtDependencyTest.cc \ + BtPostDownloadHandlerTest.cc TimeSeedCriteriaTest.cc \ + MetalinkerTest.cc MetalinkEntryTest.cc \ Xml2MetalinkProcessorTest.cc Metalink2RequestGroupTest.cc \ MetalinkPostDownloadHandlerTest.cc @ENABLE_MESSAGE_DIGEST_TRUE@am__objects_1 = \ @@ -178,7 +178,6 @@ am__aria2c_SOURCES_DIST = AllTest.cc SegmentTest.cc GrowSegmentTest.cc \ @ENABLE_BITTORRENT_TRUE@ DefaultBtContextTest.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ DefaultBtMessageDispatcherTest.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ DefaultBtRequestFactoryTest.$(OBJEXT) \ -@ENABLE_BITTORRENT_TRUE@ DefaultPieceStorageTest.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ ShaVisitorTest.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ DefaultPeerListProcessorTest.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ AnnounceListTest.$(OBJEXT) \ @@ -202,7 +201,8 @@ am__aria2c_SOURCES_DIST = AllTest.cc SegmentTest.cc GrowSegmentTest.cc \ @ENABLE_METALINK_TRUE@ Xml2MetalinkProcessorTest.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ Metalink2RequestGroupTest.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandlerTest.$(OBJEXT) -am_aria2c_OBJECTS = AllTest.$(OBJEXT) SegmentTest.$(OBJEXT) \ +am_aria2c_OBJECTS = AllTest.$(OBJEXT) PieceTest.$(OBJEXT) \ + DefaultPieceStorageTest.$(OBJEXT) SegmentTest.$(OBJEXT) \ GrowSegmentTest.$(OBJEXT) \ SingleFileAllocationIteratorTest.$(OBJEXT) \ DefaultBtProgressInfoFileTest.$(OBJEXT) \ @@ -412,7 +412,8 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ TESTS = aria2c -aria2c_SOURCES = AllTest.cc SegmentTest.cc GrowSegmentTest.cc \ +aria2c_SOURCES = AllTest.cc PieceTest.cc DefaultPieceStorageTest.cc \ + SegmentTest.cc GrowSegmentTest.cc \ SingleFileAllocationIteratorTest.cc \ DefaultBtProgressInfoFileTest.cc \ SingleFileDownloadContextTest.cc RequestGroupTest.cc \ @@ -561,6 +562,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParameterizedStringParserTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerMessageUtilTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PieceTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestFactoryTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupManTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupTest.Po@am__quote@ diff --git a/test/PieceTest.cc b/test/PieceTest.cc new file mode 100644 index 00000000..0c554b8d --- /dev/null +++ b/test/PieceTest.cc @@ -0,0 +1,106 @@ +#include "Piece.h" +#include <string> +#include <cppunit/extensions/HelperMacros.h> + +using namespace std; + +class PieceTest:public CppUnit::TestFixture { + + CPPUNIT_TEST_SUITE(PieceTest); + CPPUNIT_TEST(testCompleteBlock); + CPPUNIT_TEST(testIsRangeComplete); + CPPUNIT_TEST(testIsRangeComplete_subPiece); + CPPUNIT_TEST(testGetCompletedLength); + CPPUNIT_TEST_SUITE_END(); +private: + +public: + void setUp() {} + + void testCompleteBlock(); + void testIsRangeComplete(); + void testIsRangeComplete_subPiece(); + void testGetCompletedLength(); +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION( PieceTest ); + +void PieceTest::testCompleteBlock() +{ + int32_t blockLength = 32*1024; + Piece p(0, blockLength*10, blockLength); + + // 5 is a block index inside the Piece p. + PieceHandle subPiece = new Piece(5, blockLength, 1); + p.addSubPiece(subPiece); + + CPPUNIT_ASSERT(!p.getSubPiece(5).isNull()); + + // When block is complete, then its associated sub piece must be deleted. + p.completeBlock(5); + + CPPUNIT_ASSERT(p.getSubPiece(5).isNull()); +} + +void PieceTest::testIsRangeComplete() +{ + int32_t blockLength = 16*1024; + Piece p(0, blockLength*10, blockLength); + + CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 16*1024)); + + p.completeBlock(0); + CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 16*1024)); + CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 8*1024)); + + p.completeBlock(1); + CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 16*1024)); +} + +void PieceTest::testIsRangeComplete_subPiece() +{ + int32_t blockLength = 16*1024; + Piece p(0, blockLength*10, blockLength); + + CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); + + PieceHandle startSubPiece = new Piece(0, blockLength, 1); + p.addSubPiece(startSubPiece); + + PieceHandle endSubPiece = new Piece(2, blockLength, 1); + p.addSubPiece(endSubPiece); + + p.completeBlock(1); + + CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); + + for(int32_t i = 8*1024; i < blockLength; ++i) { + startSubPiece->completeBlock(i); + } + + CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); + + for(int32_t i = 0; i < 8*1024; ++i) { + endSubPiece->completeBlock(i); + } + CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 32*1024)); +} + +void PieceTest::testGetCompletedLength() +{ + int32_t blockLength = 16*1024; + Piece p(0, blockLength*10, blockLength); + + PieceHandle subPiece = new Piece(0, blockLength, 1); + for(int32_t i = 0; i < blockLength-1; ++i) { + subPiece->completeBlock(i); + } + p.addSubPiece(subPiece); + + p.completeBlock(1); + p.completeBlock(2); + p.completeBlock(9); + + CPPUNIT_ASSERT_EQUAL(blockLength*3+blockLength-1, p.getCompletedLength()); +} |
