RarestPieceSelectorTest.cc 5.8 KB

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