RarestPieceSelectorTest.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "RarestPieceSelector.h"
  2. #include "Exception.h"
  3. #include "Util.h"
  4. #include <cstring>
  5. #include <iostream>
  6. #include <cppunit/extensions/HelperMacros.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::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  32. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  33. for(size_t i = 0; i < 10; ++i) {
  34. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  35. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  36. }
  37. }
  38. selector.addPieceStats(1);
  39. {
  40. size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
  41. size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
  42. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  43. for(size_t i = 0; i < 10; ++i) {
  44. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  45. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  46. }
  47. }
  48. selector.addPieceStats(3);
  49. selector.addPieceStats(9);
  50. selector.addPieceStats(3);
  51. selector.addPieceStats(0);
  52. {
  53. size_t indexes[] = { 2, 4, 5, 6, 7, 8, 0, 9, 1, 3 };
  54. size_t counts[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2 };
  55. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  56. for(size_t i = 0; i < 10; ++i) {
  57. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  58. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  59. }
  60. }
  61. }
  62. void RarestPieceSelectorTest::testAddPieceStats_bitfield()
  63. {
  64. RarestPieceSelector selector(10, false);
  65. const unsigned char bitfield[] = { 0xaa, 0x80 };
  66. selector.addPieceStats(bitfield, sizeof(bitfield));
  67. {
  68. size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
  69. size_t counts[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
  70. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  71. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  72. for(size_t i = 0; i < 10; ++i) {
  73. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  74. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  75. }
  76. }
  77. selector.addPieceStats(bitfield, sizeof(bitfield));
  78. {
  79. size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
  80. size_t counts[] = { 0, 0, 0, 0, 0, 2, 2, 2, 2, 2 };
  81. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  82. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  83. for(size_t i = 0; i < 10; ++i) {
  84. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  85. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  86. }
  87. }
  88. }
  89. void RarestPieceSelectorTest::testUpdatePieceStats()
  90. {
  91. RarestPieceSelector selector(10, false);
  92. const unsigned char bitfield[] = { 0xff, 0xc0 };
  93. selector.addPieceStats(bitfield, sizeof(bitfield));
  94. const unsigned char oldBitfield[] = { 0xf0, 0x00 };
  95. const unsigned char newBitfield[] = { 0x1f, 0x00 };
  96. selector.updatePieceStats(newBitfield, sizeof(newBitfield), oldBitfield);
  97. {
  98. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  99. // bf : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  100. // old: 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  101. // new: 0, 0, 0, 1, 1, 1, 1, 1, 0, 0
  102. // ---------------------------------
  103. // res: 0, 0, 0, 1, 2, 2, 2, 2, 1, 1
  104. size_t indexes[] = { 0, 1, 2, 3, 8, 9, 4, 5, 6, 7 };
  105. size_t counts[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 };
  106. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  107. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  108. for(size_t i = 0; i < 10; ++i) {
  109. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  110. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  111. }
  112. }
  113. }
  114. void RarestPieceSelectorTest::testSubtractPieceStats()
  115. {
  116. RarestPieceSelector selector(10, false);
  117. const unsigned char bitfield[] = { 0xf0, 0x00 };
  118. selector.addPieceStats(bitfield, sizeof(bitfield));
  119. const unsigned char newBitfield[] = { 0x3f, 0x00 };
  120. selector.subtractPieceStats(newBitfield, sizeof(newBitfield));
  121. {
  122. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  123. // bf : 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  124. // new: 0, 0, 1, 1, 1, 1, 1, 1, 0, 0
  125. // ---------------------------------
  126. // res: 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
  127. size_t indexes[] = { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };
  128. size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
  129. const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
  130. CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
  131. for(size_t i = 0; i < 10; ++i) {
  132. CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
  133. CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
  134. }
  135. }
  136. }
  137. } // namespace aria2