BtDependencyTest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. DefaultPieceStorageHandle ps(new DefaultPieceStorage(dctx, option.get()));
  49. dependee->setPieceStorage(ps);
  50. ps->initStorage();
  51. dependee->initSegmentMan();
  52. return dependee;
  53. }
  54. SharedHandle<Option> _option;
  55. public:
  56. void setUp()
  57. {
  58. _option.reset(new Option());
  59. }
  60. void testResolve();
  61. void testResolve_metadata();
  62. void testResolve_loadError();
  63. void testResolve_dependeeFailure();
  64. void testResolve_dependeeInProgress();
  65. };
  66. CPPUNIT_TEST_SUITE_REGISTRATION( BtDependencyTest );
  67. void BtDependencyTest::testResolve()
  68. {
  69. std::string filename = "single.torrent";
  70. SharedHandle<RequestGroup> dependant = createDependant(_option);
  71. SharedHandle<RequestGroup> dependee =
  72. createDependee(_option, filename, File(filename).size());
  73. dependee->getPieceStorage()->markAllPiecesDone();
  74. BtDependency dep(dependant, dependee);
  75. CPPUNIT_ASSERT(dep.resolve());
  76. CPPUNIT_ASSERT_EQUAL
  77. (std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"),
  78. bittorrent::getInfoHashString(dependant->getDownloadContext()));
  79. const SharedHandle<FileEntry>& firstFileEntry =
  80. dependant->getDownloadContext()->getFirstFileEntry();
  81. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  82. firstFileEntry->getPath());
  83. CPPUNIT_ASSERT_EQUAL((size_t)1, firstFileEntry->getRemainingUris().size());
  84. }
  85. void BtDependencyTest::testResolve_metadata()
  86. {
  87. SharedHandle<RequestGroup> dependant = createDependant(_option);
  88. SharedHandle<RequestGroup> dependee =
  89. createDependee(_option, "metadata", 0);
  90. SharedHandle<DirectDiskAdaptor> diskAdaptor(new DirectDiskAdaptor());
  91. SharedHandle<ByteArrayDiskWriter> diskWriter(new ByteArrayDiskWriter());
  92. diskAdaptor->setDiskWriter(diskWriter);
  93. diskWriter->setString
  94. ("d4:name19:aria2-0.8.2.tar.bz26:lengthi384e12:piece lengthi128e"
  95. "6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC"
  96. "e");
  97. SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
  98. pieceStorage->setDiskAdaptor(diskAdaptor);
  99. pieceStorage->setDownloadFinished(true);
  100. dependee->setPieceStorage(pieceStorage);
  101. BDE attrs = BDE::dict();
  102. dependee->getDownloadContext()->setAttribute(bittorrent::BITTORRENT, attrs);
  103. BtDependency dep(dependant, dependee);
  104. CPPUNIT_ASSERT(dep.resolve());
  105. CPPUNIT_ASSERT_EQUAL
  106. (std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"),
  107. bittorrent::getInfoHashString(dependant->getDownloadContext()));
  108. }
  109. void BtDependencyTest::testResolve_loadError()
  110. {
  111. SharedHandle<RequestGroup> dependant = createDependant(_option);
  112. SharedHandle<RequestGroup> dependee =
  113. createDependee(_option, "notExist", 40);
  114. dependee->getPieceStorage()->markAllPiecesDone();
  115. BtDependency dep(dependant, dependee);
  116. CPPUNIT_ASSERT(dep.resolve());
  117. CPPUNIT_ASSERT
  118. (!dependant->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT));
  119. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  120. dependant->getFirstFilePath());
  121. }
  122. void BtDependencyTest::testResolve_dependeeFailure()
  123. {
  124. SharedHandle<RequestGroup> dependant = createDependant(_option);
  125. SharedHandle<RequestGroup> dependee = createDependee(_option, "notExist", 40);
  126. BtDependency dep(dependant, dependee);
  127. CPPUNIT_ASSERT(dep.resolve());
  128. CPPUNIT_ASSERT
  129. (!dependant->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT));
  130. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  131. dependant->getFirstFilePath());
  132. }
  133. void BtDependencyTest::testResolve_dependeeInProgress()
  134. {
  135. std::string filename = "single.torrent";
  136. SharedHandle<RequestGroup> dependant = createDependant(_option);
  137. SharedHandle<RequestGroup> dependee =
  138. createDependee(_option, filename, File(filename).size());
  139. dependee->increaseNumCommand();
  140. BtDependency dep(dependant, dependee);
  141. CPPUNIT_ASSERT(!dep.resolve());
  142. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/outfile.path"),
  143. dependant->getFirstFilePath());
  144. }
  145. } // namespace aria2