BtDependencyTest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "BtDependency.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "DefaultPieceStorage.h"
  5. #include "DownloadContext.h"
  6. #include "RequestGroup.h"
  7. #include "Option.h"
  8. #include "Exception.h"
  9. #include "SegmentMan.h"
  10. #include "FileEntry.h"
  11. #include "PieceSelector.h"
  12. #include "bittorrent_helper.h"
  13. #include "DirectDiskAdaptor.h"
  14. #include "ByteArrayDiskWriter.h"
  15. #include "MockPieceStorage.h"
  16. namespace aria2 {
  17. class BtDependencyTest:public CppUnit::TestFixture {
  18. CPPUNIT_TEST_SUITE(BtDependencyTest);
  19. CPPUNIT_TEST(testResolve);
  20. CPPUNIT_TEST(testResolve_metadata);
  21. CPPUNIT_TEST(testResolve_loadError);
  22. CPPUNIT_TEST(testResolve_dependeeFailure);
  23. CPPUNIT_TEST(testResolve_dependeeInProgress);
  24. CPPUNIT_TEST_SUITE_END();
  25. SharedHandle<RequestGroup> createDependant(const SharedHandle<Option>& option)
  26. {
  27. SharedHandle<RequestGroup> dependant(new RequestGroup(option));
  28. SharedHandle<DownloadContext> dctx
  29. (new DownloadContext(0, 0, "/tmp/outfile.path"));
  30. dctx->setDir("/tmp");
  31. std::deque<std::string> uris;
  32. uris.push_back("http://localhost/outfile.path");
  33. dctx->getFirstFileEntry()->setUris(uris);
  34. dependant->setDownloadContext(dctx);
  35. return dependant;
  36. }
  37. SharedHandle<RequestGroup>
  38. createDependee
  39. (const SharedHandle<Option>& option,
  40. const std::string& torrentFile,
  41. int64_t length)
  42. {
  43. SharedHandle<RequestGroup> dependee(new RequestGroup(option));
  44. SharedHandle<DownloadContext> dctx
  45. (new DownloadContext(1024*1024, length, torrentFile));
  46. dctx->setDir(".");
  47. dependee->setDownloadContext(dctx);
  48. dependee->initPieceStorage();
  49. return dependee;
  50. }
  51. SharedHandle<Option> _option;
  52. public:
  53. void setUp()
  54. {
  55. _option.reset(new Option());
  56. }
  57. void testResolve();
  58. void testResolve_metadata();
  59. void testResolve_loadError();
  60. void testResolve_dependeeFailure();
  61. void testResolve_dependeeInProgress();
  62. };
  63. CPPUNIT_TEST_SUITE_REGISTRATION( BtDependencyTest );
  64. void BtDependencyTest::testResolve()
  65. {
  66. std::string filename = "single.torrent";
  67. SharedHandle<RequestGroup> dependant = createDependant(_option);
  68. SharedHandle<RequestGroup> dependee =
  69. createDependee(_option, filename, File(filename).size());
  70. dependee->getPieceStorage()->markAllPiecesDone();
  71. BtDependency dep(dependant, dependee);
  72. CPPUNIT_ASSERT(dep.resolve());
  73. CPPUNIT_ASSERT_EQUAL
  74. (std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"),
  75. bittorrent::getInfoHashString(dependant->getDownloadContext()));
  76. const SharedHandle<FileEntry>& firstFileEntry =
  77. dependant->getDownloadContext()->getFirstFileEntry();
  78. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  79. firstFileEntry->getPath());
  80. CPPUNIT_ASSERT_EQUAL((size_t)1, firstFileEntry->getRemainingUris().size());
  81. }
  82. void BtDependencyTest::testResolve_metadata()
  83. {
  84. SharedHandle<RequestGroup> dependant = createDependant(_option);
  85. SharedHandle<RequestGroup> dependee =
  86. createDependee(_option, "metadata", 0);
  87. SharedHandle<DirectDiskAdaptor> diskAdaptor(new DirectDiskAdaptor());
  88. SharedHandle<ByteArrayDiskWriter> diskWriter(new ByteArrayDiskWriter());
  89. diskAdaptor->setDiskWriter(diskWriter);
  90. diskWriter->setString
  91. ("d4:name19:aria2-0.8.2.tar.bz26:lengthi384e12:piece lengthi128e"
  92. "6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC"
  93. "e");
  94. SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
  95. pieceStorage->setDiskAdaptor(diskAdaptor);
  96. pieceStorage->setDownloadFinished(true);
  97. dependee->setPieceStorage(pieceStorage);
  98. BDE attrs = BDE::dict();
  99. dependee->getDownloadContext()->setAttribute(bittorrent::BITTORRENT, attrs);
  100. BtDependency dep(dependant, dependee);
  101. CPPUNIT_ASSERT(dep.resolve());
  102. CPPUNIT_ASSERT_EQUAL
  103. (std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"),
  104. bittorrent::getInfoHashString(dependant->getDownloadContext()));
  105. }
  106. void BtDependencyTest::testResolve_loadError()
  107. {
  108. SharedHandle<RequestGroup> dependant = createDependant(_option);
  109. SharedHandle<RequestGroup> dependee =
  110. createDependee(_option, "notExist", 40);
  111. dependee->getPieceStorage()->markAllPiecesDone();
  112. BtDependency dep(dependant, dependee);
  113. CPPUNIT_ASSERT(dep.resolve());
  114. CPPUNIT_ASSERT
  115. (!dependant->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT));
  116. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  117. dependant->getFirstFilePath());
  118. }
  119. void BtDependencyTest::testResolve_dependeeFailure()
  120. {
  121. SharedHandle<RequestGroup> dependant = createDependant(_option);
  122. SharedHandle<RequestGroup> dependee = createDependee(_option, "notExist", 40);
  123. BtDependency dep(dependant, dependee);
  124. CPPUNIT_ASSERT(dep.resolve());
  125. CPPUNIT_ASSERT
  126. (!dependant->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT));
  127. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  128. dependant->getFirstFilePath());
  129. }
  130. void BtDependencyTest::testResolve_dependeeInProgress()
  131. {
  132. std::string filename = "single.torrent";
  133. SharedHandle<RequestGroup> dependant = createDependant(_option);
  134. SharedHandle<RequestGroup> dependee =
  135. createDependee(_option, filename, File(filename).size());
  136. dependee->increaseNumCommand();
  137. BtDependency dep(dependant, dependee);
  138. CPPUNIT_ASSERT(!dep.resolve());
  139. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  140. dependant->getFirstFilePath());
  141. }
  142. } // namespace aria2