Minor mechanical cleanups in dns_test_util.h response creation

Rename BuildTestDnsResponse[WithCname]() to
BuildTestDnsAddressResponse[WithCname](). Clears up the unspecified name
to be used in a subsequent CL for a more generic
non-type-specific-builder, which will make it easier to write tests for
HTTPS before I actually add parsing of those records.

Also, while poking at these methods, modernize things a bit by having
the DnsResponse returned as a movable value rather than unique_ptr.

Also, fixed up the response copying internal to MockTransaction to
actually fully copy the underlying buffer.  The change from unique_ptr
made it more obvious that const correctness was being broken.

Change-Id: Idafcb6713fd213c48a6cc7432ffd7932295ca8f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2476780
Auto-Submit: Eric Orth <[email protected]>
Reviewed-by: Dan McArdle <[email protected]>
Commit-Queue: Eric Orth <[email protected]>
Cr-Commit-Position: refs/heads/master@{#817947}
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc
index 00ff9ea..e9ed2d7 100644
--- a/net/dns/dns_test_util.cc
+++ b/net/dns/dns_test_util.cc
@@ -38,8 +38,7 @@
 
 // Create a response containing a valid question (as would normally be validated
 // in DnsTransaction) but completely missing a header-declared answer.
-std::unique_ptr<DnsResponse> CreateMalformedResponse(std::string hostname,
-                                                     uint16_t type) {
+DnsResponse CreateMalformedResponse(std::string hostname, uint16_t type) {
   std::string dns_name;
   CHECK(DNSDomainFromDot(hostname, &dns_name));
   DnsQuery query(0x14 /* id */, dns_name, type);
@@ -53,8 +52,8 @@
   memcpy(buffer->data() + sizeof(kMalformedResponseHeader),
          query.question().data(), query.question().size());
 
-  auto response = std::make_unique<DnsResponse>(buffer, buffer->size());
-  CHECK(response->InitParseWithoutQuery(buffer->size()));
+  DnsResponse response(buffer, buffer->size());
+  CHECK(response.InitParseWithoutQuery(buffer->size()));
 
   return response;
 }
@@ -206,9 +205,7 @@
   return record;
 }
 
-
-std::unique_ptr<DnsResponse> BuildTestDnsResponse(std::string name,
-                                                  const IPAddress& ip) {
+DnsResponse BuildTestDnsAddressResponse(std::string name, const IPAddress& ip) {
   DCHECK(ip.IsValid());
 
   std::vector<DnsResourceRecord> answers = {BuildTestAddressRecord(name, ip)};
@@ -217,16 +214,15 @@
   base::Optional<DnsQuery> query(
       base::in_place, 0, dns_name,
       ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA);
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /* authority_records */,
-      std::vector<DnsResourceRecord>() /* additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /* authority_records */,
+                     std::vector<DnsResourceRecord>() /* additional_records */,
+                     query);
 }
 
-std::unique_ptr<DnsResponse> BuildTestDnsResponseWithCname(
-    std::string name,
-    const IPAddress& ip,
-    std::string cannonname) {
+DnsResponse BuildTestDnsAddressResponseWithCname(std::string name,
+                                                 const IPAddress& ip,
+                                                 std::string cannonname) {
   DCHECK(ip.IsValid());
   DCHECK(!cannonname.empty());
 
@@ -238,13 +234,13 @@
   base::Optional<DnsQuery> query(
       base::in_place, 0, dns_name,
       ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA);
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /* authority_records */,
-      std::vector<DnsResourceRecord>() /* additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /* authority_records */,
+                     std::vector<DnsResourceRecord>() /* additional_records */,
+                     query);
 }
 
-std::unique_ptr<DnsResponse> BuildTestDnsTextResponse(
+DnsResponse BuildTestDnsTextResponse(
     std::string name,
     std::vector<std::vector<std::string>> text_records,
     std::string answer_name) {
@@ -261,16 +257,15 @@
   base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
                                  dns_protocol::kTypeTXT);
 
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /* authority_records */,
-      std::vector<DnsResourceRecord>() /* additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /* authority_records */,
+                     std::vector<DnsResourceRecord>() /* additional_records */,
+                     query);
 }
 
-std::unique_ptr<DnsResponse> BuildTestDnsPointerResponse(
-    std::string name,
-    std::vector<std::string> pointer_names,
-    std::string answer_name) {
+DnsResponse BuildTestDnsPointerResponse(std::string name,
+                                        std::vector<std::string> pointer_names,
+                                        std::string answer_name) {
   if (answer_name.empty())
     answer_name = name;
 
@@ -284,13 +279,13 @@
   base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
                                  dns_protocol::kTypePTR);
 
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /* authority_records */,
-      std::vector<DnsResourceRecord>() /* additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /* authority_records */,
+                     std::vector<DnsResourceRecord>() /* additional_records */,
+                     query);
 }
 
