TEST(ThriftServer, CallbackOrderingTest) { apache::thrift::TestThriftServerFactory<TestInterface> factory; auto server = factory.create(); auto serverHandler = std::make_shared<TestServerEventHandler>(); TProcessorBase::addProcessorEventHandlerFactory(serverHandler); server->setServerEventHandler(serverHandler); ScopedServerThread sst(server); TEventBase base; std::shared_ptr<TAsyncSocket> socket( TAsyncSocket::newSocket(&base, *sst.getAddress())); TestServiceAsyncClient client( std::unique_ptr<HeaderClientChannel, apache::thrift::async::TDelayedDestruction::Destructor>( new HeaderClientChannel(socket))); client.noResponse([](ClientReceiveState&& state){}, 10000); base.tryRunAfterDelay([&](){ socket->closeNow(); }, 1); base.tryRunAfterDelay([&](){ base.terminateLoopSoon(); }, 20); base.loopForever(); serverHandler->check(); TProcessorBase::removeProcessorEventHandlerFactory(serverHandler); }
void runTest(std::function<void(HeaderClientChannel* channel)> setup) { ScopedServerThread sst(getServer()); TEventBase base; auto channel = getClientChannel(&base, *sst.getAddress()); setup(channel.get()); TestServiceAsyncClient client(std::move(channel)); Countdown c(3, [&base](){base.terminateLoopSoon();}); client.sendResponse([&base,&client,&c](ClientReceiveState&& state) { EXPECT_FALSE(state.isException()); EXPECT_TRUE(state.isSecurityActive()); std::string res; try { TestServiceAsyncClient::recv_sendResponse(res, state); } catch(const std::exception&) { EXPECT_TRUE(false); } EXPECT_EQ(res, "10"); c.down(); }, 10); // fail on time out base.tryRunAfterDelay([] {EXPECT_TRUE(false);}, 5000); base.tryRunAfterDelay([&client,&base,&c] { client.sendResponse([&base,&c](ClientReceiveState&& state) { EXPECT_FALSE(state.isException()); EXPECT_TRUE(state.isSecurityActive()); std::string res; try { TestServiceAsyncClient::recv_sendResponse(res, state); } catch(const std::exception&) { EXPECT_TRUE(false); } EXPECT_EQ(res, "10"); c.down(); }, 10); client.sendResponse([&base,&c](ClientReceiveState&& state) { EXPECT_FALSE(state.isException()); EXPECT_TRUE(state.isSecurityActive()); std::string res; try { TestServiceAsyncClient::recv_sendResponse(res, state); } catch(const std::exception&) { EXPECT_TRUE(false); } EXPECT_EQ(res, "10"); c.down(); }, 10); }, 1); base.loopForever(); }
TEST(Duplex, DuplexTest) { enum {START=1, COUNT=10, INTERVAL=5}; ScopedServerThread sst(getServer()); TEventBase base; std::shared_ptr<TAsyncSocket> socket( TAsyncSocket::newSocket(&base, *sst.getAddress())); auto duplexChannel = std::make_shared<DuplexChannel>(DuplexChannel::Who::CLIENT, socket); DuplexServiceAsyncClient client(duplexChannel->getClientChannel()); bool success = false; ThriftServer clients_server(duplexChannel->getServerChannel()); clients_server.setInterface(std::make_shared<DuplexClientInterface>( START, COUNT, success)); clients_server.serve(); client.registerForUpdates([](ClientReceiveState&& state) { EXPECT_FALSE(state.isException()); bool res = DuplexServiceAsyncClient::recv_registerForUpdates(state); EXPECT_TRUE(res); }, START, COUNT, INTERVAL); // fail on time out base.tryRunAfterDelay([] {EXPECT_TRUE(false);}, 5000); base.loopForever(); EXPECT_TRUE(success); }
TEST(ThriftServer, IdleTimeoutAfterTest) { ScopedServerThread sst(getServer()); TEventBase base; std::shared_ptr<TAsyncSocket> socket( TAsyncSocket::newSocket(&base, *sst.getAddress())); auto client_channel = HeaderClientChannel::newChannel(socket); auto client_channelp = client_channel.get(); CloseChecker checker; client_channel->setCloseCallback(&checker); TestServiceAsyncClient client(std::move(client_channel)); std::string ret; client.sync_sendResponse(ret, 20); EXPECT_FALSE(checker.getClosed()); base.tryRunAfterDelay([&base](){ base.terminateLoopSoon(); }, 200); base.loopForever(); EXPECT_TRUE(checker.getClosed()); client_channelp->setCloseCallback(nullptr); }
TEST(ThriftServer, ShutdownSocketSetTest) { apache::thrift::TestThriftServerFactory<TestInterface> factory; auto server = factory.create(); ScopedServerThread sst(server); TEventBase base; ReadCallbackTest cb; std::shared_ptr<TAsyncSocket> socket2( TAsyncSocket::newSocket(&base, *sst.getAddress())); socket2->setReadCallback(&cb); base.tryRunAfterDelay([&](){ server->immediateShutdown(true); }, 10); base.tryRunAfterDelay([&](){ base.terminateLoopSoon(); }, 30); base.loopForever(); EXPECT_EQ(cb.eof, true); }
TEST(ThriftServer, IdleTimeoutTest) { ScopedServerThread sst(getServer()); TEventBase base; std::shared_ptr<TAsyncSocket> socket( TAsyncSocket::newSocket(&base, *sst.getAddress())); auto client_channel = HeaderClientChannel::newChannel(socket); CloseChecker checker; client_channel->setCloseCallback(&checker); base.tryRunAfterDelay([&base](){ base.terminateLoopSoon(); }, 100); base.loopForever(); EXPECT_TRUE(checker.getClosed()); client_channel->setCloseCallback(nullptr); }
void duplexTest(const apache::thrift::SecurityMech mech) { enum {START=1, COUNT=3, INTERVAL=1}; ScopedServerThread duplexsst(getDuplexServer()); TEventBase base; std::shared_ptr<TAsyncSocket> socket( TAsyncSocket::newSocket(&base, *duplexsst.getAddress())); auto duplexChannel = std::make_shared<DuplexChannel>(DuplexChannel::Who::CLIENT, socket); enableSecurity(duplexChannel->getClientChannel().get(), mech); DuplexServiceAsyncClient client(duplexChannel->getClientChannel()); bool success = false; ThriftServer clients_server(duplexChannel->getServerChannel()); clients_server.setInterface(std::make_shared<DuplexClientInterface>( START, COUNT, success)); clients_server.serve(); client.registerForUpdates([](ClientReceiveState&& state) { EXPECT_FALSE(state.isException()); EXPECT_TRUE(state.isSecurityActive()); try { bool res = DuplexServiceAsyncClient::recv_registerForUpdates(state); EXPECT_TRUE(res); } catch (const std::exception&) { EXPECT_TRUE(false); } }, START, COUNT, INTERVAL); // fail on time out base.tryRunAfterDelay([] {EXPECT_TRUE(false);}, 5000); base.loopForever(); EXPECT_TRUE(success); }