UTMetadataDataExtensionMessageTest.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "UTMetadataDataExtensionMessage.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "BtConstants.h"
  5. #include "PieceStorage.h"
  6. #include "DownloadContext.h"
  7. #include "DirectDiskAdaptor.h"
  8. #include "ByteArrayDiskWriter.h"
  9. #include "DownloadContext.h"
  10. #include "MockPieceStorage.h"
  11. #include "UTMetadataRequestTracker.h"
  12. #include "bittorrent_helper.h"
  13. #include "MessageDigest.h"
  14. #include "message_digest_helper.h"
  15. namespace aria2 {
  16. class UTMetadataDataExtensionMessageTest:public CppUnit::TestFixture {
  17. CPPUNIT_TEST_SUITE(UTMetadataDataExtensionMessageTest);
  18. CPPUNIT_TEST(testGetExtensionMessageID);
  19. CPPUNIT_TEST(testGetBencodedData);
  20. CPPUNIT_TEST(testToString);
  21. CPPUNIT_TEST(testDoReceivedAction);
  22. CPPUNIT_TEST_SUITE_END();
  23. public:
  24. void testGetExtensionMessageID();
  25. void testGetBencodedData();
  26. void testToString();
  27. void testDoReceivedAction();
  28. };
  29. CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataDataExtensionMessageTest);
  30. void UTMetadataDataExtensionMessageTest::testGetExtensionMessageID()
  31. {
  32. UTMetadataDataExtensionMessage msg(1);
  33. CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
  34. }
  35. void UTMetadataDataExtensionMessageTest::testGetBencodedData()
  36. {
  37. std::string data(METADATA_PIECE_SIZE, '0');
  38. UTMetadataDataExtensionMessage msg(1);
  39. msg.setIndex(1);
  40. msg.setTotalSize(data.size());
  41. msg.setData(data);
  42. CPPUNIT_ASSERT_EQUAL
  43. (std::string("d8:msg_typei1e5:piecei1e10:total_sizei16384ee")+data,
  44. msg.getPayload());
  45. }
  46. void UTMetadataDataExtensionMessageTest::testToString()
  47. {
  48. UTMetadataDataExtensionMessage msg(1);
  49. msg.setIndex(100);
  50. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata data piece=100"),
  51. msg.toString());
  52. }
  53. void UTMetadataDataExtensionMessageTest::testDoReceivedAction()
  54. {
  55. std::shared_ptr<DirectDiskAdaptor> diskAdaptor(new DirectDiskAdaptor());
  56. std::shared_ptr<ByteArrayDiskWriter> diskWriter(new ByteArrayDiskWriter());
  57. diskAdaptor->setDiskWriter(diskWriter);
  58. std::shared_ptr<MockPieceStorage> pieceStorage(new MockPieceStorage());
  59. pieceStorage->setDiskAdaptor(diskAdaptor);
  60. std::shared_ptr<UTMetadataRequestTracker> tracker
  61. (new UTMetadataRequestTracker());
  62. std::shared_ptr<DownloadContext> dctx(new DownloadContext());
  63. std::string piece0 = std::string(METADATA_PIECE_SIZE, '0');
  64. std::string piece1 = std::string(METADATA_PIECE_SIZE, '1');
  65. std::string metadata = piece0+piece1;
  66. unsigned char infoHash[INFO_HASH_LENGTH];
  67. message_digest::digest(infoHash, INFO_HASH_LENGTH,
  68. MessageDigest::sha1(),
  69. metadata.data(), metadata.size());
  70. {
  71. auto attrs = make_unique<TorrentAttribute>();
  72. attrs->infoHash = std::string(&infoHash[0], &infoHash[20]);
  73. dctx->setAttribute(CTX_ATTR_BT, std::move(attrs));
  74. }
  75. UTMetadataDataExtensionMessage m(1);
  76. m.setPieceStorage(pieceStorage);
  77. m.setUTMetadataRequestTracker(tracker.get());
  78. m.setDownloadContext(dctx);
  79. m.setIndex(1);
  80. m.setData(piece1);
  81. tracker->add(1);
  82. m.doReceivedAction();
  83. CPPUNIT_ASSERT(!tracker->tracks(1));
  84. pieceStorage->setDownloadFinished(true);
  85. // If piece is not tracked, it is ignored.
  86. m.setIndex(0);
  87. m.setData(piece0);
  88. m.doReceivedAction();
  89. tracker->add(0);
  90. m.doReceivedAction();
  91. CPPUNIT_ASSERT_EQUAL(metadata, diskWriter->getString());
  92. }
  93. } // namespace aria2