123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // Copyright 2018 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/command_line.h"
- #include "base/no_destructor.h"
- #include "content/public/test/browser_test.h"
- #include "fuchsia_web/common/test/frame_test_util.h"
- #include "fuchsia_web/common/test/test_navigation_listener.h"
- #include "fuchsia_web/webengine/switches.h"
- #include "fuchsia_web/webengine/test/frame_for_test.h"
- #include "fuchsia_web/webengine/test/web_engine_browser_test.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "url/url_constants.h"
- namespace {
- // Defines a suite of tests that exercise browser-level configuration and
- // functionality.
- class ContextImplTest : public WebEngineBrowserTest {
- public:
- ContextImplTest() = default;
- ~ContextImplTest() override = default;
- ContextImplTest(const ContextImplTest&) = delete;
- ContextImplTest& operator=(const ContextImplTest&) = delete;
- protected:
- // Synchronously gets the list of all cookies from the fuchsia.web.Context.
- std::vector<fuchsia::web::Cookie> GetCookies() {
- base::RunLoop get_cookies_loop;
- // Connect to the Context's CookieManager and request all the cookies.
- fuchsia::web::CookieManagerPtr cookie_manager;
- context()->GetCookieManager(cookie_manager.NewRequest());
- fuchsia::web::CookiesIteratorPtr cookies_iterator;
- cookie_manager->GetCookieList(nullptr, nullptr,
- cookies_iterator.NewRequest());
- // |cookies_iterator| will disconnect once after the last cookies have been
- // returned by GetNext().
- cookies_iterator.set_error_handler([&](zx_status_t status) {
- EXPECT_EQ(ZX_ERR_PEER_CLOSED, status);
- get_cookies_loop.Quit();
- });
- std::vector<fuchsia::web::Cookie> cookies;
- // std::function<> must be used here because fit::function<> is move-only
- // and this callback will be used both for the initial GetNext() call, and
- // for the follow-up calls made each time GetNext() results are received.
- std::function<void(std::vector<fuchsia::web::Cookie>)> get_next_callback =
- [&](std::vector<fuchsia::web::Cookie> new_cookies) {
- cookies.insert(cookies.end(),
- std::make_move_iterator(new_cookies.begin()),
- std::make_move_iterator(new_cookies.end()));
- cookies_iterator->GetNext(get_next_callback);
- };
- cookies_iterator->GetNext(get_next_callback);
- get_cookies_loop.Run();
- return cookies;
- }
- };
- fuchsia::web::Cookie CreateExpectedCookie() {
- fuchsia::web::Cookie cookie;
- fuchsia::web::CookieId id;
- id.set_name("foo");
- id.set_path("/");
- id.set_domain("127.0.0.1");
- cookie.set_id(std::move(id));
- cookie.set_value("bar");
- return cookie;
- }
- const fuchsia::web::Cookie& ExpectedCookie() {
- static const base::NoDestructor<fuchsia::web::Cookie> expected_cookie(
- CreateExpectedCookie());
- return *expected_cookie;
- }
- } // namespace
- // BrowserContext with persistent storage stores cookies such that they can
- // be retrieved via the CookieManager API.
- IN_PROC_BROWSER_TEST_F(ContextImplTest, PersistentCookieStore) {
- ASSERT_TRUE(embedded_test_server()->Start());
- auto frame =
- FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
- const GURL kSetCookieUrl(
- embedded_test_server()->GetURL("/set-cookie?foo=bar"));
- LoadUrlAndExpectResponse(frame.GetNavigationController(),
- fuchsia::web::LoadUrlParams(), kSetCookieUrl.spec());
- frame.navigation_listener().RunUntilUrlEquals(kSetCookieUrl);
- std::vector<fuchsia::web::Cookie> cookies = GetCookies();
- ASSERT_EQ(cookies.size(), 1u);
- ASSERT_TRUE(cookies[0].has_id());
- EXPECT_TRUE(fidl::Equals(cookies[0], ExpectedCookie()));
- // Check that the cookie persists beyond the lifetime of the Frame by
- // releasing the Frame and re-querying the CookieStore.
- frame = FrameForTest();
- base::RunLoop().RunUntilIdle();
- cookies = GetCookies();
- ASSERT_EQ(cookies.size(), 1u);
- ASSERT_TRUE(cookies[0].has_id());
- EXPECT_TRUE(fidl::Equals(cookies[0], ExpectedCookie()));
- }
- // Suite for tests which run the BrowserContext in incognito mode (no data
- // directory).
- class IncognitoContextImplTest : public ContextImplTest {
- public:
- IncognitoContextImplTest() = default;
- ~IncognitoContextImplTest() override = default;
- IncognitoContextImplTest(const IncognitoContextImplTest&) = delete;
- IncognitoContextImplTest& operator=(const IncognitoContextImplTest&) = delete;
- void SetUp() override {
- base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kIncognito);
- ContextImplTest::SetUp();
- }
- };
- // Verify that the browser can be initialized without a persistent data
- // directory.
- IN_PROC_BROWSER_TEST_F(IncognitoContextImplTest, NavigateFrame) {
- auto frame =
- FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
- EXPECT_TRUE(LoadUrlAndExpectResponse(frame.GetNavigationController(),
- fuchsia::web::LoadUrlParams(),
- url::kAboutBlankURL));
- frame.navigation_listener().RunUntilUrlEquals(GURL(url::kAboutBlankURL));
- }
- // In-memory cookie store stores cookies, and is accessible via CookieManager.
- IN_PROC_BROWSER_TEST_F(IncognitoContextImplTest, InMemoryCookieStore) {
- ASSERT_TRUE(embedded_test_server()->Start());
- auto frame =
- FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
- const GURL kSetCookieUrl(
- embedded_test_server()->GetURL("/set-cookie?foo=bar"));
- LoadUrlAndExpectResponse(frame.GetNavigationController(),
- fuchsia::web::LoadUrlParams(), kSetCookieUrl.spec());
- frame.navigation_listener().RunUntilUrlEquals(kSetCookieUrl);
- std::vector<fuchsia::web::Cookie> cookies = GetCookies();
- ASSERT_EQ(cookies.size(), 1u);
- EXPECT_TRUE(fidl::Equals(cookies[0], ExpectedCookie()));
- }
|