DefaultBtContextTest.cc 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "DefaultBtContext.h"
  2. #include "Util.h"
  3. #include "Exception.h"
  4. #include "AnnounceTier.h"
  5. #include <cppunit/extensions/HelperMacros.h>
  6. using namespace std;
  7. class DefaultBtContextTest:public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(DefaultBtContextTest);
  9. CPPUNIT_TEST(testGetInfoHash);
  10. CPPUNIT_TEST(testGetPieceHash);
  11. CPPUNIT_TEST(testGetFileEntries);
  12. CPPUNIT_TEST(testGetTotalLength);
  13. CPPUNIT_TEST(testGetFileEntriesSingle);
  14. CPPUNIT_TEST(testGetTotalLengthSingle);
  15. CPPUNIT_TEST(testGetFileModeMulti);
  16. CPPUNIT_TEST(testGetFileModeSingle);
  17. CPPUNIT_TEST(testGetNameMulti);
  18. CPPUNIT_TEST(testGetNameSingle);
  19. CPPUNIT_TEST(testGetAnnounceTier);
  20. CPPUNIT_TEST(testGetAnnounceTierAnnounceList);
  21. CPPUNIT_TEST(testGetPieceLength);
  22. CPPUNIT_TEST(testGetInfoHashAsString);
  23. CPPUNIT_TEST(testGetPeerId);
  24. CPPUNIT_TEST(testComputeFastSet);
  25. CPPUNIT_TEST_SUITE_END();
  26. public:
  27. void setUp() {
  28. }
  29. void testGetInfoHash();
  30. void testGetPieceHash();
  31. void testGetFileEntries();
  32. void testGetTotalLength();
  33. void testGetFileEntriesSingle();
  34. void testGetTotalLengthSingle();
  35. void testGetFileModeMulti();
  36. void testGetFileModeSingle();
  37. void testGetNameMulti();
  38. void testGetNameSingle();
  39. void testGetAnnounceTier();
  40. void testGetAnnounceTierAnnounceList();
  41. void testGetPieceLength();
  42. void testGetInfoHashAsString();
  43. void testGetPeerId();
  44. void testComputeFastSet();
  45. };
  46. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtContextTest);
  47. void DefaultBtContextTest::testGetInfoHash() {
  48. DefaultBtContext btContext;
  49. btContext.load("test.torrent");
  50. string correctHash = "248d0a1cd08284299de78d5c1ed359bb46717d8c";
  51. CPPUNIT_ASSERT_EQUAL((int32_t)20, btContext.getInfoHashLength());
  52. CPPUNIT_ASSERT_EQUAL(correctHash, Util::toHex(btContext.getInfoHash(),
  53. btContext.getInfoHashLength()));
  54. }
  55. void DefaultBtContextTest::testGetPieceHash() {
  56. DefaultBtContext btContext;
  57. btContext.load("test.torrent");
  58. CPPUNIT_ASSERT_EQUAL(Util::toHex((const unsigned char*)"AAAAAAAAAAAAAAAAAAAA", 20),
  59. btContext.getPieceHash(0));
  60. CPPUNIT_ASSERT_EQUAL(Util::toHex((const unsigned char*)"BBBBBBBBBBBBBBBBBBBB", 20),
  61. btContext.getPieceHash(1));
  62. CPPUNIT_ASSERT_EQUAL(Util::toHex((const unsigned char*)"CCCCCCCCCCCCCCCCCCCC", 20),
  63. btContext.getPieceHash(2));
  64. CPPUNIT_ASSERT_EQUAL(string(""),
  65. btContext.getPieceHash(-1));
  66. CPPUNIT_ASSERT_EQUAL(string(""),
  67. btContext.getPieceHash(3));
  68. }
  69. void DefaultBtContextTest::testGetFileEntries() {
  70. DefaultBtContext btContext;
  71. btContext.load("test.torrent");
  72. // This is multi-file torrent.
  73. FileEntries fileEntries = btContext.getFileEntries();
  74. // There are 2 file entries.
  75. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntries.size());
  76. FileEntries::iterator itr = fileEntries.begin();
  77. FileEntryHandle fileEntry1 = *itr;
  78. CPPUNIT_ASSERT_EQUAL(string("aria2/src/aria2c"),
  79. fileEntry1->getPath());
  80. itr++;
  81. FileEntryHandle fileEntry2 = *itr;
  82. CPPUNIT_ASSERT_EQUAL(string("aria2-0.2.2.tar.bz2"),
  83. fileEntry2->getPath());
  84. }
  85. void DefaultBtContextTest::testGetFileEntriesSingle() {
  86. DefaultBtContext btContext;
  87. btContext.load("single.torrent");
  88. // This is multi-file torrent.
  89. FileEntries fileEntries = btContext.getFileEntries();
  90. // There is 1 file entry.
  91. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size());
  92. FileEntries::iterator itr = fileEntries.begin();
  93. FileEntryHandle fileEntry1 = *itr;
  94. CPPUNIT_ASSERT_EQUAL(string("aria2-0.8.2.tar.bz2"),
  95. fileEntry1->getPath());
  96. }
  97. void DefaultBtContextTest::testGetTotalLength() {
  98. DefaultBtContext btContext;
  99. btContext.load("test.torrent");
  100. CPPUNIT_ASSERT_EQUAL((long long int)384,
  101. btContext.getTotalLength());
  102. }
  103. void DefaultBtContextTest::testGetTotalLengthSingle() {
  104. DefaultBtContext btContext;
  105. btContext.load("single.torrent");
  106. CPPUNIT_ASSERT_EQUAL((long long int)384,
  107. btContext.getTotalLength());
  108. }
  109. void DefaultBtContextTest::testGetFileModeMulti() {
  110. DefaultBtContext btContext;
  111. btContext.load("test.torrent");
  112. CPPUNIT_ASSERT_EQUAL(BtContext::MULTI,
  113. btContext.getFileMode());
  114. }
  115. void DefaultBtContextTest::testGetFileModeSingle() {
  116. DefaultBtContext btContext;
  117. btContext.load("single.torrent");
  118. CPPUNIT_ASSERT_EQUAL(BtContext::SINGLE,
  119. btContext.getFileMode());
  120. }
  121. void DefaultBtContextTest::testGetNameMulti() {
  122. DefaultBtContext btContext;
  123. btContext.load("test.torrent");
  124. CPPUNIT_ASSERT_EQUAL(string("aria2-test"),
  125. btContext.getName());
  126. }
  127. void DefaultBtContextTest::testGetNameSingle() {
  128. DefaultBtContext btContext;
  129. btContext.load("single.torrent");
  130. CPPUNIT_ASSERT_EQUAL(string("aria2-0.8.2.tar.bz2"),
  131. btContext.getName());
  132. }
  133. void DefaultBtContextTest::testGetAnnounceTier() {
  134. DefaultBtContext btContext;
  135. btContext.load("single.torrent");
  136. AnnounceTiers tiers = btContext.getAnnounceTiers();
  137. // There is 1 tier.
  138. CPPUNIT_ASSERT_EQUAL((size_t)1,
  139. tiers.size());
  140. AnnounceTiers::iterator itr = tiers.begin();
  141. AnnounceTierHandle tier1 = *itr;
  142. CPPUNIT_ASSERT_EQUAL((size_t)1,
  143. tier1->urls.size());
  144. CPPUNIT_ASSERT_EQUAL(string("http://aria.rednoah.com/announce.php"),
  145. tier1->urls.at(0));
  146. }
  147. void DefaultBtContextTest::testGetAnnounceTierAnnounceList() {
  148. DefaultBtContext btContext;
  149. btContext.load("test.torrent");
  150. AnnounceTiers tiers = btContext.getAnnounceTiers();
  151. // There are 3 tiers.
  152. CPPUNIT_ASSERT_EQUAL((size_t)3,
  153. tiers.size());
  154. AnnounceTierHandle tier1 = tiers.at(0);
  155. CPPUNIT_ASSERT_EQUAL((size_t)1,
  156. tier1->urls.size());
  157. CPPUNIT_ASSERT_EQUAL(string("http://tracker1"),
  158. tier1->urls.at(0));
  159. AnnounceTierHandle tier2 = tiers.at(1);
  160. CPPUNIT_ASSERT_EQUAL((size_t)1,
  161. tier2->urls.size());
  162. CPPUNIT_ASSERT_EQUAL(string("http://tracker2"),
  163. tier2->urls.at(0));
  164. AnnounceTierHandle tier3 = tiers.at(2);
  165. CPPUNIT_ASSERT_EQUAL((size_t)1,
  166. tier3->urls.size());
  167. CPPUNIT_ASSERT_EQUAL(string("http://tracker3"),
  168. tier3->urls.at(0));
  169. }
  170. void DefaultBtContextTest::testGetPieceLength() {
  171. DefaultBtContext btContext;
  172. btContext.load("test.torrent");
  173. CPPUNIT_ASSERT_EQUAL((int32_t)128,
  174. btContext.getPieceLength());
  175. }
  176. void DefaultBtContextTest::testGetInfoHashAsString() {
  177. DefaultBtContext btContext;
  178. btContext.load("test.torrent");
  179. CPPUNIT_ASSERT_EQUAL(string("248d0a1cd08284299de78d5c1ed359bb46717d8c"),
  180. btContext.getInfoHashAsString());
  181. }
  182. void DefaultBtContextTest::testGetPeerId() {
  183. DefaultBtContext btContext;
  184. Util::torrentUrlencode(btContext.getPeerId(), 20);
  185. }
  186. void DefaultBtContextTest::testComputeFastSet()
  187. {
  188. string ipaddr = "192.168.0.1";
  189. unsigned char infoHash[20];
  190. memset(infoHash, 0, sizeof(infoHash));
  191. infoHash[0] = 0xff;
  192. int pieces = 1000;
  193. int fastSetSize = 10;
  194. DefaultBtContext btContext;
  195. btContext.setInfoHash(infoHash);
  196. btContext.setNumPieces(pieces);
  197. Integers fastSet = btContext.computeFastSet(ipaddr, fastSetSize);
  198. //for_each(fastSet.begin(), fastSet.end(), Printer());
  199. //cerr << endl;
  200. int ans1[] = { 686, 459, 278, 200, 404, 834, 64, 203, 760, 950 };
  201. Integers ansSet1(&ans1[0], &ans1[10]);
  202. CPPUNIT_ASSERT(equal(fastSet.begin(), fastSet.end(), ansSet1.begin()));
  203. ipaddr = "10.0.0.1";
  204. fastSet = btContext.computeFastSet(ipaddr, fastSetSize);
  205. int ans2[] = { 568, 188, 466, 452, 550, 662, 109, 226, 398, 11 };
  206. Integers ansSet2(&ans2[0], &ans2[10]);
  207. CPPUNIT_ASSERT(equal(fastSet.begin(), fastSet.end(), ansSet2.begin()));
  208. }