BitfieldManTest.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "BitfieldMan.h"
  2. #include "FixedNumberRandomizer.h"
  3. #include "BitfieldManFactory.h"
  4. #include <string>
  5. #include <cppunit/extensions/HelperMacros.h>
  6. using namespace std;
  7. class BitfieldManTest:public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(BitfieldManTest);
  9. CPPUNIT_TEST(testGetBlockSize);
  10. CPPUNIT_TEST(testGetFirstMissingUnusedIndex);
  11. CPPUNIT_TEST(testIsAllBitSet);
  12. CPPUNIT_TEST(testFilter);
  13. CPPUNIT_TEST(testGetMissingIndex);
  14. CPPUNIT_TEST(testGetSparceMissingUnusedIndex);
  15. CPPUNIT_TEST_SUITE_END();
  16. private:
  17. RandomizerHandle fixedNumberRandomizer;
  18. public:
  19. BitfieldManTest():fixedNumberRandomizer(0) {
  20. FixedNumberRandomizer* randomizer = new FixedNumberRandomizer();
  21. randomizer->setFixedNumber(0);
  22. this->fixedNumberRandomizer = randomizer;
  23. }
  24. void setUp() {
  25. }
  26. void testGetBlockSize();
  27. void testGetFirstMissingUnusedIndex();
  28. void testIsAllBitSet();
  29. void testFilter();
  30. void testGetMissingIndex();
  31. void testGetSparceMissingUnusedIndex();
  32. };
  33. CPPUNIT_TEST_SUITE_REGISTRATION( BitfieldManTest );
  34. void BitfieldManTest::testGetBlockSize() {
  35. BitfieldMan bt1(1024, 1024*10);
  36. CPPUNIT_ASSERT_EQUAL((uint32_t)1024, bt1.getBlockLength(9));
  37. BitfieldMan bt2(1024, 1024*10+1);
  38. CPPUNIT_ASSERT_EQUAL((uint32_t)1024, bt2.getBlockLength(9));
  39. CPPUNIT_ASSERT_EQUAL((uint32_t)1, bt2.getBlockLength(10));
  40. CPPUNIT_ASSERT_EQUAL((uint32_t)0, bt2.getBlockLength(11));
  41. }
  42. void BitfieldManTest::testGetFirstMissingUnusedIndex() {
  43. BitfieldMan bt1(1024, 1024*10);
  44. unsigned char bitfield[2];
  45. memset(bitfield, 0xff, sizeof(bitfield));
  46. CPPUNIT_ASSERT_EQUAL(0, bt1.getFirstMissingUnusedIndex(bitfield, sizeof(bitfield)));
  47. CPPUNIT_ASSERT(bt1.setUseBit(0));
  48. CPPUNIT_ASSERT_EQUAL(1, bt1.getFirstMissingUnusedIndex(bitfield, sizeof(bitfield)));
  49. CPPUNIT_ASSERT(bt1.unsetUseBit(0));
  50. CPPUNIT_ASSERT_EQUAL(0, bt1.getFirstMissingUnusedIndex(bitfield, sizeof(bitfield)));
  51. CPPUNIT_ASSERT(bt1.setBit(0));
  52. CPPUNIT_ASSERT_EQUAL(1, bt1.getFirstMissingUnusedIndex(bitfield, sizeof(bitfield)));
  53. for(int i = 0; i < 8; i++) {
  54. CPPUNIT_ASSERT(bt1.setBit(i));
  55. }
  56. CPPUNIT_ASSERT_EQUAL(8, bt1.getFirstMissingUnusedIndex(bitfield, sizeof(bitfield)));
  57. CPPUNIT_ASSERT_EQUAL(8, bt1.getFirstMissingUnusedIndex());
  58. CPPUNIT_ASSERT(bt1.setUseBit(8));
  59. CPPUNIT_ASSERT_EQUAL(9, bt1.getFirstMissingUnusedIndex());
  60. }
  61. void BitfieldManTest::testIsAllBitSet() {
  62. BitfieldMan bt1(1024, 1024*10);
  63. CPPUNIT_ASSERT(!bt1.isAllBitSet());
  64. bt1.setBit(1);
  65. CPPUNIT_ASSERT(!bt1.isAllBitSet());
  66. for(int i = 0; i < 8; i++) {
  67. CPPUNIT_ASSERT(bt1.setBit(i));
  68. }
  69. CPPUNIT_ASSERT(!bt1.isAllBitSet());
  70. for(uint32_t i = 0; i < bt1.countBlock(); i++) {
  71. CPPUNIT_ASSERT(bt1.setBit(i));
  72. }
  73. CPPUNIT_ASSERT(bt1.isAllBitSet());
  74. }
  75. void BitfieldManTest::testFilter() {
  76. BitfieldMan btman(2, 32);
  77. btman.setRandomizer(fixedNumberRandomizer);
  78. // test offset=4, length=12
  79. btman.addFilter(4, 12);
  80. btman.enableFilter();
  81. unsigned char peerBt[2];
  82. memset(peerBt, 0xff, sizeof(peerBt));
  83. int index;
  84. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  85. btman.setUseBit(index);
  86. CPPUNIT_ASSERT_EQUAL(2, index);
  87. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  88. btman.setUseBit(index);
  89. CPPUNIT_ASSERT_EQUAL(3, index);
  90. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  91. btman.setUseBit(index);
  92. CPPUNIT_ASSERT_EQUAL(4, index);
  93. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  94. btman.setUseBit(index);
  95. CPPUNIT_ASSERT_EQUAL(5, index);
  96. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  97. btman.setUseBit(index);
  98. CPPUNIT_ASSERT_EQUAL(6, index);
  99. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  100. btman.setUseBit(index);
  101. CPPUNIT_ASSERT_EQUAL(7, index);
  102. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  103. btman.setUseBit(index);
  104. CPPUNIT_ASSERT_EQUAL(-1, index);
  105. CPPUNIT_ASSERT_EQUAL((uint64_t)12, btman.getFilteredTotalLength());
  106. // test offset=5, length=2
  107. btman.clearAllBit();
  108. btman.clearAllUseBit();
  109. btman.clearFilter();
  110. btman.addFilter(5, 2);
  111. btman.enableFilter();
  112. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  113. btman.setUseBit(index);
  114. btman.setBit(index);
  115. CPPUNIT_ASSERT_EQUAL(2, index);
  116. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  117. btman.setUseBit(index);
  118. btman.setBit(index);
  119. CPPUNIT_ASSERT_EQUAL(3, index);
  120. index = btman.getMissingUnusedIndex(peerBt, sizeof(peerBt));
  121. btman.setUseBit(index);
  122. CPPUNIT_ASSERT_EQUAL(-1, index);
  123. CPPUNIT_ASSERT_EQUAL((uint64_t)4, btman.getFilteredTotalLength());
  124. CPPUNIT_ASSERT(btman.isAllBitSet());
  125. BitfieldMan btman2(2, 31);
  126. btman2.addFilter(0, 31);
  127. btman2.enableFilter();
  128. CPPUNIT_ASSERT_EQUAL((uint64_t)31, btman2.getFilteredTotalLength());
  129. }
  130. void BitfieldManTest::testGetMissingIndex() {
  131. BitfieldMan bt1(1024, 1024*256);
  132. bt1.setRandomizer(fixedNumberRandomizer);
  133. unsigned char bitArray[] = {
  134. 0xff, 0xff, 0xff, 0xff,
  135. 0xff, 0xff, 0xff, 0xff,
  136. 0xff, 0xff, 0xff, 0xff,
  137. 0xff, 0xff, 0xff, 0xff,
  138. 0xff, 0xff, 0xff, 0xff,
  139. 0xff, 0xff, 0xff, 0xff,
  140. 0xff, 0xff, 0xff, 0xff,
  141. 0xff, 0xff, 0xff, 0xff,
  142. };
  143. CPPUNIT_ASSERT_EQUAL(0, bt1.getMissingIndex(bitArray, 32));
  144. unsigned char bitArray2[] = {
  145. 0x0f, 0xff, 0xff, 0xff,
  146. 0xff, 0xff, 0xff, 0xff,
  147. 0xff, 0xff, 0xff, 0xff,
  148. 0xff, 0xff, 0xff, 0xff,
  149. 0xff, 0xff, 0xff, 0xff,
  150. 0xff, 0xff, 0xff, 0xff,
  151. 0xff, 0xff, 0xff, 0xff,
  152. 0xff, 0xff, 0xff, 0xff,
  153. };
  154. CPPUNIT_ASSERT_EQUAL(4, bt1.getMissingIndex(bitArray2, 32));
  155. unsigned char bitArray3[] = {
  156. 0x00, 0xff, 0xff, 0xff,
  157. 0xff, 0xff, 0xff, 0xff,
  158. 0xff, 0xff, 0xff, 0xff,
  159. 0xff, 0xff, 0xff, 0xff,
  160. 0xff, 0xff, 0xff, 0xff,
  161. 0xff, 0xff, 0xff, 0xff,
  162. 0xff, 0xff, 0xff, 0xff,
  163. 0xff, 0xff, 0xff, 0xff,
  164. };
  165. CPPUNIT_ASSERT_EQUAL(8, bt1.getMissingIndex(bitArray3, 32));
  166. unsigned char bitArray4[] = {
  167. 0x00, 0x00, 0x00, 0x00,
  168. 0x00, 0x00, 0x00, 0x00,
  169. 0x00, 0x00, 0x00, 0x00,
  170. 0x00, 0x00, 0x00, 0x00,
  171. 0x00, 0x00, 0x00, 0x00,
  172. 0x00, 0x00, 0x00, 0x00,
  173. 0x00, 0x00, 0x00, 0x00,
  174. 0x00, 0x00, 0x00, 0x00,
  175. };
  176. CPPUNIT_ASSERT_EQUAL(-1, bt1.getMissingIndex(bitArray4, 32));
  177. }
  178. void BitfieldManTest::testGetSparceMissingUnusedIndex() {
  179. BitfieldMan bitfield(1024*1024, 10*1024*1024);
  180. CPPUNIT_ASSERT_EQUAL(0, bitfield.getSparseMissingUnusedIndex());
  181. bitfield.setBit(0);
  182. CPPUNIT_ASSERT_EQUAL(5, bitfield.getSparseMissingUnusedIndex());
  183. bitfield.setUseBit(5);
  184. CPPUNIT_ASSERT_EQUAL(3, bitfield.getSparseMissingUnusedIndex());
  185. bitfield.setBit(3);
  186. CPPUNIT_ASSERT_EQUAL(8, bitfield.getSparseMissingUnusedIndex());
  187. bitfield.setBit(8);
  188. CPPUNIT_ASSERT_EQUAL(2, bitfield.getSparseMissingUnusedIndex());
  189. bitfield.setBit(2);
  190. CPPUNIT_ASSERT_EQUAL(7, bitfield.getSparseMissingUnusedIndex());
  191. bitfield.setBit(7);
  192. CPPUNIT_ASSERT_EQUAL(1, bitfield.getSparseMissingUnusedIndex());
  193. bitfield.setBit(1);
  194. CPPUNIT_ASSERT_EQUAL(4, bitfield.getSparseMissingUnusedIndex());
  195. bitfield.setBit(4);
  196. CPPUNIT_ASSERT_EQUAL(6, bitfield.getSparseMissingUnusedIndex());
  197. bitfield.setBit(6);
  198. CPPUNIT_ASSERT_EQUAL(9, bitfield.getSparseMissingUnusedIndex());
  199. bitfield.setBit(9);
  200. CPPUNIT_ASSERT_EQUAL(-1, bitfield.getSparseMissingUnusedIndex());
  201. }