summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/engine/transportserver
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchlib/src/tests/engine/transportserver
Publish
Diffstat (limited to 'searchlib/src/tests/engine/transportserver')
-rw-r--r--searchlib/src/tests/engine/transportserver/.gitignore5
-rw-r--r--searchlib/src/tests/engine/transportserver/CMakeLists.txt12
-rw-r--r--searchlib/src/tests/engine/transportserver/DESC1
-rw-r--r--searchlib/src/tests/engine/transportserver/FILES1
-rw-r--r--searchlib/src/tests/engine/transportserver/transportserver_test.cpp187
5 files changed, 206 insertions, 0 deletions
diff --git a/searchlib/src/tests/engine/transportserver/.gitignore b/searchlib/src/tests/engine/transportserver/.gitignore
new file mode 100644
index 00000000000..09d836e0004
--- /dev/null
+++ b/searchlib/src/tests/engine/transportserver/.gitignore
@@ -0,0 +1,5 @@
+.depend
+Makefile
+transportserver_test
+vlog.txt
+searchlib_transportserver_test_app
diff --git a/searchlib/src/tests/engine/transportserver/CMakeLists.txt b/searchlib/src/tests/engine/transportserver/CMakeLists.txt
new file mode 100644
index 00000000000..502279bc728
--- /dev/null
+++ b/searchlib/src/tests/engine/transportserver/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_transportserver_test_app
+ SOURCES
+ transportserver_test.cpp
+ DEPENDS
+ searchlib
+)
+vespa_add_test(
+ NAME searchlib_transportserver_test_app
+ COMMAND searchlib_transportserver_test_app
+ ENVIRONMENT "VESPA_LOG_TARGET=file:vlog.txt;VESPA_LOG_LEVEL=\"all -spam\""
+)
diff --git a/searchlib/src/tests/engine/transportserver/DESC b/searchlib/src/tests/engine/transportserver/DESC
new file mode 100644
index 00000000000..2fb736a9319
--- /dev/null
+++ b/searchlib/src/tests/engine/transportserver/DESC
@@ -0,0 +1 @@
+transportserver test. Take a look at transportserver.cpp for details.
diff --git a/searchlib/src/tests/engine/transportserver/FILES b/searchlib/src/tests/engine/transportserver/FILES
new file mode 100644
index 00000000000..ec1b60cf739
--- /dev/null
+++ b/searchlib/src/tests/engine/transportserver/FILES
@@ -0,0 +1 @@
+transportserver.cpp
diff --git a/searchlib/src/tests/engine/transportserver/transportserver_test.cpp b/searchlib/src/tests/engine/transportserver/transportserver_test.cpp
new file mode 100644
index 00000000000..af4dc4761bc
--- /dev/null
+++ b/searchlib/src/tests/engine/transportserver/transportserver_test.cpp
@@ -0,0 +1,187 @@
+// Copyright 2016 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/log/log.h>
+LOG_SETUP("transportserver_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/document/base/documentid.h>
+#include <vespa/searchlib/common/packets.h>
+#include <vespa/searchlib/engine/transportserver.h>
+#include <vespa/searchlib/engine/searchapi.h>
+#include <vespa/searchlib/engine/docsumapi.h>
+#include <vespa/searchlib/engine/monitorapi.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/fnet/fnet.h>
+#include <vespa/searchlib/engine/errorcodes.h>
+
+using namespace document;
+using namespace vespalib;
+using namespace search::engine;
+using namespace search::fs4transport;
+
+class SyncServer : public search::engine::SearchServer,
+ public search::engine::DocsumServer,
+ public search::engine::MonitorServer
+{
+private:
+ virtual SearchReply::UP search(SearchRequest::Source request, SearchClient &client);
+ virtual DocsumReply::UP getDocsums(DocsumRequest::Source request, DocsumClient &client);
+ virtual MonitorReply::UP ping(MonitorRequest::UP request, MonitorClient &client);
+
+ SyncServer(const SyncServer &);
+ SyncServer &operator=(const SyncServer &);
+public:
+ SyncServer() {}
+ virtual ~SyncServer() {}
+};
+
+SearchReply::UP
+SyncServer::search(SearchRequest::Source request, SearchClient &)
+{
+ const SearchRequest &req = *request.get();
+ SearchReply::UP reply(new SearchReply());
+ SearchReply &ret = *reply;
+ ret.request = request.release();
+ LOG(info, "responding to search request...");
+ ret.offset = req.offset;
+ return reply;
+}
+
+DocsumReply::UP
+SyncServer::getDocsums(DocsumRequest::Source request, DocsumClient &)
+{
+ DocsumReply::UP reply(new DocsumReply());
+ DocsumReply &ret = *reply;
+ ret.request = request.release();
+ LOG(info, "responding to docsum request...");
+ ret.docsums.resize(1);
+ ret.docsums[0].setData("data", strlen("data"));
+ ret.docsums[0].gid = DocumentId(vespalib::make_string("doc::100")).getGlobalId();
+ return reply;
+}
+
+MonitorReply::UP
+SyncServer::ping(MonitorRequest::UP request, MonitorClient &)
+{
+ MonitorRequest &req = *request;
+ MonitorReply::UP reply(new MonitorReply());
+ MonitorReply &ret = *reply;
+ LOG(info, "responding to monitor request...");
+ ret.timestamp = req.flags;
+ return reply;
+}
+
+TEST("transportserver") {
+ {
+ SyncServer server;
+ TransportServer transport(server, server, server, 0,
+ TransportServer::DEBUG_ALL);
+ ASSERT_TRUE(transport.start());
+ int port = transport.getListenPort();
+ ASSERT_TRUE(port > 0);
+ {
+ FNET_Context ctx;
+ FastOS_ThreadPool pool(128 * 1024);
+ FNET_Transport client;
+ ASSERT_TRUE(client.Start(&pool));
+
+ FNET_PacketQueue adminQ;
+ FNET_Connection *conn = client.Connect(make_string("tcp/localhost:%d", port).c_str(),
+ &FS4PersistentPacketStreamer::Instance, &adminQ);
+ ASSERT_TRUE(conn != 0);
+ {
+ FS4Packet_MONITORQUERYX *mq = new FS4Packet_MONITORQUERYX();
+ mq->_qflags = 30;
+ mq->_features |= MQF_QFLAGS;
+ conn->PostPacket(mq, FNET_NOID);
+ FNET_Packet *p = adminQ.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_MONITORRESULTX);
+ FS4Packet_MONITORRESULTX *r = (FS4Packet_MONITORRESULTX*)p;
+ EXPECT_EQUAL(r->_timestamp, 30u);
+ p->Free();
+ }
+ {
+ FNET_PacketQueue q;
+ FNET_Channel *ch = conn->OpenChannel(&q, FNET_Context());
+ FS4Packet_QUERYX *qx = new FS4Packet_QUERYX();
+ qx->_features |= QF_PARSEDQUERY;
+ qx->_offset = 100;
+ ch->Send(qx);
+ FNET_Packet *p = q.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_QUERYRESULTX);
+ FS4Packet_QUERYRESULTX *r = (FS4Packet_QUERYRESULTX*)p;
+ EXPECT_EQUAL(r->_offset, 100u);
+ p->Free();
+ ch->CloseAndFree();
+ }
+ {
+ FS4Packet_MONITORQUERYX *mq = new FS4Packet_MONITORQUERYX();
+ mq->_qflags = 40;
+ mq->_features |= MQF_QFLAGS;
+ conn->PostPacket(mq, FNET_NOID);
+ FNET_Packet *p = adminQ.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_MONITORRESULTX);
+ FS4Packet_MONITORRESULTX *r = (FS4Packet_MONITORRESULTX*)p;
+ EXPECT_EQUAL(r->_timestamp, 40u);
+ p->Free();
+ }
+ {
+ FNET_PacketQueue q;
+ FNET_Channel *ch = conn->OpenChannel(&q, FNET_Context());
+ FS4Packet_GETDOCSUMSX *qdx = new FS4Packet_GETDOCSUMSX();
+ ch->Send(qdx);
+ FNET_Packet *p = q.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_DOCSUM);
+ FS4Packet_DOCSUM *r = (FS4Packet_DOCSUM*)p;
+ EXPECT_EQUAL(r->getGid(), DocumentId("doc::100").getGlobalId());
+ p->Free();
+ p = q.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_EOL);
+ p->Free();
+ ch->CloseAndFree();
+ }
+ {
+ FS4Packet_MONITORQUERYX *mq = new FS4Packet_MONITORQUERYX();
+ mq->_qflags = 50;
+ mq->_features |= MQF_QFLAGS;
+ conn->PostPacket(mq, FNET_NOID);
+ FNET_Packet *p = adminQ.DequeuePacket(60000, &ctx);
+ ASSERT_TRUE(p != 0);
+ ASSERT_TRUE(p->GetPCODE() == PCODE_MONITORRESULTX);
+ FS4Packet_MONITORRESULTX *r = (FS4Packet_MONITORRESULTX*)p;
+ EXPECT_EQUAL(r->_timestamp, 50u);
+ p->Free();
+ }
+ // shut down client
+ conn->CloseAdminChannel();
+ client.Close(conn);
+ conn->SubRef();
+ client.sync();
+ client.ShutDown(true);
+ pool.Close();
+ }
+
+ }
+}
+
+void printError(ErrorCode ecode) {
+ fprintf(stderr, "error code %u: '%s'\n", ecode, getStringFromErrorCode(ecode));
+}
+
+TEST("print errors") {
+ printError(ECODE_NO_ERROR);
+ printError(ECODE_GENERAL_ERROR);
+ printError(ECODE_QUERY_PARSE_ERROR);
+ printError(ECODE_ALL_PARTITIONS_DOWN);
+ printError(ECODE_ILLEGAL_DATASET);
+ printError(ECODE_OVERLOADED);
+ printError(ECODE_NOT_IMPLEMENTED);
+ printError(ECODE_QUERY_NOT_ALLOWED);
+ printError(ECODE_TIMEOUT);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }