OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "net/dns/async_host_resolver.h" | 5 #include "net/dns/async_host_resolver.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "net/base/host_cache.h" | 9 #include "net/base/host_cache.h" |
10 #include "net/base/net_log.h" | 10 #include "net/base/net_log.h" |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 HostResolver::RequestInfo info0_, info1_, info2_, info3_; | 140 HostResolver::RequestInfo info0_, info1_, info2_, info3_; |
141 std::vector<MockWrite> writes0_, writes1_, writes2_, writes3_; | 141 std::vector<MockWrite> writes0_, writes1_, writes2_, writes3_; |
142 std::vector<MockRead> reads0_, reads1_, reads2_, reads3_; | 142 std::vector<MockRead> reads0_, reads1_, reads2_, reads3_; |
143 scoped_ptr<StaticSocketDataProvider> data0_, data1_, data2_, data3_; | 143 scoped_ptr<StaticSocketDataProvider> data0_, data1_, data2_, data3_; |
144 std::vector<const char*> ip_addresses0_, ip_addresses1_, | 144 std::vector<const char*> ip_addresses0_, ip_addresses1_, |
145 ip_addresses2_, ip_addresses3_; | 145 ip_addresses2_, ip_addresses3_; |
146 MockClientSocketFactory factory_; | 146 MockClientSocketFactory factory_; |
147 TestPrng test_prng_; | 147 TestPrng test_prng_; |
148 RandIntCallback rand_int_cb_; | 148 RandIntCallback rand_int_cb_; |
149 scoped_ptr<HostResolver> resolver_; | 149 scoped_ptr<HostResolver> resolver_; |
150 TestOldCompletionCallback callback0_, callback1_, callback2_, callback3_; | 150 TestCompletionCallback callback0_, callback1_, callback2_, callback3_; |
151 }; | 151 }; |
152 | 152 |
153 TEST_F(AsyncHostResolverTest, EmptyHostLookup) { | 153 TEST_F(AsyncHostResolverTest, EmptyHostLookup) { |
154 info0_.set_host_port_pair(HostPortPair("", kPortNum)); | 154 info0_.set_host_port_pair(HostPortPair("", kPortNum)); |
155 int rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 155 int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
156 BoundNetLog()); | 156 BoundNetLog()); |
157 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); | 157 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); |
158 } | 158 } |
159 | 159 |
160 TEST_F(AsyncHostResolverTest, IPv4LiteralLookup) { | 160 TEST_F(AsyncHostResolverTest, IPv4LiteralLookup) { |
161 const char* kIPLiteral = "192.168.1.2"; | 161 const char* kIPLiteral = "192.168.1.2"; |
162 info0_.set_host_port_pair(HostPortPair(kIPLiteral, kPortNum)); | 162 info0_.set_host_port_pair(HostPortPair(kIPLiteral, kPortNum)); |
163 info0_.set_host_resolver_flags(HOST_RESOLVER_CANONNAME); | 163 info0_.set_host_resolver_flags(HOST_RESOLVER_CANONNAME); |
164 int rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 164 int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
165 BoundNetLog()); | 165 BoundNetLog()); |
166 EXPECT_EQ(OK, rv); | 166 EXPECT_EQ(OK, rv); |
167 std::vector<const char*> ip_addresses(1, kIPLiteral); | 167 std::vector<const char*> ip_addresses(1, kIPLiteral); |
168 VerifyAddressList(ip_addresses, kPortNum, addrlist0_); | 168 VerifyAddressList(ip_addresses, kPortNum, addrlist0_); |
169 EXPECT_STREQ(kIPLiteral, addrlist0_.head()->ai_canonname); | 169 EXPECT_STREQ(kIPLiteral, addrlist0_.head()->ai_canonname); |
170 } | 170 } |
171 | 171 |
172 TEST_F(AsyncHostResolverTest, IPv6LiteralLookup) { | 172 TEST_F(AsyncHostResolverTest, IPv6LiteralLookup) { |
173 info0_.set_host_port_pair(HostPortPair("2001:db8:0::42", kPortNum)); | 173 info0_.set_host_port_pair(HostPortPair("2001:db8:0::42", kPortNum)); |
174 int rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 174 int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
175 BoundNetLog()); | 175 BoundNetLog()); |
176 // When support for IPv6 is added, this should succeed. | 176 // When support for IPv6 is added, this should succeed. |
177 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); | 177 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); |
178 } | 178 } |
179 | 179 |
180 TEST_F(AsyncHostResolverTest, CachedLookup) { | 180 TEST_F(AsyncHostResolverTest, CachedLookup) { |
181 int rv = resolver_->ResolveFromCache(info0_, &addrlist0_, BoundNetLog()); | 181 int rv = resolver_->ResolveFromCache(info0_, &addrlist0_, BoundNetLog()); |
182 EXPECT_EQ(ERR_DNS_CACHE_MISS, rv); | 182 EXPECT_EQ(ERR_DNS_CACHE_MISS, rv); |
183 | 183 |
184 // Cache the result of |info0_| lookup. | 184 // Cache the result of |info0_| lookup. |
185 rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 185 rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
186 BoundNetLog()); | 186 BoundNetLog()); |
187 EXPECT_EQ(ERR_IO_PENDING, rv); | 187 EXPECT_EQ(ERR_IO_PENDING, rv); |
188 rv = callback0_.WaitForResult(); | 188 rv = callback0_.WaitForResult(); |
189 EXPECT_EQ(OK, rv); | 189 EXPECT_EQ(OK, rv); |
190 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 190 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
191 | 191 |
192 // Now lookup |info0_| from cache only, store results in |addrlist1_|, | 192 // Now lookup |info0_| from cache only, store results in |addrlist1_|, |
193 // should succeed synchronously. | 193 // should succeed synchronously. |
194 rv = resolver_->ResolveFromCache(info0_, &addrlist1_, BoundNetLog()); | 194 rv = resolver_->ResolveFromCache(info0_, &addrlist1_, BoundNetLog()); |
195 EXPECT_EQ(OK, rv); | 195 EXPECT_EQ(OK, rv); |
196 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); | 196 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); |
197 } | 197 } |
198 | 198 |
199 TEST_F(AsyncHostResolverTest, InvalidHostNameLookup) { | 199 TEST_F(AsyncHostResolverTest, InvalidHostNameLookup) { |
200 const std::string kHostName1(64, 'a'); | 200 const std::string kHostName1(64, 'a'); |
201 info0_.set_host_port_pair(HostPortPair(kHostName1, kPortNum)); | 201 info0_.set_host_port_pair(HostPortPair(kHostName1, kPortNum)); |
202 int rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 202 int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
203 BoundNetLog()); | 203 BoundNetLog()); |
204 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); | 204 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); |
205 | 205 |
206 const std::string kHostName2(4097, 'b'); | 206 const std::string kHostName2(4097, 'b'); |
207 info0_.set_host_port_pair(HostPortPair(kHostName2, kPortNum)); | 207 info0_.set_host_port_pair(HostPortPair(kHostName2, kPortNum)); |
208 rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 208 rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
209 BoundNetLog()); | 209 BoundNetLog()); |
210 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); | 210 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); |
211 } | 211 } |
212 | 212 |
213 TEST_F(AsyncHostResolverTest, Lookup) { | 213 TEST_F(AsyncHostResolverTest, Lookup) { |
214 int rv = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 214 int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
215 BoundNetLog()); | 215 BoundNetLog()); |
216 EXPECT_EQ(ERR_IO_PENDING, rv); | 216 EXPECT_EQ(ERR_IO_PENDING, rv); |
217 rv = callback0_.WaitForResult(); | 217 rv = callback0_.WaitForResult(); |
218 EXPECT_EQ(OK, rv); | 218 EXPECT_EQ(OK, rv); |
219 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 219 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
220 } | 220 } |
221 | 221 |
222 TEST_F(AsyncHostResolverTest, ConcurrentLookup) { | 222 TEST_F(AsyncHostResolverTest, ConcurrentLookup) { |
223 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 223 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
224 BoundNetLog()); | 224 BoundNetLog()); |
225 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 225 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
226 BoundNetLog()); | 226 BoundNetLog()); |
227 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, NULL, | 227 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL, |
228 BoundNetLog()); | 228 BoundNetLog()); |
229 EXPECT_EQ(ERR_IO_PENDING, rv0); | 229 EXPECT_EQ(ERR_IO_PENDING, rv0); |
230 EXPECT_EQ(ERR_IO_PENDING, rv1); | 230 EXPECT_EQ(ERR_IO_PENDING, rv1); |
231 EXPECT_EQ(ERR_IO_PENDING, rv2); | 231 EXPECT_EQ(ERR_IO_PENDING, rv2); |
232 | 232 |
233 rv0 = callback0_.WaitForResult(); | 233 rv0 = callback0_.WaitForResult(); |
234 EXPECT_EQ(OK, rv0); | 234 EXPECT_EQ(OK, rv0); |
235 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 235 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
236 | 236 |
237 rv1 = callback1_.WaitForResult(); | 237 rv1 = callback1_.WaitForResult(); |
238 EXPECT_EQ(OK, rv1); | 238 EXPECT_EQ(OK, rv1); |
239 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); | 239 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); |
240 | 240 |
241 rv2 = callback2_.WaitForResult(); | 241 rv2 = callback2_.WaitForResult(); |
242 EXPECT_EQ(OK, rv2); | 242 EXPECT_EQ(OK, rv2); |
243 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); | 243 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); |
244 | 244 |
245 EXPECT_EQ(3u, factory_.udp_client_sockets().size()); | 245 EXPECT_EQ(3u, factory_.udp_client_sockets().size()); |
246 } | 246 } |
247 | 247 |
248 TEST_F(AsyncHostResolverTest, SameHostLookupsConsumeSingleTransaction) { | 248 TEST_F(AsyncHostResolverTest, SameHostLookupsConsumeSingleTransaction) { |
249 // We pass the info0_ to all requests. | 249 // We pass the info0_ to all requests. |
250 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 250 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
251 BoundNetLog()); | 251 BoundNetLog()); |
252 int rv1 = resolver_->Resolve(info0_, &addrlist1_, &callback1_, NULL, | 252 int rv1 = resolver_->Resolve(info0_, &addrlist1_, callback1_.callback(), NULL, |
253 BoundNetLog()); | 253 BoundNetLog()); |
254 int rv2 = resolver_->Resolve(info0_, &addrlist2_, &callback2_, NULL, | 254 int rv2 = resolver_->Resolve(info0_, &addrlist2_, callback2_.callback(), NULL, |
255 BoundNetLog()); | 255 BoundNetLog()); |
256 EXPECT_EQ(ERR_IO_PENDING, rv0); | 256 EXPECT_EQ(ERR_IO_PENDING, rv0); |
257 EXPECT_EQ(ERR_IO_PENDING, rv1); | 257 EXPECT_EQ(ERR_IO_PENDING, rv1); |
258 EXPECT_EQ(ERR_IO_PENDING, rv2); | 258 EXPECT_EQ(ERR_IO_PENDING, rv2); |
259 | 259 |
260 rv0 = callback0_.WaitForResult(); | 260 rv0 = callback0_.WaitForResult(); |
261 EXPECT_EQ(OK, rv0); | 261 EXPECT_EQ(OK, rv0); |
262 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 262 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
263 | 263 |
264 rv1 = callback1_.WaitForResult(); | 264 rv1 = callback1_.WaitForResult(); |
265 EXPECT_EQ(OK, rv1); | 265 EXPECT_EQ(OK, rv1); |
266 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); | 266 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); |
267 | 267 |
268 rv2 = callback2_.WaitForResult(); | 268 rv2 = callback2_.WaitForResult(); |
269 EXPECT_EQ(OK, rv2); | 269 EXPECT_EQ(OK, rv2); |
270 VerifyAddressList(ip_addresses0_, kPortNum, addrlist2_); | 270 VerifyAddressList(ip_addresses0_, kPortNum, addrlist2_); |
271 | 271 |
272 // Although we have three lookups, a single UDP socket was used. | 272 // Although we have three lookups, a single UDP socket was used. |
273 EXPECT_EQ(1u, factory_.udp_client_sockets().size()); | 273 EXPECT_EQ(1u, factory_.udp_client_sockets().size()); |
274 } | 274 } |
275 | 275 |
276 TEST_F(AsyncHostResolverTest, CancelLookup) { | 276 TEST_F(AsyncHostResolverTest, CancelLookup) { |
277 HostResolver::RequestHandle req0 = NULL, req2 = NULL; | 277 HostResolver::RequestHandle req0 = NULL, req2 = NULL; |
278 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, &req0, | 278 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), |
| 279 &req0, BoundNetLog()); |
| 280 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
279 BoundNetLog()); | 281 BoundNetLog()); |
280 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 282 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), |
281 BoundNetLog()); | 283 &req2, BoundNetLog()); |
282 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, &req2, | |
283 BoundNetLog()); | |
284 EXPECT_EQ(ERR_IO_PENDING, rv0); | 284 EXPECT_EQ(ERR_IO_PENDING, rv0); |
285 EXPECT_EQ(ERR_IO_PENDING, rv1); | 285 EXPECT_EQ(ERR_IO_PENDING, rv1); |
286 EXPECT_EQ(ERR_IO_PENDING, rv2); | 286 EXPECT_EQ(ERR_IO_PENDING, rv2); |
287 | 287 |
288 resolver_->CancelRequest(req0); | 288 resolver_->CancelRequest(req0); |
289 resolver_->CancelRequest(req2); | 289 resolver_->CancelRequest(req2); |
290 | 290 |
291 MessageLoop::current()->RunAllPending(); | 291 MessageLoop::current()->RunAllPending(); |
292 | 292 |
293 EXPECT_FALSE(callback0_.have_result()); | 293 EXPECT_FALSE(callback0_.have_result()); |
294 EXPECT_FALSE(callback2_.have_result()); | 294 EXPECT_FALSE(callback2_.have_result()); |
295 | 295 |
296 rv1 = callback1_.WaitForResult(); | 296 rv1 = callback1_.WaitForResult(); |
297 EXPECT_EQ(OK, rv1); | 297 EXPECT_EQ(OK, rv1); |
298 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); | 298 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); |
299 } | 299 } |
300 | 300 |
301 // Tests the following scenario: start two resolutions for the same host, | 301 // Tests the following scenario: start two resolutions for the same host, |
302 // cancel one of them, make sure that the other one completes. | 302 // cancel one of them, make sure that the other one completes. |
303 TEST_F(AsyncHostResolverTest, CancelSameHostLookup) { | 303 TEST_F(AsyncHostResolverTest, CancelSameHostLookup) { |
304 HostResolver::RequestHandle req0 = NULL; | 304 HostResolver::RequestHandle req0 = NULL; |
305 | 305 |
306 // Pass the info0_ to both requests. | 306 // Pass the info0_ to both requests. |
307 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, &req0, | 307 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), |
308 BoundNetLog()); | 308 &req0, BoundNetLog()); |
309 int rv1 = resolver_->Resolve(info0_, &addrlist1_, &callback1_, NULL, | 309 int rv1 = resolver_->Resolve(info0_, &addrlist1_, callback1_.callback(), NULL, |
310 BoundNetLog()); | 310 BoundNetLog()); |
311 EXPECT_EQ(ERR_IO_PENDING, rv0); | 311 EXPECT_EQ(ERR_IO_PENDING, rv0); |
312 EXPECT_EQ(ERR_IO_PENDING, rv1); | 312 EXPECT_EQ(ERR_IO_PENDING, rv1); |
313 | 313 |
314 resolver_->CancelRequest(req0); | 314 resolver_->CancelRequest(req0); |
315 MessageLoop::current()->RunAllPending(); | 315 MessageLoop::current()->RunAllPending(); |
316 EXPECT_FALSE(callback0_.have_result()); | 316 EXPECT_FALSE(callback0_.have_result()); |
317 | 317 |
318 rv1 = callback1_.WaitForResult(); | 318 rv1 = callback1_.WaitForResult(); |
319 EXPECT_EQ(OK, rv1); | 319 EXPECT_EQ(OK, rv1); |
320 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); | 320 VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_); |
321 | 321 |
322 EXPECT_EQ(1u, factory_.udp_client_sockets().size()); | 322 EXPECT_EQ(1u, factory_.udp_client_sockets().size()); |
323 } | 323 } |
324 | 324 |
325 // Test that a queued lookup completes. | 325 // Test that a queued lookup completes. |
326 TEST_F(AsyncHostResolverTest, QueuedLookup) { | 326 TEST_F(AsyncHostResolverTest, QueuedLookup) { |
327 // kMaxTransactions is 2, thus the following requests consume all | 327 // kMaxTransactions is 2, thus the following requests consume all |
328 // available transactions. | 328 // available transactions. |
329 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 329 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
330 BoundNetLog()); | 330 BoundNetLog()); |
331 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 331 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
332 BoundNetLog()); | 332 BoundNetLog()); |
333 EXPECT_EQ(ERR_IO_PENDING, rv0); | 333 EXPECT_EQ(ERR_IO_PENDING, rv0); |
334 EXPECT_EQ(ERR_IO_PENDING, rv1); | 334 EXPECT_EQ(ERR_IO_PENDING, rv1); |
335 | 335 |
336 // The following request will end up in queue. | 336 // The following request will end up in queue. |
337 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, NULL, | 337 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL, |
338 BoundNetLog()); | 338 BoundNetLog()); |
339 EXPECT_EQ(ERR_IO_PENDING, rv2); | 339 EXPECT_EQ(ERR_IO_PENDING, rv2); |
340 EXPECT_EQ(1u, | 340 EXPECT_EQ(1u, |
341 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); | 341 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); |
342 | 342 |
343 // Make sure all requests complete. | 343 // Make sure all requests complete. |
344 rv0 = callback0_.WaitForResult(); | 344 rv0 = callback0_.WaitForResult(); |
345 EXPECT_EQ(OK, rv0); | 345 EXPECT_EQ(OK, rv0); |
346 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 346 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
347 | 347 |
348 rv1 = callback1_.WaitForResult(); | 348 rv1 = callback1_.WaitForResult(); |
349 EXPECT_EQ(OK, rv1); | 349 EXPECT_EQ(OK, rv1); |
350 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); | 350 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); |
351 | 351 |
352 rv2 = callback2_.WaitForResult(); | 352 rv2 = callback2_.WaitForResult(); |
353 EXPECT_EQ(OK, rv2); | 353 EXPECT_EQ(OK, rv2); |
354 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); | 354 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); |
355 } | 355 } |
356 | 356 |
357 // Test that cancelling a queued lookup works. | 357 // Test that cancelling a queued lookup works. |
358 TEST_F(AsyncHostResolverTest, CancelPendingLookup) { | 358 TEST_F(AsyncHostResolverTest, CancelPendingLookup) { |
359 // kMaxTransactions is 2, thus the following requests consume all | 359 // kMaxTransactions is 2, thus the following requests consume all |
360 // available transactions. | 360 // available transactions. |
361 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 361 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
362 BoundNetLog()); | 362 BoundNetLog()); |
363 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 363 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
364 BoundNetLog()); | 364 BoundNetLog()); |
365 EXPECT_EQ(ERR_IO_PENDING, rv0); | 365 EXPECT_EQ(ERR_IO_PENDING, rv0); |
366 EXPECT_EQ(ERR_IO_PENDING, rv1); | 366 EXPECT_EQ(ERR_IO_PENDING, rv1); |
367 | 367 |
368 // The following request will end up in queue. | 368 // The following request will end up in queue. |
369 HostResolver::RequestHandle req2 = NULL; | 369 HostResolver::RequestHandle req2 = NULL; |
370 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, &req2, | 370 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), |
371 BoundNetLog()); | 371 &req2, BoundNetLog()); |
372 EXPECT_EQ(ERR_IO_PENDING, rv2); | 372 EXPECT_EQ(ERR_IO_PENDING, rv2); |
373 EXPECT_EQ(1u, | 373 EXPECT_EQ(1u, |
374 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); | 374 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); |
375 | 375 |
376 resolver_->CancelRequest(req2); | 376 resolver_->CancelRequest(req2); |
377 | 377 |
378 // Make sure first two requests complete while the cancelled one doesn't. | 378 // Make sure first two requests complete while the cancelled one doesn't. |
379 MessageLoop::current()->RunAllPending(); | 379 MessageLoop::current()->RunAllPending(); |
380 EXPECT_FALSE(callback2_.have_result()); | 380 EXPECT_FALSE(callback2_.have_result()); |
381 | 381 |
382 rv0 = callback0_.WaitForResult(); | 382 rv0 = callback0_.WaitForResult(); |
383 EXPECT_EQ(OK, rv0); | 383 EXPECT_EQ(OK, rv0); |
384 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 384 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
385 | 385 |
386 rv1 = callback1_.WaitForResult(); | 386 rv1 = callback1_.WaitForResult(); |
387 EXPECT_EQ(OK, rv1); | 387 EXPECT_EQ(OK, rv1); |
388 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); | 388 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); |
389 } | 389 } |
390 | 390 |
391 TEST_F(AsyncHostResolverTest, ResolverDestructionCancelsLookups) { | 391 TEST_F(AsyncHostResolverTest, ResolverDestructionCancelsLookups) { |
392 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 392 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
393 BoundNetLog()); | 393 BoundNetLog()); |
394 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 394 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
395 BoundNetLog()); | 395 BoundNetLog()); |
396 // This one is queued. | 396 // This one is queued. |
397 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, NULL, | 397 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL, |
398 BoundNetLog()); | 398 BoundNetLog()); |
399 EXPECT_EQ(1u, | 399 EXPECT_EQ(1u, |
400 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); | 400 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); |
401 | 401 |
402 EXPECT_EQ(ERR_IO_PENDING, rv0); | 402 EXPECT_EQ(ERR_IO_PENDING, rv0); |
403 EXPECT_EQ(ERR_IO_PENDING, rv1); | 403 EXPECT_EQ(ERR_IO_PENDING, rv1); |
404 EXPECT_EQ(ERR_IO_PENDING, rv2); | 404 EXPECT_EQ(ERR_IO_PENDING, rv2); |
405 | 405 |
406 resolver_.reset(); | 406 resolver_.reset(); |
407 | 407 |
408 MessageLoop::current()->RunAllPending(); | 408 MessageLoop::current()->RunAllPending(); |
409 | 409 |
410 EXPECT_FALSE(callback0_.have_result()); | 410 EXPECT_FALSE(callback0_.have_result()); |
411 EXPECT_FALSE(callback1_.have_result()); | 411 EXPECT_FALSE(callback1_.have_result()); |
412 EXPECT_FALSE(callback2_.have_result()); | 412 EXPECT_FALSE(callback2_.have_result()); |
413 } | 413 } |
414 | 414 |
415 // Test that when the number of pending lookups is at max, a new lookup | 415 // Test that when the number of pending lookups is at max, a new lookup |
416 // with a priority lower than all of those in the queue fails. | 416 // with a priority lower than all of those in the queue fails. |
417 TEST_F(AsyncHostResolverTest, OverflowQueueWithLowPriorityLookup) { | 417 TEST_F(AsyncHostResolverTest, OverflowQueueWithLowPriorityLookup) { |
418 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 418 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
419 BoundNetLog()); | 419 BoundNetLog()); |
420 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 420 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
421 BoundNetLog()); | 421 BoundNetLog()); |
422 // This one is queued and fills up the queue since its size is 1. | 422 // This one is queued and fills up the queue since its size is 1. |
423 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, NULL, | 423 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL, |
424 BoundNetLog()); | 424 BoundNetLog()); |
425 EXPECT_EQ(1u, | 425 EXPECT_EQ(1u, |
426 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); | 426 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); |
427 | 427 |
428 EXPECT_EQ(ERR_IO_PENDING, rv0); | 428 EXPECT_EQ(ERR_IO_PENDING, rv0); |
429 EXPECT_EQ(ERR_IO_PENDING, rv1); | 429 EXPECT_EQ(ERR_IO_PENDING, rv1); |
430 EXPECT_EQ(ERR_IO_PENDING, rv2); | 430 EXPECT_EQ(ERR_IO_PENDING, rv2); |
431 | 431 |
432 // This one fails. | 432 // This one fails. |
433 info3_.set_priority(LOWEST); | 433 info3_.set_priority(LOWEST); |
434 int rv3 = resolver_->Resolve(info3_, &addrlist3_, &callback3_, NULL, | 434 int rv3 = resolver_->Resolve(info3_, &addrlist3_, callback3_.callback(), NULL, |
435 BoundNetLog()); | 435 BoundNetLog()); |
436 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv3); | 436 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv3); |
437 | 437 |
438 MessageLoop::current()->RunAllPending(); | 438 MessageLoop::current()->RunAllPending(); |
439 EXPECT_FALSE(callback3_.have_result()); | 439 EXPECT_FALSE(callback3_.have_result()); |
440 } | 440 } |
441 | 441 |
442 // Test that when the number of pending lookups is at max, a new lookup | 442 // Test that when the number of pending lookups is at max, a new lookup |
443 // with a priority higher than any of those in the queue succeeds and | 443 // with a priority higher than any of those in the queue succeeds and |
444 // causes the lowest priority lookup in the queue to fail. | 444 // causes the lowest priority lookup in the queue to fail. |
445 TEST_F(AsyncHostResolverTest, OverflowQueueWithHighPriorityLookup) { | 445 TEST_F(AsyncHostResolverTest, OverflowQueueWithHighPriorityLookup) { |
446 int rv0 = resolver_->Resolve(info0_, &addrlist0_, &callback0_, NULL, | 446 int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL, |
447 BoundNetLog()); | 447 BoundNetLog()); |
448 int rv1 = resolver_->Resolve(info1_, &addrlist1_, &callback1_, NULL, | 448 int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL, |
449 BoundNetLog()); | 449 BoundNetLog()); |
450 | 450 |
451 // Next lookup is queued. Since this will be ejected from the queue and | 451 // Next lookup is queued. Since this will be ejected from the queue and |
452 // will not consume a socket from our factory, we are not passing it | 452 // will not consume a socket from our factory, we are not passing it |
453 // predefined members. | 453 // predefined members. |
454 HostResolver::RequestInfo info(HostPortPair("cnn.com", 80)); | 454 HostResolver::RequestInfo info(HostPortPair("cnn.com", 80)); |
455 info.set_address_family(ADDRESS_FAMILY_IPV4); | 455 info.set_address_family(ADDRESS_FAMILY_IPV4); |
456 AddressList addrlist_fail; | 456 AddressList addrlist_fail; |
457 TestOldCompletionCallback callback_fail; | 457 TestCompletionCallback callback_fail; |
458 int rv_fail = resolver_->Resolve(info, &addrlist_fail, &callback_fail, NULL, | 458 int rv_fail = resolver_->Resolve(info, &addrlist_fail, |
| 459 callback_fail.callback(), NULL, |
459 BoundNetLog()); | 460 BoundNetLog()); |
460 EXPECT_EQ(1u, | 461 EXPECT_EQ(1u, |
461 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); | 462 static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending()); |
462 | 463 |
463 EXPECT_EQ(ERR_IO_PENDING, rv0); | 464 EXPECT_EQ(ERR_IO_PENDING, rv0); |
464 EXPECT_EQ(ERR_IO_PENDING, rv1); | 465 EXPECT_EQ(ERR_IO_PENDING, rv1); |
465 EXPECT_EQ(ERR_IO_PENDING, rv_fail); | 466 EXPECT_EQ(ERR_IO_PENDING, rv_fail); |
466 | 467 |
467 // Lookup 2 causes the above to fail, but itself should succeed. | 468 // Lookup 2 causes the above to fail, but itself should succeed. |
468 info2_.set_priority(HIGHEST); | 469 info2_.set_priority(HIGHEST); |
469 int rv2 = resolver_->Resolve(info2_, &addrlist2_, &callback2_, NULL, | 470 int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL, |
470 BoundNetLog()); | 471 BoundNetLog()); |
471 | 472 |
472 rv0 = callback0_.WaitForResult(); | 473 rv0 = callback0_.WaitForResult(); |
473 EXPECT_EQ(OK, rv0); | 474 EXPECT_EQ(OK, rv0); |
474 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); | 475 VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_); |
475 | 476 |
476 rv1 = callback1_.WaitForResult(); | 477 rv1 = callback1_.WaitForResult(); |
477 EXPECT_EQ(OK, rv1); | 478 EXPECT_EQ(OK, rv1); |
478 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); | 479 VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_); |
479 | 480 |
480 rv_fail = callback_fail.WaitForResult(); | 481 rv_fail = callback_fail.WaitForResult(); |
481 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv_fail); | 482 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv_fail); |
482 EXPECT_EQ(static_cast<addrinfo*>(NULL), addrlist_fail.head()); | 483 EXPECT_EQ(static_cast<addrinfo*>(NULL), addrlist_fail.head()); |
483 | 484 |
484 rv2 = callback2_.WaitForResult(); | 485 rv2 = callback2_.WaitForResult(); |
485 EXPECT_EQ(OK, rv2); | 486 EXPECT_EQ(OK, rv2); |
486 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); | 487 VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_); |
487 } | 488 } |
488 | 489 |
489 } // namespace net | 490 } // namespace net |
OLD | NEW |