aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/cpp/server
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2018-05-04 17:18:27 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2018-05-08 11:49:55 -0700
commitac8b72f75b2fbd215dbffa286b7b893b9fb061e7 (patch)
tree0c25bee4a70a93ab2704f015dd6ed88e3511d6d3 /test/cpp/server
parent2d894a8c3b6bd0a236f14c5630faced4caba0a55 (diff)
Add a test that tcp server posix consumes socket mutators
Diffstat (limited to 'test/cpp/server')
-rw-r--r--test/cpp/server/BUILD13
-rw-r--r--test/cpp/server/server_builder_with_socket_mutator_test.cc116
2 files changed, 129 insertions, 0 deletions
diff --git a/test/cpp/server/BUILD b/test/cpp/server/BUILD
index 7538845803..3f89d6e26e 100644
--- a/test/cpp/server/BUILD
+++ b/test/cpp/server/BUILD
@@ -32,6 +32,19 @@ grpc_cc_test(
)
grpc_cc_test(
+ name = "server_builder_with_socket_mutator_test",
+ srcs = ["server_builder_with_socket_mutator_test.cc"],
+ deps = [
+ "//:grpc++_unsecure",
+ "//src/proto/grpc/testing:echo_proto",
+ "//test/core/util:grpc_test_util_unsecure",
+ ],
+ external_deps = [
+ "gtest",
+ ],
+)
+
+grpc_cc_test(
name = "server_request_call_test",
srcs = ["server_request_call_test.cc"],
deps = [
diff --git a/test/cpp/server/server_builder_with_socket_mutator_test.cc b/test/cpp/server/server_builder_with_socket_mutator_test.cc
new file mode 100644
index 0000000000..5c7dd696c9
--- /dev/null
+++ b/test/cpp/server/server_builder_with_socket_mutator_test.cc
@@ -0,0 +1,116 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * 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 <grpcpp/impl/codegen/config.h>
+#include <gtest/gtest.h>
+
+#include <grpcpp/server.h>
+#include <grpcpp/server_builder.h>
+
+#include <grpc/grpc.h>
+#include <memory>
+
+#include "src/core/lib/iomgr/socket_mutator.h"
+#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "test/core/util/port.h"
+
+/* This test does a sanity check that grpc_socket_mutator's
+ * are used by servers. It's meant to protect code and end-to-end
+ * tests that rely on this functionality but which live outside
+ * of the grpc github repo. */
+
+namespace grpc {
+namespace {
+
+bool mock_socket_mutator_mutate_fd(int, grpc_socket_mutator*);
+int mock_socket_mutator_compare(grpc_socket_mutator*, grpc_socket_mutator*);
+void mock_socket_mutator_destroy(grpc_socket_mutator*);
+
+const grpc_socket_mutator_vtable mock_socket_mutator_vtable = {
+ mock_socket_mutator_mutate_fd,
+ mock_socket_mutator_compare,
+ mock_socket_mutator_destroy,
+};
+
+class MockSocketMutator : public grpc_socket_mutator {
+ public:
+ MockSocketMutator() : mutate_fd_call_count_(0) {
+ grpc_socket_mutator_init(this, &mock_socket_mutator_vtable);
+ }
+ int mutate_fd_call_count_;
+};
+
+bool mock_socket_mutator_mutate_fd(int fd, grpc_socket_mutator* m) {
+ MockSocketMutator* s = reinterpret_cast<MockSocketMutator*>(m);
+ s->mutate_fd_call_count_++;
+ return true;
+}
+
+int mock_socket_mutator_compare(grpc_socket_mutator* a,
+ grpc_socket_mutator* b) {
+ return (uintptr_t)a - (uintptr_t)b;
+}
+
+void mock_socket_mutator_destroy(grpc_socket_mutator* m) {
+ MockSocketMutator* s = reinterpret_cast<MockSocketMutator*>(m);
+ delete s;
+}
+
+class MockSocketMutatorServerBuilderOption : public grpc::ServerBuilderOption {
+ public:
+ MockSocketMutatorServerBuilderOption(MockSocketMutator* mock_socket_mutator)
+ : mock_socket_mutator_(mock_socket_mutator) {}
+
+ void UpdateArguments(ChannelArguments* args) override {
+ args->SetSocketMutator(mock_socket_mutator_);
+ }
+
+ void UpdatePlugins(
+ std::vector<std::unique_ptr<ServerBuilderPlugin>>*) override{};
+
+ MockSocketMutator* mock_socket_mutator_;
+};
+
+TEST(ServerBuilderWithSocketMutatorTest, CreateServerWithSocketMutator) {
+ auto address = "localhost:" + std::to_string(grpc_pick_unused_port_or_die());
+ auto mock_socket_mutator = new MockSocketMutator();
+ std::unique_ptr<grpc::ServerBuilderOption> mock_socket_mutator_builder_option(
+ new MockSocketMutatorServerBuilderOption(mock_socket_mutator));
+ testing::EchoTestService::Service echo_service;
+ EXPECT_EQ(mock_socket_mutator->mutate_fd_call_count_, 0);
+ ServerBuilder builder;
+ builder.RegisterService(&echo_service);
+ builder.AddListeningPort(address, InsecureServerCredentials());
+ builder.SetOption(std::move(mock_socket_mutator_builder_option));
+ std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
+ EXPECT_NE(server, nullptr);
+ // Only assert that the socket mutator was used.
+ EXPECT_GE(mock_socket_mutator->mutate_fd_call_count_, 1);
+ server->Shutdown();
+}
+
+} // namespace
+} // namespace grpc
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ grpc_init();
+ int ret = RUN_ALL_TESTS();
+ grpc_shutdown();
+ return ret;
+}