diff options
author | marja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 15:19:50 +0000 |
---|---|---|
committer | marja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 15:19:50 +0000 |
commit | 47e8f7332c04e732a0617674f53462f2e1aad424 (patch) | |
tree | c8f619304f201cb2fd05ac1909eb2ec5c01d3972 /chrome/browser/sessions | |
parent | 0fadf84de1767ec84a5a21db1d11497c6300033a (diff) | |
download | chromium_src-47e8f7332c04e732a0617674f53462f2e1aad424.zip chromium_src-47e8f7332c04e732a0617674f53462f2e1aad424.tar.gz chromium_src-47e8f7332c04e732a0617674f53462f2e1aad424.tar.bz2 |
Automate more Better Session Restore tests: Crashes.
BUG=153260
Review URL: https://chromiumcodereview.appspot.com/11597010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173732 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sessions')
-rw-r--r-- | chrome/browser/sessions/base_session_service.h | 2 | ||||
-rw-r--r-- | chrome/browser/sessions/better_session_restore_browsertest.cc | 157 |
2 files changed, 145 insertions, 14 deletions
diff --git a/chrome/browser/sessions/base_session_service.h b/chrome/browser/sessions/base_session_service.h index 9e1a0d7..e3abf84 100644 --- a/chrome/browser/sessions/base_session_service.h +++ b/chrome/browser/sessions/base_session_service.h @@ -163,6 +163,8 @@ class BaseSessionService : public CancelableRequestProvider { static const int max_persist_navigation_count; private: + friend class BetterSessionRestoreCrashTest; + // The profile. This may be null during testing. Profile* profile_; diff --git a/chrome/browser/sessions/better_session_restore_browsertest.cc b/chrome/browser/sessions/better_session_restore_browsertest.cc index 64387de..d239b96 100644 --- a/chrome/browser/sessions/better_session_restore_browsertest.cc +++ b/chrome/browser/sessions/better_session_restore_browsertest.cc @@ -8,17 +8,28 @@ #include "base/lazy_instance.h" #include "base/path_service.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/api/infobars/confirm_infobar_delegate.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chromeos/enterprise_extension_observer.h" #include "chrome/browser/content_settings/cookie_settings.h" +#include "chrome/browser/infobars/infobar_tab_helper.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_impl.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/sessions/session_backend.h" +#include "chrome/browser/sessions/session_service_factory.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_tabstrip.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/content_settings.h" #include "chrome/common/pref_names.h" +#include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/web_contents.h" @@ -33,6 +44,16 @@ namespace { +Browser* FindOneOtherBrowserForProfile(Profile* profile, + Browser* not_this_browser) { + for (BrowserList::const_iterator i = BrowserList::begin(); + i != BrowserList::end(); ++i) { + if (*i != not_this_browser && (*i)->profile() == profile) + return *i; + } + return NULL; +} + // We need to serve the test files so that PRE_Test and Test can access the same // page using the same URL. In addition, perceived security origin of the page // needs to stay the same, so e.g., redirecting the URL requests doesn't @@ -120,43 +141,56 @@ class BetterSessionRestoreTest : public InProcessBrowserTest { protected: void StoreDataWithPage(const std::string& filename) { + StoreDataWithPage(browser(), filename); + } + + void StoreDataWithPage(Browser* browser, const std::string& filename) { content::WebContents* web_contents = - chrome::GetActiveWebContents(browser()); + chrome::GetActiveWebContents(browser); content::TitleWatcher title_watcher(web_contents, title_storing_); title_watcher.AlsoWaitForTitle(title_pass_); title_watcher.AlsoWaitForTitle(title_error_write_failed_); title_watcher.AlsoWaitForTitle(title_error_empty_); ui_test_utils::NavigateToURL( - browser(), GURL(fake_server_address_ + test_path_ + filename)); + browser, GURL(fake_server_address_ + test_path_ + filename)); string16 final_title = title_watcher.WaitAndGetTitle(); EXPECT_EQ(title_storing_, final_title); } void NavigateAndCheckStoredData(const std::string& filename) { + NavigateAndCheckStoredData(browser(), filename); + } + + void NavigateAndCheckStoredData(Browser* browser, + const std::string& filename) { // Navigate to a page which has previously stored data; check that the // stored data can be accessed. content::WebContents* web_contents = - chrome::GetActiveWebContents(browser()); + chrome::GetActiveWebContents(browser); content::TitleWatcher title_watcher(web_contents, title_pass_); title_watcher.AlsoWaitForTitle(title_storing_); title_watcher.AlsoWaitForTitle(title_error_write_failed_); title_watcher.AlsoWaitForTitle(title_error_empty_); ui_test_utils::NavigateToURL( - browser(), GURL(fake_server_address_ + test_path_ + filename)); + browser, GURL(fake_server_address_ + test_path_ + filename)); string16 final_title = title_watcher.WaitAndGetTitle(); EXPECT_EQ(title_pass_, final_title); } void CheckReloadedPageRestored() { - CheckTitle(title_pass_); + CheckTitle(browser(), title_pass_); + } + + void CheckReloadedPageRestored(Browser* browser) { + CheckTitle(browser, title_pass_); } void CheckReloadedPageNotRestored() { - CheckTitle(title_storing_); + CheckTitle(browser(), title_storing_); } - void CheckTitle(const string16& expected_title) { - content::WebContents* web_contents = chrome::GetWebContentsAt(browser(), 0); + void CheckTitle(Browser* browser, const string16& expected_title) { + content::WebContents* web_contents = chrome::GetWebContentsAt(browser, 0); content::TitleWatcher title_watcher(web_contents, expected_title); title_watcher.AlsoWaitForTitle(title_pass_); title_watcher.AlsoWaitForTitle(title_storing_); @@ -222,23 +256,36 @@ class BetterSessionRestoreTest : public InProcessBrowserTest { } } + std::string fake_server_address() { + return fake_server_address_; + } + + std::string test_path() { + return test_path_; + } + private: - std::string fake_server_address_; - std::string test_path_; - string16 title_pass_; - string16 title_storing_; - string16 title_error_write_failed_; - string16 title_error_empty_; + const std::string fake_server_address_; + const std::string test_path_; + const string16 title_pass_; + const string16 title_storing_; + const string16 title_error_write_failed_; + const string16 title_error_empty_; DISALLOW_COPY_AND_ASSIGN(BetterSessionRestoreTest); }; class ContinueWhereILeftOffTest : public BetterSessionRestoreTest { public: + ContinueWhereILeftOffTest() { } + virtual void SetUpOnMainThread() OVERRIDE { + BetterSessionRestoreTest::SetUpOnMainThread(); SessionStartupPref::SetStartupPref( browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); } + + DISALLOW_COPY_AND_ASSIGN(ContinueWhereILeftOffTest); }; IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, PRE_SessionCookies) { @@ -406,10 +453,16 @@ IN_PROC_BROWSER_TEST_F(RestartTest, PostWithPassword) { // when they shouldn't be. class NoSessionRestoreTest : public BetterSessionRestoreTest { public: + NoSessionRestoreTest() { } + virtual void SetUpOnMainThread() OVERRIDE { + BetterSessionRestoreTest::SetUpOnMainThread(); SessionStartupPref::SetStartupPref( browser()->profile(), SessionStartupPref(SessionStartupPref::DEFAULT)); } + + private: + DISALLOW_COPY_AND_ASSIGN(NoSessionRestoreTest); }; IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, PRE_SessionCookies) { @@ -475,3 +528,79 @@ IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnExit) { EXPECT_EQ(std::string(chrome::kAboutBlankURL), web_contents->GetURL().spec()); StoreDataWithPage("local_storage.html"); } + +class BetterSessionRestoreCrashTest : public BetterSessionRestoreTest { + public: + BetterSessionRestoreCrashTest() { } + + virtual void SetUpOnMainThread() OVERRIDE { + BetterSessionRestoreTest::SetUpOnMainThread(); + SessionStartupPref::SetStartupPref( + browser()->profile(), SessionStartupPref(SessionStartupPref::DEFAULT)); + } + + protected: + void CrashTestWithPage(const std::string& filename) { + Profile* profile = browser()->profile(); + Browser* browser_before_restore = browser(); + ASSERT_TRUE(browser_before_restore); + StoreDataWithPage(browser_before_restore, filename); + + // Session restore data is written lazily but we cannot restore data that + // was not saved. Be less lazy for the test. + SessionServiceFactory::GetForProfile(profile)->Save(); + + // Simulate a crash and a restart. + browser_before_restore->window()->Close(); + SessionServiceFactory::GetForProfile(profile)->backend()-> + MoveCurrentSessionToLastSession(); + ProfileImpl* profile_impl = static_cast<ProfileImpl*>(profile); + profile_impl->last_session_exit_type_ = Profile::EXIT_CRASHED; +#if defined(OS_CHROMEOS) + profile_impl->chromeos_enterprise_extension_observer_.reset(NULL); +#endif + StartupBrowserCreator::ClearLaunchedProfilesForTesting(); + + CommandLine dummy(CommandLine::NO_PROGRAM); + int return_code; + StartupBrowserCreator browser_creator; + std::vector<Profile*> last_opened_profiles(1, profile); + browser_creator.Start(dummy, + g_browser_process->profile_manager()->user_data_dir(), + profile, last_opened_profiles, &return_code); + + // The browser displays an info bar, use it to restore the session. + Browser* browser_after_restore = + FindOneOtherBrowserForProfile(profile, browser_before_restore); + ASSERT_TRUE(browser_after_restore); + content::WebContents* web_contents = + chrome::GetActiveWebContents(browser_after_restore); + ASSERT_TRUE(web_contents); + EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL()); + InfoBarTabHelper* info_bar_tab_helper = + InfoBarTabHelper::FromWebContents(web_contents); + EXPECT_EQ(1U, info_bar_tab_helper->GetInfoBarCount()); + ConfirmInfoBarDelegate* info_bar_delegate = + static_cast<ConfirmInfoBarDelegate*>( + info_bar_tab_helper->GetInfoBarDelegateAt(0)); + info_bar_delegate->Accept(); + + // Session restore is done ascynhronously. + base::RunLoop loop; + loop.RunUntilIdle(); + + // Check the restored page. + web_contents = chrome::GetWebContentsAt(browser_after_restore, 0); + ASSERT_TRUE(web_contents); + EXPECT_EQ(GURL(fake_server_address() + test_path() + filename), + web_contents->GetURL()); + CheckReloadedPageRestored(browser_after_restore); + } + + private: + DISALLOW_COPY_AND_ASSIGN(BetterSessionRestoreCrashTest); +}; + +IN_PROC_BROWSER_TEST_F(BetterSessionRestoreCrashTest, SessionCookies) { + CrashTestWithPage("session_cookies.html"); +} |