summaryrefslogtreecommitdiffstats
path: root/searchcore/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'searchcore/src/tests')
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/.gitignore2
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/CMakeLists.txt (renamed from searchcore/src/tests/fdispatch/search_path/CMakeLists.txt)10
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/DESC (renamed from searchcore/src/tests/fdispatch/search_path/DESC)0
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/FILES (renamed from searchcore/src/tests/fdispatch/search_path/FILES)0
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/search_coverage_test.cpp141
-rw-r--r--searchcore/src/tests/fdispatch/fnet_search/search_path_test.cpp (renamed from searchcore/src/tests/fdispatch/search_path/search_path_test.cpp)0
-rw-r--r--searchcore/src/tests/fdispatch/search_path/.gitignore1
7 files changed, 153 insertions, 1 deletions
diff --git a/searchcore/src/tests/fdispatch/fnet_search/.gitignore b/searchcore/src/tests/fdispatch/fnet_search/.gitignore
new file mode 100644
index 00000000000..b525d6fcd38
--- /dev/null
+++ b/searchcore/src/tests/fdispatch/fnet_search/.gitignore
@@ -0,0 +1,2 @@
+searchcore_search_path_test_app
+searchcore_search_coverage_test_app
diff --git a/searchcore/src/tests/fdispatch/search_path/CMakeLists.txt b/searchcore/src/tests/fdispatch/fnet_search/CMakeLists.txt
index a3abaa868ff..c4e1608d6da 100644
--- a/searchcore/src/tests/fdispatch/search_path/CMakeLists.txt
+++ b/searchcore/src/tests/fdispatch/fnet_search/CMakeLists.txt
@@ -6,3 +6,13 @@ vespa_add_executable(searchcore_search_path_test_app TEST
searchcore_fdispatch_search
)
vespa_add_test(NAME searchcore_search_path_test_app COMMAND searchcore_search_path_test_app)
+
+vespa_add_executable(searchcore_search_coverage_test_app TEST
+ SOURCES
+ search_coverage_test.cpp
+ DEPENDS
+ searchcore_fdispatch_search
+ searchcore_fdcommon
+ searchcore_grouping
+)
+vespa_add_test(NAME searchcore_search_coverage_test_app COMMAND searchcore_search_coverage_test_app)
diff --git a/searchcore/src/tests/fdispatch/search_path/DESC b/searchcore/src/tests/fdispatch/fnet_search/DESC
index 4bc24883896..4bc24883896 100644
--- a/searchcore/src/tests/fdispatch/search_path/DESC
+++ b/searchcore/src/tests/fdispatch/fnet_search/DESC
diff --git a/searchcore/src/tests/fdispatch/search_path/FILES b/searchcore/src/tests/fdispatch/fnet_search/FILES
index a38e13c26fd..a38e13c26fd 100644
--- a/searchcore/src/tests/fdispatch/search_path/FILES
+++ b/searchcore/src/tests/fdispatch/fnet_search/FILES
diff --git a/searchcore/src/tests/fdispatch/fnet_search/search_coverage_test.cpp b/searchcore/src/tests/fdispatch/fnet_search/search_coverage_test.cpp
new file mode 100644
index 00000000000..d598583437d
--- /dev/null
+++ b/searchcore/src/tests/fdispatch/fnet_search/search_coverage_test.cpp
@@ -0,0 +1,141 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/searchcore/fdispatch/search/fnet_search.h>
+#include <vespa/searchlib/engine/searchreply.h>
+
+#include <vespa/log/log.h>
+LOG_SETUP("search_coverage_test");
+
+using namespace fdispatch;
+using search::engine::SearchReply;
+
+std::vector<FastS_FNET_SearchNode>
+createNodes(uint32_t count) {
+ std::vector<FastS_FNET_SearchNode> nodes;
+ nodes.reserve(count);
+ for (uint32_t partid(0); partid < count; partid++) {
+ nodes.emplace_back(nullptr, partid);
+ }
+ return nodes;
+}
+
+void
+query(FastS_FNET_SearchNode & node) {
+ node.DirtySetChannelOnlyForTesting((FNET_Channel *) 1);
+}
+
+void
+respond(FastS_FNET_SearchNode & node, size_t covered, size_t active, size_t soonActive, uint32_t degradeReason) {
+ node._qresult = new FS4Packet_QUERYRESULTX();
+ node._qresult->_coverageDocs = covered;
+ node._qresult->_activeDocs = active;
+ node._qresult->_soonActiveDocs = soonActive;
+ node._qresult->_coverageDegradeReason = degradeReason;
+}
+
+void
+respond(FastS_FNET_SearchNode & node, size_t covered, size_t active, size_t soonActive) {
+ respond(node, covered, active, soonActive, 0);
+}
+
+void disconnectNodes(std::vector<FastS_FNET_SearchNode> & nodes) {
+ for (auto & node : nodes) {
+ node.DirtySetChannelOnlyForTesting(nullptr);
+ }
+}
+TEST("testCoverageWhenAllNodesAreUp") {
+ std::vector<FastS_FNET_SearchNode> nodes = createNodes(4);
+ for (auto & node : nodes) {
+ query(node);
+ respond(node, 25, 30, 50);
+ }
+ FastS_SearchInfo si = FastS_FNET_Search::computeCoverage(nodes, 1, false);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(4u, si._nodesReplied);
+ EXPECT_EQUAL(100u, si._coverageDocs);
+ EXPECT_EQUAL(120u, si._activeDocs);
+ EXPECT_EQUAL(200u, si._soonActiveDocs);
+ EXPECT_EQUAL(0u, si._degradeReason);
+ disconnectNodes(nodes);
+}
+
+TEST("testCoverageWhenNoNodesAreUp") {
+ std::vector<FastS_FNET_SearchNode> nodes = createNodes(4);
+ for (auto & node : nodes) {
+ query(node);
+ }
+ FastS_SearchInfo si = FastS_FNET_Search::computeCoverage(nodes, 1, false);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(0u, si._nodesReplied);
+ EXPECT_EQUAL(0u, si._coverageDocs);
+ EXPECT_EQUAL(0u, si._activeDocs);
+ EXPECT_EQUAL(0u, si._soonActiveDocs);
+ EXPECT_EQUAL(SearchReply::Coverage::TIMEOUT, si._degradeReason);
+ disconnectNodes(nodes);
+}
+
+TEST("testCoverageWhenNoNodesAreUpWithAdaptiveTimeout") {
+ std::vector<FastS_FNET_SearchNode> nodes = createNodes(4);
+ for (auto & node : nodes) {
+ query(node);
+ }
+ FastS_SearchInfo si = FastS_FNET_Search::computeCoverage(nodes, 1, true);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(0u, si._nodesReplied);
+ EXPECT_EQUAL(0u, si._coverageDocs);
+ EXPECT_EQUAL(0u, si._activeDocs);
+ EXPECT_EQUAL(0u, si._soonActiveDocs);
+ EXPECT_EQUAL(SearchReply::Coverage::ADAPTIVE_TIMEOUT, si._degradeReason);
+ disconnectNodes(nodes);
+}
+
+TEST("testCoverageWhen1NodesIsDown") {
+ std::vector<FastS_FNET_SearchNode> nodes = createNodes(4);
+ for (auto & node : nodes) {
+ query(node);
+ }
+ respond(nodes[0], 25, 30, 50);
+ respond(nodes[2], 25, 30, 50);
+ respond(nodes[3], 25, 30, 50);
+
+ FastS_SearchInfo si = FastS_FNET_Search::computeCoverage(nodes, 1, false);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(3u, si._nodesReplied);
+ EXPECT_EQUAL(75u, si._coverageDocs);
+ EXPECT_EQUAL(120u, si._activeDocs);
+ EXPECT_EQUAL(200u, si._soonActiveDocs);
+ EXPECT_EQUAL(SearchReply::Coverage::TIMEOUT, si._degradeReason);
+
+ // Do not trigger dirty magic when you still have enough coverage in theory
+ si = FastS_FNET_Search::computeCoverage(nodes, 2, false);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(3u, si._nodesReplied);
+ EXPECT_EQUAL(75u, si._coverageDocs);
+ EXPECT_EQUAL(90u, si._activeDocs);
+ EXPECT_EQUAL(150u, si._soonActiveDocs);
+ EXPECT_EQUAL(0u, si._degradeReason);
+ disconnectNodes(nodes);
+}
+
+TEST("testCoverageWhen1NodeDoesnotReplyWithAdaptiveTimeout") {
+ std::vector<FastS_FNET_SearchNode> nodes = createNodes(4);
+ for (auto & node : nodes) {
+ query(node);
+ }
+ respond(nodes[0], 25, 30, 50);
+ respond(nodes[2], 25, 30, 50);
+ respond(nodes[3], 25, 30, 50);
+
+ FastS_SearchInfo si = FastS_FNET_Search::computeCoverage(nodes, 1, true);
+ EXPECT_EQUAL(4u, si._nodesQueried);
+ EXPECT_EQUAL(3u, si._nodesReplied);
+ EXPECT_EQUAL(75u, si._coverageDocs);
+ EXPECT_EQUAL(120u, si._activeDocs);
+ EXPECT_EQUAL(200u, si._soonActiveDocs);
+ EXPECT_EQUAL(SearchReply::Coverage::ADAPTIVE_TIMEOUT, si._degradeReason);
+ disconnectNodes(nodes);
+}
+
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchcore/src/tests/fdispatch/search_path/search_path_test.cpp b/searchcore/src/tests/fdispatch/fnet_search/search_path_test.cpp
index b62fb8d14f2..b62fb8d14f2 100644
--- a/searchcore/src/tests/fdispatch/search_path/search_path_test.cpp
+++ b/searchcore/src/tests/fdispatch/fnet_search/search_path_test.cpp
diff --git a/searchcore/src/tests/fdispatch/search_path/.gitignore b/searchcore/src/tests/fdispatch/search_path/.gitignore
deleted file mode 100644
index 7452ecf3ecc..00000000000
--- a/searchcore/src/tests/fdispatch/search_path/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-searchcore_search_path_test_app