| Index: ipc/sync_socket_unittest.cc
|
| diff --git a/ipc/sync_socket_unittest.cc b/ipc/sync_socket_unittest.cc
|
| index dc50525b3673a83599350fc8ee9038dd9dbbf371..6aa33306d9cbab13baec13dff2dd7453bc9987ba 100644
|
| --- a/ipc/sync_socket_unittest.cc
|
| +++ b/ipc/sync_socket_unittest.cc
|
| @@ -89,8 +89,8 @@ class SyncSocketServerListener : public IPC::Channel::Listener {
|
|
|
| void SetHandle(base::SyncSocket::Handle handle) {
|
| base::SyncSocket sync_socket(handle);
|
| - EXPECT_EQ(sync_socket.Send(static_cast<const void*>(kHelloString),
|
| - kHelloStringLength), kHelloStringLength);
|
| + EXPECT_EQ(sync_socket.Send(kHelloString, kHelloStringLength),
|
| + kHelloStringLength);
|
| IPC::Message* msg = new MsgClassResponse(kHelloString);
|
| EXPECT_TRUE(chan_->Send(msg));
|
| }
|
| @@ -206,11 +206,15 @@ TEST_F(SyncSocketTest, SanityTest) {
|
| base::CloseProcessHandle(server_process);
|
| }
|
|
|
| -static void BlockingRead(base::SyncSocket* socket, size_t* received) {
|
| +
|
| +// A blocking read operation that will block the thread until it receives
|
| +// |length| bytes of packets or Shutdown() is called on another thread.
|
| +static void BlockingRead(base::SyncSocket* socket, char* buf,
|
| + size_t length, size_t* received) {
|
| + DCHECK(buf != NULL);
|
| // Notify the parent thread that we're up and running.
|
| socket->Send(kHelloString, kHelloStringLength);
|
| - char buf[0xff]; // Won't ever be filled.
|
| - *received = socket->Receive(buf, arraysize(buf));
|
| + *received = socket->Receive(buf, length);
|
| }
|
|
|
| // Tests that we can safely end a blocking Receive operation on one thread
|
| @@ -223,14 +227,15 @@ TEST_F(SyncSocketTest, DisconnectTest) {
|
| worker.Start();
|
|
|
| // Try to do a blocking read from one of the sockets on the worker thread.
|
| + char buf[0xff];
|
| size_t received = 1U; // Initialize to an unexpected value.
|
| worker.message_loop()->PostTask(FROM_HERE,
|
| - base::Bind(&BlockingRead, &pair[0], &received));
|
| + base::Bind(&BlockingRead, &pair[0], &buf[0], arraysize(buf), &received));
|
|
|
| // Wait for the worker thread to say hello.
|
| char hello[kHelloStringLength] = {0};
|
| pair[1].Receive(&hello[0], sizeof(hello));
|
| - VLOG(1) << "Received: " << hello;
|
| + EXPECT_EQ(0, strcmp(hello, kHelloString));
|
| // Give the worker a chance to start Receive().
|
| base::PlatformThread::YieldCurrentThread();
|
|
|
| @@ -242,3 +247,62 @@ TEST_F(SyncSocketTest, DisconnectTest) {
|
|
|
| EXPECT_EQ(0U, received);
|
| }
|
| +
|
| +// Tests that read is a blocking operation.
|
| +TEST_F(SyncSocketTest, BlockingReceiveTest) {
|
| + base::CancelableSyncSocket pair[2];
|
| + ASSERT_TRUE(base::CancelableSyncSocket::CreatePair(&pair[0], &pair[1]));
|
| +
|
| + base::Thread worker("BlockingThread");
|
| + worker.Start();
|
| +
|
| + // Try to do a blocking read from one of the sockets on the worker thread.
|
| + char buf[kHelloStringLength] = {0};
|
| + size_t received = 1U; // Initialize to an unexpected value.
|
| + worker.message_loop()->PostTask(FROM_HERE,
|
| + base::Bind(&BlockingRead, &pair[0], &buf[0],
|
| + kHelloStringLength, &received));
|
| +
|
| + // Wait for the worker thread to say hello.
|
| + char hello[kHelloStringLength] = {0};
|
| + pair[1].Receive(&hello[0], sizeof(hello));
|
| + EXPECT_EQ(0, strcmp(hello, kHelloString));
|
| + // Give the worker a chance to start Receive().
|
| + base::PlatformThread::YieldCurrentThread();
|
| +
|
| + // Send a message to the socket on the blocking thead, it should free the
|
| + // socket from Receive().
|
| + pair[1].Send(kHelloString, kHelloStringLength);
|
| + worker.Stop();
|
| +
|
| + // Verify the socket has received the message.
|
| + EXPECT_TRUE(strcmp(buf, kHelloString) == 0);
|
| + EXPECT_EQ(kHelloStringLength, received);
|
| +}
|
| +
|
| +// Tests that the write operation is non-blocking and returns immediately
|
| +// when there is insufficient space in the socket's buffer.
|
| +TEST_F(SyncSocketTest, NonBlockingWriteTest) {
|
| + base::CancelableSyncSocket pair[2];
|
| + ASSERT_TRUE(base::CancelableSyncSocket::CreatePair(&pair[0], &pair[1]));
|
| +
|
| + // Fill up the buffer for one of the socket, Send() should not block the
|
| + // thread even when the buffer is full.
|
| + while (pair[0].Send(kHelloString, kHelloStringLength) != 0) {}
|
| +
|
| + // Data should be avialble on another socket.
|
| + size_t bytes_in_buffer = pair[1].Peek();
|
| + EXPECT_NE(bytes_in_buffer, 0U);
|
| +
|
| + // No more data can be written to the buffer since socket has been full,
|
| + // verify that the amount of avialble data on another socket is unchanged.
|
| + EXPECT_EQ(0U, pair[0].Send(kHelloString, kHelloStringLength));
|
| + EXPECT_EQ(bytes_in_buffer, pair[1].Peek());
|
| +
|
| + // Read from another socket to free some space for a new write.
|
| + char hello[kHelloStringLength] = {0};
|
| + pair[1].Receive(&hello[0], sizeof(hello));
|
| +
|
| + // Should be able to write more data to the buffer now.
|
| + EXPECT_EQ(kHelloStringLength, pair[0].Send(kHelloString, kHelloStringLength));
|
| +}
|
|
|