RarestPieceSelectorTest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "RarestPieceSelector.h"
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "Exception.h"
  6. #include "Util.h"
  7. #include "BitfieldMan.h"
  8. namespace aria2 {
  9. class RarestPieceSelectorTest:public CppUnit::TestFixture {
  10. CPPUNIT_TEST_SUITE(RarestPieceSelectorTest);
  11. CPPUNIT_TEST(testAddPieceStats_index);
  12. CPPUNIT_TEST(testAddPieceStats_bitfield);
  13. CPPUNIT_TEST(testUpdatePieceStats);
  14. CPPUNIT_TEST(testSubtractPieceStats);
  15. CPPUNIT_TEST(testSelect);
  16. CPPUNIT_TEST_SUITE_END();
  17. public:
  18. void setUp() {}
  19. void tearDown() {}
  20. void testAddPieceStats_index();
  21. void testAddPieceStats_bitfield();
  22. void testUpdatePieceStats();
  23. void testSubtractPieceStats();
  24. void testSelect();
  25. };
  26. CPPUNIT_TEST_SUITE_REGISTRATION(RarestPieceSelectorTest);
  27. void RarestPieceSelectorTest::testAddPieceStats_index()
  28. {
  29. RarestPieceSelector selector(10, false);
  30. selector.addPieceStats(1);
  31. {
  32. size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
  33. size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
  34. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  35. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  36. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  37. for(size_t i = 0; i < 10; ++i) {
  38. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  39. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  40. }
  41. }
  42. selector.addPieceStats(1);
  43. {
  44. size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
  45. size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
  46. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  47. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  48. for(size_t i = 0; i < 10; ++i) {
  49. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  50. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  51. }
  52. }
  53. selector.addPieceStats(3);
  54. selector.addPieceStats(9);
  55. selector.addPieceStats(3);
  56. selector.addPieceStats(0);
  57. {
  58. size_t indexes[] = { 2, 4, 5, 6, 7, 8, 0, 9, 1, 3 };
  59. size_t counts[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2 };
  60. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  61. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  62. for(size_t i = 0; i < 10; ++i) {
  63. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  64. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  65. }
  66. }
  67. }
  68. void RarestPieceSelectorTest::testAddPieceStats_bitfield()
  69. {
  70. RarestPieceSelector selector(10, false);
  71. const unsigned char bitfield[] = { 0xaa, 0x80 };
  72. selector.addPieceStats(bitfield, sizeof(bitfield));
  73. {
  74. size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
  75. size_t counts[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
  76. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  77. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  78. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  79. for(size_t i = 0; i < 10; ++i) {
  80. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  81. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  82. }
  83. }
  84. selector.addPieceStats(bitfield, sizeof(bitfield));
  85. {
  86. size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
  87. size_t counts[] = { 0, 0, 0, 0, 0, 2, 2, 2, 2, 2 };
  88. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  89. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  90. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  91. for(size_t i = 0; i < 10; ++i) {
  92. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  93. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  94. }
  95. }
  96. }
  97. void RarestPieceSelectorTest::testUpdatePieceStats()
  98. {
  99. RarestPieceSelector selector(10, false);
  100. const unsigned char bitfield[] = { 0xff, 0xc0 };
  101. selector.addPieceStats(bitfield, sizeof(bitfield));
  102. const unsigned char oldBitfield[] = { 0xf0, 0x00 };
  103. const unsigned char newBitfield[] = { 0x1f, 0x00 };
  104. selector.updatePieceStats(newBitfield, sizeof(newBitfield), oldBitfield);
  105. {
  106. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  107. // bf : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  108. // old: 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  109. // new: 0, 0, 0, 1, 1, 1, 1, 1, 0, 0
  110. // ---------------------------------
  111. // res: 0, 0, 0, 1, 2, 2, 2, 2, 1, 1
  112. size_t indexes[] = { 0, 1, 2, 3, 8, 9, 4, 5, 6, 7 };
  113. size_t counts[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 };
  114. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  115. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  116. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  117. for(size_t i = 0; i < 10; ++i) {
  118. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  119. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  120. }
  121. }
  122. }
  123. void RarestPieceSelectorTest::testSubtractPieceStats()
  124. {
  125. RarestPieceSelector selector(10, false);
  126. const unsigned char bitfield[] = { 0xf0, 0x00 };
  127. selector.addPieceStats(bitfield, sizeof(bitfield));
  128. const unsigned char newBitfield[] = { 0x3f, 0x00 };
  129. selector.subtractPieceStats(newBitfield, sizeof(newBitfield));
  130. {
  131. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  132. // bf : 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  133. // new: 0, 0, 1, 1, 1, 1, 1, 1, 0, 0
  134. // ---------------------------------
  135. // res: 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
  136. size_t indexes[] = { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };
  137. size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
  138. const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
  139. const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
  140. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  141. for(size_t i = 0; i < 10; ++i) {
  142. CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
  143. CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
  144. }
  145. }
  146. }
  147. void RarestPieceSelectorTest::testSelect()
  148. {
  149. RarestPieceSelector selector(10, false);
  150. BitfieldMan bf(1024, 10*1024);
  151. bf.setBitRange(0, 2);
  152. size_t index;
  153. selector.addPieceStats(0);
  154. CPPUNIT_ASSERT(selector.select(index, bf.getBitfield(),
  155. bf.countBlock()));
  156. CPPUNIT_ASSERT_EQUAL((size_t)1, index);
  157. selector.addPieceStats(1);
  158. CPPUNIT_ASSERT(selector.select(index, bf.getBitfield(),
  159. bf.countBlock()));
  160. CPPUNIT_ASSERT_EQUAL((size_t)2, index);
  161. }
  162. } // namespace aria2