| Index: chrome/browser/sessions/session_restore_observer_unittest.cc
|
| diff --git a/chrome/browser/sessions/session_restore_observer_unittest.cc b/chrome/browser/sessions/session_restore_observer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9d1b39a789e5ddb1d7104f37d8d13a00bc5e95c5
|
| --- /dev/null
|
| +++ b/chrome/browser/sessions/session_restore_observer_unittest.cc
|
| @@ -0,0 +1,148 @@
|
| +// Copyright 2017 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 "chrome/browser/sessions/session_restore_observer.h"
|
| +
|
| +#include "chrome/browser/sessions/session_restore.h"
|
| +#include "chrome/browser/sessions/tab_loader.h"
|
| +#include "chrome/test/base/chrome_render_view_host_test_harness.h"
|
| +#include "content/public/browser/web_contents.h"
|
| +#include "content/public/test/web_contents_tester.h"
|
| +
|
| +using content::WebContentsTester;
|
| +
|
| +namespace {
|
| +
|
| +const char kDefaultUrl[] = "https://www.google.com";
|
| +
|
| +} // namespace
|
| +
|
| +class MockSessionRestoreObserver : public SessionRestoreObserver {
|
| + public:
|
| + MockSessionRestoreObserver() { SessionRestore::AddObserver(this); }
|
| +
|
| + ~MockSessionRestoreObserver() { SessionRestore::RemoveObserver(this); }
|
| +
|
| + enum class SessionRestoreEvent {
|
| + STARTED_LOADING_TABS,
|
| + FINISHED_LOADING_TABS
|
| + };
|
| +
|
| + const std::vector<SessionRestoreEvent>& session_restore_events() const {
|
| + return session_restore_events_;
|
| + }
|
| +
|
| + // SessionRestoreObserver implementation:
|
| + void OnSessionRestoreStartedLoadingTabs() override {
|
| + session_restore_events_.emplace_back(
|
| + SessionRestoreEvent::STARTED_LOADING_TABS);
|
| + }
|
| +
|
| + void OnSessionRestoreFinishedLoadingTabs() override {
|
| + session_restore_events_.emplace_back(
|
| + SessionRestoreEvent::FINISHED_LOADING_TABS);
|
| + }
|
| +
|
| + private:
|
| + std::vector<SessionRestoreEvent> session_restore_events_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockSessionRestoreObserver);
|
| +};
|
| +
|
| +class SessionRestoreObserverTest : public ChromeRenderViewHostTestHarness {
|
| + public:
|
| + using RestoredTab = SessionRestoreDelegate::RestoredTab;
|
| +
|
| + SessionRestoreObserverTest() {}
|
| +
|
| + // testing::Test:
|
| + void SetUp() override {
|
| + ChromeRenderViewHostTestHarness::SetUp();
|
| + restored_tabs_.emplace_back(web_contents(), false, false, false);
|
| + }
|
| +
|
| + void TearDown() override {
|
| + ChromeRenderViewHostTestHarness::TearDown();
|
| + restored_tabs_.clear();
|
| + }
|
| +
|
| + protected:
|
| + void RestoreTabs() {
|
| + TabLoader::RestoreTabs(restored_tabs_, base::TimeTicks());
|
| + }
|
| +
|
| + void LoadWebContents(content::WebContents* contents) {
|
| + WebContentsTester::For(contents)->NavigateAndCommit(GURL(kDefaultUrl));
|
| + WebContentsTester::For(contents)->TestSetIsLoading(false);
|
| + }
|
| +
|
| + const std::vector<MockSessionRestoreObserver::SessionRestoreEvent>&
|
| + session_restore_events() const {
|
| + return mock_observer_.session_restore_events();
|
| + }
|
| +
|
| + size_t number_of_session_restore_events() const {
|
| + return session_restore_events().size();
|
| + }
|
| +
|
| + private:
|
| + MockSessionRestoreObserver mock_observer_;
|
| + std::vector<RestoredTab> restored_tabs_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SessionRestoreObserverTest);
|
| +};
|
| +
|
| +TEST_F(SessionRestoreObserverTest, SingleSessionRestore) {
|
| + RestoreTabs();
|
| + ASSERT_EQ(1u, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS,
|
| + session_restore_events()[0]);
|
| +
|
| + LoadWebContents(web_contents());
|
| + ASSERT_EQ(2u, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS,
|
| + session_restore_events()[1]);
|
| +}
|
| +
|
| +TEST_F(SessionRestoreObserverTest, SequentialSessionRestore) {
|
| + const int number_of_session_restores = 3;
|
| + size_t event_index = 0;
|
| + for (int i = 0; i < number_of_session_restores; ++i) {
|
| + RestoreTabs();
|
| + ASSERT_EQ(event_index + 1, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS,
|
| + session_restore_events()[event_index++]);
|
| +
|
| + LoadWebContents(web_contents());
|
| + ASSERT_EQ(event_index + 1, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS,
|
| + session_restore_events()[event_index++]);
|
| + }
|
| +}
|
| +
|
| +TEST_F(SessionRestoreObserverTest, ConcurrentSessionRestore) {
|
| + std::vector<RestoredTab> another_restored_tabs;
|
| + std::unique_ptr<content::WebContents> test_contents(
|
| + WebContentsTester::CreateTestWebContents(browser_context(), nullptr));
|
| + another_restored_tabs.emplace_back(test_contents.get(), false, false, false);
|
| +
|
| + RestoreTabs();
|
| + TabLoader::RestoreTabs(another_restored_tabs, base::TimeTicks());
|
| + ASSERT_EQ(1u, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS,
|
| + session_restore_events()[0]);
|
| +
|
| + LoadWebContents(web_contents());
|
| + LoadWebContents(test_contents.get());
|
| +
|
| + ASSERT_EQ(2u, number_of_session_restore_events());
|
| + EXPECT_EQ(
|
| + MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS,
|
| + session_restore_events()[1]);
|
| +}
|
|
|