diff options
author | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-31 18:14:19 +0000 |
---|---|---|
committer | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-31 18:14:19 +0000 |
commit | f8e1bb408219c65b5ce42099fbd81b0a7e91be24 (patch) | |
tree | c5d4f4238dd9b84265c6f9e41091d72a69ddfb7e /chrome/browser/chromeos/login | |
parent | d63109949c8c665f8235fa100e1c43b6a5ebdfef (diff) | |
download | chromium_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')
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); |