Chromium Code Reviews| 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) {} |
|
rvargas (doing something else)
2015/01/23 03:05:34
nit: I'd say this is not allowed by the style guid
Alpha Left Google
2015/01/23 03:52:22
I used git cl format and it didn't correct this li
|
| // 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) { |
|
rvargas (doing something else)
2015/01/23 03:05:34
This method is way too long to be defined at the d
Alpha Left Google
2015/01/23 03:52:22
Defined it out of the class.
|
| + 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 |