diff options
author | rkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 07:55:54 +0000 |
---|---|---|
committer | rkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 07:55:54 +0000 |
commit | 4ccbb68dcb1ec5c0193172d5a6c43d564ac2f035 (patch) | |
tree | a9a157fbe25f263255f115feea48206fcb380a82 /chrome/browser/chromeos/ui | |
parent | 487d3a271cd57794afac1e430497b739af6f2391 (diff) | |
download | chromium_src-4ccbb68dcb1ec5c0193172d5a6c43d564ac2f035.zip chromium_src-4ccbb68dcb1ec5c0193172d5a6c43d564ac2f035.tar.gz chromium_src-4ccbb68dcb1ec5c0193172d5a6c43d564ac2f035.tar.bz2 |
Add browser tests for IdleLogoutDialogView.
Added browser tests for the Idle Logout dialog for kiosk mode.
Reviews requested,
sky@ - Review of the browser tests.
mnissler@ - Review of the kiosk mode settings mocking code.
R=mnissler@chromium.org,sky@chromium.org
BUG=None.
TEST=Ran the browser tests to confirm they all pass. Changed the original code and re-ran to verify they failed when behavior was not as expected.
Review URL: https://chromiumcodereview.appspot.com/9810012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130339 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/ui')
3 files changed, 222 insertions, 40 deletions
diff --git a/chrome/browser/chromeos/ui/idle_logout_dialog_view.cc b/chrome/browser/chromeos/ui/idle_logout_dialog_view.cc index 9983952..1186192 100644 --- a/chrome/browser/chromeos/ui/idle_logout_dialog_view.cc +++ b/chrome/browser/chromeos/ui/idle_logout_dialog_view.cc @@ -22,13 +22,37 @@ namespace { // Global singleton instance of our dialog class. -IdleLogoutDialogView* g_instance = NULL; +chromeos::IdleLogoutDialogView* g_instance = NULL; const int kIdleLogoutDialogMaxWidth = 400; -const int kCountdownUpdateInterval = 1; // second. +const int kCountdownUpdateIntervalMs = 1000; } // namespace +namespace chromeos { + +IdleLogoutSettingsProvider* IdleLogoutDialogView::provider_ = NULL; + +//////////////////////////////////////////////////////////////////////////////// +// IdleLogoutSettingsProvider public methods +IdleLogoutSettingsProvider::IdleLogoutSettingsProvider() { +} + +IdleLogoutSettingsProvider::~IdleLogoutSettingsProvider() { +} + +base::TimeDelta IdleLogoutSettingsProvider::GetCountdownUpdateInterval() { + return base::TimeDelta::FromMilliseconds(kCountdownUpdateIntervalMs); +} + +KioskModeSettings* IdleLogoutSettingsProvider::GetKioskModeSettings() { + return KioskModeSettings::Get(); +} + +void IdleLogoutSettingsProvider::LogoutCurrentUser(IdleLogoutDialogView*) { + BrowserList::AttemptUserExit(); +} + //////////////////////////////////////////////////////////////////////////////// // IdleLogoutDialogView public static methods // static @@ -85,37 +109,28 @@ void IdleLogoutDialogView::DeleteDelegate() { g_instance = NULL; } - // CallInit succeeded (or was never called) hence it didn't free - // this pointer, free it here. - if (chromeos::KioskModeSettings::Get()->is_initialized()) - delete instance_holder_; - delete this; } //////////////////////////////////////////////////////////////////////////////// // IdleLogoutDialog private methods -IdleLogoutDialogView::IdleLogoutDialogView() : restart_label_(NULL), - warning_label_(NULL) { - instance_holder_ = new IdleLogoutDialogView*(this); +IdleLogoutDialogView::IdleLogoutDialogView() + : restart_label_(NULL), + warning_label_(NULL), + weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { + if (!IdleLogoutDialogView::provider_) + IdleLogoutDialogView::provider_ = new IdleLogoutSettingsProvider(); } IdleLogoutDialogView::~IdleLogoutDialogView() { } -// static -void IdleLogoutDialogView::CallInit(IdleLogoutDialogView** instance_holder) { - if (*instance_holder) - (*instance_holder)->Init(); - else - // Our class is gone, free the holder memory. - delete instance_holder; -} - void IdleLogoutDialogView::Init() { - if (!chromeos::KioskModeSettings::Get()->is_initialized()) { - chromeos::KioskModeSettings::Get()->Initialize( - base::Bind(&IdleLogoutDialogView::CallInit, instance_holder_)); + KioskModeSettings* settings = + IdleLogoutDialogView::provider_->GetKioskModeSettings(); + if (!settings->is_initialized()) { + settings->Initialize(base::Bind(&IdleLogoutDialogView::Init, + weak_ptr_factory_.GetWeakPtr())); return; } @@ -146,10 +161,14 @@ void IdleLogoutDialogView::Init() { } void IdleLogoutDialogView::Show() { + KioskModeSettings* settings = + IdleLogoutDialogView::provider_->GetKioskModeSettings(); + // Setup the countdown label before showing. countdown_end_time_ = base::Time::Now() + - chromeos::KioskModeSettings::Get()->GetIdleLogoutWarningDuration(); - UpdateCountdownTimer(); + settings->GetIdleLogoutWarningDuration(); + + UpdateCountdown(); views::Widget::CreateWindow(this); GetWidget()->SetAlwaysOnTop(true); @@ -157,19 +176,20 @@ void IdleLogoutDialogView::Show() { // Update countdown every 1 second. timer_.Start(FROM_HERE, - base::TimeDelta::FromSeconds(kCountdownUpdateInterval), + IdleLogoutDialogView::provider_->GetCountdownUpdateInterval(), this, - &IdleLogoutDialogView::UpdateCountdownTimer); + &IdleLogoutDialogView::UpdateCountdown); } void IdleLogoutDialogView::Close() { DCHECK(GetWidget()); - timer_.Stop(); + if (timer_.IsRunning()) + timer_.Stop(); GetWidget()->Close(); } -void IdleLogoutDialogView::UpdateCountdownTimer() { +void IdleLogoutDialogView::UpdateCountdown() { base::TimeDelta logout_warning_time = countdown_end_time_ - base::Time::Now(); int64 seconds_left = (logout_warning_time.InMillisecondsF() / @@ -187,7 +207,21 @@ void IdleLogoutDialogView::UpdateCountdownTimer() { restart_label_->SetText(l10n_util::GetStringUTF16( IDS_IDLE_LOGOUT_WARNING_RESTART_NOW)); - // Logout the current user. - BrowserList::AttemptUserExit(); + // We're done; stop the timer and logout. + timer_.Stop(); + IdleLogoutDialogView::provider_->LogoutCurrentUser(this); } } + +// static +IdleLogoutDialogView* IdleLogoutDialogView::current_instance() { + return g_instance; +} + +// static +void IdleLogoutDialogView::set_settings_provider( + IdleLogoutSettingsProvider* provider) { + provider_ = provider; +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/ui/idle_logout_dialog_view.h b/chrome/browser/chromeos/ui/idle_logout_dialog_view.h index 7c53327..8c9d11b 100644 --- a/chrome/browser/chromeos/ui/idle_logout_dialog_view.h +++ b/chrome/browser/chromeos/ui/idle_logout_dialog_view.h @@ -6,6 +6,8 @@ #define CHROME_BROWSER_CHROMEOS_UI_IDLE_LOGOUT_DIALOG_VIEW_H_ #pragma once +#include "base/gtest_prod_util.h" +#include "base/memory/weak_ptr.h" #include "base/timer.h" #include "ui/views/window/dialog_delegate.h" @@ -16,6 +18,26 @@ namespace views { class Label; } +namespace chromeos { + +class IdleLogoutDialogView; +class KioskModeSettings; + +// A class that holds the settings for IdleLogoutDialogView; this class +// can be overridden with a mock for testing. +class IdleLogoutSettingsProvider { + public: + IdleLogoutSettingsProvider(); + virtual ~IdleLogoutSettingsProvider(); + + virtual base::TimeDelta GetCountdownUpdateInterval(); + virtual KioskModeSettings* GetKioskModeSettings(); + virtual void LogoutCurrentUser(IdleLogoutDialogView* dialog); + + private: + DISALLOW_COPY_AND_ASSIGN(IdleLogoutSettingsProvider); +}; + // A class to show the logout on idle dialog if the machine is in retail mode. class IdleLogoutDialogView : public views::DialogDelegateView { public: @@ -30,23 +52,28 @@ class IdleLogoutDialogView : public views::DialogDelegateView { virtual void DeleteDelegate() OVERRIDE; private: + friend class MockIdleLogoutSettingsProvider; + friend class IdleLogoutDialogViewTest; + FRIEND_TEST_ALL_PREFIXES(IdleLogoutDialogViewTest, ShowDialogAndCloseView); + IdleLogoutDialogView(); virtual ~IdleLogoutDialogView(); - // Calls init after checking if the class is still alive. - static void CallInit(IdleLogoutDialogView** dialog); // Adds the labels and adds them to the layout. void Init(); void Show(); void Close(); - void UpdateCountdownTimer(); + void UpdateCountdown(); // Indicate that this instance has been 'closed' and should not be used. - void set_closed() { *instance_holder_ = NULL; } - // If our instance holder holds NULL, means we've been closed already. - bool is_closed() const { return NULL == *instance_holder_; } + void set_closed() { is_closed_ = true; } + bool is_closed() const { return is_closed_; } + + // For testing. + static IdleLogoutDialogView* current_instance(); + static void set_settings_provider(IdleLogoutSettingsProvider* provider); views::Label* restart_label_; views::Label* warning_label_; @@ -56,12 +83,15 @@ class IdleLogoutDialogView : public views::DialogDelegateView { base::RepeatingTimer<IdleLogoutDialogView> timer_; - // Holds a pointer to our instance; if we are closed, we set this to hold - // a NULL value, indicating that our instance is been 'closed' and should - // not be used further. The delete will happen async to the closing. - IdleLogoutDialogView** instance_holder_; + bool is_closed_; + + base::WeakPtrFactory<IdleLogoutDialogView> weak_ptr_factory_; + + static IdleLogoutSettingsProvider* provider_; DISALLOW_COPY_AND_ASSIGN(IdleLogoutDialogView); }; +} // namespace chromeos + #endif // CHROME_BROWSER_CHROMEOS_UI_IDLE_LOGOUT_DIALOG_VIEW_H_ diff --git a/chrome/browser/chromeos/ui/idle_logout_dialog_view_browsertest.cc b/chrome/browser/chromeos/ui/idle_logout_dialog_view_browsertest.cc new file mode 100644 index 0000000..c9b67bd --- /dev/null +++ b/chrome/browser/chromeos/ui/idle_logout_dialog_view_browsertest.cc @@ -0,0 +1,118 @@ +// Copyright (c) 2012 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/chromeos/ui/idle_logout_dialog_view.h" + +#include "base/message_loop.h" +#include "chrome/browser/chromeos/kiosk_mode/mock_kiosk_mode_settings.h" +#include "chrome/test/base/in_process_browser_test.h" + +namespace chromeos { + +class MockIdleLogoutSettingsProvider : public IdleLogoutSettingsProvider { +public: + explicit MockIdleLogoutSettingsProvider(KioskModeSettings* mock_settings) + : mock_settings_(mock_settings) {} + + virtual base::TimeDelta GetCountdownUpdateInterval() OVERRIDE { + return base::TimeDelta::FromMilliseconds(0); + } + + KioskModeSettings* GetKioskModeSettings() OVERRIDE { + return mock_settings_; + } + + virtual void LogoutCurrentUser(IdleLogoutDialogView* dialog) OVERRIDE { + dialog->Close(); + } + +private: + KioskModeSettings* mock_settings_; + + DISALLOW_COPY_AND_ASSIGN(MockIdleLogoutSettingsProvider); +}; + +class IdleLogoutDialogViewTest : public InProcessBrowserTest { + public: + IdleLogoutDialogViewTest() + : mock_provider_(NULL), + mock_settings_(NULL) {} + + virtual ~IdleLogoutDialogViewTest() {} + + virtual void SetUp() OVERRIDE { + mock_settings_ = new MockKioskModeSettings(); + mock_provider_ = new MockIdleLogoutSettingsProvider(mock_settings_); + IdleLogoutDialogView::set_settings_provider(mock_provider_); + + InProcessBrowserTest::SetUp(); + } + + virtual void TearDown() OVERRIDE { + delete mock_settings_; + delete mock_provider_; + + InProcessBrowserTest::TearDown(); + } + + void ExpectOpenDialog() { + IdleLogoutDialogView* dialog = IdleLogoutDialogView::current_instance(); + ASSERT_TRUE(dialog != NULL); + EXPECT_TRUE(dialog->visible()); + } + + void ExpectClosedDialog() { + EXPECT_TRUE(IdleLogoutDialogView::current_instance() == NULL); + } + + private: + MockIdleLogoutSettingsProvider* mock_provider_; + MockKioskModeSettings* mock_settings_; + + DISALLOW_COPY_AND_ASSIGN(IdleLogoutDialogViewTest); +}; + +IN_PROC_BROWSER_TEST_F(IdleLogoutDialogViewTest, ShowDialogAndClose) { + IdleLogoutDialogView::ShowDialog(); + EXPECT_NO_FATAL_FAILURE(ExpectOpenDialog()); + + IdleLogoutDialogView::CloseDialog(); + ExpectClosedDialog(); +} + +IN_PROC_BROWSER_TEST_F(IdleLogoutDialogViewTest, ShowDialogAndCloseView) { + IdleLogoutDialogView::ShowDialog(); + EXPECT_NO_FATAL_FAILURE(ExpectOpenDialog()); + + IdleLogoutDialogView::current_instance()->Close(); + MessageLoop::current()->RunAllPending(); + ExpectClosedDialog(); +} + +IN_PROC_BROWSER_TEST_F(IdleLogoutDialogViewTest, + OutOfOrderMultipleShowDialogAndClose) { + IdleLogoutDialogView::CloseDialog(); + ExpectClosedDialog(); + + IdleLogoutDialogView::ShowDialog(); + EXPECT_NO_FATAL_FAILURE(ExpectOpenDialog()); + IdleLogoutDialogView::ShowDialog(); + EXPECT_NO_FATAL_FAILURE(ExpectOpenDialog()); + + IdleLogoutDialogView::CloseDialog(); + ExpectClosedDialog(); + IdleLogoutDialogView::CloseDialog(); + ExpectClosedDialog(); +} + +IN_PROC_BROWSER_TEST_F(IdleLogoutDialogViewTest, + ShowDialogAndFinishCountdown) { + IdleLogoutDialogView::ShowDialog(); + EXPECT_NO_FATAL_FAILURE(ExpectOpenDialog()); + + MessageLoop::current()->RunAllPending(); + ExpectClosedDialog(); +} + +} // namespace chromeos |