PieceTest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "Piece.h"
  2. #include <string>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "util.h"
  5. #include "DirectDiskAdaptor.h"
  6. #include "ByteArrayDiskWriter.h"
  7. #include "WrDiskCache.h"
  8. namespace aria2 {
  9. class PieceTest:public CppUnit::TestFixture {
  10. CPPUNIT_TEST_SUITE(PieceTest);
  11. CPPUNIT_TEST(testCompleteBlock);
  12. CPPUNIT_TEST(testGetCompletedLength);
  13. CPPUNIT_TEST(testFlushWrCache);
  14. CPPUNIT_TEST(testAppendWrCache);
  15. #ifdef ENABLE_MESSAGE_DIGEST
  16. CPPUNIT_TEST(testGetDigestWithWrCache);
  17. CPPUNIT_TEST(testUpdateHash);
  18. #endif // ENABLE_MESSAGE_DIGEST
  19. CPPUNIT_TEST_SUITE_END();
  20. private:
  21. std::shared_ptr<DirectDiskAdaptor> adaptor_;
  22. ByteArrayDiskWriter* writer_;
  23. public:
  24. void setUp()
  25. {
  26. adaptor_ = std::make_shared<DirectDiskAdaptor>();
  27. auto dw = make_unique<ByteArrayDiskWriter>();
  28. writer_ = dw.get();
  29. adaptor_->setDiskWriter(std::move(dw));
  30. }
  31. void testCompleteBlock();
  32. void testGetCompletedLength();
  33. void testFlushWrCache();
  34. void testAppendWrCache();
  35. #ifdef ENABLE_MESSAGE_DIGEST
  36. void testGetDigestWithWrCache();
  37. void testUpdateHash();
  38. #endif // ENABLE_MESSAGE_DIGEST
  39. };
  40. CPPUNIT_TEST_SUITE_REGISTRATION( PieceTest );
  41. void PieceTest::testCompleteBlock()
  42. {
  43. size_t blockLength = 32*1024;
  44. Piece p(0, blockLength*10, blockLength);
  45. p.completeBlock(5);
  46. CPPUNIT_ASSERT(p.hasBlock(5));
  47. }
  48. void PieceTest::testGetCompletedLength()
  49. {
  50. int32_t blockLength = 16*1024;
  51. Piece p(0, blockLength*10+100, blockLength);
  52. p.completeBlock(1);
  53. p.completeBlock(2);
  54. p.completeBlock(9);
  55. p.completeBlock(10); // <-- 100 bytes
  56. CPPUNIT_ASSERT_EQUAL(blockLength*3+100, p.getCompletedLength());
  57. }
  58. void PieceTest::testFlushWrCache()
  59. {
  60. unsigned char* data;
  61. Piece p(0, 1024);
  62. WrDiskCache dc(64);
  63. p.initWrCache(&dc, adaptor_);
  64. data = new unsigned char[3];
  65. memcpy(data, "foo", 3);
  66. p.updateWrCache(&dc, data, 0, 3, 0);
  67. data = new unsigned char[4];
  68. memcpy(data, " bar", 4);
  69. p.updateWrCache(&dc, data, 0, 4, 3);
  70. p.flushWrCache(&dc);
  71. CPPUNIT_ASSERT_EQUAL(std::string("foo bar"), writer_->getString());
  72. data = new unsigned char[3];
  73. memcpy(data, "foo", 3);
  74. p.updateWrCache(&dc, data, 0, 3, 0);
  75. CPPUNIT_ASSERT_EQUAL((size_t)3, dc.getSize());
  76. p.clearWrCache(&dc);
  77. CPPUNIT_ASSERT_EQUAL((size_t)0, dc.getSize());
  78. p.releaseWrCache(&dc);
  79. CPPUNIT_ASSERT(!p.getWrDiskCacheEntry());
  80. }
  81. void PieceTest::testAppendWrCache()
  82. {
  83. unsigned char* data;
  84. Piece p(0, 1024);
  85. WrDiskCache dc(1024);
  86. p.initWrCache(&dc, adaptor_);
  87. size_t capacity = 6;
  88. data = new unsigned char[capacity];
  89. memcpy(data, "foo", 3);
  90. p.updateWrCache(&dc, data, 0, 3, capacity, 0);
  91. size_t alen = p.appendWrCache
  92. (&dc, 3, reinterpret_cast<const unsigned char*>("barbaz"), 6);
  93. CPPUNIT_ASSERT_EQUAL((size_t)3, alen);
  94. p.flushWrCache(&dc);
  95. CPPUNIT_ASSERT_EQUAL(std::string("foobar"), writer_->getString());
  96. }
  97. #ifdef ENABLE_MESSAGE_DIGEST
  98. void PieceTest::testGetDigestWithWrCache()
  99. {
  100. unsigned char* data;
  101. Piece p(0, 26);
  102. p.setHashType("sha-1");
  103. WrDiskCache dc(64);
  104. // 012345678901234567890123456
  105. writer_->setString("abcde...ijklmnopq...uvwx.z");
  106. p.initWrCache(&dc, adaptor_);
  107. data = new unsigned char[3];
  108. memcpy(data, "fgh", 3);
  109. p.updateWrCache(&dc, data, 0, 3, 5);
  110. data = new unsigned char[3];
  111. memcpy(data, "rst", 3);
  112. p.updateWrCache(&dc, data, 0, 3, 17);
  113. data = new unsigned char[1];
  114. memcpy(data, "y", 1);
  115. p.updateWrCache(&dc, data, 0, 1, 24);
  116. CPPUNIT_ASSERT_EQUAL
  117. (std::string("32d10c7b8cf96570ca04ce37f2a19d84240d3a89"),
  118. util::toHex(p.getDigestWithWrCache(p.getLength(), adaptor_)));
  119. }
  120. void PieceTest::testUpdateHash()
  121. {
  122. Piece p(0, 16, 2*1024*1024);
  123. p.setHashType("sha-1");
  124. std::string spam("SPAM!");
  125. CPPUNIT_ASSERT(p.updateHash
  126. (0, reinterpret_cast<const unsigned char*>(spam.c_str()),
  127. spam.size()));
  128. CPPUNIT_ASSERT(!p.isHashCalculated());
  129. std::string spamspam("SPAM!SPAM!!");
  130. CPPUNIT_ASSERT(p.updateHash
  131. (spam.size(),
  132. reinterpret_cast<const unsigned char*>(spamspam.c_str()),
  133. spamspam.size()));
  134. CPPUNIT_ASSERT(p.isHashCalculated());
  135. CPPUNIT_ASSERT_EQUAL(std::string("d9189aff79e075a2e60271b9556a710dc1bc7de7"),
  136. util::toHex(p.getDigest()));
  137. }
  138. #endif // ENABLE_MESSAGE_DIGEST
  139. } // namespace aria2