Cleanup mock_http_client.h
BUG:24267885
Change-Id: I35be9cbfb45b8b80e2db122055eab1ad40362da4
Reviewed-on: https://weave-review.googlesource.com/1291
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/Android.mk b/libweave/Android.mk
index 36732d3..0417623 100644
--- a/libweave/Android.mk
+++ b/libweave/Android.mk
@@ -145,7 +145,6 @@
src/test/fake_stream.cc \
src/test/fake_task_runner.cc \
src/test/mock_command.cc \
- src/test/mock_http_client.cc \
src/test/unittest_utils.cc \
include $(BUILD_STATIC_LIBRARY)
diff --git a/libweave/examples/ubuntu/curl_http_client.cc b/libweave/examples/ubuntu/curl_http_client.cc
index 1d69ce5..5cb4395 100644
--- a/libweave/examples/ubuntu/curl_http_client.cc
+++ b/libweave/examples/ubuntu/curl_http_client.cc
@@ -34,12 +34,18 @@
CurlHttpClient::CurlHttpClient(provider::TaskRunner* task_runner)
: task_runner_{task_runner} {}
-std::unique_ptr<provider::HttpClient::Response>
-CurlHttpClient::SendRequestAndBlock(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) {
+void CurlHttpClient::PostError(const ErrorCallback& error_callback,
+ ErrorPtr error) {
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(error_callback, base::Owned(error.release())), {});
+}
+
+void CurlHttpClient::SendRequest(const std::string& method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SuccessCallback& success_callback,
+ const ErrorCallback& error_callback) {
std::unique_ptr<CURL, decltype(&curl_easy_cleanup)> curl{curl_easy_init(),
&curl_easy_cleanup};
CHECK(curl);
@@ -80,18 +86,19 @@
if (chunk)
curl_slist_free_all(chunk);
+ ErrorPtr error;
if (res != CURLE_OK) {
- Error::AddTo(error, FROM_HERE, "curl", "curl_easy_perform_error",
+ Error::AddTo(&error, FROM_HERE, "curl", "curl_easy_perform_error",
curl_easy_strerror(res));
- return nullptr;
+ return PostError(error_callback, std::move(error));
}
const std::string kContentType = "\r\nContent-Type:";
auto pos = response->content_type.find(kContentType);
if (pos == std::string::npos) {
- Error::AddTo(error, FROM_HERE, "curl", "no_content_header",
+ Error::AddTo(&error, FROM_HERE, "curl", "no_content_header",
"Content-Type header is missing");
- return nullptr;
+ return PostError(error_callback, std::move(error));
}
pos += kContentType.size();
auto pos_end = response->content_type.find("\r\n", pos);
@@ -103,30 +110,12 @@
CHECK_EQ(CURLE_OK, curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE,
&response->status));
- return std::move(response);
-}
-void CurlHttpClient::SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
- ErrorPtr error;
- auto response = SendRequestAndBlock(method, url, headers, data, &error);
- if (response) {
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&CurlHttpClient::RunSuccessCallback,
- weak_ptr_factory_.GetWeakPtr(), success_callback,
- base::Passed(&response)),
- {});
- } else {
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&CurlHttpClient::RunErrorCallback,
- weak_ptr_factory_.GetWeakPtr(), error_callback,
- base::Passed(&error)),
- {});
- }
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&CurlHttpClient::RunSuccessCallback,
+ weak_ptr_factory_.GetWeakPtr(), success_callback,
+ base::Passed(&response)),
+ {});
}
void CurlHttpClient::RunSuccessCallback(const SuccessCallback& success_callback,
@@ -134,10 +123,5 @@
success_callback.Run(*response);
}
-void CurlHttpClient::RunErrorCallback(const ErrorCallback& error_callback,
- ErrorPtr error) {
- error_callback.Run(error.get());
-}
-
} // namespace examples
} // namespace weave
diff --git a/libweave/examples/ubuntu/curl_http_client.h b/libweave/examples/ubuntu/curl_http_client.h
index 8d41c36..033102d 100644
--- a/libweave/examples/ubuntu/curl_http_client.h
+++ b/libweave/examples/ubuntu/curl_http_client.h
@@ -32,17 +32,10 @@
const ErrorCallback& error_callback) override;
private:
- std::unique_ptr<Response> SendRequestAndBlock(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error);
+ void PostError(const ErrorCallback& error_callback, ErrorPtr error);
void RunSuccessCallback(const SuccessCallback& success_callback,
std::unique_ptr<Response> response);
- void RunErrorCallback(const ErrorCallback& error_callback,
- ErrorPtr error);
-
provider::TaskRunner* task_runner_{nullptr};
base::WeakPtrFactory<CurlHttpClient> weak_ptr_factory_{this};
diff --git a/libweave/include/weave/provider/test/mock_http_client.h b/libweave/include/weave/provider/test/mock_http_client.h
index ce3bfc3..8a9f955 100644
--- a/libweave/include/weave/provider/test/mock_http_client.h
+++ b/libweave/include/weave/provider/test/mock_http_client.h
@@ -27,19 +27,13 @@
public:
~MockHttpClient() override = default;
- MOCK_METHOD5(MockSendRequest,
- Response*(const std::string&,
- const std::string&,
- const Headers&,
- const std::string&,
- ErrorPtr*));
-
- void SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ MOCK_METHOD6(SendRequest,
+ void(const std::string&,
+ const std::string&,
+ const Headers&,
+ const std::string&,
+ const SuccessCallback&,
+ const ErrorCallback&));
};
} // namespace test
diff --git a/libweave/libweave.gypi b/libweave/libweave.gypi
index 46ad5b3..6df6c89 100644
--- a/libweave/libweave.gypi
+++ b/libweave/libweave.gypi
@@ -56,7 +56,6 @@
'src/test/fake_stream.cc',
'src/test/fake_task_runner.cc',
'src/test/mock_command.cc',
- 'src/test/mock_http_client.cc',
'src/test/unittest_utils.cc',
],
'weave_unittest_sources': [
diff --git a/libweave/libweave_standalone.gyp b/libweave/libweave_standalone.gyp
index 6c825ac..00b4251 100644
--- a/libweave/libweave_standalone.gyp
+++ b/libweave/libweave_standalone.gyp
@@ -6,9 +6,9 @@
'libraries': [
'-lcrypto',
'-lexpat',
- '-lpthread',
'-lgtest',
'-lgmock',
+ '-lpthread',
],
},
'targets': [
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index 4a47013..41b6d78 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -77,12 +77,14 @@
return {};
}
-HttpClient::Response* ReplyWithJson(int status_code, const base::Value& json) {
+std::unique_ptr<HttpClient::Response> ReplyWithJson(int status_code,
+ const base::Value& json) {
std::string text;
base::JSONWriter::WriteWithOptions(
json, base::JSONWriter::OPTIONS_PRETTY_PRINT, &text);
- MockHttpClientResponse* response = new StrictMock<MockHttpClientResponse>;
+ std::unique_ptr<MockHttpClientResponse> response{
+ new StrictMock<MockHttpClientResponse>};
EXPECT_CALL(*response, GetStatusCode())
.Times(AtLeast(1))
.WillRepeatedly(Return(status_code));
@@ -92,7 +94,7 @@
EXPECT_CALL(*response, GetData())
.Times(AtLeast(1))
.WillRepeatedly(Return(text));
- return response;
+ return std::move(response);
}
std::pair<std::string, std::string> GetAuthHeader() {
@@ -194,7 +196,6 @@
std::shared_ptr<StateManager> state_manager_;
};
-////////////////////////////////////////////////////////////////////////////////
TEST_F(DeviceRegistrationInfoTest, GetServiceURL) {
EXPECT_EQ(test_data::kServiceURL, dev_reg_->GetServiceURL());
std::string url = test_data::kServiceURL;
@@ -233,9 +234,11 @@
ReloadSettings();
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -247,7 +250,7 @@
json.SetString("access_token", test_data::kAccessToken);
json.SetInteger("expires_in", 3600);
- return ReplyWithJson(200, json);
+ callback.Run(*ReplyWithJson(200, json));
})));
EXPECT_TRUE(RefreshAccessToken(nullptr));
@@ -259,9 +262,11 @@
EXPECT_EQ(GcdState::kConnecting, GetGcdState());
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -271,7 +276,7 @@
base::DictionaryValue json;
json.SetString("error", "unable_to_authenticate");
- return ReplyWithJson(400, json);
+ callback.Run(*ReplyWithJson(400, json));
})));
ErrorPtr error;
@@ -285,9 +290,11 @@
EXPECT_EQ(GcdState::kConnecting, GetGcdState());
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -297,7 +304,7 @@
base::DictionaryValue json;
json.SetString("error", "invalid_grant");
- return ReplyWithJson(400, json);
+ callback.Run(*ReplyWithJson(400, json));
})));
ErrorPtr error;
@@ -311,17 +318,19 @@
SetAccessToken();
EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kGet, dev_reg_->GetDeviceURL(),
- HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- base::DictionaryValue json;
- json.SetString("channel.supportedType", "xmpp");
- json.SetString("deviceKind", "vendor");
- json.SetString("id", test_data::kDeviceId);
- json.SetString("kind", "clouddevices#device");
- return ReplyWithJson(200, json);
- })));
+ SendRequest(http::kGet, dev_reg_->GetDeviceURL(),
+ HttpClient::Headers{GetAuthHeader(), GetJsonHeader()},
+ _, _, _))
+ .WillOnce(WithArgs<3, 4>(
+ Invoke([](const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
+ base::DictionaryValue json;
+ json.SetString("channel.supportedType", "xmpp");
+ json.SetString("deviceKind", "vendor");
+ json.SetString("id", test_data::kDeviceId);
+ json.SetString("kind", "clouddevices#device");
+ callback.Run(*ReplyWithJson(200, json));
+ })));
bool succeeded = false;
auto on_success = [&succeeded, this](const base::DictionaryValue& info) {
@@ -375,9 +384,11 @@
test_data::kClaimTicketId;
EXPECT_CALL(
http_client_,
- MockSendRequest(http::kPatch, ticket_url + "?key=" + test_data::kApiKey,
- HttpClient::Headers{GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPatch, ticket_url + "?key=" + test_data::kApiKey,
+ HttpClient::Headers{GetJsonHeader()}, _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
auto json = test::CreateDictionaryValue(data);
EXPECT_NE(nullptr, json.get());
std::string value;
@@ -437,32 +448,35 @@
device_draft->SetString("kind", "clouddevices#device");
json_resp.Set("deviceDraft", device_draft);
- return ReplyWithJson(200, json_resp);
+ callback.Run(*ReplyWithJson(200, json_resp));
})));
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, ticket_url + "/finalize?key=" +
- test_data::kApiKey,
- HttpClient::Headers{}, _, _))
- .WillOnce(InvokeWithoutArgs([]() {
- base::DictionaryValue json;
- json.SetString("id", test_data::kClaimTicketId);
- json.SetString("kind", "clouddevices#registrationTicket");
- json.SetString("oauthClientId", test_data::kClientId);
- json.SetString("userEmail", "user@email.com");
- json.SetString("deviceDraft.id", test_data::kDeviceId);
- json.SetString("deviceDraft.kind", "clouddevices#device");
- json.SetString("deviceDraft.channel.supportedType", "xmpp");
- json.SetString("robotAccountEmail", test_data::kRobotAccountEmail);
- json.SetString("robotAccountAuthorizationCode",
- test_data::kRobotAccountAuthCode);
- return ReplyWithJson(200, json);
- }));
+ SendRequest(http::kPost,
+ ticket_url + "/finalize?key=" + test_data::kApiKey,
+ HttpClient::Headers{}, _, _, _))
+ .WillOnce(
+ WithArgs<4>(Invoke([](const HttpClient::SuccessCallback& callback) {
+ base::DictionaryValue json;
+ json.SetString("id", test_data::kClaimTicketId);
+ json.SetString("kind", "clouddevices#registrationTicket");
+ json.SetString("oauthClientId", test_data::kClientId);
+ json.SetString("userEmail", "user@email.com");
+ json.SetString("deviceDraft.id", test_data::kDeviceId);
+ json.SetString("deviceDraft.kind", "clouddevices#device");
+ json.SetString("deviceDraft.channel.supportedType", "xmpp");
+ json.SetString("robotAccountEmail", test_data::kRobotAccountEmail);
+ json.SetString("robotAccountAuthorizationCode",
+ test_data::kRobotAccountAuthCode);
+ callback.Run(*ReplyWithJson(200, json));
+ })));
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_EQ("authorization_code", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRobotAccountAuthCode, GetFormField(data, "code"));
EXPECT_EQ(test_data::kClientId, GetFormField(data, "client_id"));
@@ -479,7 +493,7 @@
json.SetString("refresh_token", test_data::kRefreshToken);
json.SetInteger("expires_in", 3600);
- return ReplyWithJson(200, json);
+ callback.Run(*ReplyWithJson(200, json));
})));
bool done = false;
@@ -558,14 +572,16 @@
TEST_F(DeviceRegistrationInfoUpdateCommandTest, SetProgress) {
EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url_,
- HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- EXPECT_JSON_EQ(R"({"state":"inProgress", "progress":{"progress":18}})",
+ SendRequest(http::kPatch, command_url_,
+ HttpClient::Headers{GetAuthHeader(), GetJsonHeader()},
+ _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
+ EXPECT_JSON_EQ((R"({"state":"inProgress","progress":{"progress":18}})"),
*CreateDictionaryValue(data));
base::DictionaryValue json;
- return ReplyWithJson(200, json);
+ callback.Run(*ReplyWithJson(200, json));
})));
EXPECT_TRUE(command_->SetProgress(*CreateDictionaryValue("{'progress':18}"),
nullptr));
@@ -573,14 +589,16 @@
TEST_F(DeviceRegistrationInfoUpdateCommandTest, Complete) {
EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url_,
- HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPatch, command_url_,
+ HttpClient::Headers{GetAuthHeader(), GetJsonHeader()},
+ _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_JSON_EQ(R"({"state":"done", "results":{"status":"Ok"}})",
*CreateDictionaryValue(data));
base::DictionaryValue json;
- return ReplyWithJson(200, json);
+ callback.Run(*ReplyWithJson(200, json));
})));
EXPECT_TRUE(
command_->Complete(*CreateDictionaryValue("{'status': 'Ok'}"), nullptr));
@@ -588,14 +606,16 @@
TEST_F(DeviceRegistrationInfoUpdateCommandTest, Cancel) {
EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url_,
- HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ SendRequest(http::kPatch, command_url_,
+ HttpClient::Headers{GetAuthHeader(), GetJsonHeader()},
+ _, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SuccessCallback& callback) {
EXPECT_JSON_EQ(R"({"state":"cancelled"})",
*CreateDictionaryValue(data));
base::DictionaryValue json;
- return ReplyWithJson(200, json);
+ callback.Run(*ReplyWithJson(200, json));
})));
EXPECT_TRUE(command_->Cancel(nullptr));
}
diff --git a/libweave/src/test/mock_http_client.cc b/libweave/src/test/mock_http_client.cc
deleted file mode 100644
index c3ffbef..0000000
--- a/libweave/src/test/mock_http_client.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2015 The Chromium OS 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 <weave/provider/test/mock_http_client.h>
-
-#include <memory>
-#include <string>
-
-namespace weave {
-namespace provider {
-namespace test {
-
-void MockHttpClient::SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
- ErrorPtr error;
- std::unique_ptr<Response> response{
- MockSendRequest(method, url, headers, data, &error)};
- if (response) {
- success_callback.Run(*response);
- } else {
- error_callback.Run(error.get());
- }
-}
-
-} // namespace test
-} // namespace provider
-} // namespace weave
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index 5334e6a..8eb6a54 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -139,10 +139,11 @@
void ExpectRequest(const std::string& method,
const std::string& url,
const std::string& json_response) {
- EXPECT_CALL(http_client_, MockSendRequest(method, url, _, _, _))
- .WillOnce(InvokeWithoutArgs([json_response]() {
- provider::test::MockHttpClientResponse* response =
- new StrictMock<provider::test::MockHttpClientResponse>;
+ EXPECT_CALL(http_client_, SendRequest(method, url, _, _, _, _))
+ .WillOnce(WithArgs<4>(Invoke([json_response](
+ const provider::HttpClient::SuccessCallback& callback) {
+ std::unique_ptr<provider::test::MockHttpClientResponse> response{
+ new StrictMock<provider::test::MockHttpClientResponse>};
EXPECT_CALL(*response, GetStatusCode())
.Times(AtLeast(1))
.WillRepeatedly(Return(200));
@@ -152,8 +153,8 @@
EXPECT_CALL(*response, GetData())
.Times(AtLeast(1))
.WillRepeatedly(Return(json_response));
- return response;
- }));
+ callback.Run(*response);
+ })));
}
void InitConfigStore() {