Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: net/dns/mdns_client_unittest.cc

Issue 581813004: Enqueue mDns requests if send on socket in progress. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mon Sep 22 15:53:28 PDT 2014 Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/dns/mdns_client_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <queue> 5 #include <queue>
6 6
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "net/base/rand_callback.h" 9 #include "net/base/rand_callback.h"
10 #include "net/base/test_completion_callback.h" 10 #include "net/base/test_completion_callback.h"
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 MDnsConnectionTest() : connection_(&delegate_) { 1086 MDnsConnectionTest() : connection_(&delegate_) {
1087 } 1087 }
1088 1088
1089 protected: 1089 protected:
1090 // Follow successful connection initialization. 1090 // Follow successful connection initialization.
1091 virtual void SetUp() OVERRIDE { 1091 virtual void SetUp() OVERRIDE {
1092 socket_ipv4_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV4); 1092 socket_ipv4_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV4);
1093 socket_ipv6_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV6); 1093 socket_ipv6_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV6);
1094 factory_.PushSocket(socket_ipv6_); 1094 factory_.PushSocket(socket_ipv6_);
1095 factory_.PushSocket(socket_ipv4_); 1095 factory_.PushSocket(socket_ipv4_);
1096 sample_packet_ = MakeString(kSamplePacket1, sizeof(kSamplePacket1));
1097 sample_buffer_ = new StringIOBuffer(sample_packet_);
1096 } 1098 }
1097 1099
1098 bool InitConnection() { 1100 bool InitConnection() {
1099 return connection_.Init(&factory_); 1101 return connection_.Init(&factory_);
1100 } 1102 }
1101 1103
1102 StrictMock<MockMDnsConnectionDelegate> delegate_; 1104 StrictMock<MockMDnsConnectionDelegate> delegate_;
1103 1105
1104 MockMDnsDatagramServerSocket* socket_ipv4_; 1106 MockMDnsDatagramServerSocket* socket_ipv4_;
1105 MockMDnsDatagramServerSocket* socket_ipv6_; 1107 MockMDnsDatagramServerSocket* socket_ipv6_;
1106 SimpleMockSocketFactory factory_; 1108 SimpleMockSocketFactory factory_;
1107 MDnsConnection connection_; 1109 MDnsConnection connection_;
1108 TestCompletionCallback callback_; 1110 TestCompletionCallback callback_;
1111 std::string sample_packet_;
1112 scoped_refptr<IOBuffer> sample_buffer_;
1109 }; 1113 };
1110 1114
1111 TEST_F(MDnsConnectionTest, ReceiveSynchronous) { 1115 TEST_F(MDnsConnectionTest, ReceiveSynchronous) {
Ryan Hamilton 2014/09/22 23:19:56 nit: Should these tests be "ConnectionTest" or "Cl
Vitaly Buka (NO REVIEWS) 2014/09/22 23:33:02 I guess most content of the file should be in mdns
Ryan Hamilton 2014/09/22 23:34:50 Yeah, no worries.
1112 std::string sample_packet = MakeString(kSamplePacket1, 1116 socket_ipv6_->SetResponsePacket(sample_packet_);
1113 sizeof(kSamplePacket1));
1114
1115 socket_ipv6_->SetResponsePacket(sample_packet);
1116 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) 1117 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
1117 .WillOnce(Return(ERR_IO_PENDING)); 1118 .WillOnce(Return(ERR_IO_PENDING));
1118 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) 1119 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
1119 .WillOnce( 1120 .WillOnce(
1120 Invoke(socket_ipv6_, &MockMDnsDatagramServerSocket::HandleRecvNow)) 1121 Invoke(socket_ipv6_, &MockMDnsDatagramServerSocket::HandleRecvNow))
1121 .WillOnce(Return(ERR_IO_PENDING)); 1122 .WillOnce(Return(ERR_IO_PENDING));
1122 1123
1123 EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet)); 1124 EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet_));
1124
1125 ASSERT_TRUE(InitConnection()); 1125 ASSERT_TRUE(InitConnection());
1126 } 1126 }
1127 1127
1128 TEST_F(MDnsConnectionTest, ReceiveAsynchronous) { 1128 TEST_F(MDnsConnectionTest, ReceiveAsynchronous) {
1129 std::string sample_packet = MakeString(kSamplePacket1, 1129 socket_ipv6_->SetResponsePacket(sample_packet_);
1130 sizeof(kSamplePacket1)); 1130
1131 socket_ipv6_->SetResponsePacket(sample_packet);
1132 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) 1131 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
1133 .WillOnce(Return(ERR_IO_PENDING)); 1132 .WillOnce(Return(ERR_IO_PENDING));
1134 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) 1133 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
1134 .Times(2)
1135 .WillOnce( 1135 .WillOnce(
1136 Invoke(socket_ipv6_, &MockMDnsDatagramServerSocket::HandleRecvLater)) 1136 Invoke(socket_ipv6_, &MockMDnsDatagramServerSocket::HandleRecvLater))
1137 .WillOnce(Return(ERR_IO_PENDING)); 1137 .WillOnce(Return(ERR_IO_PENDING));
1138 1138
1139 ASSERT_TRUE(InitConnection()); 1139 ASSERT_TRUE(InitConnection());
1140 1140
1141 EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet)); 1141 EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet_));
1142 1142
1143 base::MessageLoop::current()->RunUntilIdle(); 1143 base::MessageLoop::current()->RunUntilIdle();
1144 } 1144 }
1145 1145
1146 TEST_F(MDnsConnectionTest, Send) {
1147 std::string sample_packet = MakeString(kSamplePacket1,
1148 sizeof(kSamplePacket1));
1149
1150 scoped_refptr<IOBufferWithSize> buf(
1151 new IOBufferWithSize(sizeof kSamplePacket1));
1152 memcpy(buf->data(), kSamplePacket1, sizeof(kSamplePacket1));
1153
1154 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
1155 .WillOnce(Return(ERR_IO_PENDING));
1156 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
1157 .WillOnce(Return(ERR_IO_PENDING));
1158
1159 ASSERT_TRUE(InitConnection());
1160
1161 EXPECT_CALL(*socket_ipv4_,
1162 SendToInternal(sample_packet, "224.0.0.251:5353", _));
1163 EXPECT_CALL(*socket_ipv6_,
1164 SendToInternal(sample_packet, "[ff02::fb]:5353", _));
1165
1166 connection_.Send(buf.get(), buf->size());
1167 }
1168
1169 TEST_F(MDnsConnectionTest, Error) { 1146 TEST_F(MDnsConnectionTest, Error) {
1170 CompletionCallback callback; 1147 CompletionCallback callback;
1171 1148
1172 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) 1149 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
1173 .WillOnce(Return(ERR_IO_PENDING)); 1150 .WillOnce(Return(ERR_IO_PENDING));
1174 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) 1151 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
1175 .WillOnce(DoAll(SaveArg<3>(&callback), Return(ERR_IO_PENDING))); 1152 .WillOnce(DoAll(SaveArg<3>(&callback), Return(ERR_IO_PENDING)));
1176 1153
1177 ASSERT_TRUE(InitConnection()); 1154 ASSERT_TRUE(InitConnection());
1178 1155
1179 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); 1156 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED));
1180 callback.Run(ERR_SOCKET_NOT_CONNECTED); 1157 callback.Run(ERR_SOCKET_NOT_CONNECTED);
1158 base::MessageLoop::current()->RunUntilIdle();
1159 }
1160
1161 class MDnsConnectionSendTest : public MDnsConnectionTest {
1162 protected:
1163 virtual void SetUp() OVERRIDE {
1164 MDnsConnectionTest::SetUp();
1165 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
1166 .WillOnce(Return(ERR_IO_PENDING));
1167 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
1168 .WillOnce(Return(ERR_IO_PENDING));
1169 EXPECT_TRUE(InitConnection());
1170 }
1171 };
1172
1173 TEST_F(MDnsConnectionSendTest, Send) {
1174 EXPECT_CALL(*socket_ipv4_,
1175 SendToInternal(sample_packet_, "224.0.0.251:5353", _));
1176 EXPECT_CALL(*socket_ipv6_,
1177 SendToInternal(sample_packet_, "[ff02::fb]:5353", _));
1178
1179 connection_.Send(sample_buffer_, sample_packet_.size());
1180 }
1181
1182 TEST_F(MDnsConnectionSendTest, SendError) {
1183 CompletionCallback callback;
1184
1185 EXPECT_CALL(*socket_ipv4_,
1186 SendToInternal(sample_packet_, "224.0.0.251:5353", _));
1187 EXPECT_CALL(*socket_ipv6_,
1188 SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
1189 .WillOnce(DoAll(SaveArg<2>(&callback), Return(ERR_SOCKET_NOT_CONNECTED)));
1190
1191 connection_.Send(sample_buffer_, sample_packet_.size());
1192 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED));
1193 base::MessageLoop::current()->RunUntilIdle();
1194 }
1195
1196 TEST_F(MDnsConnectionSendTest, SendQueued) {
1197 // Send data immediately.
1198 EXPECT_CALL(*socket_ipv4_,
1199 SendToInternal(sample_packet_, "224.0.0.251:5353", _))
1200 .Times(2)
1201 .WillRepeatedly(Return(OK));
1202
1203 CompletionCallback callback;
1204 // Delay sending data. Only the first call should be made.
1205 EXPECT_CALL(*socket_ipv6_,
1206 SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
1207 .WillOnce(DoAll(SaveArg<2>(&callback), Return(ERR_IO_PENDING)));
Ryan Hamilton 2014/09/22 23:19:56 Wow, clever!
1208
1209 connection_.Send(sample_buffer_, sample_packet_.size());
1210 connection_.Send(sample_buffer_, sample_packet_.size());
1211
1212 // The second IPv6 packed is not sent yet.
1213 EXPECT_CALL(*socket_ipv4_,
1214 SendToInternal(sample_packet_, "224.0.0.251:5353", _))
1215 .Times(0);
1216 // Expect call for the second IPv6 packed.
1217 EXPECT_CALL(*socket_ipv6_,
1218 SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
1219 .WillOnce(Return(OK));
1220 callback.Run(OK);
1181 } 1221 }
1182 1222
1183 } // namespace 1223 } // namespace
1184 1224
1185 } // namespace net 1225 } // namespace net
OLDNEW
« no previous file with comments | « net/dns/mdns_client_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698