|
@@ -1,6 +1,7 @@
|
|
|
#include "BitfieldMan.h"
|
|
|
|
|
|
#include <cstring>
|
|
|
+#include <vector>
|
|
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
|
@@ -37,6 +38,7 @@ class BitfieldManTest:public CppUnit::TestFixture {
|
|
|
CPPUNIT_TEST(testCountFilteredBlock);
|
|
|
CPPUNIT_TEST(testCountMissingBlock);
|
|
|
CPPUNIT_TEST(testZeroLengthFilter);
|
|
|
+ CPPUNIT_TEST(testGetFirstNMissingUnusedIndex);
|
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
private:
|
|
|
SharedHandle<Randomizer> fixedNumberRandomizer;
|
|
@@ -77,6 +79,7 @@ public:
|
|
|
void testCountFilteredBlock();
|
|
|
void testCountMissingBlock();
|
|
|
void testZeroLengthFilter();
|
|
|
+ void testGetFirstNMissingUnusedIndex();
|
|
|
};
|
|
|
|
|
|
|
|
@@ -843,4 +846,30 @@ void BitfieldManTest::testZeroLengthFilter()
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)0, bt.countMissingBlock());
|
|
|
}
|
|
|
|
|
|
+void BitfieldManTest::testGetFirstNMissingUnusedIndex()
|
|
|
+{
|
|
|
+ BitfieldMan bt(1024, 1024*10);
|
|
|
+ bt.setUseBit(1);
|
|
|
+ bt.setBit(5);
|
|
|
+ std::vector<size_t> out;
|
|
|
+ bt.getFirstNMissingUnusedIndex(out, 256);
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)8, out.size());
|
|
|
+ const size_t ans[] = {0, 2, 3, 4, 6, 7, 8, 9};
|
|
|
+ for(size_t i = 0; i < out.size(); ++i) {
|
|
|
+ CPPUNIT_ASSERT_EQUAL(ans[i], out[i]);
|
|
|
+ }
|
|
|
+ out.clear();
|
|
|
+ bt.getFirstNMissingUnusedIndex(out, 3);
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)3, out.size());
|
|
|
+ for(size_t i = 0; i < out.size(); ++i) {
|
|
|
+ CPPUNIT_ASSERT_EQUAL(ans[i], out[i]);
|
|
|
+ }
|
|
|
+ out.clear();
|
|
|
+ bt.addFilter(1024*9, 1024);
|
|
|
+ bt.enableFilter();
|
|
|
+ bt.getFirstNMissingUnusedIndex(out, 256);
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)1, out.size());
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)9, out[0]);
|
|
|
+}
|
|
|
+
|
|
|
} // namespace aria2
|