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 |