blob: a7da29702b075c7446176f44b2d06c9658440e75 [file] [log] [blame]
// Copyright 2020 The Chromium 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 "base/test/bind.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "weblayer/browser/profile_impl.h"
#include "weblayer/public/cookie_manager.h"
#include "weblayer/test/weblayer_browser_test.h"
#include "weblayer/test/weblayer_browser_test_utils.h"
namespace weblayer {
class CookieManagerBrowserTest : public WebLayerBrowserTest {
public:
const std::vector<net::CookieChangeInfo>& WaitForChanges(size_t num) {
if (change_infos_.size() >= num)
return change_infos_;
num_to_wait_for_ = num;
run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
return change_infos_;
}
void OnCookieChanged(const net::CookieChangeInfo& info) {
change_infos_.push_back(info);
if (run_loop_ && num_to_wait_for_ == change_infos_.size())
run_loop_->Quit();
}
void Reset() { change_infos_.clear(); }
bool SetCookie(const std::string& cookie) {
GURL base_url = embedded_test_server()->base_url();
base::RunLoop run_loop;
bool final_result = false;
GetProfile()->GetCookieManager()->SetCookie(
base_url, cookie,
base::BindLambdaForTesting([&run_loop, &final_result](bool result) {
final_result = result;
run_loop.Quit();
}));
run_loop.Run();
return final_result;
}
private:
size_t num_to_wait_for_ = 0;
std::vector<net::CookieChangeInfo> change_infos_;
std::unique_ptr<base::RunLoop> run_loop_;
};
IN_PROC_BROWSER_TEST_F(CookieManagerBrowserTest, CookieChanged) {
EXPECT_TRUE(embedded_test_server()->Start());
NavigateAndWaitForCompletion(
embedded_test_server()->GetURL("/simple_page.html"), shell());
GURL base_url = embedded_test_server()->base_url();
base::CallbackListSubscription subscription =
GetProfile()->GetCookieManager()->AddCookieChangedCallback(
base_url, nullptr,
base::BindRepeating(&CookieManagerBrowserTest::OnCookieChanged,
base::Unretained(this)));
ASSERT_TRUE(SetCookie("foo=bar"));
const auto& changes = WaitForChanges(1);
ASSERT_EQ(changes.size(), 1u);
const auto& cookie = changes[0].cookie;
EXPECT_EQ(cookie.Name(), "foo");
EXPECT_EQ(cookie.Value(), "bar");
}
IN_PROC_BROWSER_TEST_F(CookieManagerBrowserTest,
CookieChangedRemoveSubscription) {
EXPECT_TRUE(embedded_test_server()->Start());
NavigateAndWaitForCompletion(
embedded_test_server()->GetURL("/simple_page.html"), shell());
GURL base_url = embedded_test_server()->base_url();
std::string cookie1 = "cookie1";
base::CallbackListSubscription subscription1 =
GetProfile()->GetCookieManager()->AddCookieChangedCallback(
base_url, &cookie1,
base::BindRepeating(&CookieManagerBrowserTest::OnCookieChanged,
base::Unretained(this)));
std::string cookie2 = "cookie2";
base::CallbackListSubscription subscription2 =
GetProfile()->GetCookieManager()->AddCookieChangedCallback(
base_url, &cookie2,
base::BindRepeating(&CookieManagerBrowserTest::OnCookieChanged,
base::Unretained(this)));
ASSERT_TRUE(SetCookie("cookie1=something"));
{
const auto& changes = WaitForChanges(1);
ASSERT_EQ(changes.size(), 1u);
EXPECT_EQ(changes[0].cookie.Name(), cookie1);
}
Reset();
subscription1 = {};
// Set cookie1 first and then cookie2. We should only receive a cookie change
// event for cookie2.
ASSERT_TRUE(SetCookie("cookie1=other"));
ASSERT_TRUE(SetCookie("cookie2=something"));
{
const auto& changes = WaitForChanges(1);
ASSERT_EQ(changes.size(), 1u);
EXPECT_EQ(changes[0].cookie.Name(), cookie2);
}
}
} // namespace weblayer