server_builder_with_socket_mutator_test.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. *
  3. * Copyright 2017 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include <memory>
  19. #include <gtest/gtest.h>
  20. #include <grpc/grpc.h>
  21. #include <grpcpp/impl/codegen/config.h>
  22. #include <grpcpp/server.h>
  23. #include <grpcpp/server_builder.h>
  24. #include "src/core/lib/iomgr/socket_mutator.h"
  25. #include "src/proto/grpc/testing/echo.grpc.pb.h"
  26. #include "test/core/util/port.h"
  27. #include "test/core/util/test_config.h"
  28. /* This test does a sanity check that grpc_socket_mutator's
  29. * are used by servers. It's meant to protect code and end-to-end
  30. * tests that rely on this functionality but which live outside
  31. * of the grpc github repo. */
  32. namespace grpc {
  33. namespace {
  34. bool mock_socket_mutator_mutate_fd(int, grpc_socket_mutator*);
  35. int mock_socket_mutator_compare(grpc_socket_mutator*, grpc_socket_mutator*);
  36. void mock_socket_mutator_destroy(grpc_socket_mutator*);
  37. const grpc_socket_mutator_vtable mock_socket_mutator_vtable = {
  38. mock_socket_mutator_mutate_fd,
  39. mock_socket_mutator_compare,
  40. mock_socket_mutator_destroy,
  41. nullptr,
  42. };
  43. class MockSocketMutator : public grpc_socket_mutator {
  44. public:
  45. MockSocketMutator() : mutate_fd_call_count_(0) {
  46. grpc_socket_mutator_init(this, &mock_socket_mutator_vtable);
  47. }
  48. int mutate_fd_call_count_;
  49. };
  50. bool mock_socket_mutator_mutate_fd(int /*fd*/, grpc_socket_mutator* m) {
  51. MockSocketMutator* s = reinterpret_cast<MockSocketMutator*>(m);
  52. s->mutate_fd_call_count_++;
  53. return true;
  54. }
  55. int mock_socket_mutator_compare(grpc_socket_mutator* a,
  56. grpc_socket_mutator* b) {
  57. return reinterpret_cast<uintptr_t>(a) - reinterpret_cast<uintptr_t>(b);
  58. }
  59. void mock_socket_mutator_destroy(grpc_socket_mutator* m) {
  60. MockSocketMutator* s = reinterpret_cast<MockSocketMutator*>(m);
  61. delete s;
  62. }
  63. class MockSocketMutatorServerBuilderOption : public grpc::ServerBuilderOption {
  64. public:
  65. explicit MockSocketMutatorServerBuilderOption(
  66. MockSocketMutator* mock_socket_mutator)
  67. : mock_socket_mutator_(mock_socket_mutator) {}
  68. void UpdateArguments(ChannelArguments* args) override {
  69. args->SetSocketMutator(mock_socket_mutator_);
  70. }
  71. void UpdatePlugins(
  72. std::vector<std::unique_ptr<ServerBuilderPlugin>>*) override{};
  73. MockSocketMutator* mock_socket_mutator_;
  74. };
  75. class ServerBuilderWithSocketMutatorTest : public ::testing::Test {
  76. protected:
  77. static void SetUpTestCase() { grpc_init(); }
  78. static void TearDownTestCase() { grpc_shutdown(); }
  79. };
  80. TEST_F(ServerBuilderWithSocketMutatorTest, CreateServerWithSocketMutator) {
  81. auto address = "localhost:" + std::to_string(grpc_pick_unused_port_or_die());
  82. auto mock_socket_mutator = new MockSocketMutator();
  83. std::unique_ptr<grpc::ServerBuilderOption> mock_socket_mutator_builder_option(
  84. new MockSocketMutatorServerBuilderOption(mock_socket_mutator));
  85. testing::EchoTestService::Service echo_service;
  86. EXPECT_EQ(mock_socket_mutator->mutate_fd_call_count_, 0);
  87. ServerBuilder builder;
  88. builder.RegisterService(&echo_service);
  89. builder.AddListeningPort(address, InsecureServerCredentials());
  90. builder.SetOption(std::move(mock_socket_mutator_builder_option));
  91. std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
  92. EXPECT_NE(server, nullptr);
  93. // Only assert that the socket mutator was used.
  94. EXPECT_GE(mock_socket_mutator->mutate_fd_call_count_, 1);
  95. server->Shutdown();
  96. }
  97. } // namespace
  98. } // namespace grpc
  99. int main(int argc, char** argv) {
  100. grpc::testing::TestEnvironment env(argc, argv);
  101. ::testing::InitGoogleTest(&argc, argv);
  102. int ret = RUN_ALL_TESTS();
  103. return ret;
  104. }