blob: d018592022d55109e6fe74aacda3d973a32a05bd [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/signin/bound_session_credentials/bound_session_refresh_cookie_fetcher_impl.h"
#include <memory>
#include <string>
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "components/signin/public/base/test_signin_client.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "net/base/net_errors.h"
#include "net/http/http_status_code.h"
#include "services/network/public/mojom/fetch_api.mojom-shared.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class BoundSessionRefreshCookieFetcherImplTest : public ::testing::Test {
public:
BoundSessionRefreshCookieFetcherImplTest() {
test_url_loader_factory_ = signin_client_.GetTestURLLoaderFactory();
fetcher_ =
std::make_unique<BoundSessionRefreshCookieFetcherImpl>(&signin_client_);
}
protected:
base::test::TaskEnvironment task_environment_;
sync_preferences::TestingPrefServiceSyncable prefs_;
TestSigninClient signin_client_{&prefs_};
raw_ptr<network::TestURLLoaderFactory> test_url_loader_factory_ = nullptr;
std::unique_ptr<BoundSessionRefreshCookieFetcherImpl> fetcher_;
};
TEST_F(BoundSessionRefreshCookieFetcherImplTest, Success) {
EXPECT_FALSE(signin_client_.AreNetworkCallsDelayed());
base::test::TestFuture<BoundSessionRefreshCookieFetcher::Result> future;
fetcher_->Start(future.GetCallback());
EXPECT_EQ(test_url_loader_factory_->total_requests(), 1u);
network::TestURLLoaderFactory::PendingRequest* pending_request =
test_url_loader_factory_->GetPendingRequest(0);
EXPECT_EQ(pending_request->request.url,
"https://accounts.google.com/RotateBoundCookies");
EXPECT_EQ(pending_request->request.method, "GET");
EXPECT_EQ(pending_request->request.credentials_mode,
network::mojom::CredentialsMode::kInclude);
test_url_loader_factory_->SimulateResponseForPendingRequest(
pending_request->request.url.spec(), "");
EXPECT_TRUE(future.Wait());
BoundSessionRefreshCookieFetcher::Result result = future.Get();
EXPECT_EQ(result.net_error, net::OK);
EXPECT_EQ(result.response_code, net::HTTP_OK);
}
TEST_F(BoundSessionRefreshCookieFetcherImplTest, FailureNetError) {
EXPECT_FALSE(signin_client_.AreNetworkCallsDelayed());
base::test::TestFuture<BoundSessionRefreshCookieFetcher::Result> future;
fetcher_->Start(future.GetCallback());
EXPECT_EQ(test_url_loader_factory_->total_requests(), 1u);
network::TestURLLoaderFactory::PendingRequest* pending_request =
test_url_loader_factory_->GetPendingRequest(0);
network::URLLoaderCompletionStatus status(net::ERR_UNEXPECTED);
test_url_loader_factory_->SimulateResponseForPendingRequest(
pending_request->request.url, status,
network::mojom::URLResponseHead::New(), std::string());
EXPECT_TRUE(future.Wait());
BoundSessionRefreshCookieFetcher::Result result = future.Get();
EXPECT_EQ(result.net_error, status.error_code);
EXPECT_FALSE(result.response_code.has_value());
}
TEST_F(BoundSessionRefreshCookieFetcherImplTest, FailureHttpError) {
EXPECT_FALSE(signin_client_.AreNetworkCallsDelayed());
base::test::TestFuture<BoundSessionRefreshCookieFetcher::Result> future;
fetcher_->Start(future.GetCallback());
EXPECT_EQ(test_url_loader_factory_->total_requests(), 1u);
network::TestURLLoaderFactory::PendingRequest* pending_request =
test_url_loader_factory_->GetPendingRequest(0);
test_url_loader_factory_->SimulateResponseForPendingRequest(
pending_request->request.url.spec(), "", net::HTTP_UNAUTHORIZED);
EXPECT_TRUE(future.Wait());
BoundSessionRefreshCookieFetcher::Result result = future.Get();
EXPECT_EQ(result.net_error, net::ERR_HTTP_RESPONSE_CODE_FAILURE);
EXPECT_EQ(result.response_code, net::HTTP_UNAUTHORIZED);
}
TEST_F(BoundSessionRefreshCookieFetcherImplTest, NetworkDelayed) {
signin_client_.SetNetworkCallsDelayed(true);
base::test::TestFuture<BoundSessionRefreshCookieFetcher::Result> future;
fetcher_->Start(future.GetCallback());
EXPECT_EQ(test_url_loader_factory_->total_requests(), 0u);
signin_client_.SetNetworkCallsDelayed(false);
EXPECT_EQ(test_url_loader_factory_->total_requests(), 1u);
network::TestURLLoaderFactory::PendingRequest* pending_request =
test_url_loader_factory_->GetPendingRequest(0);
EXPECT_EQ(pending_request->request.url,
"https://accounts.google.com/RotateBoundCookies");
test_url_loader_factory_->SimulateResponseForPendingRequest(
pending_request->request.url.spec(), "");
EXPECT_TRUE(future.Wait());
}
} // namespace