| Index: net/dns/async_host_resolver_unittest.cc
 | 
| diff --git a/net/dns/async_host_resolver_unittest.cc b/net/dns/async_host_resolver_unittest.cc
 | 
| deleted file mode 100644
 | 
| index be57d494bf2ba084529a39cad0abb543bffe4ba7..0000000000000000000000000000000000000000
 | 
| --- a/net/dns/async_host_resolver_unittest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,544 +0,0 @@
 | 
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "net/dns/async_host_resolver.h"
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/memory/scoped_ptr.h"
 | 
| -#include "base/message_loop.h"
 | 
| -#include "base/stl_util.h"
 | 
| -#include "net/base/host_cache.h"
 | 
| -#include "net/base/net_errors.h"
 | 
| -#include "net/base/net_log.h"
 | 
| -#include "net/base/sys_addrinfo.h"
 | 
| -#include "net/base/test_completion_callback.h"
 | 
| -#include "net/dns/dns_query.h"
 | 
| -#include "net/dns/dns_response.h"
 | 
| -#include "net/dns/dns_test_util.h"
 | 
| -#include "net/dns/dns_transaction.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -
 | 
| -namespace net {
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -const int kPortNum = 80;
 | 
| -const size_t kMaxTransactions = 2;
 | 
| -const size_t kMaxPendingRequests = 1;
 | 
| -
 | 
| -void VerifyAddressList(const std::vector<const char*>& ip_addresses,
 | 
| -                       int port,
 | 
| -                       const AddressList& addrlist) {
 | 
| -  ASSERT_LT(0u, ip_addresses.size());
 | 
| -  ASSERT_NE(static_cast<addrinfo*>(NULL), addrlist.head());
 | 
| -
 | 
| -  IPAddressNumber ip_number;
 | 
| -  const struct addrinfo* ainfo = addrlist.head();
 | 
| -  for (std::vector<const char*>::const_iterator i = ip_addresses.begin();
 | 
| -       i != ip_addresses.end(); ++i, ainfo = ainfo->ai_next) {
 | 
| -    ASSERT_NE(static_cast<addrinfo*>(NULL), ainfo);
 | 
| -    EXPECT_EQ(sizeof(struct sockaddr_in),
 | 
| -              static_cast<size_t>(ainfo->ai_addrlen));
 | 
| -
 | 
| -    const struct sockaddr* sa = ainfo->ai_addr;
 | 
| -    const struct sockaddr_in* sa_in = (const struct sockaddr_in*) sa;
 | 
| -    EXPECT_TRUE(htons(port) == sa_in->sin_port);
 | 
| -    EXPECT_STREQ(*i, NetAddressToString(sa, ainfo->ai_addrlen).c_str());
 | 
| -  }
 | 
| -  ASSERT_EQ(static_cast<addrinfo*>(NULL), ainfo);
 | 
| -}
 | 
| -
 | 
| -class MockTransactionFactory : public DnsTransactionFactory,
 | 
| -  public base::SupportsWeakPtr<MockTransactionFactory> {
 | 
| - public:
 | 
| -  // Using WeakPtr to support cancellation. All MockTransactions succeed unless
 | 
| -  // cancelled or MockTransactionFactory is destroyed.
 | 
| -  class MockTransaction : public DnsTransaction,
 | 
| -                          public base::SupportsWeakPtr<MockTransaction> {
 | 
| -   public:
 | 
| -    MockTransaction(const std::string& hostname,
 | 
| -                    uint16 qtype,
 | 
| -                    const DnsTransactionFactory::CallbackType& callback,
 | 
| -                    const base::WeakPtr<MockTransactionFactory>& factory)
 | 
| -        : hostname_(hostname),
 | 
| -          qtype_(qtype),
 | 
| -          callback_(callback),
 | 
| -          started_(false),
 | 
| -          factory_(factory) {
 | 
| -      EXPECT_FALSE(started_);
 | 
| -      started_ = true;
 | 
| -      MessageLoop::current()->PostTask(
 | 
| -          FROM_HERE,
 | 
| -          base::Bind(&MockTransaction::Finish, AsWeakPtr()));
 | 
| -    }
 | 
| -
 | 
| -    virtual const std::string& GetHostname() const OVERRIDE {
 | 
| -      return hostname_;
 | 
| -    }
 | 
| -
 | 
| -    virtual uint16 GetType() const OVERRIDE {
 | 
| -      return qtype_;
 | 
| -    }
 | 
| -
 | 
| -    virtual int Start() OVERRIDE {
 | 
| -      return ERR_IO_PENDING;
 | 
| -    }
 | 
| -
 | 
| -   private:
 | 
| -    void Finish() {
 | 
| -      if (!factory_) {
 | 
| -        callback_.Run(this, ERR_DNS_SERVER_FAILED, NULL);
 | 
| -        return;
 | 
| -      }
 | 
| -      callback_.Run(this,
 | 
| -                    OK,
 | 
| -                    factory_->responses_[Key(GetHostname(), GetType())]);
 | 
| -    }
 | 
| -
 | 
| -    const std::string hostname_;
 | 
| -    const uint16 qtype_;
 | 
| -    DnsTransactionFactory::CallbackType callback_;
 | 
| -    bool started_;
 | 
| -    const base::WeakPtr<MockTransactionFactory> factory_;
 | 
| -  };
 | 
| -
 | 
| -  typedef std::pair<std::string, uint16> Key;
 | 
| -
 | 
| -  MockTransactionFactory() : num_requests_(0) {}
 | 
| -  ~MockTransactionFactory() {
 | 
| -    STLDeleteValues(&responses_);
 | 
| -  }
 | 
| -
 | 
| -  scoped_ptr<DnsTransaction> CreateTransaction(
 | 
| -      const std::string& qname,
 | 
| -      uint16 qtype,
 | 
| -      const DnsTransactionFactory::CallbackType& callback,
 | 
| -      const BoundNetLog&) {
 | 
| -    ++num_requests_;
 | 
| -    return scoped_ptr<DnsTransaction>(
 | 
| -        new MockTransaction(qname, qtype, callback, AsWeakPtr()));
 | 
| -  }
 | 
| -
 | 
| -  void AddResponse(const std::string& name, uint8 type, DnsResponse* response) {
 | 
| -    responses_[MockTransactionFactory::Key(name, type)] = response;
 | 
| -  }
 | 
| -
 | 
| -  int num_requests() const { return num_requests_; }
 | 
| -
 | 
| - private:
 | 
| -  int num_requests_;
 | 
| -  std::map<Key, DnsResponse*> responses_;
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -
 | 
| -// The following fixture sets up an environment for four different lookups
 | 
| -// with their data defined in dns_test_util.h.  All tests make use of these
 | 
| -// predefined variables instead of each defining their own, to avoid
 | 
| -// boilerplate code in every test.  Assuming every coming query is for a
 | 
| -// distinct hostname, as |kMaxTransactions| is set to 2 and
 | 
| -// |kMaxPendingRequests| is set to 1, first two queries start immediately
 | 
| -// and the next one is sent to pending queue; as a result, the next query
 | 
| -// should either fail itself or cause the pending query to fail depending
 | 
| -// on its priority.
 | 
| -class AsyncHostResolverTest : public testing::Test {
 | 
| - public:
 | 
| -  AsyncHostResolverTest()
 | 
| -      : info0_(HostPortPair(kT0HostName, kPortNum)),
 | 
| -        info1_(HostPortPair(kT1HostName, kPortNum)),
 | 
| -        info2_(HostPortPair(kT2HostName, kPortNum)),
 | 
| -        info3_(HostPortPair(kT3HostName, kPortNum)),
 | 
| -        ip_addresses0_(kT0IpAddresses,
 | 
| -            kT0IpAddresses + arraysize(kT0IpAddresses)),
 | 
| -        ip_addresses1_(kT1IpAddresses,
 | 
| -            kT1IpAddresses + arraysize(kT1IpAddresses)),
 | 
| -        ip_addresses2_(kT2IpAddresses,
 | 
| -            kT2IpAddresses + arraysize(kT2IpAddresses)),
 | 
| -        ip_addresses3_(kT3IpAddresses,
 | 
| -            kT3IpAddresses + arraysize(kT3IpAddresses)) {
 | 
| -    // AF_INET only for now.
 | 
| -    info0_.set_address_family(ADDRESS_FAMILY_IPV4);
 | 
| -    info1_.set_address_family(ADDRESS_FAMILY_IPV4);
 | 
| -    info2_.set_address_family(ADDRESS_FAMILY_IPV4);
 | 
| -    info3_.set_address_family(ADDRESS_FAMILY_IPV4);
 | 
| -
 | 
| -    client_ = new MockTransactionFactory();
 | 
| -
 | 
| -    client_->AddResponse(kT0HostName, kT0Qtype,
 | 
| -        new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram),
 | 
| -                        arraysize(kT0ResponseDatagram),
 | 
| -                        arraysize(kT0QueryDatagram)));
 | 
| -
 | 
| -    client_->AddResponse(kT1HostName, kT1Qtype,
 | 
| -        new DnsResponse(reinterpret_cast<const char*>(kT1ResponseDatagram),
 | 
| -                        arraysize(kT1ResponseDatagram),
 | 
| -                        arraysize(kT1QueryDatagram)));
 | 
| -
 | 
| -    client_->AddResponse(kT2HostName, kT2Qtype,
 | 
| -        new DnsResponse(reinterpret_cast<const char*>(kT2ResponseDatagram),
 | 
| -                        arraysize(kT2ResponseDatagram),
 | 
| -                        arraysize(kT2QueryDatagram)));
 | 
| -
 | 
| -    client_->AddResponse(kT3HostName, kT3Qtype,
 | 
| -        new DnsResponse(reinterpret_cast<const char*>(kT3ResponseDatagram),
 | 
| -                        arraysize(kT3ResponseDatagram),
 | 
| -                        arraysize(kT3QueryDatagram)));
 | 
| -
 | 
| -    resolver_.reset(
 | 
| -        new AsyncHostResolver(kMaxTransactions, kMaxPendingRequests,
 | 
| -              HostCache::CreateDefaultCache(),
 | 
| -              scoped_ptr<DnsTransactionFactory>(client_), NULL));
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  AddressList addrlist0_, addrlist1_, addrlist2_, addrlist3_;
 | 
| -  HostResolver::RequestInfo info0_, info1_, info2_, info3_;
 | 
| -  std::vector<const char*> ip_addresses0_, ip_addresses1_,
 | 
| -    ip_addresses2_, ip_addresses3_;
 | 
| -  scoped_ptr<HostResolver> resolver_;
 | 
| -  MockTransactionFactory* client_;  // Owned by the AsyncHostResolver.
 | 
| -  TestCompletionCallback callback0_, callback1_, callback2_, callback3_;
 | 
| -};
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, EmptyHostLookup) {
 | 
| -  info0_.set_host_port_pair(HostPortPair("", kPortNum));
 | 
| -  int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                              BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, IPv4LiteralLookup) {
 | 
| -  const char* kIPLiteral = "192.168.1.2";
 | 
| -  info0_.set_host_port_pair(HostPortPair(kIPLiteral, kPortNum));
 | 
| -  info0_.set_host_resolver_flags(HOST_RESOLVER_CANONNAME);
 | 
| -  int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                              BoundNetLog());
 | 
