summaryrefslogtreecommitdiff
path: root/chromium/net/socket/udp_socket_posix_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/socket/udp_socket_posix_unittest.cc')
-rw-r--r--chromium/net/socket/udp_socket_posix_unittest.cc726
1 files changed, 0 insertions, 726 deletions
diff --git a/chromium/net/socket/udp_socket_posix_unittest.cc b/chromium/net/socket/udp_socket_posix_unittest.cc
deleted file mode 100644
index fc306356f59..00000000000
--- a/chromium/net/socket/udp_socket_posix_unittest.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/socket/udp_socket_posix.h"
-
-#include "base/bind.h"
-#include "build/build_config.h"
-#include "net/base/completion_repeating_callback.h"
-#include "net/base/net_errors.h"
-#include "net/log/net_log.h"
-#include "net/log/test_net_log.h"
-#include "net/log/test_net_log_util.h"
-#include "net/socket/datagram_socket.h"
-#include "net/test/test_with_task_environment.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::InvokeWithoutArgs;
-using ::testing::Return;
-
-namespace net {
-
-namespace test {
-
-namespace {
-
-const size_t kMaxPacketSize = 1500;
-const size_t kNumMsgs = 3;
-const std::string kHelloMsg = "Hello world";
-const std::string kSecondMsg = "Second buffer";
-const std::string kThirdMsg = "Third buffer";
-
-int SetWouldBlock() {
- errno = EWOULDBLOCK;
- return -1;
-}
-
-#if HAVE_SENDMMSG
-int SetNotImplemented() {
- errno = ENOSYS;
- return -1;
-}
-#endif
-
-bool WatcherSetInvalidHandle() {
- errno = EBADF;
- return false;
-}
-
-int SetInvalidHandle() {
- errno = EBADF;
- return -1;
-}
-
-} // namespace
-
-class MockUDPSocketPosixSender : public UDPSocketPosixSender {
- public:
- MOCK_CONST_METHOD4(
- Send,
- ssize_t(int sockfd, const void* buf, size_t len, int flags));
- MOCK_CONST_METHOD4(Sendmmsg,
- int(int sockfd,
- struct mmsghdr* msgvec,
- unsigned int vlen,
- unsigned int flags));
-
- public:
- SendResult InternalSendBuffers(int fd, DatagramBuffers buffers) const {
- return UDPSocketPosixSender::InternalSendBuffers(fd, std::move(buffers));
- }
-#if HAVE_SENDMMSG
- SendResult InternalSendmmsgBuffers(int fd, DatagramBuffers buffers) const {
- return UDPSocketPosixSender::InternalSendmmsgBuffers(fd,
- std::move(buffers));
- }
-#endif
-
- private:
- ~MockUDPSocketPosixSender() override {}
-};
-
-class MockUDPSocketPosix : public UDPSocketPosix {
- public:
- MockUDPSocketPosix(DatagramSocket::BindType bind_type,
- net::NetLog* net_log,
- const net::NetLogSource& source)
- : UDPSocketPosix(bind_type, net_log, source) {
- sender_ = new MockUDPSocketPosixSender();
- }
-
- MockUDPSocketPosixSender* sender() {
- return static_cast<MockUDPSocketPosixSender*>(sender_.get());
- }
-
- MOCK_METHOD0(InternalWatchFileDescriptor, bool());
- MOCK_METHOD0(InternalStopWatchingFileDescriptor, void());
-
- void FlushPending() { UDPSocketPosix::FlushPending(); }
-
- void DidSendBuffers(SendResult buffers) {
- UDPSocketPosix::DidSendBuffers(std::move(buffers));
- }
-
- void Enqueue(const std::string& msg, DatagramBuffers* buffers) {
- datagram_buffer_pool_->Enqueue(msg.data(), msg.length(), buffers);
- }
-
- void SetWriteCallback(CompletionOnceCallback callback) {
- UDPSocketPosix::SetWriteCallback(std::move(callback));
- }
-
- void IncreaseWriteAsyncOutstanding(int increment) {
- UDPSocketPosix::IncreaseWriteAsyncOutstanding(increment);
- }
-
- void SetPendingWrites(DatagramBuffers buffers) {
- pending_writes_ = std::move(buffers);
- }
-
- void OnFileCanWriteWithoutBlocking() {
- write_async_watcher_->OnFileCanWriteWithoutBlocking(1);
- }
-};
-
-class UDPSocketPosixTest : public TestWithTaskEnvironment {
- public:
- UDPSocketPosixTest()
- : TestWithTaskEnvironment(
- base::test::TaskEnvironment::TimeSource::MOCK_TIME),
- socket_(DatagramSocket::DEFAULT_BIND, NetLog::Get(), NetLogSource()) {
- write_callback_ = base::BindRepeating(&UDPSocketPosixTest::OnWriteComplete,
- weak_factory_.GetWeakPtr());
- }
-
- void SetUp() override {
- socket_.SetWriteAsyncEnabled(true);
- socket_.SetMaxPacketSize(kMaxPacketSize);
- }
-
- void AddBuffer(const std::string& msg) {
- socket_.IncreaseWriteAsyncOutstanding(1);
- socket_.Enqueue(msg, &buffers_);
- }
-
- void AddBuffers() {
- for (size_t i = 0; i < kNumMsgs; i++) {
- AddBuffer(msgs_[i]);
- }
- }
-
- void SaveBufferPtrs() {
- int i = 0;
- for (auto it = buffers_.cbegin(); it != buffers_.cend(); it++) {
- buffer_ptrs_[i] = it->get();
- i++;
- }
- }
-
- void VerifyBufferPtrs() {
- int i = 0;
- for (auto it = buffers_.cbegin(); it != buffers_.cend(); it++) {
- EXPECT_EQ(buffer_ptrs_[i], it->get());
- i++;
- }
- }
-
- void VerifyBuffersDequeued() {
- AddBuffers();
- VerifyBufferPtrs();
- buffers_.clear();
- }
-
- void ResetWriteCallback() {
- callback_fired_ = false;
- rv_ = 0;
- }
-
- void OnWriteComplete(int rv) {
- callback_fired_ = true;
- rv_ = rv;
- }
-
- int WriteAsync(int i) {
- return socket_.WriteAsync(msgs_[i].data(), lengths_[i], write_callback_,
- TRAFFIC_ANNOTATION_FOR_TESTS);
- }
-
- void ExpectSend(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(Return(lengths_[i]));
- }
-
- void ExpectSendWillBlock(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- }
-
- void ExpectSendWillError(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(InvokeWithoutArgs(SetInvalidHandle));
- }
-
- void ExpectSends() {
- InSequence dummy;
- for (size_t i = 0; i < kNumMsgs; i++) {
- ExpectSend(static_cast<int>(i));
- }
- }
-
- void ExpectSendmmsg() {
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(Return(kNumMsgs));
- }
-
- RecordingNetLogObserver net_log_observer_;
- MockUDPSocketPosix socket_;
- DatagramBuffers buffers_;
- bool callback_fired_ = false;
- int rv_;
- std::string msgs_[kNumMsgs] = {kHelloMsg, kSecondMsg, kThirdMsg};
- int lengths_[kNumMsgs] = {static_cast<int>(kHelloMsg.length()),
- static_cast<int>(kSecondMsg.length()),
- static_cast<int>(kThirdMsg.length())};
- int total_lengths_ =
- kHelloMsg.length() + kSecondMsg.length() + kThirdMsg.length();
- DatagramBuffer* buffer_ptrs_[kNumMsgs];
- CompletionRepeatingCallback write_callback_;
-#if HAVE_SENDMMSG
- struct iovec msg_iov_[kNumMsgs];
- struct mmsghdr msgvec_[kNumMsgs];
-#endif
- base::WeakPtrFactory<UDPSocketPosixTest> weak_factory_{this};
-};
-
-TEST_F(UDPSocketPosixTest, InternalSendBuffers) {
- AddBuffers();
- ExpectSends();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendBuffersWriteError) {
- AddBuffers();
- {
- InSequence dummy;
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .WillOnce(Return(lengths_[0]));
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[1], _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- }
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(ERR_IO_PENDING, result.rv);
- EXPECT_EQ(1, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-#if HAVE_SENDMMSG
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffers) {
- AddBuffers();
- ExpectSendmmsg();
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteShort) {
- AddBuffers();
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(Return(1));
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(1, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteError) {
- AddBuffers();
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(ERR_IO_PENDING, result.rv);
- EXPECT_EQ(0, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSend) {
- AddBuffers();
- ExpectSends();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSendmmsg) {
- socket_.sender()->SetSendmmsgEnabled(true);
- AddBuffers();
- ExpectSendmmsg();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSendmmsgFallback) {
- socket_.sender()->SetSendmmsgEnabled(true);
- AddBuffers();
- {
- InSequence dummy;
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(InvokeWithoutArgs(SetNotImplemented));
- ExpectSends();
- }
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-#endif // HAVE_SENDMMSG
-
-TEST_F(UDPSocketPosixTest, DidSendBuffers) {
- AddBuffers();
- SaveBufferPtrs();
- SendResult send_result(0, kNumMsgs, std::move(buffers_));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- VerifyBuffersDequeued();
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_FALSE(callback_fired_);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersAsync) {
- AddBuffers();
- SendResult send_result(0, kNumMsgs, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersError) {
- AddBuffers();
- SendResult send_result(ERR_INVALID_HANDLE, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersShort) {
- AddBuffers();
- SendResult send_result(0, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersPending) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersWatchError) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor())
- .WillOnce(InvokeWithoutArgs(WatcherSetInvalidHandle));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(3u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_SEND_ERROR,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersStopWatch) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(2u, buffers_.size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-
- SendResult send_result2(0, 2, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
-
- socket_.DidSendBuffers(std::move(send_result2));
-
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[1] + lengths_[2]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersErrorStopWatch) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(2u, buffers_.size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-
- SendResult send_result2(ERR_INVALID_HANDLE, 0, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
-
- socket_.DidSendBuffers(std::move(send_result2));
-
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersDelayCallbackWhileTooManyBuffers) {
- for (int i = 0; i < kWriteAsyncCallbackBuffersThreshold + 2; i++) {
- AddBuffer(msgs_[0]);
- }
- SendResult send_result(0, 2, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(3u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- // bytes written but no callback because socket_.pending_writes_ is full.
- EXPECT_FALSE(callback_fired_);
-
- // now the rest
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(kWriteAsyncCallbackBuffersThreshold,
- static_cast<int>(buffers_.size()));
- SendResult send_result2(0, buffers_.size(), std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result2));
- EXPECT_TRUE(callback_fired_);
- // rv includes bytes from previous invocation.
- EXPECT_EQ(rv_, (kWriteAsyncCallbackBuffersThreshold + 2) * lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, FlushPendingLocal) {
- socket_.SetWriteMultiCoreEnabled(false);
- AddBuffers();
- ExpectSends();
- socket_.SetPendingWrites(std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.FlushPending();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, FlushPendingMultiCore) {
- socket_.SetWriteMultiCoreEnabled(true);
- AddBuffers();
- ExpectSends();
- socket_.SetPendingWrites(std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.FlushPending();
- EXPECT_FALSE(callback_fired_);
- RunUntilIdle();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatching) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSend(1);
- rv = WriteAsync(1);
- EXPECT_EQ(lengths_[1], rv);
- ExpectSend(2);
- rv = WriteAsync(2);
- EXPECT_EQ(lengths_[2], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingErrIOPending) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSendWillBlock(1);
- rv = WriteAsync(1);
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
- ExpectSend(1);
- socket_.OnFileCanWriteWithoutBlocking();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[1]);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingError) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSendWillError(1);
- rv = WriteAsync(1);
- EXPECT_EQ(ERR_INVALID_HANDLE, rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncBasicDelay) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ASSERT_LT(kWriteAsyncMinBuffersThreshold, 3);
- ASSERT_GT(kWriteAsyncPostBuffersThreshold, 3);
- int rv = WriteAsync(0);
- EXPECT_EQ(0, rv);
- rv = WriteAsync(1);
- EXPECT_EQ(0, rv);
- rv = WriteAsync(2);
- EXPECT_EQ(0, rv);
- // Cause the write async timer to fire and above writes to flush.
- ExpectSends();
- FastForwardBy(kWriteAsyncMsThreshold);
- RunUntilIdle();
- rv = WriteAsync(0);
- EXPECT_EQ(total_lengths_, rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdLocal) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(false);
- DatagramBuffers buffers;
- int rv = 0;
- for (int i = 0; i < kWriteAsyncPostBuffersThreshold - 1; i++) {
- WriteAsync(0);
- EXPECT_EQ(0, rv);
- }
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncPostBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- rv = WriteAsync(0);
- EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdRemote) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncPostBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- DatagramBuffers buffers;
- int rv = 0;
- for (int i = 0; i < kWriteAsyncPostBuffersThreshold; i++) {
- WriteAsync(0);
- EXPECT_EQ(0, rv);
- }
- RunUntilIdle();
- rv = WriteAsync(0);
- EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBlocks) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- for (int i = 0; i < kWriteAsyncMaxBuffersThreshold; i++) {
- socket_.Enqueue(msgs_[0], &buffers_);
- }
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncMaxBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- int rv = socket_.WriteAsync(std::move(buffers_), write_callback_,
- TRAFFIC_ANNOTATION_FOR_TESTS);
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_FALSE(callback_fired_);
- RunUntilIdle();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, kWriteAsyncMaxBuffersThreshold * lengths_[0]);
-}
-
-} // namespace test
-
-} // namespace net