diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchlib/src/tests/engine/transportserver |
Publish
Diffstat (limited to 'searchlib/src/tests/engine/transportserver')
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(); } |