blob: ec45185ff2c64dd9af076fda4b9e9e52a33f919d [file] [log] [blame]
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +01001// 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.
4#include <errno.h>
5#include <fcntl.h>
6#include <pthread.h>
7#include <sys/stat.h>
8
9#include <map>
10#include <string>
11
12#include "gmock/gmock.h"
13#include "gtest/gtest.h"
14
15#include "nacl_io/kernel_intercept.h"
16#include "nacl_io/kernel_proxy.h"
17#include "nacl_io/ossocket.h"
18#include "nacl_io/ostypes.h"
19
20#ifdef PROVIDES_SOCKET_API
21
22using namespace nacl_io;
23using namespace sdk_util;
24
25namespace {
26class SocketTest : public ::testing::Test {
27 public:
28 SocketTest() : kp_(new KernelProxy) {
29 ki_init(kp_);
30 }
31
32 ~SocketTest() {
33 ki_uninit();
34 delete kp_;
35 }
36
37 protected:
38 KernelProxy* kp_;
39};
40
Ben Murdochbb1529c2013-08-08 10:24:53 +010041} // namespace
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010042
43TEST_F(SocketTest, Accept) {
44 struct sockaddr addr = {};
45 socklen_t len = 0;
46
47 EXPECT_LT(ki_accept(123, NULL, &len), 0);
48 EXPECT_EQ(errno, EFAULT);
49 EXPECT_LT(ki_accept(123, &addr, NULL), 0);
50 EXPECT_EQ(errno, EFAULT);
51 EXPECT_LT(ki_accept(123, NULL, NULL), 0);
52 EXPECT_EQ(errno, EFAULT);
53 EXPECT_LT(ki_accept(-1, &addr, &len), 0);
54 EXPECT_EQ(errno, EBADF);
55 EXPECT_LT(ki_accept(0, &addr, &len), 0);
56 EXPECT_EQ(errno, ENOTSOCK);
57}
58
59TEST_F(SocketTest, Bind) {
60 const struct sockaddr const_addr = {};
61 socklen_t len = 0;
62
63 EXPECT_LT(ki_bind(123, NULL, len), 0);
64 EXPECT_EQ(errno, EFAULT);
65 EXPECT_LT(ki_bind(-1, &const_addr, len), 0);
66 EXPECT_EQ(errno, EBADF);
67 EXPECT_LT(ki_bind(0, &const_addr, len), 0);
68 EXPECT_EQ(errno, ENOTSOCK);
69}
70
71TEST_F(SocketTest, Connect) {
72 const struct sockaddr const_addr = {};
73 socklen_t len = 0;
74
75 EXPECT_LT(ki_connect(123, NULL, len), 0);
76 EXPECT_EQ(errno, EFAULT);
77 EXPECT_LT(ki_connect(-1, &const_addr, len), 0);
78 EXPECT_EQ(errno, EBADF);
79 EXPECT_LT(ki_connect(0, &const_addr, len), 0);
80 EXPECT_EQ(errno, ENOTSOCK);
81}
82
83TEST_F(SocketTest, Getpeername) {
84 struct sockaddr addr = {};
85 socklen_t len = 0;
86
87 EXPECT_LT(ki_getpeername(123, NULL, &len), 0);
88 EXPECT_EQ(errno, EFAULT);
89 EXPECT_LT(ki_getpeername(123, &addr, NULL), 0);
90 EXPECT_EQ(errno, EFAULT);
91 EXPECT_LT(ki_getpeername(123, NULL, NULL), 0);
92 EXPECT_EQ(errno, EFAULT);
93 EXPECT_LT(ki_getpeername(-1, &addr, &len), 0);
94 EXPECT_EQ(errno, EBADF);
95 EXPECT_LT(ki_getpeername(0, &addr, &len), 0);
96 EXPECT_EQ(errno, ENOTSOCK);
97}
98
99TEST_F(SocketTest, Getsockname) {
100 struct sockaddr addr = {};
101 socklen_t len = 0;
102
103 EXPECT_LT(ki_getsockname(123, NULL, &len), 0);
104 EXPECT_EQ(errno, EFAULT);
105 EXPECT_LT(ki_getsockname(123, &addr, NULL), 0);
106 EXPECT_EQ(errno, EFAULT);
107 EXPECT_LT(ki_getsockname(123, NULL, NULL), 0);
108 EXPECT_EQ(errno, EFAULT);
109 EXPECT_LT(ki_getsockname(-1, &addr, &len), 0);
110 EXPECT_EQ(errno, EBADF);
111 EXPECT_LT(ki_getsockname(0, &addr, &len), 0);
112 EXPECT_EQ(errno, ENOTSOCK);
113}
114
115TEST_F(SocketTest, Getsockopt) {
116 socklen_t len = 10;
117 char optval[len];
118
119 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, optval, NULL), 0);
120 EXPECT_EQ(errno, EFAULT);
121 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, &len), 0);
122 EXPECT_EQ(errno, EFAULT);
123 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, NULL), 0);
124 EXPECT_EQ(errno, EFAULT);
125 EXPECT_LT(ki_getsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0);
126 EXPECT_EQ(errno, EBADF);
127 EXPECT_LT(ki_getsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0);
128 EXPECT_EQ(errno, ENOTSOCK);
129}
130
Ben Murdochbb1529c2013-08-08 10:24:53 +0100131TEST_F(SocketTest, Hstrerror) {
132 EXPECT_STREQ(ki_hstrerror(2718),
133 "Unknown error in gethostbyname: 2718.");
134}
135
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100136TEST_F(SocketTest, Listen) {
137 EXPECT_LT(ki_listen(-1, 123), 0);
138 EXPECT_EQ(errno, EBADF);
139 EXPECT_LT(ki_listen(0, 123), 0);
140 EXPECT_EQ(errno, ENOTSOCK);
141}
142
143TEST_F(SocketTest, Recv) {
144 size_t len = 10;
145 char buf[len];
146
147 EXPECT_LT(ki_recv(123, NULL, len, 0), 0);
148 EXPECT_EQ(errno, EFAULT);
149 EXPECT_LT(ki_recv(-1, buf, len, 0), 0);
150 EXPECT_EQ(errno, EBADF);
151 EXPECT_LT(ki_recv(0, buf, len, 0), 0);
152 EXPECT_EQ(errno, ENOTSOCK);
153}
154
155TEST_F(SocketTest, Recvfrom) {
156 size_t len = 10;
157 char buf[len];
158 struct sockaddr addr = {};
159 socklen_t addrlen = 4;
160
161 EXPECT_LT(ki_recvfrom(123, NULL, len, 0, &addr, &addrlen), 0);
162 EXPECT_EQ(errno, EFAULT);
163 EXPECT_LT(ki_recvfrom(123, buf, len, 0, &addr, NULL), 0);
164 EXPECT_EQ(errno, EFAULT);
165 EXPECT_LT(ki_recvfrom(-1, buf, len, 0, &addr, &addrlen), 0);
166 EXPECT_EQ(errno, EBADF);
167 EXPECT_LT(ki_recvfrom(0, buf, len, 0, &addr, &addrlen), 0);
168 EXPECT_EQ(errno, ENOTSOCK);
169}
170
171TEST_F(SocketTest, Recvmsg) {
172 struct msghdr msg = {};
173
174 EXPECT_LT(ki_recvmsg(123, NULL, 0), 0);
175 EXPECT_EQ(errno, EFAULT);
176 EXPECT_LT(ki_recvmsg(-1, &msg, 0), 0);
177 EXPECT_EQ(errno, EBADF);
178 EXPECT_LT(ki_recvmsg(0, &msg, 0), 0);
179 EXPECT_EQ(errno, ENOTSOCK);
180}
181
182TEST_F(SocketTest, Send) {
183 size_t len = 10;
184 char buf[len];
185
186 EXPECT_LT(ki_send(123, NULL, len, 0), 0);
187 EXPECT_EQ(errno, EFAULT);
188 EXPECT_LT(ki_send(-1, buf, len, 0), 0);
189 EXPECT_EQ(errno, EBADF);
190 EXPECT_LT(ki_send(0, buf, len, 0), 0);
191 EXPECT_EQ(errno, ENOTSOCK);
192}
193
194TEST_F(SocketTest, Sendto) {
195 size_t len = 10;
196 char buf[len];
197 struct sockaddr addr = {};
198 socklen_t addrlen = 4;
199
200 EXPECT_LT(ki_sendto(123, NULL, len, 0, &addr, addrlen), 0);
201 EXPECT_EQ(errno, EFAULT);
202 EXPECT_LT(ki_sendto(-1, buf, len, 0, &addr, addrlen), 0);
203 EXPECT_EQ(errno, EBADF);
204 EXPECT_LT(ki_sendto(0, buf, len, 0, &addr, addrlen), 0);
205 EXPECT_EQ(errno, ENOTSOCK);
206}
207
208TEST_F(SocketTest, Sendmsg) {
209 struct msghdr msg = {};
210
211 EXPECT_LT(ki_sendmsg(123, NULL, 0), 0);
212 EXPECT_EQ(errno, EFAULT);
213 EXPECT_LT(ki_sendmsg(-1, &msg, 0), 0);
214 EXPECT_EQ(errno, EBADF);
215 EXPECT_LT(ki_sendmsg(0, &msg, 0), 0);
216 EXPECT_EQ(errno, ENOTSOCK);
217}
218
219TEST_F(SocketTest, Setsockopt) {
220 socklen_t len = 10;
221 char optval[len];
222
223 EXPECT_LT(ki_setsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, len), 0);
224 EXPECT_EQ(errno, EFAULT);
225 EXPECT_LT(ki_setsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, len), 0);
226 EXPECT_EQ(errno, EBADF);
227 EXPECT_LT(ki_setsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, len), 0);
228 EXPECT_EQ(errno, ENOTSOCK);
229}
230
231TEST_F(SocketTest, Shutdown) {
232 EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0);
233 EXPECT_EQ(errno, EBADF);
234 EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0);
235 EXPECT_EQ(errno, ENOTSOCK);
236}
237
238TEST_F(SocketTest, Socket) {
239 EXPECT_LT(ki_socket(AF_UNIX, SOCK_STREAM, 0), 0);
240 EXPECT_EQ(errno, EAFNOSUPPORT);
241 EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0);
242 EXPECT_EQ(errno, EPROTONOSUPPORT);
243
244 // These four af/protocol combinations should be supported.
245 EXPECT_LT(ki_socket(AF_INET, SOCK_STREAM, 0), 0);
246 EXPECT_EQ(errno, EACCES);
247 EXPECT_LT(ki_socket(AF_INET, SOCK_DGRAM, 0), 0);
248 EXPECT_EQ(errno, EACCES);
249 EXPECT_LT(ki_socket(AF_INET6, SOCK_STREAM, 0), 0);
250 EXPECT_EQ(errno, EACCES);
251 EXPECT_LT(ki_socket(AF_INET6, SOCK_DGRAM, 0), 0);
252 EXPECT_EQ(errno, EACCES);
253}
254
255TEST_F(SocketTest, Socketpair) {
256 int sv[2];
257 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0);
258 EXPECT_EQ(errno, EFAULT);
259 EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0);
260 EXPECT_EQ(errno, EAFNOSUPPORT);
261 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0);
262 EXPECT_EQ(errno, EPROTONOSUPPORT);
263 EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0);
264 EXPECT_EQ(errno, EPROTONOSUPPORT);
265}
266
Ben Murdochbb1529c2013-08-08 10:24:53 +0100267// These utility functions are only used for newlib (glibc provides its own
268// implementations of these functions).
269#if !defined(__GLIBC__)
Ben Murdoch32409262013-08-07 11:04:47 +0100270
271static struct in_addr generate_ipv4_addr(int tuple1, int tuple2,
272 int tuple3, int tuple4) {
273 unsigned char addr[4];
274 addr[0] = static_cast<unsigned char>(tuple1);
275 addr[1] = static_cast<unsigned char>(tuple2);
276 addr[2] = static_cast<unsigned char>(tuple3);
277 addr[3] = static_cast<unsigned char>(tuple4);
278 struct in_addr* real_addr = reinterpret_cast<struct in_addr*>(addr);
279 return *real_addr;
280}
281
282static struct in6_addr generate_ipv6_addr(int* tuples) {
283 unsigned char addr[16];
284 for (int i = 0; i < 8; i++) {
285 addr[2*i] = (tuples[i] >> 8) & 0xFF;
286 addr[2*i+1] = tuples[i] & 0xFF;
287 }
288 struct in6_addr* real_addr = reinterpret_cast<struct in6_addr*>(addr);
289 return *real_addr;
290}
291
292TEST(SocketUtilityFunctions, Inet_ntoa) {
293 char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0));
294 ASSERT_TRUE(NULL != stringified_addr);
295 EXPECT_STREQ("0.0.0.0", stringified_addr);
296
297 stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1));
298 ASSERT_TRUE(NULL != stringified_addr);
299 EXPECT_STREQ("127.0.0.1", stringified_addr);
300
301 stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255));
302 ASSERT_TRUE(NULL != stringified_addr);
303 EXPECT_STREQ("255.255.255.255", stringified_addr);
304}
305
306TEST(SocketUtilityFunctions, Inet_ntop_ipv4) {
307 char stringified_addr[INET_ADDRSTRLEN];
308
309 struct in_addr real_addr = generate_ipv4_addr(0,0,0,0);
310 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
311 stringified_addr, INET_ADDRSTRLEN));
312 EXPECT_STREQ("0.0.0.0", stringified_addr);
313
314 real_addr = generate_ipv4_addr(127,0,0,1);
315 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
316 stringified_addr, INET_ADDRSTRLEN));
317 EXPECT_STREQ("127.0.0.1", stringified_addr);
318
319 real_addr = generate_ipv4_addr(255,255,255,255);
320 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
321 stringified_addr, INET_ADDRSTRLEN));
322 EXPECT_STREQ("255.255.255.255", stringified_addr);
323}
324
325TEST(SocketUtilityFunctions, Inet_ntop_ipv6) {
326 char stringified_addr[INET6_ADDRSTRLEN];
327
328 {
329 int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
330 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
331 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
332 stringified_addr, INET6_ADDRSTRLEN));
333 EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr);
334 }
335
336 {
337 int addr_tuples[8] = { 0x1234, 0xa, 0x12, 0x0000,
338 0x5678, 0x9abc, 0xdef, 0xffff };
339 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
340 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
341 stringified_addr, INET6_ADDRSTRLEN));
342 EXPECT_STREQ("1234:a:12:0:5678:9abc:def:ffff", stringified_addr);
343 }
344
345 {
346 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
347 0xffff, 0xffff, 0xffff, 0xffff };
348 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
349 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
350 stringified_addr, INET6_ADDRSTRLEN));
351 EXPECT_STREQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", stringified_addr);
352 }
353}
354
355TEST(SocketUtilityFunctions, Inet_ntop_failure) {
356 char addr_name[INET6_ADDRSTRLEN];
357 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
358 0xffff, 0xffff, 0xffff, 0xffff };
359 struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples);
360 struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255);
361
362 EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr,
363 addr_name, INET6_ADDRSTRLEN));
364 EXPECT_EQ(errno, EAFNOSUPPORT);
365
366 EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr,
367 addr_name, INET_ADDRSTRLEN - 1));
368 EXPECT_EQ(errno, ENOSPC);
369
370 EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr,
371 addr_name, INET6_ADDRSTRLEN - 1));
372 EXPECT_EQ(errno, ENOSPC);
373}
374
Ben Murdochbb1529c2013-08-08 10:24:53 +0100375#endif // !defined(__GLIBC__)
376#endif // PROVIDES_SOCKETPAIR_API