summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/ui
diff options
context:
space:
mode:
authorrkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 07:55:54 +0000
committerrkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 07:55:54 +0000
commit4ccbb68dcb1ec5c0193172d5a6c43d564ac2f035 (patch)
treea9a157fbe25f263255f115feea48206fcb380a82 /chrome/browser/chromeos/ui
parent487d3a271cd57794afac1e430497b739af6f2391 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/chromeos/ui/idle_logout_dialog_view.cc94
-rw-r--r--chrome/browser/chromeos/ui/idle_logout_dialog_view.h50
-rw-r--r--chrome/browser/chromeos/ui/idle_logout_dialog_view_browsertest.cc118
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