PieceTest.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. #ifdef ENABLE_MESSAGE_DIGEST
  15. CPPUNIT_TEST(testGetDigestWithWrCache);
  16. CPPUNIT_TEST(testUpdateHash);
  17. #endif // ENABLE_MESSAGE_DIGEST
  18. CPPUNIT_TEST_SUITE_END();
  19. private:
  20. SharedHandle<DirectDiskAdaptor> adaptor_;
  21. SharedHandle<ByteArrayDiskWriter> writer_;
  22. public:
  23. void setUp()
  24. {
  25. adaptor_.reset(new DirectDiskAdaptor());
  26. writer_.reset(new ByteArrayDiskWriter());
  27. adaptor_->setDiskWriter(writer_);
  28. }
  29. void testCompleteBlock();
  30. void testGetCompletedLength();
  31. void testFlushWrCache();
  32. #ifdef ENABLE_MESSAGE_DIGEST
  33. void testGetDigestWithWrCache();
  34. void testUpdateHash();
  35. #endif // ENABLE_MESSAGE_DIGEST
  36. };
  37. CPPUNIT_TEST_SUITE_REGISTRATION( PieceTest );
  38. void PieceTest::testCompleteBlock()
  39. {
  40. size_t blockLength = 32*1024;
  41. Piece p(0, blockLength*10, blockLength);
  42. p.completeBlock(5);
  43. CPPUNIT_ASSERT(p.hasBlock(5));
  44. }
  45. void PieceTest::testGetCompletedLength()
  46. {
  47. int32_t blockLength = 16*1024;
  48. Piece p(0, blockLength*10+100, blockLength);
  49. p.completeBlock(1);
  50. p.completeBlock(2);
  51. p.completeBlock(9);
  52. p.completeBlock(10); // <-- 100 bytes
  53. CPPUNIT_ASSERT_EQUAL(blockLength*3+100, p.getCompletedLength());
  54. }
  55. void PieceTest::testFlushWrCache()
  56. {
  57. unsigned char* data;
  58. Piece p(0, 1024);
  59. WrDiskCache dc(64);
  60. p.initWrCache(&dc, adaptor_);
  61. data = new unsigned char[3];
  62. memcpy(data, "foo", 3);
  63. p.updateWrCache(&dc, data, 0, 3, 0);
  64. data = new unsigned char[4];
  65. memcpy(data, " bar", 4);
  66. p.updateWrCache(&dc, data, 0, 4, 3);
  67. p.flushWrCache(&dc);
  68. CPPUNIT_ASSERT_EQUAL(std::string("foo bar"), writer_->getString());
  69. data = new unsigned char[3];
  70. memcpy(data, "foo", 3);
  71. p.updateWrCache(&dc, data, 0, 3, 0);
  72. CPPUNIT_ASSERT_EQUAL((size_t)3, dc.getSize());
  73. p.clearWrCache(&dc);
  74. CPPUNIT_ASSERT_EQUAL((size_t)0, dc.getSize());
  75. p.releaseWrCache(&dc);
  76. CPPUNIT_ASSERT(!p.getWrDiskCacheEntry());
  77. }
  78. #ifdef ENABLE_MESSAGE_DIGEST
  79. void PieceTest::testGetDigestWithWrCache()
  80. {
  81. unsigned char* data;
  82. Piece p(0, 26);
  83. p.setHashType("sha-1");
  84. WrDiskCache dc(64);
  85. // 012345678901234567890123456
  86. writer_->setString("abcde...ijklmnopq...uvwx.z");
  87. p.initWrCache(&dc, adaptor_);
  88. data = new unsigned char[3];
  89. memcpy(data, "fgh", 3);
  90. p.updateWrCache(&dc, data, 0, 3, 5);
  91. data = new unsigned char[3];
  92. memcpy(data, "rst", 3);
  93. p.updateWrCache(&dc, data, 0, 3, 17);
  94. data = new unsigned char[1];
  95. memcpy(data, "y", 1);
  96. p.updateWrCache(&dc, data, 0, 1, 24);
  97. CPPUNIT_ASSERT_EQUAL
  98. (std::string("32d10c7b8cf96570ca04ce37f2a19d84240d3a89"),
  99. util::toHex(p.getDigestWithWrCache(p.getLength(), adaptor_)));
  100. }
  101. void PieceTest::testUpdateHash()
  102. {
  103. Piece p(0, 16, 2*1024*1024);
  104. p.setHashType("sha-1");
  105. std::string spam("SPAM!");
  106. CPPUNIT_ASSERT(p.updateHash
  107. (0, reinterpret_cast<const unsigned char*>(spam.c_str()),
  108. spam.size()));
  109. CPPUNIT_ASSERT(!p.isHashCalculated());
  110. std::string spamspam("SPAM!SPAM!!");
  111. CPPUNIT_ASSERT(p.updateHash
  112. (spam.size(),
  113. reinterpret_cast<const unsigned char*>(spamspam.c_str()),
  114. spamspam.size()));
  115. CPPUNIT_ASSERT(p.isHashCalculated());
  116. CPPUNIT_ASSERT_EQUAL(std::string("d9189aff79e075a2e60271b9556a710dc1bc7de7"),
  117. util::toHex(p.getDigest()));
  118. }
  119. #endif // ENABLE_MESSAGE_DIGEST
  120. } // namespace aria2