| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | #include "Piece.h"#include <string>#include <cppunit/extensions/HelperMacros.h>#include "util.h"#include "DirectDiskAdaptor.h"#include "ByteArrayDiskWriter.h"#include "WrDiskCache.h"namespace aria2 {class PieceTest:public CppUnit::TestFixture {  CPPUNIT_TEST_SUITE(PieceTest);  CPPUNIT_TEST(testCompleteBlock);  CPPUNIT_TEST(testGetCompletedLength);  CPPUNIT_TEST(testFlushWrCache);  CPPUNIT_TEST(testAppendWrCache);  CPPUNIT_TEST(testGetDigestWithWrCache);  CPPUNIT_TEST(testUpdateHash);  CPPUNIT_TEST_SUITE_END();private:  std::shared_ptr<DirectDiskAdaptor> adaptor_;  ByteArrayDiskWriter* writer_;public:  void setUp()  {    adaptor_ = std::make_shared<DirectDiskAdaptor>();    auto dw = make_unique<ByteArrayDiskWriter>();    writer_ = dw.get();    adaptor_->setDiskWriter(std::move(dw));  }  void testCompleteBlock();  void testGetCompletedLength();  void testFlushWrCache();  void testAppendWrCache();  void testGetDigestWithWrCache();  void testUpdateHash();};CPPUNIT_TEST_SUITE_REGISTRATION( PieceTest );void PieceTest::testCompleteBlock(){  size_t blockLength = 32*1024;  Piece p(0, blockLength*10, blockLength);  p.completeBlock(5);  CPPUNIT_ASSERT(p.hasBlock(5));}void PieceTest::testGetCompletedLength(){  int32_t blockLength = 16*1024;  Piece p(0, blockLength*10+100, blockLength);  p.completeBlock(1);  p.completeBlock(2);  p.completeBlock(9);  p.completeBlock(10); // <-- 100 bytes  CPPUNIT_ASSERT_EQUAL((int64_t)(blockLength*3+100), p.getCompletedLength());}void PieceTest::testFlushWrCache(){  unsigned char* data;  Piece p(0, 1024);  WrDiskCache dc(64);  p.initWrCache(&dc, adaptor_);  data = new unsigned char[3];  memcpy(data, "foo", 3);  p.updateWrCache(&dc, data, 0, 3, 0);  data = new unsigned char[4];  memcpy(data, " bar", 4);  p.updateWrCache(&dc, data, 0, 4, 3);  p.flushWrCache(&dc);  CPPUNIT_ASSERT_EQUAL(std::string("foo bar"), writer_->getString());  data = new unsigned char[3];  memcpy(data, "foo", 3);  p.updateWrCache(&dc, data, 0, 3, 0);  CPPUNIT_ASSERT_EQUAL((size_t)3, dc.getSize());  p.clearWrCache(&dc);  CPPUNIT_ASSERT_EQUAL((size_t)0, dc.getSize());  p.releaseWrCache(&dc);  CPPUNIT_ASSERT(!p.getWrDiskCacheEntry());}void PieceTest::testAppendWrCache(){  unsigned char* data;  Piece p(0, 1024);  WrDiskCache dc(1024);  p.initWrCache(&dc, adaptor_);  size_t capacity = 6;  data = new unsigned char[capacity];  memcpy(data, "foo", 3);  p.updateWrCache(&dc, data, 0, 3, capacity, 0);  size_t alen = p.appendWrCache    (&dc, 3, reinterpret_cast<const unsigned char*>("barbaz"), 6);  CPPUNIT_ASSERT_EQUAL((size_t)3, alen);  p.flushWrCache(&dc);  CPPUNIT_ASSERT_EQUAL(std::string("foobar"), writer_->getString());}void PieceTest::testGetDigestWithWrCache(){  unsigned char* data;  Piece p(0, 26);  p.setHashType("sha-1");  WrDiskCache dc(64);  //                  012345678901234567890123456  writer_->setString("abcde...ijklmnopq...uvwx.z");  p.initWrCache(&dc, adaptor_);  data = new unsigned char[3];  memcpy(data, "fgh", 3);  p.updateWrCache(&dc, data, 0, 3, 5);  data = new unsigned char[3];  memcpy(data, "rst", 3);  p.updateWrCache(&dc, data, 0, 3, 17);  data = new unsigned char[1];  memcpy(data, "y", 1);  p.updateWrCache(&dc, data, 0, 1, 24);  CPPUNIT_ASSERT_EQUAL    (std::string("32d10c7b8cf96570ca04ce37f2a19d84240d3a89"),     util::toHex(p.getDigestWithWrCache(p.getLength(), adaptor_)));}void PieceTest::testUpdateHash(){  Piece p(0, 16, 2*1024*1024);  p.setHashType("sha-1");  std::string spam("SPAM!");  CPPUNIT_ASSERT(p.updateHash                 (0, reinterpret_cast<const unsigned char*>(spam.c_str()),                  spam.size()));  CPPUNIT_ASSERT(!p.isHashCalculated());  std::string spamspam("SPAM!SPAM!!");  CPPUNIT_ASSERT(p.updateHash                 (spam.size(),                  reinterpret_cast<const unsigned char*>(spamspam.c_str()),                  spamspam.size()));  CPPUNIT_ASSERT(p.isHashCalculated());  CPPUNIT_ASSERT_EQUAL(std::string("d9189aff79e075a2e60271b9556a710dc1bc7de7"),                       util::toHex(p.getDigest()));}} // namespace aria2
 |