-std::unique_ptr<DnsResponse> BuildTestDnsServiceResponse(
+DnsResponse BuildTestDnsServiceResponse(
     std::string name,
     std::vector<TestServiceRecord> service_records,
     std::string answer_name) {
@@ -308,13 +303,13 @@
   base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
                                  dns_protocol::kTypeSRV);
 
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /* authority_records */,
-      std::vector<DnsResourceRecord>() /* additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /* authority_records */,
+                     std::vector<DnsResourceRecord>() /* additional_records */,
+                     query);
 }
 
-std::unique_ptr<DnsResponse> BuildTestDnsIntegrityResponse(
+DnsResponse BuildTestDnsIntegrityResponse(
     std::string hostname,
     const std::vector<uint8_t>& serialized_rdata) {
   CHECK(!hostname.empty());
@@ -327,17 +322,17 @@
   base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
                                  dns_protocol::kExperimentalTypeIntegrity);
 
-  return std::make_unique<DnsResponse>(
-      0, false, std::move(answers),
-      std::vector<DnsResourceRecord>() /*  authority_records  */,
-      std::vector<DnsResourceRecord>() /*  additional_records */, query);
+  return DnsResponse(0, false, std::move(answers),
+                     std::vector<DnsResourceRecord>() /*  authority_records  */,
+                     std::vector<DnsResourceRecord>() /*  additional_records */,
+                     query);
 }
 
 MockDnsClientRule::Result::Result(ResultType type,
-                                  std::unique_ptr<DnsResponse> response)
+                                  base::Optional<DnsResponse> response)
     : type(type), response(std::move(response)) {}
 
-MockDnsClientRule::Result::Result(std::unique_ptr<DnsResponse> response)
+MockDnsClientRule::Result::Result(DnsResponse response)
     : type(OK), response(std::move(response)) {}
 
 MockDnsClientRule::Result::Result(Result&& result) = default;
@@ -412,7 +407,7 @@
             case MockDnsClientRule::EMPTY:
               DCHECK(!result->response);  // Not expected to be provided.
               authority_records = {BuildSoaRecord(hostname_)};
-              result_.response = std::make_unique<DnsResponse>(
+              result_.response = DnsResponse(
                   22 /* id */, false /* is_authoritative */,
                   std::vector<DnsResourceRecord>() /* answers */,
                   authority_records,
@@ -472,18 +467,22 @@
     if (result->response) {
       // Copy response in case |result| is destroyed before the transaction
       // completes.
-      result_.response = std::make_unique<DnsResponse>(
-          result->response->io_buffer(), result->response->io_buffer_size());
+      auto buffer_copy =
+          base::MakeRefCounted<IOBuffer>(result->response->io_buffer_size());
+      memcpy(buffer_copy->data(), result->response->io_buffer()->data(),
+             result->response->io_buffer_size());
+      result_.response = DnsResponse(std::move(buffer_copy),
+                                     result->response->io_buffer_size());
       CHECK(result_.response->InitParseWithoutQuery(
           result->response->io_buffer_size()));
     } else {
       // Generated response only available for address types.
       DCHECK(qtype_ == dns_protocol::kTypeA ||
              qtype_ == dns_protocol::kTypeAAAA);
-      result_.response =
-          BuildTestDnsResponse(hostname_, qtype_ == dns_protocol::kTypeA
-                                              ? IPAddress::IPv4Localhost()
-                                              : IPAddress::IPv6Localhost());
+      result_.response = BuildTestDnsAddressResponse(
+          hostname_, qtype_ == dns_protocol::kTypeA
+                         ? IPAddress::IPv4Localhost()
+                         : IPAddress::IPv6Localhost());
     }
   }
 
@@ -491,14 +490,17 @@
     switch (result_.type) {
       case MockDnsClientRule::NODOMAIN:
       case MockDnsClientRule::FAIL:
-        std::move(callback_).Run(this, ERR_NAME_NOT_RESOLVED,
-                                 result_.response.get(), base::nullopt);
+        std::move(callback_).Run(
+            this, ERR_NAME_NOT_RESOLVED,
+            result_.response ? &result_.response.value() : nullptr,
+            base::nullopt);
         break;
       case MockDnsClientRule::EMPTY:
       case MockDnsClientRule::OK:
       case MockDnsClientRule::MALFORMED:
-        std::move(callback_).Run(this, OK, result_.response.get(),
-                                 base::nullopt);
+        std::move(callback_).Run(
+            this, OK, result_.response ? &result_.response.value() : nullptr,
+            base::nullopt);
         break;
       case MockDnsClientRule::TIMEOUT:
         std::move(callback_).Run(this, ERR_DNS_TIMED_OUT, nullptr,
@@ -506,8 +508,9 @@
         break;
       case MockDnsClientRule::SLOW:
         if (result_.response) {
-          std::move(callback_).Run(this, OK, result_.response.get(),
-                                   base::nullopt);
+          std::move(callback_).Run(
+              this, OK, result_.response ? &result_.response.value() : nullptr,
+              base::nullopt);
         } else {
           std::move(callback_).Run(this, ERR_DNS_TIMED_OUT, nullptr,
                                    base::nullopt);