summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-09-06 14:29:36 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-09-06 14:29:36 +0000
commitefbfe4c006cfb6e0bf3ee4ed57d0657c0cd85c19 (patch)
treea72723a125c34220772259f051673ff88598bded /test
parent552c753dbba55005964ad60698d803a44dac6391 (diff)
2010-09-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Data from remote server in HTTP/FTP download are now written to the disk(or memory) through StreamFilter. Decoding chunked and gziped streams are done cascading StreamFilter. Removed inefficient 1byte read code. * src/ChunkedDecodingStreamFilter.cc * src/ChunkedDecodingStreamFilter.h * src/DownloadCommand.cc * src/DownloadCommand.h * src/GZipDecodingStreamFilter.cc * src/GZipDecodingStreamFilter.h * src/HttpConnection.cc * src/HttpDownloadCommand.cc * src/HttpResponse.cc * src/HttpResponse.h * src/HttpResponseCommand.cc * src/HttpResponseCommand.h * src/HttpSkipResponseCommand.cc * src/HttpSkipResponseCommand.h * src/Makefile.am * src/NullSinkStreamFilter.cc * src/NullSinkStreamFilter.h * src/RequestGroup.cc * src/SinkStreamFilter.cc * src/SinkStreamFilter.h * src/StreamFilter.cc * src/StreamFilter.h * test/ChunkedDecodingStreamFilterTest.cc * test/GZipDecodingStreamFilterTest.cc * test/HttpResponseTest.cc * test/Makefile.am * test/MockSegment.h
Diffstat (limited to 'test')
-rw-r--r--test/ChunkedDecodingStreamFilterTest.cc240
-rw-r--r--test/GZipDecodingStreamFilterTest.cc81
-rw-r--r--test/HttpResponseTest.cc41
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in16
-rw-r--r--test/MockSegment.h80
6 files changed, 439 insertions, 23 deletions
diff --git a/test/ChunkedDecodingStreamFilterTest.cc b/test/ChunkedDecodingStreamFilterTest.cc
new file mode 100644
index 00000000..8dea7bd1
--- /dev/null
+++ b/test/ChunkedDecodingStreamFilterTest.cc
@@ -0,0 +1,240 @@
+#include "ChunkedDecodingStreamFilter.h"
+
+#include <cstdlib>
+#include <iostream>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "DlAbortEx.h"
+#include "Segment.h"
+#include "ByteArrayDiskWriter.h"
+#include "SinkStreamFilter.h"
+#include "MockSegment.h"
+
+namespace aria2 {
+
+class ChunkedDecodingStreamFilterTest:public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE(ChunkedDecodingStreamFilterTest);
+ CPPUNIT_TEST(testTransform);
+ CPPUNIT_TEST(testTransform_withoutTrailer);
+ CPPUNIT_TEST(testTransform_with2Trailers);
+ CPPUNIT_TEST(testTransform_largeChunkSize);
+ CPPUNIT_TEST(testTransform_tooLargeChunkSize);
+ CPPUNIT_TEST(testTransform_chunkSizeMismatch);
+ CPPUNIT_TEST(testGetName);
+ CPPUNIT_TEST_SUITE_END();
+
+ SharedHandle<ChunkedDecodingStreamFilter> filter_;
+ SharedHandle<SinkStreamFilter> sinkFilter_;
+ SharedHandle<ByteArrayDiskWriter> writer_;
+ SharedHandle<Segment> segment_;
+
+ void clearWriter()
+ {
+ writer_->setString("");
+ }
+public:
+ void setUp()
+ {
+ writer_.reset(new ByteArrayDiskWriter());
+ sinkFilter_.reset(new SinkStreamFilter());
+ filter_.reset(new ChunkedDecodingStreamFilter(sinkFilter_));
+ sinkFilter_->init();
+ filter_->init();
+ segment_.reset(new MockSegment());
+ }
+
+ void testTransform();
+ void testTransform_withoutTrailer();
+ void testTransform_with2Trailers();
+ void testTransform_largeChunkSize();
+ void testTransform_tooLargeChunkSize();
+ void testTransform_chunkSizeMismatch();
+ void testGetName();
+};
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ChunkedDecodingStreamFilterTest );
+
+void ChunkedDecodingStreamFilterTest::testTransform()
+{
+ try {
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("a\r\n1234567890\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)10, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("1234567890"), writer_->getString());
+ }
+ clearWriter();
+ // Feed extension; see it is ignored.
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>
+ ("3;extensionIgnored\r\n123\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)3, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("123"), writer_->getString());
+ }
+ clearWriter();
+ // Feed 2extensions; see it is ignored.
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>
+ ("3;extension1;extension2;\r\n123\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)3, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("123"), writer_->getString());
+ }
+ clearWriter();
+ // Not all chunk size is available
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("1");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ }
+ clearWriter();
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("0\r\n1234567890123456\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)16, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("1234567890123456"),
+ writer_->getString());
+ }
+ clearWriter();
+ // Not all chunk data is available
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("10\r\n1234567890");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)10, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("1234567890"), writer_->getString());
+ }
+ clearWriter();
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("123456\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)6, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("123456"), writer_->getString());
+ }
+ clearWriter();
+ // no trailing CR LF.
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("10\r\n1234567890123456");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)16, r);
+ CPPUNIT_ASSERT_EQUAL(std::string("1234567890123456"),
+ writer_->getString());
+ }
+ clearWriter();
+ // feed only CR
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("\r");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ }
+ // feed next LF
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ CPPUNIT_ASSERT_EQUAL(std::string(""), writer_->getString());
+ }
+ // feed 0 CR LF.
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("0\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ }
+ // feed trailer
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("trailer\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ }
+ // feed final CRLF
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("\r\n");
+ ssize_t r = filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_ASSERT_EQUAL((ssize_t)0, r);
+ }
+ // input is over
+ CPPUNIT_ASSERT(filter_->finished());
+ } catch(DlAbortEx& e) {
+ CPPUNIT_FAIL(e.stackTrace());
+ }
+}
+
+void ChunkedDecodingStreamFilterTest::testTransform_withoutTrailer()
+{
+ CPPUNIT_ASSERT_EQUAL
+ ((ssize_t)0,
+ filter_->transform
+ (writer_, segment_,
+ reinterpret_cast<const unsigned char*>("0\r\n\r\n"), 5));
+ CPPUNIT_ASSERT(filter_->finished());
+}
+
+void ChunkedDecodingStreamFilterTest::testTransform_with2Trailers()
+{
+ CPPUNIT_ASSERT_EQUAL
+ ((ssize_t)0,
+ filter_->transform
+ (writer_, segment_,
+ reinterpret_cast<const unsigned char*>("0\r\nt1\r\nt2\r\n\r\n"), 13));
+ CPPUNIT_ASSERT(filter_->finished());
+}
+
+void ChunkedDecodingStreamFilterTest::testTransform_largeChunkSize()
+{
+ // chunkSize should be under 2^64-1
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("ffffffffffffffff\r\n");
+ filter_->transform(writer_, segment_, msg.data(), msg.size());
+ }
+}
+
+void ChunkedDecodingStreamFilterTest::testTransform_tooLargeChunkSize()
+{
+ // chunkSize 2^64 causes error
+ {
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("10000000000000000\r\n");
+ try {
+ filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_FAIL("exception must be thrown.");
+ } catch(DlAbortEx& e) {
+ // success
+ }
+ }
+}
+
+void ChunkedDecodingStreamFilterTest::testTransform_chunkSizeMismatch()
+{
+ std::basic_string<unsigned char> msg =
+ reinterpret_cast<const unsigned char*>("3\r\n1234\r\n");
+ try {
+ filter_->transform(writer_, segment_, msg.data(), msg.size());
+ CPPUNIT_FAIL("exception must be thrown.");
+ } catch(DlAbortEx& e) {
+ // success
+ }
+}
+
+void ChunkedDecodingStreamFilterTest::testGetName()
+{
+ CPPUNIT_ASSERT_EQUAL
+ (std::string("ChunkedDecodingStreamFilter"), filter_->getName());
+}
+
+} // namespace aria2
diff --git a/test/GZipDecodingStreamFilterTest.cc b/test/GZipDecodingStreamFilterTest.cc
new file mode 100644
index 00000000..250f410e
--- /dev/null
+++ b/test/GZipDecodingStreamFilterTest.cc
@@ -0,0 +1,81 @@
+#include "GZipDecodingStreamFilter.h"
+
+#include <cassert>
+#include <iostream>
+#include <fstream>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "Exception.h"
+#include "util.h"
+#include "Segment.h"
+#include "ByteArrayDiskWriter.h"
+#include "SinkStreamFilter.h"
+#include "MockSegment.h"
+#ifdef ENABLE_MESSAGE_DIGEST
+# include "MessageDigestHelper.h"
+#endif // ENABLE_MESSAGE_DIGEST
+
+namespace aria2 {
+
+class GZipDecodingStreamFilterTest:public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE(GZipDecodingStreamFilterTest);
+ CPPUNIT_TEST(testTransform);
+ CPPUNIT_TEST_SUITE_END();
+
+ class MockSegment2:public MockSegment {
+ private:
+ off_t positionToWrite_;
+ public:
+ MockSegment2():positionToWrite_(0) {}
+
+ virtual void updateWrittenLength(size_t bytes)
+ {
+ positionToWrite_ += bytes;
+ }
+
+ virtual off_t getPositionToWrite() const
+ {
+ return positionToWrite_;
+ }
+ };
+
+ SharedHandle<GZipDecodingStreamFilter> filter_;
+ SharedHandle<SinkStreamFilter> sinkFilter_;
+ SharedHandle<ByteArrayDiskWriter> writer_;
+ SharedHandle<MockSegment2> segment_;
+public:
+ void setUp()
+ {
+ writer_.reset(new ByteArrayDiskWriter());
+ sinkFilter_.reset(new SinkStreamFilter());
+ filter_.reset(new GZipDecodingStreamFilter(sinkFilter_));
+ sinkFilter_->init();
+ filter_->init();
+ segment_.reset(new MockSegment2());
+ }
+
+ void testTransform();
+};
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION(GZipDecodingStreamFilterTest);
+
+void GZipDecodingStreamFilterTest::testTransform()
+{
+ unsigned char buf[4096];
+ std::ifstream in("gzip_decode_test.gz", std::ios::binary);
+ while(in) {
+ in.read(reinterpret_cast<char*>(buf), sizeof(buf));
+ filter_->transform(writer_, segment_, buf, in.gcount());
+ }
+ CPPUNIT_ASSERT(filter_->finished());
+#ifdef ENABLE_MESSAGE_DIGEST
+ CPPUNIT_ASSERT_EQUAL(std::string("8b577b33c0411b2be9d4fa74c7402d54a8d21f96"),
+ MessageDigestHelper::digestString
+ (MessageDigestContext::SHA1, writer_->getString()));
+#endif // ENABLE_MESSAGE_DIGEST
+}
+
+} // namespace aria2
diff --git a/test/HttpResponseTest.cc b/test/HttpResponseTest.cc
index dd31da09..a530a884 100644
--- a/test/HttpResponseTest.cc
+++ b/test/HttpResponseTest.cc
@@ -12,11 +12,11 @@
#include "HttpRequest.h"
#include "Exception.h"
#include "A2STR.h"
-#include "Decoder.h"
#include "DlRetryEx.h"
#include "CookieStorage.h"
#include "AuthConfigFactory.h"
#include "AuthConfig.h"
+#include "StreamFilter.h"
namespace aria2 {
@@ -36,10 +36,10 @@ class HttpResponseTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testIsRedirect);
CPPUNIT_TEST(testIsTransferEncodingSpecified);
CPPUNIT_TEST(testGetTransferEncoding);
- CPPUNIT_TEST(testGetTransferEncodingDecoder);
+ CPPUNIT_TEST(testGetTransferEncodingStreamFilter);
CPPUNIT_TEST(testIsContentEncodingSpecified);
CPPUNIT_TEST(testGetContentEncoding);
- CPPUNIT_TEST(testGetContentEncodingDecoder);
+ CPPUNIT_TEST(testGetContentEncodingStreamFilter);
CPPUNIT_TEST(testValidateResponse);
CPPUNIT_TEST(testValidateResponse_good_range);
CPPUNIT_TEST(testValidateResponse_bad_range);
@@ -68,10 +68,10 @@ public:
void testIsRedirect();
void testIsTransferEncodingSpecified();
void testGetTransferEncoding();
- void testGetTransferEncodingDecoder();
+ void testGetTransferEncodingStreamFilter();
void testIsContentEncodingSpecified();
void testGetContentEncoding();
- void testGetContentEncodingDecoder();
+ void testGetContentEncodingStreamFilter();
void testValidateResponse();
void testValidateResponse_good_range();
void testValidateResponse_bad_range();
@@ -253,18 +253,18 @@ void HttpResponseTest::testGetTransferEncoding()
httpResponse.getTransferEncoding());
}
-void HttpResponseTest::testGetTransferEncodingDecoder()
+void HttpResponseTest::testGetTransferEncodingStreamFilter()
{
HttpResponse httpResponse;
SharedHandle<HttpHeader> httpHeader(new HttpHeader());
httpResponse.setHttpHeader(httpHeader);
- CPPUNIT_ASSERT(httpResponse.getTransferEncodingDecoder().isNull());
+ CPPUNIT_ASSERT(httpResponse.getTransferEncodingStreamFilter().isNull());
httpHeader->put("Transfer-Encoding", "chunked");
- CPPUNIT_ASSERT(!httpResponse.getTransferEncodingDecoder().isNull());
+ CPPUNIT_ASSERT(!httpResponse.getTransferEncodingStreamFilter().isNull());
}
void HttpResponseTest::testIsContentEncodingSpecified()
@@ -295,37 +295,42 @@ void HttpResponseTest::testGetContentEncoding()
CPPUNIT_ASSERT_EQUAL(std::string("gzip"), httpResponse.getContentEncoding());
}
-void HttpResponseTest::testGetContentEncodingDecoder()
+void HttpResponseTest::testGetContentEncodingStreamFilter()
{
HttpResponse httpResponse;
SharedHandle<HttpHeader> httpHeader(new HttpHeader());
httpResponse.setHttpHeader(httpHeader);
- CPPUNIT_ASSERT(httpResponse.getContentEncodingDecoder().isNull());
+ CPPUNIT_ASSERT(httpResponse.getContentEncodingStreamFilter().isNull());
#ifdef HAVE_LIBZ
httpHeader->put("Content-Encoding", "gzip");
{
- SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
- CPPUNIT_ASSERT(!decoder.isNull());
- CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
+ SharedHandle<StreamFilter> filter =
+ httpResponse.getContentEncodingStreamFilter();
+ CPPUNIT_ASSERT(!filter.isNull());
+ CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
+ filter->getName());
}
httpHeader.reset(new HttpHeader());
httpResponse.setHttpHeader(httpHeader);
httpHeader->put("Content-Encoding", "deflate");
{
- SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
- CPPUNIT_ASSERT(!decoder.isNull());
- CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
+ SharedHandle<StreamFilter> filter =
+ httpResponse.getContentEncodingStreamFilter();
+ CPPUNIT_ASSERT(!filter.isNull());
+ CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
+ filter->getName());
}
#endif // HAVE_LIBZ
httpHeader.reset(new HttpHeader());
httpResponse.setHttpHeader(httpHeader);
httpHeader->put("Content-Encoding", "bzip2");
{
- SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
- CPPUNIT_ASSERT(decoder.isNull());
+ SharedHandle<StreamFilter> filter =
+ httpResponse.getContentEncodingStreamFilter();
+ CPPUNIT_ASSERT(filter.isNull());
}
}
diff --git a/test/Makefile.am b/test/Makefile.am
index 20fc2778..9871cc21 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -72,7 +72,9 @@ aria2c_SOURCES = AllTest.cc\
bitfieldTest.cc\
DownloadContextTest.cc\
SessionSerializerTest.cc\
- ValueBaseTest.cc
+ ValueBaseTest.cc\
+ ChunkedDecodingStreamFilterTest.cc\
+ GZipDecodingStreamFilterTest.cc
if ENABLE_XML_RPC
aria2c_SOURCES += XmlRpcRequestParserControllerTest.cc\
diff --git a/test/Makefile.in b/test/Makefile.in
index c81a278e..c6717271 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -213,6 +213,8 @@ am__aria2c_SOURCES_DIST = AllTest.cc TestUtil.cc TestUtil.h \
InOrderPieceSelector.h LongestSequencePieceSelectorTest.cc \
a2algoTest.cc bitfieldTest.cc DownloadContextTest.cc \
SessionSerializerTest.cc ValueBaseTest.cc \
+ ChunkedDecodingStreamFilterTest.cc \
+ GZipDecodingStreamFilterTest.cc \
XmlRpcRequestParserControllerTest.cc \
XmlRpcRequestProcessorTest.cc XmlRpcMethodTest.cc \
FallocFileAllocationIteratorTest.cc GZipDecoderTest.cc \
@@ -404,9 +406,11 @@ am_aria2c_OBJECTS = AllTest.$(OBJEXT) TestUtil.$(OBJEXT) \
LongestSequencePieceSelectorTest.$(OBJEXT) \
a2algoTest.$(OBJEXT) bitfieldTest.$(OBJEXT) \
DownloadContextTest.$(OBJEXT) SessionSerializerTest.$(OBJEXT) \
- ValueBaseTest.$(OBJEXT) $(am__objects_1) $(am__objects_2) \
- $(am__objects_3) $(am__objects_4) $(am__objects_5) \
- $(am__objects_6) $(am__objects_7)
+ ValueBaseTest.$(OBJEXT) \
+ ChunkedDecodingStreamFilterTest.$(OBJEXT) \
+ GZipDecodingStreamFilterTest.$(OBJEXT) $(am__objects_1) \
+ $(am__objects_2) $(am__objects_3) $(am__objects_4) \
+ $(am__objects_5) $(am__objects_6) $(am__objects_7)
aria2c_OBJECTS = $(am_aria2c_OBJECTS)
am__DEPENDENCIES_1 =
aria2c_DEPENDENCIES = ../src/libaria2c.a $(am__DEPENDENCIES_1)
@@ -639,7 +643,9 @@ aria2c_SOURCES = AllTest.cc TestUtil.cc TestUtil.h SocketCoreTest.cc \
RarestPieceSelectorTest.cc PieceStatManTest.cc \
InOrderPieceSelector.h LongestSequencePieceSelectorTest.cc \
a2algoTest.cc bitfieldTest.cc DownloadContextTest.cc \
- SessionSerializerTest.cc ValueBaseTest.cc $(am__append_1) \
+ SessionSerializerTest.cc ValueBaseTest.cc \
+ ChunkedDecodingStreamFilterTest.cc \
+ GZipDecodingStreamFilterTest.cc $(am__append_1) \
$(am__append_2) $(am__append_3) $(am__append_4) \
$(am__append_5) $(am__append_6) $(am__append_7)
@@ -773,6 +779,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtUnchokeMessageTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ByteArrayDiskWriterTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkedDecoderTest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkedDecodingStreamFilterTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieParserTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieStorageTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieTest.Po@am__quote@
@@ -822,6 +829,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FtpConnectionTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GZipDecoderTest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GZipDecodingStreamFilterTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GZipEncoderTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GrowSegmentTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HandshakeExtensionMessageTest.Po@am__quote@
diff --git a/test/MockSegment.h b/test/MockSegment.h
new file mode 100644
index 00000000..5be67fc8
--- /dev/null
+++ b/test/MockSegment.h
@@ -0,0 +1,80 @@
+#ifndef D_MOCK_SEGMENT_H
+#define D_MOCK_SEGMENT_H
+
+#include "Segment.h"
+#include "Piece.h"
+#include "A2STR.h"
+
+namespace aria2 {
+
+class MockSegment:public Segment {
+public:
+ virtual bool complete() const
+ {
+ return false;
+ }
+
+ virtual size_t getIndex() const
+ {
+ return 0;
+ }
+
+ virtual off_t getPosition() const
+ {
+ return 0;
+ }
+
+ virtual off_t getPositionToWrite() const
+ {
+ return 0;
+ }
+
+ virtual size_t getLength() const
+ {
+ return 0;
+ }
+
+ virtual size_t getSegmentLength() const
+ {
+ return 0;
+ }
+
+ virtual size_t getWrittenLength() const
+ {
+ return 0;
+ }
+
+ virtual void updateWrittenLength(size_t bytes) {}
+
+#ifdef ENABLE_MESSAGE_DIGEST
+
+ // `begin' is a offset inside this segment.
+ virtual bool updateHash
+ (uint32_t begin, const unsigned char* data, size_t dataLength)
+ {
+ return false;
+ }
+
+ virtual bool isHashCalculated() const
+ {
+ return false;
+ }
+
+ virtual std::string getHashString()
+ {
+ return A2STR::NIL;
+ }
+
+#endif // ENABLE_MESSAGE_DIGEST
+
+ virtual void clear() {}
+
+ virtual SharedHandle<Piece> getPiece() const
+ {
+ return SharedHandle<Piece>();
+ }
+};
+
+} // namespace aria2
+
+#endif // D_MOCK_SEGMENT_H