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