| -  EXPECT_EQ(OK, rv);
 | 
| -  std::vector<const char*> ip_addresses(1, kIPLiteral);
 | 
| -  VerifyAddressList(ip_addresses, kPortNum, addrlist0_);
 | 
| -  EXPECT_STREQ(kIPLiteral, addrlist0_.head()->ai_canonname);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, IPv6LiteralLookup) {
 | 
| -  info0_.set_host_port_pair(HostPortPair("2001:db8:0::42", kPortNum));
 | 
| -  int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                              BoundNetLog());
 | 
| -  // When support for IPv6 is added, this should succeed.
 | 
| -  EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, CachedLookup) {
 | 
| -  int rv = resolver_->ResolveFromCache(info0_, &addrlist0_, BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_DNS_CACHE_MISS, rv);
 | 
| -
 | 
| -  // Cache the result of |info0_| lookup.
 | 
| -  rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                          BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv);
 | 
| -  rv = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  // Now lookup |info0_| from cache only, store results in |addrlist1_|,
 | 
| -  // should succeed synchronously.
 | 
| -  rv = resolver_->ResolveFromCache(info0_, &addrlist1_, BoundNetLog());
 | 
| -  EXPECT_EQ(OK, rv);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_);
 | 
| -}
 | 
| -
 | 
