1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 #include <netinet/in.h>
10 #include <sys/types.h>
11 #include <sys/socket.h>
17 #include "gmock/gmock.h"
18 #include "gtest/gtest.h"
20 #include "nacl_io/kernel_intercept.h"
21 #include "nacl_io/kernel_proxy.h"
22 #include "nacl_io/ossocket.h"
23 #include "nacl_io/ostypes.h"
25 #ifdef PROVIDES_SOCKET_API
27 using namespace nacl_io;
28 using namespace sdk_util;
31 class SocketTest : public ::testing::Test {
49 TEST_F(SocketTest, Accept) {
50 struct sockaddr addr = {};
53 EXPECT_LT(ki_accept(123, NULL, &len), 0);
54 EXPECT_EQ(errno, EFAULT);
55 EXPECT_LT(ki_accept(123, &addr, NULL), 0);
56 EXPECT_EQ(errno, EFAULT);
57 EXPECT_LT(ki_accept(123, NULL, NULL), 0);
58 EXPECT_EQ(errno, EFAULT);
59 EXPECT_LT(ki_accept(-1, &addr, &len), 0);
60 EXPECT_EQ(errno, EBADF);
61 EXPECT_LT(ki_accept(0, &addr, &len), 0);
62 EXPECT_EQ(errno, ENOTSOCK);
65 TEST_F(SocketTest, Bind) {
66 const struct sockaddr const_addr = {};
69 EXPECT_LT(ki_bind(123, NULL, len), 0);
70 EXPECT_EQ(errno, EFAULT);
71 EXPECT_LT(ki_bind(-1, &const_addr, len), 0);
72 EXPECT_EQ(errno, EBADF);
73 EXPECT_LT(ki_bind(0, &const_addr, len), 0);
74 EXPECT_EQ(errno, ENOTSOCK);
77 TEST_F(SocketTest, Connect) {
78 const struct sockaddr const_addr = {};
81 EXPECT_LT(ki_connect(123, NULL, len), 0);
82 EXPECT_EQ(errno, EFAULT);
83 EXPECT_LT(ki_connect(-1, &const_addr, len), 0);
84 EXPECT_EQ(errno, EBADF);
85 EXPECT_LT(ki_connect(0, &const_addr, len), 0);
86 EXPECT_EQ(errno, ENOTSOCK);
89 TEST_F(SocketTest, Getpeername) {
90 struct sockaddr addr = {};
93 EXPECT_LT(ki_getpeername(123, NULL, &len), 0);
94 EXPECT_EQ(errno, EFAULT);
95 EXPECT_LT(ki_getpeername(123, &addr, NULL), 0);
96 EXPECT_EQ(errno, EFAULT);
97 EXPECT_LT(ki_getpeername(123, NULL, NULL), 0);
98 EXPECT_EQ(errno, EFAULT);
99 EXPECT_LT(ki_getpeername(-1, &addr, &len), 0);
100 EXPECT_EQ(errno, EBADF);
101 EXPECT_LT(ki_getpeername(0, &addr, &len), 0);
102 EXPECT_EQ(errno, ENOTSOCK);
105 TEST_F(SocketTest, Getsockname) {
106 struct sockaddr addr = {};
109 EXPECT_LT(ki_getsockname(123, NULL, &len), 0);
110 EXPECT_EQ(errno, EFAULT);
111 EXPECT_LT(ki_getsockname(123, &addr, NULL), 0);
112 EXPECT_EQ(errno, EFAULT);
113 EXPECT_LT(ki_getsockname(123, NULL, NULL), 0);
114 EXPECT_EQ(errno, EFAULT);
115 EXPECT_LT(ki_getsockname(-1, &addr, &len), 0);
116 EXPECT_EQ(errno, EBADF);
117 EXPECT_LT(ki_getsockname(0, &addr, &len), 0);
118 EXPECT_EQ(errno, ENOTSOCK);
121 TEST_F(SocketTest, Getsockopt) {
125 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, optval, NULL), 0);
126 EXPECT_EQ(errno, EFAULT);
127 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, &len), 0);
128 EXPECT_EQ(errno, EFAULT);
129 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, NULL), 0);
130 EXPECT_EQ(errno, EFAULT);
131 EXPECT_LT(ki_getsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0);
132 EXPECT_EQ(errno, EBADF);
133 EXPECT_LT(ki_getsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0);
134 EXPECT_EQ(errno, ENOTSOCK);
137 TEST_F(SocketTest, Listen) {
138 EXPECT_LT(ki_listen(-1, 123), 0);
139 EXPECT_EQ(errno, EBADF);
140 EXPECT_LT(ki_listen(0, 123), 0);
141 EXPECT_EQ(errno, ENOTSOCK);
144 TEST_F(SocketTest, Recv) {
148 EXPECT_LT(ki_recv(123, NULL, len, 0), 0);
149 EXPECT_EQ(errno, EFAULT);
150 EXPECT_LT(ki_recv(-1, buf, len, 0), 0);
151 EXPECT_EQ(errno, EBADF);
152 EXPECT_LT(ki_recv(0, buf, len, 0), 0);
153 EXPECT_EQ(errno, ENOTSOCK);
156 TEST_F(SocketTest, Recvfrom) {
159 struct sockaddr addr = {};
160 socklen_t addrlen = 4;
162 EXPECT_LT(ki_recvfrom(123, NULL, len, 0, &addr, &addrlen), 0);
163 EXPECT_EQ(errno, EFAULT);
164 EXPECT_LT(ki_recvfrom(123, buf, len, 0, &addr, NULL), 0);
165 EXPECT_EQ(errno, EFAULT);
166 EXPECT_LT(ki_recvfrom(-1, buf, len, 0, &addr, &addrlen), 0);
167 EXPECT_EQ(errno, EBADF);
168 EXPECT_LT(ki_recvfrom(0, buf, len, 0, &addr, &addrlen), 0);
169 EXPECT_EQ(errno, ENOTSOCK);
172 TEST_F(SocketTest, Recvmsg) {
173 struct msghdr msg = {};
175 EXPECT_LT(ki_recvmsg(123, NULL, 0), 0);
176 EXPECT_EQ(errno, EFAULT);
177 EXPECT_LT(ki_recvmsg(-1, &msg, 0), 0);
178 EXPECT_EQ(errno, EBADF);
179 EXPECT_LT(ki_recvmsg(0, &msg, 0), 0);
180 EXPECT_EQ(errno, ENOTSOCK);
183 TEST_F(SocketTest, Send) {
187 EXPECT_LT(ki_send(123, NULL, len, 0), 0);
188 EXPECT_EQ(errno, EFAULT);
189 EXPECT_LT(ki_send(-1, buf, len, 0), 0);
190 EXPECT_EQ(errno, EBADF);
191 EXPECT_LT(ki_send(0, buf, len, 0), 0);
192 EXPECT_EQ(errno, ENOTSOCK);
195 TEST_F(SocketTest, Sendto) {
198 struct sockaddr addr = {};
199 socklen_t addrlen = 4;
201 EXPECT_LT(ki_sendto(123, NULL, len, 0, &addr, addrlen), 0);
202 EXPECT_EQ(errno, EFAULT);
203 EXPECT_LT(ki_sendto(-1, buf, len, 0, &addr, addrlen), 0);
204 EXPECT_EQ(errno, EBADF);
205 EXPECT_LT(ki_sendto(0, buf, len, 0, &addr, addrlen), 0);
206 EXPECT_EQ(errno, ENOTSOCK);
209 TEST_F(SocketTest, Sendmsg) {
210 struct msghdr msg = {};
212 EXPECT_LT(ki_sendmsg(123, NULL, 0), 0);
213 EXPECT_EQ(errno, EFAULT);
214 EXPECT_LT(ki_sendmsg(-1, &msg, 0), 0);
215 EXPECT_EQ(errno, EBADF);
216 EXPECT_LT(ki_sendmsg(0, &msg, 0), 0);
217 EXPECT_EQ(errno, ENOTSOCK);
220 TEST_F(SocketTest, Setsockopt) {
224 // Passing a bad address as optval should generate EFAULT
225 EXPECT_EQ(-1, ki_setsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, len));
226 EXPECT_EQ(errno, EFAULT);
228 // Passing a bad socket descriptor should generate EBADF
229 EXPECT_EQ(-1, ki_setsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, len));
230 EXPECT_EQ(errno, EBADF);
232 // Passing an FD that is valid but not a socket should generate ENOTSOCK
233 EXPECT_EQ(-1, ki_setsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, len));
234 EXPECT_EQ(errno, ENOTSOCK);
237 TEST_F(SocketTest, Shutdown) {
238 EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0);
239 EXPECT_EQ(errno, EBADF);
240 EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0);
241 EXPECT_EQ(errno, ENOTSOCK);
244 TEST_F(SocketTest, Socket) {
245 EXPECT_LT(ki_socket(AF_UNIX, SOCK_STREAM, 0), 0);
246 EXPECT_EQ(errno, EAFNOSUPPORT);
247 EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0);
248 EXPECT_EQ(errno, EPROTONOSUPPORT);
251 TEST_F(SocketTest, Socketpair) {
253 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0);
254 EXPECT_EQ(errno, EFAULT);
255 EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0);
256 EXPECT_EQ(errno, EAFNOSUPPORT);
257 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0);
258 EXPECT_EQ(errno, EPROTONOSUPPORT);
259 EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0);
260 EXPECT_EQ(errno, EPROTONOSUPPORT);
263 // These utility functions are only used for newlib (glibc provides its own
264 // implementations of these functions).
265 #if !defined(__GLIBC__)
267 TEST(SocketUtilityFunctions, Hstrerror) {
268 EXPECT_STREQ(hstrerror(2718),
269 "Unknown error in gethostbyname: 2718.");
272 TEST(SocketUtilityFunctions, Htonl) {
273 uint32_t host_long = 0x44332211;
274 uint32_t network_long = htonl(host_long);
275 uint8_t network_bytes[4];
276 memcpy(network_bytes, &network_long, 4);
277 EXPECT_EQ(network_bytes[0], 0x44);
278 EXPECT_EQ(network_bytes[1], 0x33);
279 EXPECT_EQ(network_bytes[2], 0x22);
280 EXPECT_EQ(network_bytes[3], 0x11);
283 TEST(SocketUtilityFunctions, Htons) {
284 uint16_t host_short = 0x2211;
285 uint16_t network_short = htons(host_short);
286 uint8_t network_bytes[2];
287 memcpy(network_bytes, &network_short, 2);
288 EXPECT_EQ(network_bytes[0], 0x22);
289 EXPECT_EQ(network_bytes[1], 0x11);
292 static struct in_addr generate_ipv4_addr(int tuple1, int tuple2,
293 int tuple3, int tuple4) {
294 unsigned char addr[4];
295 addr[0] = static_cast<unsigned char>(tuple1);
296 addr[1] = static_cast<unsigned char>(tuple2);
297 addr[2] = static_cast<unsigned char>(tuple3);
298 addr[3] = static_cast<unsigned char>(tuple4);
299 struct in_addr real_addr;
300 memcpy(&real_addr, addr, 4);
304 static struct in6_addr generate_ipv6_addr(int* tuples) {
305 unsigned char addr[16];
306 for (int i = 0; i < 8; i++) {
307 addr[2*i] = (tuples[i] >> 8) & 0xFF;
308 addr[2*i+1] = tuples[i] & 0xFF;
310 struct in6_addr real_addr;
311 memcpy(&real_addr, addr, 16);
315 TEST(SocketUtilityFunctions, Inet_ntoa) {
316 char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0));
317 ASSERT_TRUE(NULL != stringified_addr);
318 EXPECT_STREQ("0.0.0.0", stringified_addr);
320 stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1));
321 ASSERT_TRUE(NULL != stringified_addr);
322 EXPECT_STREQ("127.0.0.1", stringified_addr);
324 stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255));
325 ASSERT_TRUE(NULL != stringified_addr);
326 EXPECT_STREQ("255.255.255.255", stringified_addr);
329 TEST(SocketUtilityFunctions, Inet_ntop_ipv4) {
330 char stringified_addr[INET_ADDRSTRLEN];
332 struct in_addr real_addr = generate_ipv4_addr(0,0,0,0);
333 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
334 stringified_addr, INET_ADDRSTRLEN));
335 EXPECT_STREQ("0.0.0.0", stringified_addr);
337 real_addr = generate_ipv4_addr(127,0,0,1);
338 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
339 stringified_addr, INET_ADDRSTRLEN));
340 EXPECT_STREQ("127.0.0.1", stringified_addr);
342 real_addr = generate_ipv4_addr(255,255,255,255);
343 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
344 stringified_addr, INET_ADDRSTRLEN));
345 EXPECT_STREQ("255.255.255.255", stringified_addr);
348 TEST(SocketUtilityFunctions, Inet_ntop_ipv6) {
349 char stringified_addr[INET6_ADDRSTRLEN];
352 int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
353 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
354 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
355 stringified_addr, INET6_ADDRSTRLEN));
356 EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr);
360 int addr_tuples[8] = { 0x1234, 0xa, 0x12, 0x0000,
361 0x5678, 0x9abc, 0xdef, 0xffff };
362 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
363 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
364 stringified_addr, INET6_ADDRSTRLEN));
365 EXPECT_STREQ("1234:a:12:0:5678:9abc:def:ffff", stringified_addr);
369 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
370 0xffff, 0xffff, 0xffff, 0xffff };
371 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
372 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
373 stringified_addr, INET6_ADDRSTRLEN));
374 EXPECT_STREQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", stringified_addr);
378 TEST(SocketUtilityFunctions, Inet_ntop_failure) {
379 char addr_name[INET6_ADDRSTRLEN];
380 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
381 0xffff, 0xffff, 0xffff, 0xffff };
382 struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples);
383 struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255);
385 EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr,
386 addr_name, INET6_ADDRSTRLEN));
387 EXPECT_EQ(errno, EAFNOSUPPORT);
389 EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr,
390 addr_name, INET_ADDRSTRLEN - 1));
391 EXPECT_EQ(errno, ENOSPC);
393 EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr,
394 addr_name, INET6_ADDRSTRLEN - 1));
395 EXPECT_EQ(errno, ENOSPC);
398 TEST(SocketUtilityFunctions, Ntohs) {
399 uint8_t network_bytes[2] = { 0x22, 0x11 };
400 uint16_t network_short;
401 memcpy(&network_short, network_bytes, 2);
402 uint16_t host_short = ntohs(network_short);
403 EXPECT_EQ(host_short, 0x2211);
406 TEST(SocketUtilityFunctions, Ntohl) {
407 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 };
408 uint32_t network_long;
409 memcpy(&network_long, network_bytes, 4);
410 uint32_t host_long = ntohl(network_long);
411 EXPECT_EQ(host_long, 0x44332211);
414 #endif // !defined(__GLIBC__)
415 #endif // PROVIDES_SOCKETPAIR_API