Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: native_client_sdk/src/tests/nacl_io_test/socket_test.cc

Issue 1679643002: nacl_io: Add SOCK_DGRAM support to socketpair() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix unit test failure Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/tests/nacl_io_test/socket_test.cc
diff --git a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
index e2d86d53bb8e23b81f83cccb358edccbc1c1a9dc..0e454b241d41d9a42e7c45a502e875f0bb66e5b2 100644
--- a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
@@ -256,7 +256,7 @@ TEST_F(SocketTest, SocketpairUnsupported) {
EXPECT_EQ(errno, EOPNOTSUPP);
EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0);
EXPECT_EQ(errno, EOPNOTSUPP);
- EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_DGRAM, 0, sv), 0);
+ EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_RAW, 0, sv), 0);
EXPECT_EQ(errno, EPROTOTYPE);
EXPECT_LT(ki_socketpair(AF_MAX, SOCK_STREAM, 0, sv), 0);
EXPECT_EQ(errno, EAFNOSUPPORT);
@@ -296,9 +296,15 @@ TEST_F(UnixSocketTest, Socketpair) {
EXPECT_EQ(0, errno);
EXPECT_LE(0, sv_[0]);
EXPECT_LE(0, sv_[1]);
+
+ errno = 0;
+ EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_DGRAM, 0, sv_));
+ EXPECT_EQ(0, errno);
+ EXPECT_LE(0, sv_[0]);
+ EXPECT_LE(0, sv_[1]);
}
-TEST_F(UnixSocketTest, SendRecv) {
+TEST_F(UnixSocketTest, SendRecvStream) {
char outbuf[256];
char inbuf[512];
@@ -318,7 +324,7 @@ TEST_F(UnixSocketTest, SendRecv) {
EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf)));
- // A reader should block after to read at this point.
+ // A reader should block after trying to read at this point.
EXPECT_EQ(-1, ki_recv(sv_[1], inbuf, sizeof(inbuf), MSG_DONTWAIT));
EXPECT_EQ(EAGAIN, errno);
@@ -338,7 +344,7 @@ TEST_F(UnixSocketTest, SendRecv) {
EXPECT_EQ(EAGAIN, errno);
}
-TEST_F(UnixSocketTest, RecvNonBlocking) {
+TEST_F(UnixSocketTest, RecvNonBlockingStream) {
char buf[128];
EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv_));
@@ -352,6 +358,80 @@ TEST_F(UnixSocketTest, RecvNonBlocking) {
EXPECT_NE(POLLIN, pollfd.revents & POLLIN);
}
+TEST_F(UnixSocketTest, SendRecvDgram) {
+ char outbuf1[256], outbuf2[128];
Sam Clegg 2016/02/08 17:30:55 nit: put these one on each line
cernekee 2016/02/08 22:53:29 Done.
+ char inbuf[512];
+
+ memset(outbuf1, 0xA4, sizeof(outbuf1));
+ memset(outbuf2, 0xA5, sizeof(outbuf2));
+ memset(inbuf, 0x3C, sizeof(inbuf));
+
+ EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_DGRAM, 0, sv_));
+
+ int len1 = ki_send(sv_[0], outbuf1, sizeof(outbuf1), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf1), len1);
+
+ // The buffers should be different.
+ EXPECT_NE(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+
+ int len2 = ki_send(sv_[0], outbuf2, sizeof(outbuf2), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf2), len2);
+
+ // Make sure the datagram boundaries are respected.
+ len1 = ki_recv(sv_[1], inbuf, sizeof(inbuf), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf1), len1);
+ EXPECT_EQ(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+
+ len2 = ki_recv(sv_[1], inbuf, sizeof(inbuf), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf2), len2);
+ EXPECT_EQ(0, memcmp(outbuf2, inbuf, sizeof(outbuf2)));
+
+ // A reader should block after trying to read at this point.
+ EXPECT_EQ(-1, ki_recv(sv_[1], inbuf, sizeof(inbuf), MSG_DONTWAIT));
+ EXPECT_EQ(EAGAIN, errno);
+
+ // Send a datagram larger than the recv buffer, and check for overflow.
+ memset(inbuf, 0x3C, sizeof(inbuf));
+ EXPECT_NE(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+ len1 = ki_send(sv_[1], outbuf1, sizeof(outbuf1), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf1), len1);
+
+ len2 = ki_recv(sv_[0], inbuf, 16, /* flags */ 0);
+ EXPECT_EQ(16, len2);
+ EXPECT_EQ(0, memcmp(outbuf1, inbuf, 16));
+ EXPECT_EQ(0x3C, inbuf[16]);
+
+ // Send data back in the opposite direction, and make sure the call
+ // blocks when there is no more data to read.
Sam Clegg 2016/02/08 17:30:55 Didn't you already send data in the opposite direc
cernekee 2016/02/08 22:53:29 Done.
+ memset(inbuf, 0x3C, sizeof(inbuf));
+ EXPECT_NE(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+ len1 = ki_send(sv_[1], outbuf1, sizeof(outbuf1), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf1), len1);
+
+ EXPECT_NE(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+
+ len2 = ki_recv(sv_[0], inbuf, sizeof(inbuf), /* flags */ 0);
+ EXPECT_EQ(sizeof(outbuf1), len2);
+
+ EXPECT_EQ(0, memcmp(outbuf1, inbuf, sizeof(outbuf1)));
+ EXPECT_EQ(-1, ki_recv(sv_[0], inbuf, sizeof(inbuf), MSG_DONTWAIT));
+ EXPECT_EQ(EAGAIN, errno);
+}
+
+TEST_F(UnixSocketTest, RecvNonBlockingDgram) {
+ char buf[128];
+
+ EXPECT_EQ(0, ki_socketpair(AF_UNIX, SOCK_DGRAM, 0, sv_));
+
+ EXPECT_EQ(-1, ki_recv(sv_[0], buf, sizeof(buf), MSG_DONTWAIT));
+ EXPECT_EQ(EAGAIN, errno);
+
+ struct pollfd pollfd = {sv_[0], POLLIN | POLLOUT, 0};
+ EXPECT_EQ(1, ki_poll(&pollfd, 1, 0));
+ EXPECT_EQ(POLLOUT, pollfd.revents & POLLOUT);
+ EXPECT_NE(POLLIN, pollfd.revents & POLLIN);
+}
+
TEST(SocketUtilityFunctions, Htonl) {
uint32_t host_long = 0x44332211;
uint32_t network_long = htonl(host_long);

Powered by Google App Engine
This is Rietveld 408576698