| 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 |