/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace apache::thrift; using namespace apache::thrift::concurrency; using namespace apache::thrift::test; using std::string; class TestServiceHandler : public apache::thrift::ServiceHandler { public: void sendResponse(string& _return, int64_t size) override { if (size >= 0) { usleep(size); } _return = "test" + boost::lexical_cast(size); } }; std::unique_ptr createHTTP2RoutingHandler( ThriftServer& server) { auto h2_options = std::make_unique(); h2_options->threads = static_cast(server.getNumIOWorkerThreads()); h2_options->idleTimeout = server.getIdleTimeout(); h2_options->shutdownOn = {SIGINT, SIGTERM}; return std::make_unique( std::move(h2_options), server.getThriftProcessor(), server); } std::shared_ptr createHttpServer() { auto handler = std::make_shared(); auto server = std::make_shared(); server->setAddress({"::1", 0}); server->setInterface(handler); server->setNumIOWorkerThreads(1); server->setThreadFactory(std::make_shared()); server->setThreadManagerType(ThriftServer::ThreadManagerType::SIMPLE); server->addRoutingHandler(createHTTP2RoutingHandler(*server)); return server; } TEST(HTTPClientChannelTest, Basic) { ScopedServerInterfaceThread runner(createHttpServer()); const auto addr = runner.getAddress(); folly::EventBase eb; folly::AsyncTransport::UniquePtr socket(new folly::AsyncSocket(&eb, addr)); TestServiceAsyncClient client( HTTPClientChannel::newHTTP2Channel(std::move(socket))); std::string ret; client.sync_sendResponse(ret, 42); EXPECT_EQ(ret, "test42"); } TEST(HTTPClientChannelTest, NoGoodChannel) { ScopedServerInterfaceThread runner(createHttpServer()); const auto addr = runner.getAddress(); folly::EventBase eb; folly::AsyncTransport::UniquePtr socket(new folly::AsyncSocket(&eb, addr)); auto channel = HTTPClientChannel::newHTTP2Channel(std::move(socket)); EXPECT_TRUE(channel->good()); channel->getTransport()->close(); EXPECT_FALSE(channel->good()); }