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