summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/login
diff options
context:
space:
mode:
authorglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-31 18:14:19 +0000
committerglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-31 18:14:19 +0000
commitf8e1bb408219c65b5ce42099fbd81b0a7e91be24 (patch)
treec5d4f4238dd9b84265c6f9e41091d72a69ddfb7e /chrome/browser/chromeos/login
parentd63109949c8c665f8235fa100e1c43b6a5ebdfef (diff)
downloadchromium_src-f8e1bb408219c65b5ce42099fbd81b0a7e91be24.zip
chromium_src-f8e1bb408219c65b5ce42099fbd81b0a7e91be24.tar.gz
chromium_src-f8e1bb408219c65b5ce42099fbd81b0a7e91be24.tar.bz2
Control flow test family added.
BUG=none TEST=out/Debug/browser_tests --gtest_filter=WizardControllerFlowTest.ControlFlow* Review URL: http://codereview.chromium.org/1513005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43238 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/login')
-rw-r--r--chrome/browser/chromeos/login/mock_login_utils.h22
-rw-r--r--chrome/browser/chromeos/login/mock_update_screen.h17
-rw-r--r--chrome/browser/chromeos/login/screen_observer.h1
-rw-r--r--chrome/browser/chromeos/login/view_screen.h3
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.cc5
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.h6
-rw-r--r--chrome/browser/chromeos/login/wizard_controller_browsertest.cc139
7 files changed, 190 insertions, 3 deletions
diff --git a/chrome/browser/chromeos/login/mock_login_utils.h b/chrome/browser/chromeos/login/mock_login_utils.h
new file mode 100644
index 0000000..9efe6f4
--- /dev/null
+++ b/chrome/browser/chromeos/login/mock_login_utils.h
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_LOGIN_UTILS_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_LOGIN_UTILS_H_
+
+#include <string>
+#include <vector>
+#include "chrome/browser/chromeos/login/login_utils.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+class MockLoginUtils : public chromeos::LoginUtils {
+ public:
+ virtual ~MockLoginUtils() {}
+ MOCK_METHOD2(CompleteLogin, void(const std::string& username,
+ std::vector<std::string> cookies));
+ MOCK_METHOD1(CreateAuthenticator,
+ Authenticator*(LoginStatusConsumer* consumer));
+};
+
+#endif // CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_LOGIN_UTILS_H_
diff --git a/chrome/browser/chromeos/login/mock_update_screen.h b/chrome/browser/chromeos/login/mock_update_screen.h
new file mode 100644
index 0000000..a11ed74
--- /dev/null
+++ b/chrome/browser/chromeos/login/mock_update_screen.h
@@ -0,0 +1,17 @@
+// Copyright (c) 2010 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_UPDATE_SCREEN_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_UPDATE_SCREEN_H_
+
+#include "chrome/browser/chromeos/login/view_screen.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+class MockUpdateScreen : public UpdateScreen {
+ public:
+ explicit MockUpdateScreen(WizardScreenDelegate* d) : UpdateScreen(d) {}
+ MOCK_METHOD0(StartUpdate, void());
+};
+
+#endif // CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_UPDATE_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screen_observer.h b/chrome/browser/chromeos/login/screen_observer.h
index bacb96e..2d616ca 100644
--- a/chrome/browser/chromeos/login/screen_observer.h
+++ b/chrome/browser/chromeos/login/screen_observer.h
@@ -31,6 +31,7 @@ class ScreenObserver {
UPDATE_NOUPDATE,
UPDATE_NETWORK_ERROR,
UPDATE_OTHER_ERROR,
+ EXIT_CODES_COUNT // not a real code, must be the last
};
// Method called by a screen when user's done with it.
diff --git a/chrome/browser/chromeos/login/view_screen.h b/chrome/browser/chromeos/login/view_screen.h
index e802fe5..55a6cf7 100644
--- a/chrome/browser/chromeos/login/view_screen.h
+++ b/chrome/browser/chromeos/login/view_screen.h
@@ -102,7 +102,8 @@ class UpdateScreen: public DefaultViewScreen<chromeos::UpdateView> {
explicit UpdateScreen(WizardScreenDelegate* delegate)
: DefaultViewScreen<chromeos::UpdateView>(delegate) {
}
- void StartUpdate() { view()->StartUpdate(); }
+ virtual ~UpdateScreen() {}
+ virtual void StartUpdate() { view()->StartUpdate(); }
};
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 5afc336..09ac135 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -124,6 +124,9 @@ const char WizardController::kUpdateScreenName[] = "update";
// Passing this parameter as a "first screen" initiates full OOBE flow.
const char WizardController::kOutOfBoxScreenName[] = "oobe";
+// Special test value that commands not to create any window yet.
+const char WizardController::kTestNoScreenName[] = "test:nowindow";
+
// Initialize default controller.
// static
WizardController* WizardController::default_controller_ = NULL;
@@ -357,7 +360,7 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) {
} else if (first_screen_name == kUpdateScreenName) {
SetCurrentScreen(GetUpdateScreen());
update_screen_->StartUpdate();
- } else {
+ } else if (first_screen_name != kTestNoScreenName) {
if (is_out_of_box_) {
SetCurrentScreen(GetNetworkScreen());
} else {
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index 3c6e43c..2036d3c 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -85,6 +85,7 @@ class WizardController : public chromeos::ScreenObserver,
static const char kAccountScreenName[];
static const char kUpdateScreenName[];
static const char kOutOfBoxScreenName[];
+ static const char kTestNoScreenName[];
private:
// Exit handlers:
@@ -145,6 +146,11 @@ class WizardController : public chromeos::ScreenObserver,
static WizardController* default_controller_;
FRIEND_TEST(WizardControllerTest, SwitchLanguage);
+ FRIEND_TEST(WizardControllerFlowTest, ControlFlowMain);
+ FRIEND_TEST(WizardControllerFlowTest, ControlFlowLanguageSwitch);
+ FRIEND_TEST(WizardControllerFlowTest, ControlFlowErrorUpdate);
+ FRIEND_TEST(WizardControllerFlowTest, ControlFlowErrorNetwork);
+ friend class WizardControllerFlowTest;
DISALLOW_COPY_AND_ASSIGN(WizardController);
};
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index 2da0a21..df481cb 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -4,15 +4,60 @@
#include "app/l10n_util.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/account_screen.h"
+#include "chrome/browser/chromeos/login/mock_update_screen.h"
+#include "chrome/browser/chromeos/login/network_screen.h"
+#include "chrome/browser/chromeos/login/network_selection_view.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/test/ui_test_utils.h"
#include "grit/generated_resources.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "unicode/locid.h"
+namespace {
+
+template <class T>
+class MockOutShowHide : public T {
+ public:
+ template <class P> MockOutShowHide(P p) : T(p) {}
+ template <class P1, class P2> MockOutShowHide(P1 p1, P2 p2) : T(p1, p2) {}
+ MOCK_METHOD0(Show, void());
+ MOCK_METHOD0(Hide, void());
+};
+
+template <class T>
+struct CreateMockWizardScreenHelper {
+ static MockOutShowHide<T>* Create(WizardController* wizard);
+};
+
+template <class T> MockOutShowHide<T>*
+CreateMockWizardScreenHelper<T>::Create(WizardController* wizard) {
+ return new MockOutShowHide<T>(wizard);
+}
+
+template <> MockOutShowHide<chromeos::NetworkScreen>*
+CreateMockWizardScreenHelper<chromeos::NetworkScreen>::Create(
+ WizardController* wizard) {
+ return new MockOutShowHide<chromeos::NetworkScreen>(wizard, true);
+}
+
+#define MOCK(mock_var, screen_name, mocked_class) \
+ mock_var = CreateMockWizardScreenHelper<mocked_class>::Create(controller()); \
+ controller()->screen_name.reset(mock_var); \
+ EXPECT_CALL(*mock_var, Show()).Times(0); \
+ EXPECT_CALL(*mock_var, Hide()).Times(0);
+
+} // namespace
+
class WizardControllerTest : public chromeos::WizardInProcessBrowserTest {
protected:
- WizardControllerTest(): chromeos::WizardInProcessBrowserTest("oobe") {}
+ WizardControllerTest() : chromeos::WizardInProcessBrowserTest(
+ WizardController::kTestNoScreenName) {}
+ virtual ~WizardControllerTest() {}
private:
DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
@@ -21,6 +66,7 @@ class WizardControllerTest : public chromeos::WizardInProcessBrowserTest {
IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
WizardController* const wizard = controller();
ASSERT_TRUE(wizard != NULL);
+ wizard->ShowFirstScreen(WizardController::kOutOfBoxScreenName);
views::View* current_screen = wizard->contents();
ASSERT_TRUE(current_screen != NULL);
@@ -46,3 +92,94 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
EXPECT_NE(fr_str, ar_str);
}
+
+class WizardControllerFlowTest : public WizardControllerTest {
+ protected:
+ WizardControllerFlowTest() {}
+ // Overriden from InProcessBrowserTest:
+ virtual Browser* CreateBrowser(Profile* profile) {
+ Browser* ret = WizardControllerTest::CreateBrowser(profile);
+
+ // Set up the mocks for all screens.
+ MOCK(mock_account_screen_, account_screen_, chromeos::AccountScreen);
+ MOCK(mock_login_screen_, login_screen_, LoginScreen);
+ MOCK(mock_network_screen_, network_screen_, chromeos::NetworkScreen);
+ MOCK(mock_update_screen_, update_screen_, MockUpdateScreen);
+
+ // Switch to the initial screen.
+ EXPECT_EQ(NULL, controller()->current_screen());
+ EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
+ controller()->ShowFirstScreen(WizardController::kOutOfBoxScreenName);
+
+ return ret;
+ }
+
+ MockOutShowHide<chromeos::AccountScreen>* mock_account_screen_;
+ MockOutShowHide<LoginScreen>* mock_login_screen_;
+ MockOutShowHide<chromeos::NetworkScreen>* mock_network_screen_;
+ MockOutShowHide<MockUpdateScreen>* mock_update_screen_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
+};
+
+IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+ EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1);
+ EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::NETWORK_CONNECTED);
+
+ EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+ EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::UPDATE_INSTALLED);
+
+ EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_login_screen_, Hide()).Times(1);
+ EXPECT_CALL(*mock_account_screen_, Show()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::LOGIN_CREATE_ACCOUNT);
+
+ EXPECT_EQ(controller()->GetAccountScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_account_screen_, Hide()).Times(1);
+ EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
+ EXPECT_CALL(*mock_login_screen_, Hide()).Times(0); // last transition
+ controller()->OnExit(chromeos::ScreenObserver::ACCOUNT_CREATED);
+
+ EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowLanguageSwitch) {
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
+ EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::LANGUAGE_CHANGED);
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1);
+ EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+ EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::NETWORK_CONNECTED);
+
+ EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+ EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
+ EXPECT_CALL(*mock_network_screen_, Hide()).Times(0); // last transition
+ controller()->OnExit(chromeos::ScreenObserver::UPDATE_NETWORK_ERROR);
+
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) {
+ EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
+ EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
+ EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+ controller()->OnExit(chromeos::ScreenObserver::NETWORK_OFFLINE);
+ EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
+}
+
+COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 12,
+ add_tests_for_new_control_flow_you_just_introduced);