| -// TODO(szym): This tests DnsTransaction not AsyncHostResolver. Remove or move
 | 
| -// to dns_transaction_unittest.cc
 | 
| -TEST_F(AsyncHostResolverTest, DISABLED_InvalidHostNameLookup) {
 | 
| -  const std::string kHostName1(64, 'a');
 | 
| -  info0_.set_host_port_pair(HostPortPair(kHostName1, kPortNum));
 | 
| -  int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                              BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_INVALID_ARGUMENT, rv);
 | 
| -
 | 
| -  const std::string kHostName2(4097, 'b');
 | 
| -  info0_.set_host_port_pair(HostPortPair(kHostName2, kPortNum));
 | 
| -  rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                          BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_INVALID_ARGUMENT, rv);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, Lookup) {
 | 
| -  int rv = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                              BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv);
 | 
| -  rv = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, ConcurrentLookup) {
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -
 | 
| -  rv0 = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv0);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_);
 | 
| -
 | 
| -  rv2 = callback2_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv2);
 | 
| -  VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_);
 | 
| -
 | 
| -  EXPECT_EQ(3, client_->num_requests());
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, SameHostLookupsConsumeSingleTransaction) {
 | 
| -  // We pass the info0_ to all requests.
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info0_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv2 = resolver_->Resolve(info0_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -
 | 
| -  rv0 = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv0);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_);
 | 
