summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/DefaultPieceStorageTest.cc110
-rw-r--r--test/Makefile.am3
-rw-r--r--test/Makefile.in34
-rw-r--r--test/PieceTest.cc106
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());
+}