Implemented AsyncHostResolver -- asynchronous HostResolver!

BUG=60149
TEST=net_unittests --gtest_filter="AsyncHostResolverTest*"

Review URL: http://codereview.chromium.org/7472025

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@93380 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/base/dns_test_util.h b/net/base/dns_test_util.h
index 96ce38a..04d8652 100644
--- a/net/base/dns_test_util.h
+++ b/net/base/dns_test_util.h
@@ -12,6 +12,7 @@
 #include "base/logging.h"
 #include "net/base/dns_transaction.h"
 #include "net/base/dns_util.h"
+#include "net/base/host_resolver.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_util.h"
 
@@ -34,6 +35,62 @@
   DISALLOW_COPY_AND_ASSIGN(TestPrng);
 };
 
+bool operator==(const HostResolver::RequestInfo& a,
+                const HostResolver::RequestInfo& b);
+
+// Observer that just makes note of how it was called. The test code can then
+// inspect to make sure it was called with the right parameters.  Used by
+// HostResolverImpl and AsyncHostResolver unit tests.
+class TestHostResolverObserver : public HostResolver::Observer {
+ public:
+  TestHostResolverObserver();
+  virtual ~TestHostResolverObserver();
+
+  // HostResolver::Observer methods:
+  virtual void OnStartResolution(int id, const HostResolver::RequestInfo& info);
+  virtual void OnFinishResolutionWithStatus(
+      int id,
+      bool was_resolved,
+      const HostResolver::RequestInfo& info);
+  virtual void OnCancelResolution(
+      int id,
+      const HostResolver::RequestInfo& info);
+
+  // Tuple (id, info).
+  struct StartOrCancelEntry {
+    StartOrCancelEntry(int id, const HostResolver::RequestInfo& info)
+        : id(id), info(info) {}
+
+    bool operator==(const StartOrCancelEntry& other) const {
+      return id == other.id && info == other.info;
+    }
+
+    int id;
+    HostResolver::RequestInfo info;
+  };
+
+  // Tuple (id, was_resolved, info).
+  struct FinishEntry {
+    FinishEntry(int id, bool was_resolved,
+                const HostResolver::RequestInfo& info)
+        : id(id), was_resolved(was_resolved), info(info) {}
+
+    bool operator==(const FinishEntry& other) const {
+      return id == other.id &&
+             was_resolved == other.was_resolved &&
+             info == other.info;
+    }
+
+    int id;
+    bool was_resolved;
+    HostResolver::RequestInfo info;
+  };
+
+  std::vector<StartOrCancelEntry> start_log;
+  std::vector<FinishEntry> finish_log;
+  std::vector<StartOrCancelEntry> cancel_log;
+};
+
 // A utility function for tests that given an array of IP literals,
 // converts it to an IPAddressList.
 bool ConvertStringsToIPAddressList(
@@ -47,29 +104,26 @@
 static const uint16 kDnsPort = 53;
 
 //-----------------------------------------------------------------------------
-// Query/response set for www.google.com, ID is fixed to 1.
-
-static const uint16 kT1Qtype = kDNS_A;
-
-static const char kT1DnsName[] = {
+// Query/response set for www.google.com, ID is fixed to 0.
+static const char kT0HostName[] = "www.google.com";
+static const uint16 kT0Qtype = kDNS_A;
+static const char kT0DnsName[] = {
   0x03, 'w', 'w', 'w',
   0x06, 'g', 'o', 'o', 'g', 'l', 'e',
   0x03, 'c', 'o', 'm',
   0x00
 };
-
-static const uint8 kT1QueryDatagram[] = {
+static const uint8 kT0QueryDatagram[] = {
   // query for www.google.com, type A.
-  0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
   0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
   0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01
 };
-
-static const uint8 kT1ResponseDatagram[] = {
+static const uint8 kT0ResponseDatagram[] = {
   // response contains one CNAME for www.l.google.com and the following
   // IP addresses: 74.125.226.{179,180,176,177,178}
-  0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x06,
+  0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x06,
   0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
   0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
   0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
@@ -87,37 +141,34 @@
   0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
   0x4a, 0x7d, 0xe2, 0xb2
 };
-
-static const char* const kT1IpAddresses[] = {
+static const char* const kT0IpAddresses[] = {
   "74.125.226.179", "74.125.226.180", "74.125.226.176",
   "74.125.226.177", "74.125.226.178"
 };
 
 //-----------------------------------------------------------------------------
-// Query/response set for codereview.chromium.org, ID is fixed to 2.
-static const uint16 kT2Qtype = kDNS_A;
-
-static const char kT2DnsName[] = {
+// Query/response set for codereview.chromium.org, ID is fixed to 1.
+static const char kT1HostName[] = "codereview.chromium.org";
+static const uint16 kT1Qtype = kDNS_A;
+static const char kT1DnsName[] = {
   0x12, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
   0x10, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
   0x03, 'o', 'r', 'g',
   0x00
 };
-
-static const uint8 kT2QueryDatagram[] = {
+static const uint8 kT1QueryDatagram[] = {
   // query for codereview.chromium.org, type A.
-  0x00, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+  0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, 0x64,
   0x65, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x08,
   0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
   0x03, 0x6f, 0x72, 0x67, 0x00, 0x00, 0x01, 0x00,
   0x01
 };
-
-static const uint8 kT2ResponseDatagram[] = {
+static const uint8 kT1ResponseDatagram[] = {
   // response contains one CNAME for ghs.l.google.com and the following
   // IP address: 64.233.169.121
-  0x00, 0x02, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
+  0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, 0x64,
   0x65, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x08,
   0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
@@ -129,8 +180,92 @@
   0x35, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
   0x0b, 0x00, 0x04, 0x40, 0xe9, 0xa9, 0x79
 };
+static const char* const kT1IpAddresses[] = {
+  "64.233.169.121"
+};
 
 //-----------------------------------------------------------------------------
+// Query/response set for www.ccs.neu.edu, ID is fixed to 2.
+static const char kT2HostName[] = "www.ccs.neu.edu";
+static const uint16 kT2Qtype = kDNS_A;
+static const char kT2DnsName[] = {
+  0x03, 'w', 'w', 'w',
+  0x03, 'c', 'c', 'c',
+  0x03, 'n', 'e', 'u',
+  0x03, 'e', 'd', 'u',
+  0x00
+};
+static const uint8 kT2QueryDatagram[] = {
+  // query for www.ccs.neu.edu, type A.
+  0x00, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
+  0x03, 0x63, 0x63, 0x73, 0x03, 0x6e, 0x65, 0x75,
+  0x03, 0x65, 0x64, 0x75, 0x00, 0x00, 0x01, 0x00,
+  0x01
+};
+static const uint8 kT2ResponseDatagram[] = {
+  // response contains one CNAME for vulcan.ccs.neu.edu and the following
+  // IP address: 129.10.116.81
+  0x00, 0x02, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
+  0x03, 0x63, 0x63, 0x73, 0x03, 0x6e, 0x65, 0x75,
+  0x03, 0x65, 0x64, 0x75, 0x00, 0x00, 0x01, 0x00,
+  0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
+  0x00, 0x01, 0x2c, 0x00, 0x09, 0x06, 0x76, 0x75,
+  0x6c, 0x63, 0x61, 0x6e, 0xc0, 0x10, 0xc0, 0x2d,
+  0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x2c,
+  0x00, 0x04, 0x81, 0x0a, 0x74, 0x51
+};
+static const char* const kT2IpAddresses[] = {
+  "129.10.116.81"
+};
+
+//-----------------------------------------------------------------------------
+// Query/response set for www.google.az, ID is fixed to 3.
+static const char kT3HostName[] = "www.google.az";
+static const uint16 kT3Qtype = kDNS_A;
+static const char kT3DnsName[] = {
+  0x03, 'w', 'w', 'w',
+  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
+  0x02, 'a', 'z',
+  0x00
+};
+static const uint8 kT3QueryDatagram[] = {
+  // query for www.google.az, type A.
+  0x00, 0x03, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
+  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x02,
+  0x61, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x01
+};
+static const uint8 kT3ResponseDatagram[] = {
+  // response contains www.google.com as CNAME for www.google.az and
+  // www.l.google.com as CNAME for www.google.com and the following
+  // IP addresses: 74.125.226.{178,179,180,176,177}
+  0x00, 0x03, 0x81, 0x80, 0x00, 0x01, 0x00, 0x07,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
+  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x02,
+  0x61, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
+  0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x50,
+  0x99, 0x00, 0x10, 0x03, 0x77, 0x77, 0x77, 0x06,
+  0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63,
+  0x6f, 0x6d, 0x00, 0xc0, 0x2b, 0x00, 0x05, 0x00,
+  0x01, 0x00, 0x01, 0x50, 0x99, 0x00, 0x08, 0x03,
+  0x77, 0x77, 0x77, 0x01, 0x6c, 0xc0, 0x2f, 0xc0,
+  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb2, 0xc0,
+  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb3, 0xc0,
+  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb4, 0xc0,
+  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb0, 0xc0,
+  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb1
+};
+static const char* const kT3IpAddresses[] = {
+  "74.125.226.178", "74.125.226.179", "74.125.226.180",
+  "74.125.226.176", "74.125.226.177"
+};
 
 }  // namespace net