| -
 | 
| -  rv2 = callback2_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv2);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist2_);
 | 
| -
 | 
| -  // Although we have three lookups, a single UDP socket was used.
 | 
| -  EXPECT_EQ(1, client_->num_requests());
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, CancelLookup) {
 | 
| -  HostResolver::RequestHandle req0 = NULL, req2 = NULL;
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(),
 | 
| -                               &req0, BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(),
 | 
| -                               &req2, BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -
 | 
| -  resolver_->CancelRequest(req0);
 | 
| -  resolver_->CancelRequest(req2);
 | 
| -
 | 
| -  MessageLoop::current()->RunAllPending();
 | 
| -
 | 
| -  EXPECT_FALSE(callback0_.have_result());
 | 
| -  EXPECT_FALSE(callback2_.have_result());
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_);
 | 
| -}
 | 
| -
 | 
| -// Tests the following scenario: start two resolutions for the same host,
 | 
| -// cancel one of them, make sure that the other one completes.
 | 
| -TEST_F(AsyncHostResolverTest, CancelSameHostLookup) {
 | 
| -  HostResolver::RequestHandle req0 = NULL;
 | 
| -
 | 
| -  // Pass the info0_ to both requests.
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(),
 | 
| -                               &req0, BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info0_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -
 | 
| -  resolver_->CancelRequest(req0);
 | 
| -  MessageLoop::current()->RunAllPending();
 | 
| -  EXPECT_FALSE(callback0_.have_result());
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist1_);
 | 
| -
 | 
| -  EXPECT_EQ(1, client_->num_requests());
 | 
| -}
 | 
| -
 | 
| -// Test that a queued lookup completes.
 | 
| -TEST_F(AsyncHostResolverTest, QueuedLookup) {
 | 
| -  // kMaxTransactions is 2, thus the following requests consume all
 | 
| -  // available transactions.
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -
 | 
| -  // The following request will end up in queue.
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -  EXPECT_EQ(1u,
 | 
| -      static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending());
 | 
| -
 | 
| -  // Make sure all requests complete.
 | 
| -  rv0 = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv0);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_);
 | 
| -
 | 
| -  rv2 = callback2_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv2);
 | 
| -  VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_);
 | 
| -}
 | 
| -
 | 
| -// Test that cancelling a queued lookup works.
 | 
| -TEST_F(AsyncHostResolverTest, CancelPendingLookup) {
 | 
| -  // kMaxTransactions is 2, thus the following requests consume all
 | 
| -  // available transactions.
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -
 | 
| -  // The following request will end up in queue.
 | 
| -  HostResolver::RequestHandle req2 = NULL;
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(),
 | 
| -                               &req2, BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -  EXPECT_EQ(1u,
 | 
| -      static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending());
 | 
| -
 | 
| -  resolver_->CancelRequest(req2);
 | 
| -
 | 
| -  // Make sure first two requests complete while the cancelled one doesn't.
 | 
| -  MessageLoop::current()->RunAllPending();
 | 
| -  EXPECT_FALSE(callback2_.have_result());
 | 
| -
 | 
| -  rv0 = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv0);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_);
 | 
