| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <arpa/inet.h> | 5 #include <arpa/inet.h> |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <netinet/in.h> | 8 #include <netinet/in.h> |
| 9 #include <pthread.h> | 9 #include <pthread.h> |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 EXPECT_EQ(errno, ENOTSOCK); | 236 EXPECT_EQ(errno, ENOTSOCK); |
| 237 } | 237 } |
| 238 | 238 |
| 239 TEST_F(SocketTest, Shutdown) { | 239 TEST_F(SocketTest, Shutdown) { |
| 240 EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0); | 240 EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0); |
| 241 EXPECT_EQ(errno, EBADF); | 241 EXPECT_EQ(errno, EBADF); |
| 242 EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0); | 242 EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0); |
| 243 EXPECT_EQ(errno, ENOTSOCK); | 243 EXPECT_EQ(errno, ENOTSOCK); |
| 244 } | 244 } |
| 245 | 245 |
| 246 TEST_F(SocketTest, Socket) { | 246 TEST_F(SocketTest, SocketInetRawUnsupported) { |
| 247 EXPECT_LT(ki_socket(AF_UNIX, SOCK_STREAM, 0), 0); | |
| 248 EXPECT_EQ(errno, EAFNOSUPPORT); | |
| 249 EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0); | 247 EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0); |
| 250 EXPECT_EQ(errno, EPROTONOSUPPORT); | 248 EXPECT_EQ(errno, EPROTONOSUPPORT); |
| 251 } | 249 } |
| 252 | 250 |
| 253 TEST_F(SocketTest, Socketpair) { | 251 TEST_F(SocketTest, SocketpairUnsupported) { |
| 254 int sv[2]; | 252 int sv[2]; |
| 255 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0); | 253 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0); |
| 256 EXPECT_EQ(errno, EFAULT); | 254 EXPECT_EQ(errno, EFAULT); |
| 257 EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0); | 255 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0); |
| 256 EXPECT_EQ(errno, EOPNOTSUPP); |
| 257 EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0); |
| 258 EXPECT_EQ(errno, EOPNOTSUPP); |
| 259 EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_DGRAM, 0, sv), 0); |
| 260 EXPECT_EQ(errno, EPROTOTYPE); |
| 261 EXPECT_LT(ki_socketpair(AF_MAX, SOCK_STREAM, 0, sv), 0); |
| 258 EXPECT_EQ(errno, EAFNOSUPPORT); | 262 EXPECT_EQ(errno, EAFNOSUPPORT); |
| 259 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0); | 263 } |
| 260 EXPECT_EQ(errno, EPROTONOSUPPORT); | 264 |
| 261 EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0); | 265 class UnixSocketTest : public ::testing::Test { |
| 262 EXPECT_EQ(errno, EPROTONOSUPPORT); | 266 public: |
| 267 UnixSocketTest() { sv_[0] = sv_[1] = -1; } |
| 268 |
| 269 void SetUp() { |
| 270 ASSERT_EQ(0, ki_push_state_for_testing()); |
| 271 ASSERT_EQ(0, ki_init(&kp_)); |
| 272 } |
| 273 |
| 274 void TearDown() { |
| 275 if (sv_[0] != -1) |
| 276 EXPECT_EQ(0, ki_close(sv_[0])); |
| 277 if (sv_[1] != -1) |
| 278 EXPECT_EQ(0, ki_close(sv_[1])); |
| 279 ki_uninit(); |
| 280 } |
| 281 |
| 282 protected: |
| 283 KernelProxy kp_; |
| 284 |
| 285 int sv_[2]; |
| 286 }; |
| 287 |
| 288 TEST_F(UnixSocketTest, Socket) { |
| 289 EXPECT_EQ(-1, ki_socket(AF_UNIX, SOCK_STREAM, 0)); |
| 290 EXPECT_EQ(EAFNOSUPPORT, errno); |
| 291 } |
| 292 |
| 293 TEST_F(UnixSocketTest, Socketpair) { |
| 294 errno = 0; |
| 295 EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv_)); |
| 296 EXPECT_EQ(0, errno); |
| 297 EXPECT_LE(0, sv_[0]); |
| 298 EXPECT_LE(0, sv_[1]); |
| 299 } |
| 300 |
| 301 TEST_F(UnixSocketTest, SendRecv) { |
| 302 char outbuf[256]; |
| 303 char inbuf[512]; |
| 304 |
| 305 memset(outbuf, 0xA5, sizeof(outbuf)); |
| 306 memset(inbuf, 0x3C, sizeof(inbuf)); |
| 307 |
| 308 EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv_)); |
| 309 |
| 310 int len1 = ki_send(sv_[0], outbuf, sizeof(outbuf), /* flags */ 0); |
| 311 EXPECT_EQ(sizeof(outbuf), len1); |
| 312 |
| 313 // The buffers should be different. |
| 314 EXPECT_NE(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 315 |
| 316 int len2 = ki_recv(sv_[1], inbuf, sizeof(inbuf), /* flags */ 0); |
| 317 EXPECT_EQ(sizeof(outbuf), len2); |
| 318 |
| 319 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 320 |
| 321 // A reader should block after to read at this point. |
| 322 EXPECT_EQ(-1, ki_recv(sv_[1], inbuf, sizeof(inbuf), MSG_DONTWAIT)); |
| 323 EXPECT_EQ(EAGAIN, errno); |
| 324 |
| 325 // Send data back in the opposite direction. |
| 326 memset(inbuf, 0x3C, sizeof(inbuf)); |
| 327 EXPECT_NE(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 328 len1 = ki_send(sv_[1], outbuf, sizeof(outbuf), /* flags */ 0); |
| 329 EXPECT_EQ(sizeof(outbuf), len1); |
| 330 |
| 331 EXPECT_NE(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 332 |
| 333 len2 = ki_recv(sv_[0], inbuf, sizeof(inbuf), /* flags */ 0); |
| 334 EXPECT_EQ(sizeof(outbuf), len2); |
| 335 |
| 336 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 337 EXPECT_EQ(-1, ki_recv(sv_[0], inbuf, sizeof(inbuf), MSG_DONTWAIT)); |
| 338 EXPECT_EQ(EAGAIN, errno); |
| 339 } |
| 340 |
| 341 TEST_F(UnixSocketTest, RecvNonBlocking) { |
| 342 char buf[128]; |
| 343 |
| 344 EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv_)); |
| 345 |
| 346 EXPECT_EQ(-1, ki_recv(sv_[0], buf, sizeof(buf), MSG_DONTWAIT)); |
| 347 EXPECT_EQ(EAGAIN, errno); |
| 348 |
| 349 struct pollfd pollfd = {sv_[0], POLLIN | POLLOUT, 0}; |
| 350 EXPECT_EQ(1, ki_poll(&pollfd, 1, 0)); |
| 351 EXPECT_EQ(POLLOUT, pollfd.revents & POLLOUT); |
| 352 EXPECT_NE(POLLIN, pollfd.revents & POLLIN); |
| 263 } | 353 } |
| 264 | 354 |
| 265 TEST(SocketUtilityFunctions, Htonl) { | 355 TEST(SocketUtilityFunctions, Htonl) { |
| 266 uint32_t host_long = 0x44332211; | 356 uint32_t host_long = 0x44332211; |
| 267 uint32_t network_long = htonl(host_long); | 357 uint32_t network_long = htonl(host_long); |
| 268 uint8_t network_bytes[4]; | 358 uint8_t network_bytes[4]; |
| 269 memcpy(network_bytes, &network_long, 4); | 359 memcpy(network_bytes, &network_long, 4); |
| 270 EXPECT_EQ(network_bytes[0], 0x44); | 360 EXPECT_EQ(network_bytes[0], 0x44); |
| 271 EXPECT_EQ(network_bytes[1], 0x33); | 361 EXPECT_EQ(network_bytes[1], 0x33); |
| 272 EXPECT_EQ(network_bytes[2], 0x22); | 362 EXPECT_EQ(network_bytes[2], 0x22); |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 | 620 |
| 531 TEST(SocketUtilityFunctions, Ntohl) { | 621 TEST(SocketUtilityFunctions, Ntohl) { |
| 532 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; | 622 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; |
| 533 uint32_t network_long; | 623 uint32_t network_long; |
| 534 memcpy(&network_long, network_bytes, 4); | 624 memcpy(&network_long, network_bytes, 4); |
| 535 uint32_t host_long = ntohl(network_long); | 625 uint32_t host_long = ntohl(network_long); |
| 536 EXPECT_EQ(host_long, 0x44332211); | 626 EXPECT_EQ(host_long, 0x44332211); |
| 537 } | 627 } |
| 538 | 628 |
| 539 #endif // PROVIDES_SOCKETPAIR_API | 629 #endif // PROVIDES_SOCKETPAIR_API |
| OLD | NEW |