parse_address_test.cc
Go to the documentation of this file.
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 
20 
21 #include <string.h>
22 #ifdef GRPC_HAVE_UNIX_SOCKET
23 #include <sys/un.h>
24 #endif
25 
26 #include <grpc/grpc.h>
27 #include <grpc/support/log.h>
28 
34 
35 #ifdef GRPC_HAVE_UNIX_SOCKET
36 
37 static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {
40  if (!uri.ok()) {
41  gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
42  GPR_ASSERT(uri.ok());
43  }
45 
46  GPR_ASSERT(1 == grpc_parse_uri(*uri, &addr));
47  struct sockaddr_un* addr_un =
48  reinterpret_cast<struct sockaddr_un*>(addr.addr);
49  GPR_ASSERT(AF_UNIX == addr_un->sun_family);
50  GPR_ASSERT(0 == strcmp(addr_un->sun_path, pathname));
51 }
52 
53 static void test_grpc_parse_unix_abstract(const char* uri_text,
54  const char* pathname) {
57  if (!uri.ok()) {
58  gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
59  GPR_ASSERT(uri.ok());
60  }
62 
63  GPR_ASSERT(1 == grpc_parse_uri(*uri, &addr));
64  struct sockaddr_un* addr_un =
65  reinterpret_cast<struct sockaddr_un*>(addr.addr);
66  GPR_ASSERT(AF_UNIX == addr_un->sun_family);
67  GPR_ASSERT('\0' == addr_un->sun_path[0]);
68  GPR_ASSERT(0 == strncmp(addr_un->sun_path + 1, pathname, strlen(pathname)));
69 }
70 
71 #else /* GRPC_HAVE_UNIX_SOCKET */
72 
73 static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {}
74 static void test_grpc_parse_unix_abstract(const char* uri_text,
75  const char* pathname) {}
76 
77 #endif /* GRPC_HAVE_UNIX_SOCKET */
78 
79 static void test_grpc_parse_ipv4(const char* uri_text, const char* host,
80  unsigned short port) {
83  if (!uri.ok()) {
84  gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
85  GPR_ASSERT(uri.ok());
86  }
88  char ntop_buf[GRPC_INET_ADDRSTRLEN];
89 
90  GPR_ASSERT(1 == grpc_parse_ipv4(*uri, &addr));
91  grpc_sockaddr_in* addr_in = reinterpret_cast<grpc_sockaddr_in*>(addr.addr);
92  GPR_ASSERT(GRPC_AF_INET == addr_in->sin_family);
93  GPR_ASSERT(nullptr != grpc_inet_ntop(GRPC_AF_INET, &addr_in->sin_addr,
94  ntop_buf, sizeof(ntop_buf)));
95  GPR_ASSERT(0 == strcmp(ntop_buf, host));
96  GPR_ASSERT(grpc_ntohs(addr_in->sin_port) == port);
97 }
98 
99 static void test_grpc_parse_ipv6(const char* uri_text, const char* host,
100  unsigned short port, uint32_t scope_id) {
103  if (!uri.ok()) {
104  gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
105  GPR_ASSERT(uri.ok());
106  }
108  char ntop_buf[GRPC_INET6_ADDRSTRLEN];
109  GPR_ASSERT(1 == grpc_parse_ipv6(*uri, &addr));
110  grpc_sockaddr_in6* addr_in6 = reinterpret_cast<grpc_sockaddr_in6*>(addr.addr);
111  GPR_ASSERT(GRPC_AF_INET6 == addr_in6->sin6_family);
112  GPR_ASSERT(nullptr != grpc_inet_ntop(GRPC_AF_INET6, &addr_in6->sin6_addr,
113  ntop_buf, sizeof(ntop_buf)));
114  GPR_ASSERT(0 == strcmp(ntop_buf, host));
115  GPR_ASSERT(grpc_ntohs(addr_in6->sin6_port) == port);
116  GPR_ASSERT(addr_in6->sin6_scope_id == scope_id);
117 }
118 
119 /* Test parsing invalid ipv6 addresses (valid uri_text but invalid ipv6 addr) */
120 static void test_grpc_parse_ipv6_invalid(const char* uri_text) {
123  if (!uri.ok()) {
124  gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
125  GPR_ASSERT(uri.ok());
126  }
128  GPR_ASSERT(!grpc_parse_ipv6(*uri, &addr));
129 }
130 
131 int main(int argc, char** argv) {
132  grpc::testing::TestEnvironment env(&argc, argv);
133  grpc_init();
134 
135  test_grpc_parse_unix("unix:/path/name", "/path/name");
136  test_grpc_parse_unix_abstract("unix-abstract:foobar", "foobar");
137  test_grpc_parse_ipv4("ipv4:192.0.2.1:12345", "192.0.2.1", 12345);
138  test_grpc_parse_ipv6("ipv6:[2001:db8::1]:12345", "2001:db8::1", 12345, 0);
139  test_grpc_parse_ipv6("ipv6:[2001:db8::1%252]:12345", "2001:db8::1", 12345, 2);
140 
141  /* Address length greater than GRPC_INET6_ADDRSTRLEN */
143  "ipv6:WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW45%"
144  "25v6:45%25x$1*");
145 
146  grpc_shutdown();
147 }
log.h
sockaddr_utils.h
generate.env
env
Definition: generate.py:37
test_grpc_parse_unix
static void test_grpc_parse_unix(const char *uri_text, const char *pathname)
Definition: parse_address_test.cc:73
test_grpc_parse_ipv4
static void test_grpc_parse_ipv4(const char *uri_text, const char *host, unsigned short port)
Definition: parse_address_test.cc:79
string.h
grpc_parse_ipv6
bool grpc_parse_ipv6(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:282
grpc_resolved_address
Definition: resolved_address.h:34
grpc_ntohs
uint16_t grpc_ntohs(uint16_t netshort)
grpc_inet_ntop
const char * grpc_inet_ntop(int af, const void *src, char *dst, size_t size)
grpc_core::URI::Parse
static absl::StatusOr< URI > Parse(absl::string_view uri_text)
Definition: uri_parser.cc:209
sockaddr.h
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
grpc_parse_uri
bool grpc_parse_uri(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:293
socket_utils.h
parse_address.h
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc.h
main
int main(int argc, char **argv)
Definition: parse_address_test.cc:131
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
test_grpc_parse_ipv6_invalid
static void test_grpc_parse_ipv6_invalid(const char *uri_text)
Definition: parse_address_test.cc:120
grpc_core::ExecCtx
Definition: exec_ctx.h:97
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
test_config.h
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
exec_ctx.h
test_grpc_parse_ipv6
static void test_grpc_parse_ipv6(const char *uri_text, const char *host, unsigned short port, uint32_t scope_id)
Definition: parse_address_test.cc:99
test_grpc_parse_unix_abstract
static void test_grpc_parse_unix_abstract(const char *uri_text, const char *pathname)
Definition: parse_address_test.cc:74
grpc_parse_ipv4
bool grpc_parse_ipv4(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:187
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:49