diff options
author | 2015-08-20 12:18:28 -0700 | |
---|---|---|
committer | 2015-08-20 12:18:28 -0700 | |
commit | 961eeb0b44af09b816b9b2aa8e331ac549e6b58b (patch) | |
tree | 3ae3ca26c144b9eeeef8bef8623b5692baa607d0 /test/cpp | |
parent | c317f07b5668d6e081a54ad9f6636555f35e0994 (diff) | |
parent | 6f98162b0c8e34476a2188186337a7c29bc6bd10 (diff) |
Merge remote-tracking branch 'upstream/master' into docs
Diffstat (limited to 'test/cpp')
-rw-r--r-- | test/cpp/end2end/shutdown_test.cc | 159 | ||||
-rw-r--r-- | test/cpp/interop/client_helper.cc | 14 | ||||
-rw-r--r-- | test/cpp/interop/client_helper.h | 14 |
3 files changed, 170 insertions, 17 deletions
diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc new file mode 100644 index 0000000000..fccbb13030 --- /dev/null +++ b/test/cpp/end2end/shutdown_test.cc @@ -0,0 +1,159 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "test/core/util/test_config.h" + +#include <thread> + +#include "test/core/util/port.h" +#include "test/cpp/util/echo.grpc.pb.h" +#include "src/core/support/env.h" +#include <grpc++/channel_arguments.h> +#include <grpc++/channel_interface.h> +#include <grpc++/client_context.h> +#include <grpc++/create_channel.h> +#include <grpc++/credentials.h> +#include <grpc++/server.h> +#include <grpc++/server_builder.h> +#include <grpc++/server_context.h> +#include <grpc++/server_credentials.h> +#include <grpc++/status.h> +#include <gtest/gtest.h> +#include <grpc/grpc.h> +#include <grpc/support/sync.h> + +using grpc::cpp::test::util::EchoRequest; +using grpc::cpp::test::util::EchoResponse; + +namespace grpc { +namespace testing { + +class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { + public: + explicit TestServiceImpl(gpr_event* ev) : ev_(ev) {} + + Status Echo(ServerContext* context, const EchoRequest* request, + EchoResponse* response) GRPC_OVERRIDE { + gpr_event_set(ev_, (void*)1); + while (!context->IsCancelled()) { + } + return Status::OK; + } + + private: + gpr_event* ev_; +}; + +class ShutdownTest : public ::testing::Test { + public: + ShutdownTest() : shutdown_(false), service_(&ev_) { gpr_event_init(&ev_); } + + void SetUp() GRPC_OVERRIDE { + port_ = grpc_pick_unused_port_or_die(); + server_ = SetUpServer(port_); + } + + std::unique_ptr<Server> SetUpServer(const int port) { + grpc::string server_address = "localhost:" + to_string(port); + + ServerBuilder builder; + builder.AddListeningPort(server_address, InsecureServerCredentials()); + builder.RegisterService(&service_); + std::unique_ptr<Server> server = builder.BuildAndStart(); + return server; + } + + void TearDown() GRPC_OVERRIDE { GPR_ASSERT(shutdown_); } + + void ResetStub() { + string target = "dns:localhost:" + to_string(port_); + channel_ = CreateChannel(target, InsecureCredentials(), ChannelArguments()); + stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel_)); + } + + string to_string(const int number) { + std::stringstream strs; + strs << number; + return strs.str(); + } + + void SendRequest() { + EchoRequest request; + EchoResponse response; + request.set_message("Hello"); + ClientContext context; + GPR_ASSERT(!shutdown_); + Status s = stub_->Echo(&context, request, &response); + GPR_ASSERT(shutdown_); + } + + protected: + std::shared_ptr<ChannelInterface> channel_; + std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_; + std::unique_ptr<Server> server_; + bool shutdown_; + int port_; + gpr_event ev_; + TestServiceImpl service_; +}; + +// Tests zookeeper state change between two RPCs +// TODO(ctiller): leaked objects in this test +TEST_F(ShutdownTest, ShutdownTest) { + ResetStub(); + + // send the request in a background thread + std::thread thr(std::bind(&ShutdownTest::SendRequest, this)); + + // wait for the server to get the event + gpr_event_wait(&ev_, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + + shutdown_ = true; + + // shutdown should trigger cancellation causing everything to shutdown + auto deadline = + std::chrono::system_clock::now() + std::chrono::microseconds(100); + server_->Shutdown(deadline); + EXPECT_GE(std::chrono::system_clock::now(), deadline); + + thr.join(); +} + +} // namespace testing +} // namespace grpc + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc index 91c8dbc0c3..be652a4add 100644 --- a/test/cpp/interop/client_helper.cc +++ b/test/cpp/interop/client_helper.cc @@ -52,7 +52,6 @@ #include "test/core/security/oauth2_utils.h" #include "test/cpp/util/create_test_channel.h" -#include "src/core/surface/call.h" #include "src/cpp/client/secure_credentials.h" DECLARE_bool(enable_ssl); @@ -141,18 +140,5 @@ std::shared_ptr<Channel> CreateChannelForTestCase( } } -InteropClientContextInspector::InteropClientContextInspector( - const ::grpc::ClientContext& context) - : context_(context) {} - -grpc_compression_algorithm -InteropClientContextInspector::GetCallCompressionAlgorithm() const { - return grpc_call_get_compression_algorithm(context_.call_); -} - -gpr_uint32 InteropClientContextInspector::GetMessageFlags() const { - return grpc_call_get_message_flags(context_.call_); -} - } // namespace testing } // namespace grpc diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h index 3b46d87016..d4c14433a9 100644 --- a/test/cpp/interop/client_helper.h +++ b/test/cpp/interop/client_helper.h @@ -39,6 +39,8 @@ #include <grpc++/config.h> #include <grpc++/channel.h> +#include "src/core/surface/call.h" + namespace grpc { namespace testing { @@ -51,11 +53,17 @@ std::shared_ptr<Channel> CreateChannelForTestCase( class InteropClientContextInspector { public: - InteropClientContextInspector(const ::grpc::ClientContext& context); + InteropClientContextInspector(const ::grpc::ClientContext& context) + : context_(context) {} // Inspector methods, able to peek inside ClientContext, follow. - grpc_compression_algorithm GetCallCompressionAlgorithm() const; - gpr_uint32 GetMessageFlags() const; + grpc_compression_algorithm GetCallCompressionAlgorithm() const { + return grpc_call_get_compression_algorithm(context_.call_); + } + + gpr_uint32 GetMessageFlags() const { + return grpc_call_get_message_flags(context_.call_); + } private: const ::grpc::ClientContext& context_; |