| Index: net/udp/udp_socket_unittest.cc
|
| diff --git a/net/udp/udp_socket_unittest.cc b/net/udp/udp_socket_unittest.cc
|
| index c92bf2b35d100c4466a5ee262f2f1665bf065e46..eb27a148f59e20ceb1940ddab1e0bd05f546b813 100644
|
| --- a/net/udp/udp_socket_unittest.cc
|
| +++ b/net/udp/udp_socket_unittest.cc
|
| @@ -9,7 +9,9 @@
|
|
|
| #include "base/basictypes.h"
|
| #include "base/bind.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/run_loop.h"
|
| #include "base/stl_util.h"
|
| #include "net/base/io_buffer.h"
|
| #include "net/base/ip_endpoint.h"
|
| @@ -28,8 +30,7 @@ namespace {
|
| class UDPSocketTest : public PlatformTest {
|
| public:
|
| UDPSocketTest()
|
| - : buffer_(new IOBufferWithSize(kMaxRead)) {
|
| - }
|
| + : buffer_(new IOBufferWithSize(kMaxRead)), weak_factory_(this) {}
|
|
|
| // Blocks until data is read from the socket.
|
| std::string RecvFromSocket(UDPServerSocket* socket) {
|
| @@ -112,97 +113,121 @@ class UDPSocketTest : public PlatformTest {
|
| return bytes_sent;
|
| }
|
|
|
| + // Creates and address from an ip/port and returns it in |address|.
|
| + void CreateUDPAddress(std::string ip_str, uint16 port, IPEndPoint* address) {
|
| + IPAddressNumber ip_number;
|
| + bool rv = ParseIPLiteralToNumber(ip_str, &ip_number);
|
| + if (!rv)
|
| + return;
|
| + *address = IPEndPoint(ip_number, port);
|
| + }
|
| +
|
| + // Run unit test for a connection test.
|
| + // |use_nonblocking_io| is used to switch between overlapped and non-blocking
|
| + // IO on Windows. It has no effect in other ports.
|
| + void ConnectTest(bool use_nonblocking_io) {
|
| + const uint16 kPort = 9999;
|
| + std::string simple_message("hello world!");
|
| +
|
| + // Setup the server to listen.
|
| + IPEndPoint bind_address;
|
| + CreateUDPAddress("127.0.0.1", kPort, &bind_address);
|
| + CapturingNetLog server_log;
|
| + scoped_ptr<UDPServerSocket> server(
|
| + new UDPServerSocket(&server_log, NetLog::Source()));
|
| +#if defined(OS_WIN)
|
| + if (use_nonblocking_io)
|
| + server->UseNonBlockingIO();
|
| +#endif
|
| + server->AllowAddressReuse();
|
| + int rv = server->Listen(bind_address);
|
| + ASSERT_EQ(OK, rv);
|
| +
|
| + // Setup the client.
|
| + IPEndPoint server_address;
|
| + CreateUDPAddress("127.0.0.1", kPort, &server_address);
|
| + CapturingNetLog client_log;
|
| + scoped_ptr<UDPClientSocket> client(
|
| + new UDPClientSocket(DatagramSocket::DEFAULT_BIND, RandIntCallback(),
|
| + &client_log, NetLog::Source()));
|
| +#if defined(OS_WIN)
|
| + if (use_nonblocking_io)
|
| + client->UseNonBlockingIO();
|
| +#endif
|
| +
|
| + rv = client->Connect(server_address);
|
| + EXPECT_EQ(OK, rv);
|
| +
|
| + // Client sends to the server.
|
| + rv = WriteSocket(client.get(), simple_message);
|
| + EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
|
| +
|
| + // Server waits for message.
|
| + std::string str = RecvFromSocket(server.get());
|
| + DCHECK(simple_message == str);
|
| +
|
| + // Server echoes reply.
|
| + rv = SendToSocket(server.get(), simple_message);
|
| + EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
|
| +
|
| + // Client waits for response.
|
| + str = ReadSocket(client.get());
|
| + DCHECK(simple_message == str);
|
| +
|
| + // Delete sockets so they log their final events.
|
| + server.reset();
|
| + client.reset();
|
| +
|
| + // Check the server's log.
|
| + CapturingNetLog::CapturedEntryList server_entries;
|
| + server_log.GetEntries(&server_entries);
|
| + EXPECT_EQ(4u, server_entries.size());
|
| + EXPECT_TRUE(
|
| + LogContainsBeginEvent(server_entries, 0, NetLog::TYPE_SOCKET_ALIVE));
|
| + EXPECT_TRUE(LogContainsEvent(server_entries, 1,
|
| + NetLog::TYPE_UDP_BYTES_RECEIVED,
|
| + NetLog::PHASE_NONE));
|
| + EXPECT_TRUE(LogContainsEvent(server_entries, 2, NetLog::TYPE_UDP_BYTES_SENT,
|
| + NetLog::PHASE_NONE));
|
| + EXPECT_TRUE(
|
| + LogContainsEndEvent(server_entries, 3, NetLog::TYPE_SOCKET_ALIVE));
|
| +
|
| + // Check the client's log.
|
| + CapturingNetLog::CapturedEntryList client_entries;
|
| + client_log.GetEntries(&client_entries);
|
| + EXPECT_EQ(6u, client_entries.size());
|
| + EXPECT_TRUE(
|
| + LogContainsBeginEvent(client_entries, 0, NetLog::TYPE_SOCKET_ALIVE));
|
| + EXPECT_TRUE(
|
| + LogContainsBeginEvent(client_entries, 1, NetLog::TYPE_UDP_CONNECT));
|
| + EXPECT_TRUE(
|
| + LogContainsEndEvent(client_entries, 2, NetLog::TYPE_UDP_CONNECT));
|
| + EXPECT_TRUE(LogContainsEvent(client_entries, 3, NetLog::TYPE_UDP_BYTES_SENT,
|
| + NetLog::PHASE_NONE));
|
| + EXPECT_TRUE(LogContainsEvent(client_entries, 4,
|
| + NetLog::TYPE_UDP_BYTES_RECEIVED,
|
| + NetLog::PHASE_NONE));
|
| + EXPECT_TRUE(
|
| + LogContainsEndEvent(client_entries, 5, NetLog::TYPE_SOCKET_ALIVE));
|
| + }
|
| +
|
| protected:
|
| static const int kMaxRead = 1024;
|
| scoped_refptr<IOBufferWithSize> buffer_;
|
| IPEndPoint recv_from_address_;
|
| + base::WeakPtrFactory<UDPSocketTest> weak_factory_;
|
| };
|
|
|
| -// Creates and address from an ip/port and returns it in |address|.
|
| -void CreateUDPAddress(std::string ip_str, uint16 port, IPEndPoint* address) {
|
| - IPAddressNumber ip_number;
|
| - bool rv = ParseIPLiteralToNumber(ip_str, &ip_number);
|
| - if (!rv)
|
| - return;
|
| - *address = IPEndPoint(ip_number, port);
|
| -}
|
| -
|
| TEST_F(UDPSocketTest, Connect) {
|
| - const uint16 kPort = 9999;
|
| - std::string simple_message("hello world!");
|
| -
|
| - // Setup the server to listen.
|
| - IPEndPoint bind_address;
|
| - CreateUDPAddress("127.0.0.1", kPort, &bind_address);
|
| - CapturingNetLog server_log;
|
| - scoped_ptr<UDPServerSocket> server(
|
| - new UDPServerSocket(&server_log, NetLog::Source()));
|
| - server->AllowAddressReuse();
|
| - int rv = server->Listen(bind_address);
|
| - ASSERT_EQ(OK, rv);
|
| -
|
| - // Setup the client.
|
| - IPEndPoint server_address;
|
| - CreateUDPAddress("127.0.0.1", kPort, &server_address);
|
| - CapturingNetLog client_log;
|
| - scoped_ptr<UDPClientSocket> client(
|
| - new UDPClientSocket(DatagramSocket::DEFAULT_BIND,
|
| - RandIntCallback(),
|
| - &client_log,
|
| - NetLog::Source()));
|
| - rv = client->Connect(server_address);
|
| - EXPECT_EQ(OK, rv);
|
| -
|
| - // Client sends to the server.
|
| - rv = WriteSocket(client.get(), simple_message);
|
| - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
|
| -
|
| - // Server waits for message.
|
| - std::string str = RecvFromSocket(server.get());
|
| - DCHECK(simple_message == str);
|
| -
|
| - // Server echoes reply.
|
| - rv = SendToSocket(server.get(), simple_message);
|
| - EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
|
| -
|
| - // Client waits for response.
|
| - str = ReadSocket(client.get());
|
| - DCHECK(simple_message == str);
|
| + // The variable |use_nonblocking_io| has no effect in non-Windows ports.
|
| + ConnectTest(false);
|
| +}
|
|
|
| - // Delete sockets so they log their final events.
|
| - server.reset();
|
| - client.reset();
|
| -
|
| - // Check the server's log.
|
| - CapturingNetLog::CapturedEntryList server_entries;
|
| - server_log.GetEntries(&server_entries);
|
| - EXPECT_EQ(4u, server_entries.size());
|
| - EXPECT_TRUE(LogContainsBeginEvent(
|
| - server_entries, 0, NetLog::TYPE_SOCKET_ALIVE));
|
| - EXPECT_TRUE(LogContainsEvent(
|
| - server_entries, 1, NetLog::TYPE_UDP_BYTES_RECEIVED, NetLog::PHASE_NONE));
|
| - EXPECT_TRUE(LogContainsEvent(
|
| - server_entries, 2, NetLog::TYPE_UDP_BYTES_SENT, NetLog::PHASE_NONE));
|
| - EXPECT_TRUE(LogContainsEndEvent(
|
| - server_entries, 3, NetLog::TYPE_SOCKET_ALIVE));
|
| -
|
| - // Check the client's log.
|
| - CapturingNetLog::CapturedEntryList client_entries;
|
| - client_log.GetEntries(&client_entries);
|
| - EXPECT_EQ(6u, client_entries.size());
|
| - EXPECT_TRUE(LogContainsBeginEvent(
|
| - client_entries, 0, NetLog::TYPE_SOCKET_ALIVE));
|
| - EXPECT_TRUE(LogContainsBeginEvent(
|
| - client_entries, 1, NetLog::TYPE_UDP_CONNECT));
|
| - EXPECT_TRUE(LogContainsEndEvent(
|
| - client_entries, 2, NetLog::TYPE_UDP_CONNECT));
|
| - EXPECT_TRUE(LogContainsEvent(
|
| - client_entries, 3, NetLog::TYPE_UDP_BYTES_SENT, NetLog::PHASE_NONE));
|
| - EXPECT_TRUE(LogContainsEvent(
|
| - client_entries, 4, NetLog::TYPE_UDP_BYTES_RECEIVED, NetLog::PHASE_NONE));
|
| - EXPECT_TRUE(LogContainsEndEvent(
|
| - client_entries, 5, NetLog::TYPE_SOCKET_ALIVE));
|
| +#if defined(OS_WIN)
|
| +TEST_F(UDPSocketTest, ConnectNonBlocking) {
|
| + ConnectTest(true);
|
| }
|
| +#endif
|
|
|
| #if defined(OS_MACOSX)
|
| // UDPSocketPrivate_Broadcast is disabled for OSX because it requires
|
|
|