summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahoo-inc.com>2017-05-18 11:28:21 +0000
committerTor Egge <Tor.Egge@yahoo-inc.com>2017-05-18 11:28:21 +0000
commit22b9177d83c8b29be8196e99245e197283e31918 (patch)
tree65cba901e76f1b32fbc251e69a8e9f545ddb7f6c
parent480270b558640b0bc5f4d63f64cb0b36a85a85fc (diff)
Add unit test for shrink lid space flush target.
-rw-r--r--searchcore/CMakeLists.txt1
-rw-r--r--searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/CMakeLists.txt12
-rw-r--r--searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/DESC1
-rw-r--r--searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/FILES1
-rw-r--r--searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/shrink_lid_space_flush_target_test.cpp123
5 files changed, 138 insertions, 0 deletions
diff --git a/searchcore/CMakeLists.txt b/searchcore/CMakeLists.txt
index 4fc000e5a49..2a0ea6c7cb3 100644
--- a/searchcore/CMakeLists.txt
+++ b/searchcore/CMakeLists.txt
@@ -103,6 +103,7 @@ vespa_define_module(
src/tests/proton/feedtoken
src/tests/proton/flushengine
src/tests/proton/flushengine/prepare_restart_flush_strategy
+ src/tests/proton/flushengine/shrink_lid_space_flush_target
src/tests/proton/index
src/tests/proton/index/index_writer
src/tests/proton/initializer
diff --git a/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/CMakeLists.txt b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/CMakeLists.txt
new file mode 100644
index 00000000000..8a917ba8e29
--- /dev/null
+++ b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchcore_flushengine_shrink_lid_space_flush_target_test_app TEST
+ SOURCES
+ shrink_lid_space_flush_target_test.cpp
+ DEPENDS
+ searchcorespi
+ searchcore_flushengine
+)
+vespa_add_test(
+ NAME searchcore_flushengine_shrink_lid_space_flush_target_test_app
+ COMMAND searchcore_flushengine_shrink_lid_space_flush_target_test_app
+)
diff --git a/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/DESC b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/DESC
new file mode 100644
index 00000000000..e8cb3013c29
--- /dev/null
+++ b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/DESC
@@ -0,0 +1 @@
+ShrinkLidSpaceFlushTarget test. Take a look at shrink_lid_space_flush_target_test.cpp for details.
diff --git a/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/FILES b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/FILES
new file mode 100644
index 00000000000..54ff425acdd
--- /dev/null
+++ b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/FILES
@@ -0,0 +1 @@
+shrink_lid_space_flush_target_test.cpp
diff --git a/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/shrink_lid_space_flush_target_test.cpp b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/shrink_lid_space_flush_target_test.cpp
new file mode 100644
index 00000000000..a7795477aa7
--- /dev/null
+++ b/searchcore/src/tests/proton/flushengine/shrink_lid_space_flush_target/shrink_lid_space_flush_target_test.cpp
@@ -0,0 +1,123 @@
+// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.h>
+#include <vespa/searchlib/common/i_compactable_lid_space.h>
+
+using namespace proton;
+using search::SerialNum;
+using searchcorespi::IFlushTarget;
+
+bool validTask(const std::unique_ptr<searchcorespi::FlushTask> &task)
+{
+ return static_cast<bool>(task);
+}
+
+class MyLidSpace : public search::common::ICompactableLidSpace
+{
+ bool _canShrink;
+ size_t _canFree;
+public:
+ MyLidSpace()
+ : _canShrink(true),
+ _canFree(16)
+ {
+ }
+ virtual ~MyLidSpace() override {}
+
+ virtual void compactLidSpace(uint32_t wantedDocLidLimit) override {
+ (void) wantedDocLidLimit;
+ }
+
+ virtual bool canShrinkLidSpace() const override {
+ return _canShrink;
+ }
+
+ virtual size_t getEstimatedShrinkLidSpaceGain() const override {
+ return _canShrink ? _canFree : 0;
+ }
+
+ virtual void shrinkLidSpace() override {
+ if (_canShrink) {
+ _canFree = 0;
+ _canShrink = false;
+ }
+ }
+ void setCanShrink(bool canShrink) { _canShrink = canShrink; }
+ void setCanFree(size_t canFree) { _canFree = canFree; }
+};
+
+struct Fixture
+{
+ std::shared_ptr<MyLidSpace> _lidSpace;
+ std::shared_ptr<ShrinkLidSpaceFlushTarget> _ft;
+ Fixture()
+ : _lidSpace(std::make_shared<MyLidSpace>()),
+ _ft(std::make_shared<ShrinkLidSpaceFlushTarget>("name",
+ IFlushTarget::Type::GC,
+ IFlushTarget::Component::ATTRIBUTE,
+ 10,
+ IFlushTarget::Time(),
+ _lidSpace))
+ {
+ }
+
+ ~Fixture() { }
+};
+
+TEST_F("require that flush target returns estimated memory gain", Fixture)
+{
+ auto memoryGain = f._ft->getApproxMemoryGain();
+ EXPECT_EQUAL(16, memoryGain.gain());
+ EXPECT_EQUAL(10u, f._ft->getFlushedSerialNum());
+ EXPECT_EQUAL(IFlushTarget::Time(), f._ft->getLastFlushTime());
+}
+
+TEST_F("require that flush target returns no estimated memory gain when not able to flush", Fixture)
+{
+ f._lidSpace->setCanShrink(false);
+ auto memoryGain = f._ft->getApproxMemoryGain();
+ EXPECT_EQUAL(0, memoryGain.gain());
+}
+
+TEST_F("require that flush target returns no estimated memory gain right after shrink", Fixture)
+{
+ auto task = f._ft->initFlush(20);
+ EXPECT_TRUE(validTask(task));
+ task->run();
+ auto memoryGain = f._ft->getApproxMemoryGain();
+ EXPECT_EQUAL(0, memoryGain.gain());
+ EXPECT_EQUAL(20u, f._ft->getFlushedSerialNum());
+ EXPECT_NOT_EQUAL(IFlushTarget::Time(), f._ft->getLastFlushTime());
+}
+
+TEST_F("require that flush target returns no task when not able to flush", Fixture)
+{
+ f._lidSpace->setCanShrink(false);
+ auto task = f._ft->initFlush(20);
+ EXPECT_FALSE(validTask(task));
+ EXPECT_EQUAL(20u, f._ft->getFlushedSerialNum());
+ EXPECT_NOT_EQUAL(IFlushTarget::Time(), f._ft->getLastFlushTime());
+}
+
+TEST_F("require that flush target returns valid task when able to flush again", Fixture)
+{
+ f._lidSpace->setCanShrink(false);
+ auto task = f._ft->initFlush(20);
+ EXPECT_FALSE(validTask(task));
+ EXPECT_EQUAL(20u, f._ft->getFlushedSerialNum());
+ EXPECT_NOT_EQUAL(IFlushTarget::Time(), f._ft->getLastFlushTime());
+ f._lidSpace->setCanShrink(true);
+ auto memoryGain = f._ft->getApproxMemoryGain();
+ EXPECT_EQUAL(16, memoryGain.gain());
+ task = f._ft->initFlush(20);
+ EXPECT_TRUE(validTask(task));
+ task->run();
+ EXPECT_EQUAL(20u, f._ft->getFlushedSerialNum());
+}
+
+TEST_MAIN()
+{
+ TEST_RUN_ALL();
+}