PieceStatManTest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. int ans[] = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0};
  26. const std::vector<size_t>& order(pieceStatMan.getOrder());
  27. const std::vector<int>& counts(pieceStatMan.getCounts());
  28. for (size_t i = 0; i < 10; ++i) {
  29. CPPUNIT_ASSERT_EQUAL(i, order[i]);
  30. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  31. }
  32. }
  33. pieceStatMan.addPieceStats(1);
  34. {
  35. int ans[] = {0, 2, 0, 0, 0, 0, 0, 0, 0, 0};
  36. const std::vector<int>& counts(pieceStatMan.getCounts());
  37. for (size_t i = 0; i < 10; ++i) {
  38. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  39. }
  40. }
  41. pieceStatMan.addPieceStats(3);
  42. pieceStatMan.addPieceStats(9);
  43. pieceStatMan.addPieceStats(3);
  44. pieceStatMan.addPieceStats(0);
  45. {
  46. int ans[] = {1, 2, 0, 2, 0, 0, 0, 0, 0, 1};
  47. const std::vector<int>& counts(pieceStatMan.getCounts());
  48. for (size_t i = 0; i < 10; ++i) {
  49. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  50. }
  51. }
  52. }
  53. void PieceStatManTest::testAddPieceStats_bitfield()
  54. {
  55. PieceStatMan pieceStatMan(10, false);
  56. const unsigned char bitfield[] = {0xaa, 0x80};
  57. pieceStatMan.addPieceStats(bitfield, sizeof(bitfield));
  58. {
  59. int ans[] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
  60. const std::vector<int>& counts(pieceStatMan.getCounts());
  61. for (size_t i = 0; i < 10; ++i) {
  62. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  63. }
  64. }
  65. pieceStatMan.addPieceStats(bitfield, sizeof(bitfield));
  66. {
  67. int ans[] = {2, 0, 2, 0, 2, 0, 2, 0, 2, 0};
  68. const std::vector<int>& counts(pieceStatMan.getCounts());
  69. for (size_t i = 0; i < 10; ++i) {
  70. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  71. }
  72. }
  73. }
  74. void PieceStatManTest::testUpdatePieceStats()
  75. {
  76. PieceStatMan pieceStatMan(10, false);
  77. const unsigned char bitfield[] = {0xff, 0xc0};
  78. pieceStatMan.addPieceStats(bitfield, sizeof(bitfield));
  79. const unsigned char oldBitfield[] = {0xf0, 0x00};
  80. const unsigned char newBitfield[] = {0x1f, 0x00};
  81. pieceStatMan.updatePieceStats(newBitfield, sizeof(newBitfield), oldBitfield);
  82. {
  83. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  84. // bf : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  85. // old: 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  86. // new: 0, 0, 0, 1, 1, 1, 1, 1, 0, 0
  87. // ---------------------------------
  88. // res: 0, 0, 0, 1, 2, 2, 2, 2, 1, 1
  89. int ans[] = {0, 0, 0, 1, 2, 2, 2, 2, 1, 1};
  90. const std::vector<int>& counts(pieceStatMan.getCounts());
  91. for (size_t i = 0; i < 10; ++i) {
  92. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  93. }
  94. }
  95. }
  96. void PieceStatManTest::testSubtractPieceStats()
  97. {
  98. PieceStatMan pieceStatMan(10, false);
  99. const unsigned char bitfield[] = {0xf0, 0x00};
  100. pieceStatMan.addPieceStats(bitfield, sizeof(bitfield));
  101. const unsigned char newBitfield[] = {0x3f, 0x00};
  102. pieceStatMan.subtractPieceStats(newBitfield, sizeof(newBitfield));
  103. {
  104. // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  105. // bf : 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
  106. // new: 0, 0, 1, 1, 1, 1, 1, 1, 0, 0
  107. // ---------------------------------
  108. // res: 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
  109. int ans[] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0};
  110. const std::vector<int>& counts(pieceStatMan.getCounts());
  111. for (size_t i = 0; i < 10; ++i) {
  112. CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]);
  113. }
  114. }
  115. }
  116. } // namespace aria2