blob: 784c66f004c86c848d4d4f78ece9dfb4c57bd6b9 [file] [log] [blame]
Josh Gao3fb517c2016-09-19 17:31:55 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "socket_spec.h"
18
19#include <string>
20
Jason Jeremy Iman84613872019-07-19 12:44:39 +090021#include <unistd.h>
22
23#include <android-base/file.h>
24#include <android-base/stringprintf.h>
Josh Gao3fb517c2016-09-19 17:31:55 -070025#include <gtest/gtest.h>
26
Elliott Hughes35be7f92020-05-12 16:36:04 -070027TEST(socket_spec, parse_tcp_socket_spec_failure) {
28 std::string hostname, error, serial;
29 int port;
Shaju Mathewdf973452022-10-16 22:15:22 -070030 // spec needs to be prefixed with "tcp:"
Elliott Hughes35be7f92020-05-12 16:36:04 -070031 EXPECT_FALSE(parse_tcp_socket_spec("sneakernet:5037", &hostname, &port, &serial, &error));
32 EXPECT_TRUE(error.find("sneakernet") != std::string::npos);
33}
34
Shaju Mathewdf973452022-10-16 22:15:22 -070035TEST(socket_spec, parse_tcp_socket_spec_just_port_success) {
Cody Schuffelen331a9082019-01-02 14:17:29 -080036 std::string hostname, error, serial;
Josh Gao3fb517c2016-09-19 17:31:55 -070037 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -080038 EXPECT_TRUE(parse_tcp_socket_spec("tcp:5037", &hostname, &port, &serial, &error));
Josh Gao3fb517c2016-09-19 17:31:55 -070039 EXPECT_EQ("", hostname);
40 EXPECT_EQ(5037, port);
Cody Schuffelen331a9082019-01-02 14:17:29 -080041 EXPECT_EQ("", serial);
Elliott Hughes14d673e2019-07-30 13:51:03 -070042}
Josh Gao3fb517c2016-09-19 17:31:55 -070043
Shaju Mathewdf973452022-10-16 22:15:22 -070044TEST(socket_spec, parse_tcp_socket_spec_bad_ports_failure) {
Elliott Hughes14d673e2019-07-30 13:51:03 -070045 std::string hostname, error, serial;
46 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -080047 EXPECT_FALSE(parse_tcp_socket_spec("tcp:", &hostname, &port, &serial, &error));
48 EXPECT_FALSE(parse_tcp_socket_spec("tcp:-1", &hostname, &port, &serial, &error));
49 EXPECT_FALSE(parse_tcp_socket_spec("tcp:65536", &hostname, &port, &serial, &error));
Elliott Hughes14d673e2019-07-30 13:51:03 -070050}
Josh Gao3fb517c2016-09-19 17:31:55 -070051
Shaju Mathewdf973452022-10-16 22:15:22 -070052TEST(socket_spec, parse_tcp_socket_spec_host_and_port_success) {
Elliott Hughes14d673e2019-07-30 13:51:03 -070053 std::string hostname, error, serial;
54 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -080055 EXPECT_TRUE(parse_tcp_socket_spec("tcp:localhost:1234", &hostname, &port, &serial, &error));
Josh Gao3fb517c2016-09-19 17:31:55 -070056 EXPECT_EQ("localhost", hostname);
57 EXPECT_EQ(1234, port);
Cody Schuffelen331a9082019-01-02 14:17:29 -080058 EXPECT_EQ("localhost:1234", serial);
Elliott Hughes14d673e2019-07-30 13:51:03 -070059}
Josh Gao3fb517c2016-09-19 17:31:55 -070060
Shaju Mathewdf973452022-10-16 22:15:22 -070061TEST(socket_spec, parse_tcp_socket_spec_host_no_port_success) {
Elliott Hughes14d673e2019-07-30 13:51:03 -070062 std::string hostname, error, serial;
63 int port;
64 EXPECT_TRUE(parse_tcp_socket_spec("tcp:localhost", &hostname, &port, &serial, &error));
65 EXPECT_EQ("localhost", hostname);
66 EXPECT_EQ(5555, port);
67 EXPECT_EQ("localhost:5555", serial);
68}
69
Shaju Mathewdf973452022-10-16 22:15:22 -070070TEST(socket_spec, parse_tcp_socket_spec_host_ipv4_no_port_success) {
71 std::string hostname, error, serial;
72 int port;
73 EXPECT_TRUE(parse_tcp_socket_spec("tcp:127.0.0.1", &hostname, &port, &serial, &error));
74 EXPECT_EQ("127.0.0.1", hostname);
75 EXPECT_EQ(5555, port);
76 EXPECT_EQ("127.0.0.1:5555", serial);
77}
78
79TEST(socket_spec, parse_tcp_socket_spec_host_bad_ports_failure) {
Elliott Hughes14d673e2019-07-30 13:51:03 -070080 std::string hostname, error, serial;
81 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -080082 EXPECT_FALSE(parse_tcp_socket_spec("tcp:localhost:", &hostname, &port, &serial, &error));
83 EXPECT_FALSE(parse_tcp_socket_spec("tcp:localhost:-1", &hostname, &port, &serial, &error));
84 EXPECT_FALSE(parse_tcp_socket_spec("tcp:localhost:65536", &hostname, &port, &serial, &error));
Elliott Hughes14d673e2019-07-30 13:51:03 -070085}
Josh Gao3fb517c2016-09-19 17:31:55 -070086
Shaju Mathewdf973452022-10-16 22:15:22 -070087TEST(socket_spec, parse_tcp_socket_spec_host_ipv4_bad_ports_failure) {
88 std::string hostname, error, serial;
89 int port;
90 EXPECT_FALSE(parse_tcp_socket_spec("tcp:127.0.0.1:", &hostname, &port, &serial, &error));
91 EXPECT_FALSE(parse_tcp_socket_spec("tcp:127.0.0.1:-1", &hostname, &port, &serial, &error));
92 EXPECT_FALSE(parse_tcp_socket_spec("tcp:127.0.0.1:65536", &hostname, &port, &serial, &error));
93}
94
95TEST(socket_spec, parse_tcp_socket_spec_host_ipv6_bad_ports_failure) {
96 std::string hostname, error, serial;
97 int port;
98 EXPECT_FALSE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:c63:50c9:8a91:8efa:", &hostname,
99 &port, &serial, &error));
100 EXPECT_FALSE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:c63:50c9:8a91:8efa:-1", &hostname,
101 &port, &serial, &error));
102 EXPECT_FALSE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:c63:50c9:8a91:8efa:65536", &hostname,
103 &port, &serial, &error));
104}
105
106TEST(socket_spec, parse_tcp_socket_spec_ipv6_and_port_success) {
Elliott Hughes14d673e2019-07-30 13:51:03 -0700107 std::string hostname, error, serial;
108 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -0800109 EXPECT_TRUE(parse_tcp_socket_spec("tcp:[::1]:1234", &hostname, &port, &serial, &error));
Josh Gao3fb517c2016-09-19 17:31:55 -0700110 EXPECT_EQ("::1", hostname);
111 EXPECT_EQ(1234, port);
Cody Schuffelen331a9082019-01-02 14:17:29 -0800112 EXPECT_EQ("[::1]:1234", serial);
Shaju Mathewdf973452022-10-16 22:15:22 -0700113
114 // Repeat with different format of ipv6
115 EXPECT_TRUE(parse_tcp_socket_spec("tcp:[2601:644:8e80:620::fbbc]:2345", &hostname, &port,
116 &serial, &error));
117 EXPECT_EQ("2601:644:8e80:620::fbbc", hostname);
118 EXPECT_EQ(2345, port);
119 EXPECT_EQ("[2601:644:8e80:620::fbbc]:2345", serial);
Elliott Hughes14d673e2019-07-30 13:51:03 -0700120}
Josh Gao3fb517c2016-09-19 17:31:55 -0700121
Shaju Mathewdf973452022-10-16 22:15:22 -0700122TEST(socket_spec, parse_tcp_socket_spec_ipv6_no_port_success) {
Elliott Hughes14d673e2019-07-30 13:51:03 -0700123 std::string hostname, error, serial;
124 int port;
125 EXPECT_TRUE(parse_tcp_socket_spec("tcp:::1", &hostname, &port, &serial, &error));
126 EXPECT_EQ("::1", hostname);
127 EXPECT_EQ(5555, port);
128 EXPECT_EQ("[::1]:5555", serial);
Shaju Mathewdf973452022-10-16 22:15:22 -0700129
130 // Repeat with other supported formats of ipv6.
131 EXPECT_TRUE(parse_tcp_socket_spec("tcp:2601:644:8e80:620::fbbc", &hostname, &port, &serial,
132 &error));
133 EXPECT_EQ("2601:644:8e80:620::fbbc", hostname);
134 EXPECT_EQ(5555, port);
135 EXPECT_EQ("[2601:644:8e80:620::fbbc]:5555", serial);
136
137 EXPECT_TRUE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:c63:50c9:8a91:8efa", &hostname, &port,
138 &serial, &error));
139 EXPECT_EQ("2601:644:8e80:620:c63:50c9:8a91:8efa", hostname);
140 EXPECT_EQ(5555, port);
141 EXPECT_EQ("[2601:644:8e80:620:c63:50c9:8a91:8efa]:5555", serial);
142
143 EXPECT_TRUE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:2d0e:b944:5288:97df", &hostname, &port,
144 &serial, &error));
145 EXPECT_EQ("2601:644:8e80:620:2d0e:b944:5288:97df", hostname);
146 EXPECT_EQ(5555, port);
147 EXPECT_EQ("[2601:644:8e80:620:2d0e:b944:5288:97df]:5555", serial);
Elliott Hughes14d673e2019-07-30 13:51:03 -0700148}
149
Shaju Mathewdf973452022-10-16 22:15:22 -0700150TEST(socket_spec, parse_tcp_socket_spec_ipv6_bad_ports_failure) {
Elliott Hughes14d673e2019-07-30 13:51:03 -0700151 std::string hostname, error, serial;
152 int port;
Cody Schuffelen331a9082019-01-02 14:17:29 -0800153 EXPECT_FALSE(parse_tcp_socket_spec("tcp:[::1]", &hostname, &port, &serial, &error));
154 EXPECT_FALSE(parse_tcp_socket_spec("tcp:[::1]:", &hostname, &port, &serial, &error));
155 EXPECT_FALSE(parse_tcp_socket_spec("tcp:[::1]:-1", &hostname, &port, &serial, &error));
Shaju Mathewdf973452022-10-16 22:15:22 -0700156
157 EXPECT_TRUE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:2d0e:b944:5288:97df", &hostname, &port,
158 &serial, &error));
159 EXPECT_FALSE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:2d0e:b944:5288:97df:", &hostname,
160 &port, &serial, &error));
161 EXPECT_FALSE(parse_tcp_socket_spec("tcp:2601:644:8e80:620:2d0e:b944:5288:97df:-1", &hostname,
162 &port, &serial, &error));
Josh Gao3fb517c2016-09-19 17:31:55 -0700163}
Jason Jeremy Iman84613872019-07-19 12:44:39 +0900164
Shaju Mathewdf973452022-10-16 22:15:22 -0700165TEST(socket_spec, get_host_socket_spec_port_success) {
Jason Jeremy Iman84613872019-07-19 12:44:39 +0900166 std::string error;
167 EXPECT_EQ(5555, get_host_socket_spec_port("tcp:5555", &error));
168 EXPECT_EQ(5555, get_host_socket_spec_port("tcp:localhost:5555", &error));
169 EXPECT_EQ(5555, get_host_socket_spec_port("tcp:[::1]:5555", &error));
170 EXPECT_EQ(5555, get_host_socket_spec_port("vsock:5555", &error));
171}
172
173TEST(socket_spec, get_host_socket_spec_port_no_port) {
174 std::string error;
175 EXPECT_EQ(5555, get_host_socket_spec_port("tcp:localhost", &error));
176 EXPECT_EQ(-1, get_host_socket_spec_port("vsock:localhost", &error));
177}
178
179TEST(socket_spec, get_host_socket_spec_port_bad_ports) {
180 std::string error;
181 EXPECT_EQ(-1, get_host_socket_spec_port("tcp:65536", &error));
182 EXPECT_EQ(-1, get_host_socket_spec_port("tcp:-5", &error));
183 EXPECT_EQ(-1, get_host_socket_spec_port("vsock:-5", &error));
184 EXPECT_EQ(-1, get_host_socket_spec_port("vsock:5:5555", &error));
185}
186
187TEST(socket_spec, get_host_socket_spec_port_bad_string) {
188 std::string error;
189 EXPECT_EQ(-1, get_host_socket_spec_port("tcpz:5555", &error));
190 EXPECT_EQ(-1, get_host_socket_spec_port("vsockz:5555", &error));
191 EXPECT_EQ(-1, get_host_socket_spec_port("abcd:5555", &error));
192 EXPECT_EQ(-1, get_host_socket_spec_port("abcd", &error));
193}
194
195TEST(socket_spec, socket_spec_listen_connect_tcp) {
196 std::string error, serial;
197 int port;
198 unique_fd server_fd, client_fd;
199 EXPECT_FALSE(socket_spec_connect(&client_fd, "tcp:localhost:7777", &port, &serial, &error));
200 server_fd.reset(socket_spec_listen("tcp:7777", &error, &port));
201 EXPECT_NE(server_fd.get(), -1);
202 EXPECT_TRUE(socket_spec_connect(&client_fd, "tcp:localhost:7777", &port, &serial, &error));
203 EXPECT_NE(client_fd.get(), -1);
204}
205
Elliott Hughes35be7f92020-05-12 16:36:04 -0700206TEST(socket_spec, socket_spec_connect_failure) {
207 std::string error, serial;
208 int port;
209 unique_fd client_fd;
210 EXPECT_FALSE(socket_spec_connect(&client_fd, "tcp:", &port, &serial, &error));
211 EXPECT_FALSE(socket_spec_connect(&client_fd, "acceptfd:", &port, &serial, &error));
212 EXPECT_FALSE(socket_spec_connect(&client_fd, "vsock:", &port, &serial, &error));
213 EXPECT_FALSE(socket_spec_connect(&client_fd, "vsock:x", &port, &serial, &error));
214 EXPECT_FALSE(socket_spec_connect(&client_fd, "vsock:5", &port, &serial, &error));
215 EXPECT_FALSE(socket_spec_connect(&client_fd, "vsock:5:x", &port, &serial, &error));
216 EXPECT_FALSE(socket_spec_connect(&client_fd, "sneakernet:", &port, &serial, &error));
217}
218
Jason Jeremy Iman84613872019-07-19 12:44:39 +0900219TEST(socket_spec, socket_spec_listen_connect_localfilesystem) {
220 std::string error, serial;
221 int port;
222 unique_fd server_fd, client_fd;
223 TemporaryDir sock_dir;
224
225 // Only run this test if the created directory is writable.
226 int result = access(sock_dir.path, W_OK);
227 if (result == 0) {
228 std::string sock_addr =
229 android::base::StringPrintf("localfilesystem:%s/af_unix_socket", sock_dir.path);
230 EXPECT_FALSE(socket_spec_connect(&client_fd, sock_addr, &port, &serial, &error));
231 server_fd.reset(socket_spec_listen(sock_addr, &error, &port));
232 EXPECT_NE(server_fd.get(), -1);
233 EXPECT_TRUE(socket_spec_connect(&client_fd, sock_addr, &port, &serial, &error));
234 EXPECT_NE(client_fd.get(), -1);
235 }
236}
Elliott Hughes35be7f92020-05-12 16:36:04 -0700237
238TEST(socket_spec, is_socket_spec) {
239 EXPECT_TRUE(is_socket_spec("tcp:blah"));
240 EXPECT_TRUE(is_socket_spec("acceptfd:blah"));
241 EXPECT_TRUE(is_socket_spec("local:blah"));
242 EXPECT_TRUE(is_socket_spec("localreserved:blah"));
Andrew Walbranebf09dd2021-03-03 18:06:12 +0000243 EXPECT_TRUE(is_socket_spec("vsock:123:456"));
Elliott Hughes35be7f92020-05-12 16:36:04 -0700244}
245
246TEST(socket_spec, is_local_socket_spec) {
247 EXPECT_TRUE(is_local_socket_spec("local:blah"));
248 EXPECT_TRUE(is_local_socket_spec("tcp:localhost"));
249 EXPECT_FALSE(is_local_socket_spec("tcp:www.google.com"));
250}