Migrate to AnyInvocable in auth module

Merged success/failure callbacks into a single callback
in SignInCallback and AccessTokenCallback to simplify resource management and to avoid making copies.

PiperOrigin-RevId: 565744310
This commit is contained in:
Janusz Sobczak
2023-09-15 12:11:50 -07:00
committed by Copybara-Service
parent c7b740f0c4
commit b33c0e0332
9 changed files with 106 additions and 54 deletions
@@ -15,15 +15,20 @@
#ifndef THIRD_PARTY_NEARBY_FASTPAIR_INTERNAL_TEST_FAST_PAIR_FAKE_HTTP_CLIENT_H_
#define THIRD_PARTY_NEARBY_FASTPAIR_INTERNAL_TEST_FAST_PAIR_FAKE_HTTP_CLIENT_H_
#include <functional>
#include <cstddef>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "internal/network/http_client.h"
#include "internal/network/http_request.h"
#include "internal/network/http_response.h"
#include "internal/network/http_status_code.h"
namespace nearby {
namespace network {
@@ -32,7 +37,7 @@ class FastPairFakeHttpClient : public HttpClient {
public:
struct RequestInfo {
HttpRequest request;
std::function<void(const absl::StatusOr<HttpResponse>&)> callback;
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback;
};
FastPairFakeHttpClient() = default;
@@ -44,18 +49,19 @@ class FastPairFakeHttpClient : public HttpClient {
FastPairFakeHttpClient(FastPairFakeHttpClient&&) = default;
FastPairFakeHttpClient& operator=(FastPairFakeHttpClient&&) = default;
void StartRequest(const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)>
callback) override {
void StartRequest(
const HttpRequest& request,
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override {
RequestInfo request_info;
request_info.request = request;
request_info.callback = callback;
request_info.callback = std::move(callback);
request_infos_.push_back(std::move(request_info));
}
void StartCancellableRequest(
std::unique_ptr<CancellableRequest> request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback)
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override {}
absl::StatusOr<HttpResponse> GetResponse(
@@ -70,8 +76,8 @@ class FastPairFakeHttpClient : public HttpClient {
return;
}
auto request_info = request_infos_.at(pos);
if (request_info.callback != nullptr) {
auto& request_info = request_infos_.at(pos);
if (request_info.callback) {
request_info.callback(response);
}
+11
View File
@@ -33,10 +33,13 @@ cc_library(
"//fastpair/proto:fastpair_cc_proto",
"//fastpair/proto:proto_to_json",
"//internal/account",
"//internal/auth:credential",
"//internal/auth:types",
"//internal/base",
"//internal/network:types",
"//internal/platform:types",
"//internal/platform/implementation:types",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
@@ -92,12 +95,20 @@ cc_test(
"//internal/account",
"//internal/account:test_support",
"//internal/auth:credential",
"//internal/auth:types",
"//internal/network:types",
"//internal/platform:types",
"//internal/platform/implementation/g3", # build_cleaner: keep
"//internal/preferences",
"//internal/test",
"//internal/test/google3_only:test",
"@com_github_protobuf_matchers//protobuf-matchers",
"@com_google_absl//absl/functional:any_invocable",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:string_view",
"@com_google_googletest//:gtest_main",
],
)
+18 -14
View File
@@ -14,20 +14,28 @@
#include "fastpair/server_access/fast_pair_client_impl.h"
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
#include "absl/synchronization/notification.h"
#include "fastpair/common/fast_pair_switches.h"
#include "fastpair/server_access/fast_pair_http_notifier.h"
#include "internal/account/account_manager.h"
#include "internal/auth/auth_status_util.h"
#include "internal/auth/authentication_manager.h"
#include "internal/network/http_client.h"
#include "internal/network/http_request.h"
#include "internal/network/http_response.h"
#include "internal/network/url.h"
#include "internal/platform/device_info.h"
#include "internal/platform/implementation/device_info.h"
#include "internal/platform/logging.h"
namespace nearby {
@@ -274,19 +282,15 @@ absl::StatusOr<std::string> FastPairClientImpl::GetAccessToken() {
absl::StatusOr<std::string> result;
absl::Notification notification;
authentication_manager_->FetchAccessToken(
account->id, {
.success_cb =
[&](absl::string_view access_token) {
result = std::string(access_token);
notification.Notify();
},
.failure_cb =
[&](auth::AuthStatus status) {
result = absl::UnknownError(
absl::StrCat(static_cast<int>(status)));
notification.Notify();
},
});
account->id,
[&](auth::AuthStatus status, absl::string_view access_token) {
if (status == auth::AuthStatus::SUCCESS) {
result = std::string(access_token);
} else {
result = absl::UnknownError(absl::StrCat(static_cast<int>(status)));
}
notification.Notify();
});
notification.WaitForNotification();
return result;
}
@@ -25,23 +25,39 @@
#include "gmock/gmock.h"
#include "protobuf-matchers/protocol-buffer-matchers.h"
#include "gtest/gtest.h"
#include "absl/functional/any_invocable.h"
#include "absl/log/check.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/ascii.h"
#include "absl/strings/escaping.h"
#include "absl/strings/numbers.h"
#include "absl/strings/string_view.h"
#include "fastpair/common/account_key.h"
#include "fastpair/common/device_metadata.h"
#include "fastpair/common/fast_pair_device.h"
#include "fastpair/common/fast_pair_prefs.h"
#include "fastpair/common/fast_pair_switches.h"
#include "fastpair/common/protocol.h"
#include "fastpair/proto/data.proto.h"
#include "fastpair/proto/enum.proto.h"
#include "fastpair/proto/fast_pair_string.proto.h"
#include "fastpair/proto/proto_builder.h"
#include "fastpair/server_access/fast_pair_client.h"
#include "fastpair/server_access/fast_pair_http_notifier.h"
#include "internal/account/account_manager.h"
#include "internal/account/fake_account_manager.h"
#include "internal/auth/auth_status_util.h"
#include "internal/auth/authentication_manager.h"
#include "internal/network/http_client.h"
#include "internal/network/http_request.h"
#include "internal/network/http_response.h"
#include "internal/network/http_status_code.h"
#include "internal/network/url.h"
#include "internal/platform/device_info.h"
#include "internal/platform/task_runner.h"
#include "internal/platform/task_runner_impl.h"
#include "internal/preferences/preferences_manager.h"
#include "internal/test/fake_device_info.h"
#include "internal/test/google3_only/fake_authentication_manager.h"
@@ -89,11 +105,11 @@ class MockHttpClient : public HttpClient {
public:
MOCK_METHOD(void, StartRequest,
(const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)>),
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)>),
(override));
MOCK_METHOD(void, StartCancellableRequest,
(std::unique_ptr<CancellableRequest> request,
std::function<void(const absl::StatusOr<HttpResponse>&)>),
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)>),
(override));
MOCK_METHOD(absl::StatusOr<HttpResponse>, GetResponse, (const HttpRequest&),
(override));
@@ -119,9 +135,10 @@ std::vector<std::string> ExpectQueryStringValues(
// A gMock matcher to match proto values. Use this matcher like:
// request/response proto, expected_proto;
// EXPECT_THAT(proto, MatchesProto(expected_proto));
MATCHER_P(MatchesProto, expected_proto,
absl::StrCat(negation ? "does not match" : "matches",
testing::PrintToString(expected_proto.SerializeAsString()))) {
MATCHER_P(
MatchesProto, expected_proto,
absl::StrCat(negation ? "does not match" : "matches",
testing::PrintToString(expected_proto.SerializeAsString()))) {
return arg.has_value() &&
arg->SerializeAsString() == expected_proto.SerializeAsString();
}
+5 -4
View File
@@ -28,7 +28,9 @@ cc_library(
],
deps = [
"//internal/platform:types",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/functional:any_invocable",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
@@ -56,13 +58,12 @@ cc_library(
deps = [
":types",
"//internal/platform:types",
"//internal/platform/implementation:platform",
"//internal/platform/implementation:comm",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/functional:any_invocable",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings:str_format",
"@com_google_absl//absl/synchronization",
"@com_google_absl//absl/strings",
],
)
+8 -3
View File
@@ -15,12 +15,15 @@
#ifndef THIRD_PARTY_NEARBY_INTERNAL_NETWORK_HTTP_CLIENT_H_
#define THIRD_PARTY_NEARBY_INTERNAL_NETWORK_HTTP_CLIENT_H_
#include <functional>
#include <memory>
#include "absl/base/thread_annotations.h"
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "internal/network/http_request.h"
#include "internal/network/http_response.h"
#include "internal/platform/mutex.h"
#include "internal/platform/mutex_lock.h"
namespace nearby {
@@ -60,12 +63,14 @@ class HttpClient {
// Starts HTTP request in asynchronization mode.
virtual void StartRequest(
const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback) = 0;
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)>
callback) = 0;
// Starts cancellable request in asynchronization mode.
virtual void StartCancellableRequest(
std::unique_ptr<CancellableRequest> request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback) = 0;
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)>
callback) = 0;
// Gets HTTP response in synchronization mode.
virtual absl::StatusOr<HttpResponse> GetResponse(
+11 -5
View File
@@ -14,14 +14,20 @@
#include "internal/network/http_client_impl.h"
#include <functional>
#include <memory>
#include <ostream>
#include <sstream>
#include <utility>
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "internal/network/debug.h"
#include "internal/network/http_request.h"
#include "internal/network/http_response.h"
#include "internal/network/http_status_code.h"
#include "internal/platform/implementation/http_loader.h"
#include "internal/platform/logging.h"
#include "internal/platform/mutex_lock.h"
#include "internal/platform/single_thread_executor.h"
@@ -31,10 +37,10 @@ namespace network {
void NearbyHttpClient::StartRequest(
const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback) {
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback) {
MutexLock lock(&mutex_);
executor_.Execute(
[request = std::move(request), callback = std::move(callback)]() {
[request = std::move(request), callback = std::move(callback)]() mutable {
NEARBY_LOGS(INFO) << __func__ << ": Start async request to url="
<< request.GetUrl().GetUrlPath();
absl::StatusOr<HttpResponse> response = InternalGetResponse(request);
@@ -58,7 +64,7 @@ void NearbyHttpClient::StartRequest(
void NearbyHttpClient::StartCancellableRequest(
std::unique_ptr<CancellableRequest> cancellable_request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback) {
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback) {
MutexLock lock(&mutex_);
if (cancellable_request == nullptr) {
NEARBY_LOGS(ERROR) << __func__ << ": invalid cancellable request.";
@@ -68,7 +74,7 @@ void NearbyHttpClient::StartCancellableRequest(
executor_
.Execute(
[cancellable_request = std::move(cancellable_request),
callback = std::move(callback)]() {
callback = std::move(callback)]() mutable {
NEARBY_LOGS(INFO)
<< __func__ << ": Start async request to url="
<< cancellable_request->http_request().GetUrl().GetUrlPath();
+5 -4
View File
@@ -37,13 +37,14 @@ class NearbyHttpClient : public HttpClient {
NearbyHttpClient(NearbyHttpClient&&) = default;
NearbyHttpClient& operator=(NearbyHttpClient&&) = default;
void StartRequest(const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)>
callback) override ABSL_LOCKS_EXCLUDED(mutex_);
void StartRequest(
const HttpRequest& request,
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override ABSL_LOCKS_EXCLUDED(mutex_);
void StartCancellableRequest(
std::unique_ptr<CancellableRequest> request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback)
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override ABSL_LOCKS_EXCLUDED(mutex_);
// Gets HTTP response in synchronization mode.
+11 -10
View File
@@ -17,13 +17,13 @@
#include <stddef.h>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
@@ -39,7 +39,7 @@ class FakeHttpClient : public HttpClient {
public:
struct RequestInfo {
HttpRequest request;
std::function<void(const absl::StatusOr<HttpResponse>&)> callback;
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback;
};
FakeHttpClient() = default;
@@ -51,22 +51,23 @@ class FakeHttpClient : public HttpClient {
FakeHttpClient(FakeHttpClient&&) = default;
FakeHttpClient& operator=(FakeHttpClient&&) = default;
void StartRequest(const HttpRequest& request,
std::function<void(const absl::StatusOr<HttpResponse>&)>
callback) override {
void StartRequest(
const HttpRequest& request,
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override {
RequestInfo request_info;
request_info.request = request;
request_info.callback = callback;
request_info.callback = std::move(callback);
request_infos_.push_back(std::move(request_info));
}
void StartCancellableRequest(
std::unique_ptr<CancellableRequest> request,
std::function<void(const absl::StatusOr<HttpResponse>&)> callback)
absl::AnyInvocable<void(const absl::StatusOr<HttpResponse>&)> callback)
override {
RequestInfo request_info;
request_info.request = request->http_request();
request_info.callback = callback;
request_info.callback = std::move(callback);
request_infos_.push_back(std::move(request_info));
}
@@ -90,8 +91,8 @@ class FakeHttpClient : public HttpClient {
if (pos >= request_infos_.size()) {
return;
}
auto request_info = request_infos_.at(pos);
if (request_info.callback != nullptr) {
auto& request_info = request_infos_.at(pos);
if (request_info.callback) {
request_info.callback(response);
}