buffet: Added advanced error reporting

Created chromeos::Error class that encapsulates rich error
information from various system domains.

Swept GCD device registration, HTTP transport and utilities
to always return additional error information when the caller
requests it. This includes internal errors, general HTTP errors
as well as parsing and returning specific GCD and OAuth2 server
error responses.

Also fixed a number of existing linter warnings.

BUG=chromium:366709
TEST=All existing and new unit tests pass.

Change-Id: Ic01622a8efa3dc365ec106e595b09536818b9b23
Reviewed-on: https://chromium-review.googlesource.com/198772
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/device_registration_info_unittest.cc b/buffet/device_registration_info_unittest.cc
index 93584b4..5456ca0 100644
--- a/buffet/device_registration_info_unittest.cc
+++ b/buffet/device_registration_info_unittest.cc
@@ -14,9 +14,9 @@
 #include "buffet/mime_utils.h"
 #include "buffet/storage_impls.h"
 
-using namespace buffet;
-using namespace chromeos;
-using namespace chromeos::http;
+using namespace buffet;          // NOLINT(build/namespaces)
+using namespace chromeos;        // NOLINT(build/namespaces)
+using namespace chromeos::http;  // NOLINT(build/namespaces)
 
 namespace {
 
@@ -102,10 +102,10 @@
       json.SetString("token_type", "Bearer");
       json.SetString("refresh_token", test_data::kRefreshToken);
     } else {
-      ASSERT_TRUE(false); // Unexpected authorization code.
+      FAIL() << "Unexpected authorization code";
     }
   } else {
-    ASSERT_TRUE(false); // Unexpected grant type.
+    FAIL() << "Unexpected grant type";
   }
   json.SetInteger("expires_in", 3600);
   response->ReplyJson(status_code::Ok, &json);
@@ -209,7 +209,7 @@
 
 TEST_F(DeviceRegistrationInfoTest, CheckRegistration) {
   EXPECT_TRUE(dev_reg->Load());
-  EXPECT_FALSE(dev_reg->CheckRegistration());
+  EXPECT_FALSE(dev_reg->CheckRegistration(nullptr));
   EXPECT_EQ(0, transport->GetRequestCount());
 
   SetDefaultDeviceRegistration(&data);
@@ -219,7 +219,7 @@
   transport->AddHandler(dev_reg->GetOAuthURL("token"), request_type::kPost,
                         base::Bind(OAuth2Handler));
   transport->ResetRequestCount();
-  EXPECT_TRUE(dev_reg->CheckRegistration());
+  EXPECT_TRUE(dev_reg->CheckRegistration(nullptr));
   EXPECT_EQ(1, transport->GetRequestCount());
 }
 
@@ -233,7 +233,7 @@
   transport->AddHandler(dev_reg->GetDeviceURL(), request_type::kGet,
                         base::Bind(DeviceInfoHandler));
   transport->ResetRequestCount();
-  auto device_info = dev_reg->GetDeviceInfo();
+  auto device_info = dev_reg->GetDeviceInfo(nullptr);
   EXPECT_EQ(2, transport->GetRequestCount());
   EXPECT_NE(nullptr, device_info.get());
   base::DictionaryValue* dict = nullptr;
@@ -252,7 +252,7 @@
                         base::Bind(OAuth2Handler));
   transport->AddHandler(dev_reg->GetDeviceURL(), request_type::kGet,
                         base::Bind(DeviceInfoHandler));
-  std::string id = dev_reg->GetDeviceId();
+  std::string id = dev_reg->GetDeviceId(nullptr);
   EXPECT_EQ(test_data::kDeviceId, id);
 }
 
@@ -317,8 +317,8 @@
 
   storage->reset_save_count();
   DeviceRegistrationInfo::TestHelper::SetTestTicketId(dev_reg.get());
-  EXPECT_TRUE(dev_reg->FinishRegistration(""));
-  EXPECT_EQ(1, storage->save_count()); // The device info must have been saved.
+  EXPECT_TRUE(dev_reg->FinishRegistration("", nullptr));
+  EXPECT_EQ(1, storage->save_count());  // The device info must have been saved.
   EXPECT_EQ(2, transport->GetRequestCount());
 
   // Validate the device info saved to storage...
@@ -386,7 +386,8 @@
 
   storage->reset_save_count();
   DeviceRegistrationInfo::TestHelper::SetTestTicketId(dev_reg.get());
-  EXPECT_TRUE(dev_reg->FinishRegistration(test_data::kUserAccountAuthCode));
-  EXPECT_EQ(1, storage->save_count()); // The device info must have been saved.
+  EXPECT_TRUE(dev_reg->FinishRegistration(test_data::kUserAccountAuthCode,
+                                          nullptr));
+  EXPECT_EQ(1, storage->save_count());  // The device info must have been saved.
   EXPECT_EQ(4, transport->GetRequestCount());
 }