OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |