PieceStatManTest.cc 5.8 KB

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