| -}
 | 
| -
 | 
| -TEST_F(AsyncHostResolverTest, ResolverDestructionCancelsLookups) {
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  // This one is queued.
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(1u,
 | 
| -      static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending());
 | 
| -
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -
 | 
| -  resolver_.reset();
 | 
| -
 | 
| -  MessageLoop::current()->RunAllPending();
 | 
| -
 | 
| -  EXPECT_FALSE(callback0_.have_result());
 | 
| -  EXPECT_FALSE(callback1_.have_result());
 | 
| -  EXPECT_FALSE(callback2_.have_result());
 | 
| -}
 | 
| -
 | 
| -// Test that when the number of pending lookups is at max, a new lookup
 | 
| -// with a priority lower than all of those in the queue fails.
 | 
| -TEST_F(AsyncHostResolverTest, OverflowQueueWithLowPriorityLookup) {
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  // This one is queued and fills up the queue since its size is 1.
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(1u,
 | 
| -      static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending());
 | 
| -
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv2);
 | 
| -
 | 
| -  // This one fails.
 | 
| -  info3_.set_priority(LOWEST);
 | 
| -  int rv3 = resolver_->Resolve(info3_, &addrlist3_, callback3_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv3);
 | 
| -
 | 
| -  MessageLoop::current()->RunAllPending();
 | 
| -  EXPECT_FALSE(callback3_.have_result());
 | 
| -}
 | 
| -
 | 
| -// Test that when the number of pending lookups is at max, a new lookup
 | 
| -// with a priority higher than any of those in the queue succeeds and
 | 
| -// causes the lowest priority lookup in the queue to fail.
 | 
| -TEST_F(AsyncHostResolverTest, OverflowQueueWithHighPriorityLookup) {
 | 
| -  int rv0 = resolver_->Resolve(info0_, &addrlist0_, callback0_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -  int rv1 = resolver_->Resolve(info1_, &addrlist1_, callback1_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -
 | 
| -  // Next lookup is queued.  Since this will be ejected from the queue and
 | 
| -  // will not consume a socket from our factory, we are not passing it
 | 
| -  // predefined members.
 | 
| -  HostResolver::RequestInfo info(HostPortPair("cnn.com", 80));
 | 
| -  info.set_address_family(ADDRESS_FAMILY_IPV4);
 | 
| -  AddressList addrlist_fail;
 | 
| -  TestCompletionCallback callback_fail;
 | 
| -  int rv_fail = resolver_->Resolve(info, &addrlist_fail,
 | 
| -                                   callback_fail.callback(), NULL,
 | 
| -                                   BoundNetLog());
 | 
| -  EXPECT_EQ(1u,
 | 
| -      static_cast<AsyncHostResolver*>(resolver_.get())->GetNumPending());
 | 
| -
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv0);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv1);
 | 
| -  EXPECT_EQ(ERR_IO_PENDING, rv_fail);
 | 
| -
 | 
| -  // Lookup 2 causes the above to fail, but itself should succeed.
 | 
| -  info2_.set_priority(HIGHEST);
 | 
| -  int rv2 = resolver_->Resolve(info2_, &addrlist2_, callback2_.callback(), NULL,
 | 
| -                               BoundNetLog());
 | 
| -
 | 
| -  rv0 = callback0_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv0);
 | 
| -  VerifyAddressList(ip_addresses0_, kPortNum, addrlist0_);
 | 
| -
 | 
| -  rv1 = callback1_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv1);
 | 
| -  VerifyAddressList(ip_addresses1_, kPortNum, addrlist1_);
 | 
| -
 | 
| -  rv_fail = callback_fail.WaitForResult();
 | 
| -  EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv_fail);
 | 
| -  EXPECT_EQ(static_cast<addrinfo*>(NULL), addrlist_fail.head());
 | 
| -
 | 
| -  rv2 = callback2_.WaitForResult();
 | 
| -  EXPECT_EQ(OK, rv2);
 | 
| -  VerifyAddressList(ip_addresses2_, kPortNum, addrlist2_);
 | 
| -}
 | 
| -
 | 
| -}  // namespace net
 | 
| 
 |