server_test.cc 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. *
  3. * Copyright 2015 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 <string>
  19. #include "absl/strings/str_cat.h"
  20. #include <grpc/grpc.h>
  21. #include <grpc/grpc_security.h>
  22. #include <grpc/support/alloc.h>
  23. #include <grpc/support/log.h>
  24. #include "src/core/lib/gprpp/host_port.h"
  25. #include "src/core/lib/iomgr/resolve_address.h"
  26. #include "src/core/lib/security/credentials/fake/fake_credentials.h"
  27. #include "test/core/util/port.h"
  28. #include "test/core/util/test_config.h"
  29. void test_register_method_fail(void) {
  30. grpc_server* server = grpc_server_create(nullptr, nullptr);
  31. void* method;
  32. void* method_old;
  33. method = grpc_server_register_method(server, nullptr, nullptr,
  34. GRPC_SRM_PAYLOAD_NONE, 0);
  35. GPR_ASSERT(method == nullptr);
  36. method_old =
  37. grpc_server_register_method(server, "m", "h", GRPC_SRM_PAYLOAD_NONE, 0);
  38. GPR_ASSERT(method_old != nullptr);
  39. method = grpc_server_register_method(
  40. server, "m", "h", GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, 0);
  41. GPR_ASSERT(method == nullptr);
  42. method_old =
  43. grpc_server_register_method(server, "m2", "h2", GRPC_SRM_PAYLOAD_NONE,
  44. GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST);
  45. GPR_ASSERT(method_old != nullptr);
  46. method =
  47. grpc_server_register_method(server, "m2", "h2", GRPC_SRM_PAYLOAD_NONE, 0);
  48. GPR_ASSERT(method == nullptr);
  49. method = grpc_server_register_method(
  50. server, "m2", "h2", GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER,
  51. GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST);
  52. GPR_ASSERT(method == nullptr);
  53. grpc_server_destroy(server);
  54. }
  55. void test_request_call_on_no_server_cq(void) {
  56. grpc_completion_queue* cc = grpc_completion_queue_create_for_next(nullptr);
  57. grpc_server* server = grpc_server_create(nullptr, nullptr);
  58. GPR_ASSERT(GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE ==
  59. grpc_server_request_call(server, nullptr, nullptr, nullptr, cc, cc,
  60. nullptr));
  61. GPR_ASSERT(GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE ==
  62. grpc_server_request_registered_call(server, nullptr, nullptr,
  63. nullptr, nullptr, nullptr, cc,
  64. cc, nullptr));
  65. grpc_completion_queue_destroy(cc);
  66. grpc_server_destroy(server);
  67. }
  68. void test_bind_server_twice(void) {
  69. grpc_arg a = grpc_channel_arg_integer_create(
  70. const_cast<char*>(GRPC_ARG_ALLOW_REUSEPORT), 0);
  71. grpc_channel_args args = {1, &a};
  72. grpc_server* server1 = grpc_server_create(&args, nullptr);
  73. grpc_server* server2 = grpc_server_create(&args, nullptr);
  74. grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr);
  75. int port = grpc_pick_unused_port_or_die();
  76. std::string addr = absl::StrCat("[::]:", port);
  77. grpc_server_register_completion_queue(server1, cq, nullptr);
  78. grpc_server_register_completion_queue(server2, cq, nullptr);
  79. GPR_ASSERT(0 == grpc_server_add_http2_port(server2, addr.c_str(), nullptr));
  80. grpc_server_credentials* insecure_creds =
  81. grpc_insecure_server_credentials_create();
  82. GPR_ASSERT(port ==
  83. grpc_server_add_http2_port(server1, addr.c_str(), insecure_creds));
  84. grpc_server_credentials_release(insecure_creds);
  85. grpc_server_credentials* another_insecure_creds =
  86. grpc_insecure_server_credentials_create();
  87. GPR_ASSERT(0 == grpc_server_add_http2_port(server2, addr.c_str(),
  88. another_insecure_creds));
  89. grpc_server_credentials_release(another_insecure_creds);
  90. grpc_server_credentials* fake_creds =
  91. grpc_fake_transport_security_server_credentials_create();
  92. GPR_ASSERT(0 ==
  93. grpc_server_add_http2_port(server2, addr.c_str(), fake_creds));
  94. grpc_server_credentials_release(fake_creds);
  95. grpc_server_shutdown_and_notify(server1, cq, nullptr);
  96. grpc_server_shutdown_and_notify(server2, cq, nullptr);
  97. grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_MONOTONIC), nullptr);
  98. grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_MONOTONIC), nullptr);
  99. grpc_server_destroy(server1);
  100. grpc_server_destroy(server2);
  101. grpc_completion_queue_destroy(cq);
  102. }
  103. void test_bind_server_to_addr(const char* host, bool secure) {
  104. int port = grpc_pick_unused_port_or_die();
  105. std::string addr = grpc_core::JoinHostPort(host, port);
  106. gpr_log(GPR_INFO, "Test bind to %s", addr.c_str());
  107. grpc_server* server = grpc_server_create(nullptr, nullptr);
  108. if (secure) {
  109. grpc_server_credentials* fake_creds =
  110. grpc_fake_transport_security_server_credentials_create();
  111. GPR_ASSERT(grpc_server_add_http2_port(server, addr.c_str(), fake_creds));
  112. grpc_server_credentials_release(fake_creds);
  113. } else {
  114. grpc_server_credentials* insecure_creds =
  115. grpc_insecure_server_credentials_create();
  116. GPR_ASSERT(
  117. grpc_server_add_http2_port(server, addr.c_str(), insecure_creds));
  118. grpc_server_credentials_release(insecure_creds);
  119. }
  120. grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr);
  121. grpc_server_register_completion_queue(server, cq, nullptr);
  122. grpc_server_start(server);
  123. grpc_server_shutdown_and_notify(server, cq, nullptr);
  124. grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_MONOTONIC), nullptr);
  125. grpc_server_destroy(server);
  126. grpc_completion_queue_destroy(cq);
  127. }
  128. static bool external_dns_works(const char* host) {
  129. return grpc_core::GetDNSResolver()->ResolveNameBlocking(host, "80").ok();
  130. }
  131. static void test_bind_server_to_addrs(const char** addrs, size_t n) {
  132. for (size_t i = 0; i < n; i++) {
  133. test_bind_server_to_addr(addrs[i], false);
  134. test_bind_server_to_addr(addrs[i], true);
  135. }
  136. }
  137. int main(int argc, char** argv) {
  138. grpc::testing::TestEnvironment env(argc, argv);
  139. grpc_init();
  140. test_register_method_fail();
  141. test_request_call_on_no_server_cq();
  142. test_bind_server_twice();
  143. static const char* addrs[] = {
  144. "::1", "127.0.0.1", "::ffff:127.0.0.1", "localhost", "0.0.0.0", "::",
  145. };
  146. test_bind_server_to_addrs(addrs, GPR_ARRAY_SIZE(addrs));
  147. if (external_dns_works("loopback46.unittest.grpc.io")) {
  148. static const char* dns_addrs[] = {
  149. "loopback46.unittest.grpc.io",
  150. "loopback4.unittest.grpc.io",
  151. };
  152. test_bind_server_to_addrs(dns_addrs, GPR_ARRAY_SIZE(dns_addrs));
  153. }
  154. grpc_shutdown();
  155. return 0;
  156. }