aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/util/reusable_set/reusable_set_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vespalib/src/tests/util/reusable_set/reusable_set_test.cpp')
-rw-r--r--vespalib/src/tests/util/reusable_set/reusable_set_test.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/vespalib/src/tests/util/reusable_set/reusable_set_test.cpp b/vespalib/src/tests/util/reusable_set/reusable_set_test.cpp
new file mode 100644
index 00000000000..f46cbb6c2f3
--- /dev/null
+++ b/vespalib/src/tests/util/reusable_set/reusable_set_test.cpp
@@ -0,0 +1,106 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/util/reusable_set_pool.h>
+#include <vespa/vespalib/gtest/gtest.h>
+
+using namespace vespalib;
+
+using Mark = ReusableSet::Mark;
+
+void verify_set(const ReusableSet &set, size_t sz, Mark val, size_t marked) {
+ EXPECT_EQ(sz, set.sz);
+ EXPECT_EQ(val, set.curval);
+ size_t count = 0;
+ for (size_t i = 0; i < set.sz; ++i) {
+ if (set.isMarked(i)) ++count;
+ }
+ EXPECT_EQ(marked, count);
+}
+
+void verify_handle(const ReusableSetHandle &set, size_t sz, Mark val, size_t marked) {
+ EXPECT_EQ(sz, set.capacity());
+ EXPECT_EQ(val, set.generation());
+ size_t count = 0;
+ for (size_t i = 0; i < set.capacity(); ++i) {
+ if (set.isMarked(i)) ++count;
+ }
+ EXPECT_EQ(marked, count);
+}
+
+class Pool : public ::testing::Test {
+public:
+ ReusableSetPool pool;
+ Pool() : pool() {}
+ ~Pool() {}
+ void exercise(ReusableSetHandle &set) {
+ size_t sz = set.capacity();
+ size_t count = 0;
+ for (size_t i = 0; i < sz; ++i) {
+ if (set.isMarked(i)) ++count;
+ }
+ EXPECT_EQ(0, count);
+ for (int i = 0; i < 17; ++i) {
+ set.mark((i * 711) % sz);
+ }
+ count = 0;
+ for (size_t i = 0; i < sz; ++i) {
+ if (set.isMarked(i)) ++count;
+ }
+ EXPECT_EQ(17, count);
+ for (int i = 0; i < 17; ++i) {
+ set.mark((i * 711) % sz);
+ }
+ count = 0;
+ for (size_t i = 0; i < sz; ++i) {
+ if (set.isMarked(i)) ++count;
+ }
+ EXPECT_EQ(17, count);
+ }
+};
+
+
+TEST(ReusableSetTest, simple_usage)
+{
+ ReusableSet visited(7);
+ verify_set(visited, 7, 1, 0);
+ visited.mark(1);
+ visited.mark(2);
+ visited.mark(4);
+ verify_set(visited, 7, 1, 3);
+ visited.mark(4);
+ visited.mark(1);
+ visited.mark(2);
+ verify_set(visited, 7, 1, 3);
+ visited.clear();
+ verify_set(visited, 7, 2, 0);
+ visited.clear();
+ verify_set(visited, 7, 3, 0);
+}
+
+TEST_F(Pool, reuse_works)
+{
+ for (int i = 0; i < 65535; ++i) {
+ auto handle = pool.get(7);
+ EXPECT_EQ(i, pool.reuse_count());
+ EXPECT_EQ(1, pool.create_count());
+ verify_handle(handle, 250, i+1, 0);
+ exercise(handle);
+ }
+ for (int i = 0; i < 5; ++i) {
+ auto handle = pool.get(7);
+ EXPECT_EQ(65535+i, pool.reuse_count());
+ EXPECT_EQ(1, pool.create_count());
+ verify_handle(handle, 250, i+1, 0);
+ exercise(handle);
+ }
+ auto handle3 = pool.get(300);
+ EXPECT_EQ(2, pool.create_count());
+ verify_handle(handle3, 600, 1, 0);
+ exercise(handle3);
+ auto handle7 = pool.get(700);
+ EXPECT_EQ(3, pool.create_count());
+ verify_handle(handle7, 1400, 1, 0);
+ exercise(handle7);
+}
+
+GTEST_MAIN_RUN_ALL_TESTS()