buffet: Added unit tests for DeviceRegistrationInfo class

Added unit tests for GCD registration workflow in Buffet.

BUG=chromium:367381
TEST=Unit tests pass (old and new).

Change-Id: Ia3ad5f028ae6fc7f3d2acdf4648ceb88cc4e00ef
Reviewed-on: https://chromium-review.googlesource.com/197568
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/http_transport_fake.cc b/buffet/http_transport_fake.cc
index 84d70cb..4a3a781 100644
--- a/buffet/http_transport_fake.cc
+++ b/buffet/http_transport_fake.cc
@@ -4,9 +4,11 @@
 
 #include "buffet/http_transport_fake.h"
 
+#include <base/json/json_reader.h>
 #include <base/json/json_writer.h>
 #include <base/logging.h>
 
+#include "buffet/bind_lambda.h"
 #include "buffet/http_connection_fake.h"
 #include "buffet/http_request.h"
 #include "buffet/mime_utils.h"
@@ -48,6 +50,7 @@
     if (error_msg)
       *error_msg = "Failed to send request headers";
   }
+  request_count_++;
   return connection;
 }
 
@@ -61,6 +64,18 @@
   handlers_.insert(std::make_pair(GetHandlerMapKey(url, method), handler));
 }
 
+void Transport::AddSimpleReplyHandler(const std::string& url,
+                                      const std::string& method,
+                                      int status_code,
+                                      const std::string& reply_text,
+                                      const std::string& mime_type) {
+  auto handler = [status_code, reply_text, mime_type](
+      const ServerRequest& request, ServerResponse* response) {
+    response->ReplyText(status_code, reply_text, mime_type.c_str());
+  };
+  AddHandler(url, method, base::Bind(handler));
+}
+
 Transport::HandlerCallback Transport::GetHandler(
     const std::string& url, const std::string& method) const {
   // First try the exact combination of URL/Method
@@ -92,6 +107,23 @@
   return std::string(chars, data_.size());
 }
 
+std::unique_ptr<base::DictionaryValue>
+    ServerRequestResponseBase::GetDataAsJson() const {
+  if (mime::RemoveParameters(GetHeader(request_header::kContentType)) ==
+      mime::application::kJson) {
+    auto value = base::JSONReader::Read(GetDataAsString());
+    if (value) {
+      base::DictionaryValue* dict = nullptr;
+      if (value->GetAsDictionary(&dict)) {
+        return std::unique_ptr<base::DictionaryValue>(dict);
+      } else {
+        delete value;
+      }
+    }
+  }
+  return std::unique_ptr<base::DictionaryValue>();
+}
+
 void ServerRequestResponseBase::AddHeaders(const HeaderList& headers) {
   for (auto&& pair : headers) {
     if (pair.second.empty())
@@ -150,7 +182,19 @@
   base::JSONWriter::WriteWithOptions(json,
                                      base::JSONWriter::OPTIONS_PRETTY_PRINT,
                                      &text);
-  ReplyText(status_code, text, mime::application::kJson);
+  std::string mime_type = mime::AppendParameter(mime::application::kJson,
+                                                mime::parameters::kCharset,
+                                                "utf-8");
+  ReplyText(status_code, text, mime_type.c_str());
+}
+
+void ServerResponse::ReplyJson(int status_code,
+                               const http::FormFieldList& fields) {
+  base::DictionaryValue json;
+  for (auto&& pair : fields) {
+    json.SetString(pair.first, pair.second);
+  }
+  ReplyJson(status_code, &json);
 }
 
 std::string ServerResponse::GetStatusText() const {