#include "PieceStatMan.h" #include namespace aria2 { class PieceStatManTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(PieceStatManTest); CPPUNIT_TEST(testAddPieceStats_index); CPPUNIT_TEST(testAddPieceStats_bitfield); CPPUNIT_TEST(testUpdatePieceStats); CPPUNIT_TEST(testSubtractPieceStats); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} void tearDown() {} void testAddPieceStats_index(); void testAddPieceStats_bitfield(); void testUpdatePieceStats(); void testSubtractPieceStats(); }; CPPUNIT_TEST_SUITE_REGISTRATION(PieceStatManTest); void PieceStatManTest::testAddPieceStats_index() { PieceStatMan pieceStatMan(10, false); pieceStatMan.addPieceStats(1); { int ans[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; const std::vector& order(pieceStatMan.getOrder()); const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(i, order[i]); CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } pieceStatMan.addPieceStats(1); { int ans[] = { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } pieceStatMan.addPieceStats(3); pieceStatMan.addPieceStats(9); pieceStatMan.addPieceStats(3); pieceStatMan.addPieceStats(0); { int ans[] = { 1, 2, 0, 2, 0, 0, 0, 0, 0, 1 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } } void PieceStatManTest::testAddPieceStats_bitfield() { PieceStatMan pieceStatMan(10, false); const unsigned char bitfield[] = { 0xaa, 0x80 }; pieceStatMan.addPieceStats(bitfield, sizeof(bitfield)); { int ans[] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } pieceStatMan.addPieceStats(bitfield, sizeof(bitfield)); { int ans[] = { 2, 0, 2, 0, 2, 0, 2, 0, 2, 0 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } } void PieceStatManTest::testUpdatePieceStats() { PieceStatMan pieceStatMan(10, false); const unsigned char bitfield[] = { 0xff, 0xc0 }; pieceStatMan.addPieceStats(bitfield, sizeof(bitfield)); const unsigned char oldBitfield[] = { 0xf0, 0x00 }; const unsigned char newBitfield[] = { 0x1f, 0x00 }; pieceStatMan.updatePieceStats(newBitfield, sizeof(newBitfield), oldBitfield); { // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // bf : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // old: 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 // new: 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 // --------------------------------- // res: 0, 0, 0, 1, 2, 2, 2, 2, 1, 1 int ans[] = { 0, 0, 0, 1, 2, 2, 2, 2, 1, 1 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } } void PieceStatManTest::testSubtractPieceStats() { PieceStatMan pieceStatMan(10, false); const unsigned char bitfield[] = { 0xf0, 0x00 }; pieceStatMan.addPieceStats(bitfield, sizeof(bitfield)); const unsigned char newBitfield[] = { 0x3f, 0x00 }; pieceStatMan.subtractPieceStats(newBitfield, sizeof(newBitfield)); { // idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // bf : 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 // new: 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 // --------------------------------- // res: 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 int ans[] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; const std::vector& counts(pieceStatMan.getCounts()); for(size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(ans[i], counts[i]); } } } } // namespace aria2