Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / wizard_controller_browsertest.cc
index 2658a42..25f9f44 100644 (file)
@@ -2,28 +2,32 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/chromeos/login/wizard_controller.h"
+
 #include "base/basictypes.h"
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
-#include "base/path_service.h"
 #include "base/prefs/pref_registry_simple.h"
 #include "base/prefs/pref_service.h"
 #include "base/prefs/pref_service_factory.h"
 #include "base/prefs/testing_pref_store.h"
 #include "base/run_loop.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_shutdown.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/base/locale_util.h"
+#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
+#include "chrome/browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h"
 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
 #include "chrome/browser/chromeos/login/existing_user_controller.h"
-#include "chrome/browser/chromeos/login/login_display_host_impl.h"
-#include "chrome/browser/chromeos/login/mock_authenticator.h"
-#include "chrome/browser/chromeos/login/mock_login_status_consumer.h"
+#include "chrome/browser/chromeos/login/screens/device_disabled_screen.h"
 #include "chrome/browser/chromeos/login/screens/error_screen.h"
+#include "chrome/browser/chromeos/login/screens/hid_detection_screen.h"
+#include "chrome/browser/chromeos/login/screens/mock_device_disabled_screen_actor.h"
 #include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
 #include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
 #include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
 #include "chrome/browser/chromeos/login/screens/user_image_screen.h"
 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
 #include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
 #include "chrome/browser/chromeos/login/test_login_utils.h"
-#include "chrome/browser/chromeos/login/webui_login_view.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
-#include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
+#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
+#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
+#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/stub_enterprise_install_attributes.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/timezone/timezone_request.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/test/base/ui_test_utils.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/grit/generated_resources.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/chromeos_test_utils.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/dbus/fake_dbus_thread_manager.h"
 #include "chromeos/dbus/fake_session_manager_client.h"
+#include "chromeos/login/auth/key.h"
+#include "chromeos/login/auth/mock_auth_status_consumer.h"
+#include "chromeos/login/auth/mock_authenticator.h"
+#include "chromeos/login/auth/user_context.h"
+#include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
+#include "chromeos/settings/timezone_settings.h"
+#include "chromeos/system/fake_statistics_provider.h"
+#include "chromeos/system/statistics_provider.h"
+#include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
-#include "grit/generated_resources.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_fetcher_impl.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/icu/source/common/unicode/locid.h"
 #include "ui/base/l10n/l10n_util.h"
 
 using ::testing::Exactly;
+using ::testing::Invoke;
+using ::testing::Mock;
 using ::testing::Return;
 
 namespace chromeos {
 
 namespace {
+
 const char kUsername[] = "test_user@managedchrome.com";
 const char kPassword[] = "test_password";
 
+const char kGeolocationResponseBody[] =
+    "{\n"
+    "  \"location\": {\n"
+    "    \"lat\": 51.0,\n"
+    "    \"lng\": -0.1\n"
+    "  },\n"
+    "  \"accuracy\": 1200.4\n"
+    "}";
+
+// Timezone should not match kGeolocationResponseBody to check that exactly
+// this value will be used.
+const char kTimezoneResponseBody[] =
+    "{\n"
+    "    \"dstOffset\" : 0.0,\n"
+    "    \"rawOffset\" : -32400.0,\n"
+    "    \"status\" : \"OK\",\n"
+    "    \"timeZoneId\" : \"America/Anchorage\",\n"
+    "    \"timeZoneName\" : \"Pacific Standard Time\"\n"
+    "}";
+
+const char kDisabledMessage[] = "This device has been disabled.";
+
 class PrefStoreStub : public TestingPrefStore {
  public:
   // TestingPrefStore overrides:
-  virtual PrefReadError GetReadError() const OVERRIDE {
+  virtual PrefReadError GetReadError() const override {
     return PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE;
   }
 
-  virtual bool IsInitializationComplete() const OVERRIDE {
+  virtual bool IsInitializationComplete() const override {
     return true;
   }
 
@@ -112,9 +155,7 @@ void RunSwitchLanguageTest(const std::string& locale,
   locale_util::SwitchLanguage(locale, true, false, callback.Pass());
 
   // Token writing moves control to BlockingPool and back.
-  base::RunLoop().RunUntilIdle();
-  content::BrowserThread::GetBlockingPool()->FlushForTesting();
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
 
   EXPECT_EQ(data.done, true);
   EXPECT_EQ(data.requested_locale, locale);
@@ -130,13 +171,32 @@ void SetUpCrasAndEnableChromeVox(int volume_percent, bool mute_on) {
   // is disabled.
   cras->SetOutputVolumePercent(volume_percent);
   cras->SetOutputMute(mute_on);
-  a11y->EnableSpokenFeedback(false, ash::A11Y_NOTIFICATION_NONE);
+  a11y->EnableSpokenFeedback(false, ui::A11Y_NOTIFICATION_NONE);
 
   // Spoken feedback is enabled.
-  a11y->EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_NONE);
+  a11y->EnableSpokenFeedback(true, ui::A11Y_NOTIFICATION_NONE);
   base::RunLoop().RunUntilIdle();
 }
 
+void QuitLoopOnAutoEnrollmentProgress(
+    policy::AutoEnrollmentState expected_state,
+    base::RunLoop* loop,
+    policy::AutoEnrollmentState actual_state) {
+  if (expected_state == actual_state)
+    loop->Quit();
+}
+
+void WaitForAutoEnrollmentState(policy::AutoEnrollmentState state) {
+  base::RunLoop loop;
+  AutoEnrollmentController* auto_enrollment_controller =
+      LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
+  scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
+      progress_subscription(
+          auto_enrollment_controller->RegisterProgressCallback(
+              base::Bind(&QuitLoopOnAutoEnrollmentProgress, state, &loop)));
+  loop.Run();
+}
+
 }  // namespace
 
 using ::testing::_;
@@ -147,6 +207,9 @@ class MockOutShowHide : public T {
   template <class P> explicit  MockOutShowHide(P p) : T(p) {}
   template <class P> MockOutShowHide(P p, H* actor)
       : T(p, actor), actor_(actor) {}
+  template <class P, class Q>
+  MockOutShowHide(P p, Q q, H* actor)
+      : T(p, q, actor), actor_(actor) {}
 
   H* actor() const { return actor_.get(); }
 
@@ -157,11 +220,22 @@ class MockOutShowHide : public T {
   scoped_ptr<H> actor_;
 };
 
-#define MOCK(mock_var, screen_name, mocked_class, actor_class)                 \
-  mock_var = new MockOutShowHide<mocked_class, actor_class>(                   \
-      WizardController::default_controller(), new actor_class);                \
-  WizardController::default_controller()->screen_name.reset(mock_var);         \
-  EXPECT_CALL(*mock_var, Show()).Times(0);                                     \
+#define MOCK(mock_var, screen_name, mocked_class, actor_class)               \
+  mock_var = new MockOutShowHide<mocked_class, actor_class>(                 \
+      WizardController::default_controller(), new actor_class);              \
+  WizardController::default_controller()                                     \
+      ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
+  EXPECT_CALL(*mock_var, Show()).Times(0);                                   \
+  EXPECT_CALL(*mock_var, Hide()).Times(0);
+
+#define MOCK_WITH_DELEGATE(mock_var, screen_name, mocked_class, actor_class) \
+  mock_var = new MockOutShowHide<mocked_class, actor_class>(                 \
+      WizardController::default_controller(),                                \
+      WizardController::default_controller(),                                \
+      new actor_class);                                                      \
+  WizardController::default_controller()                                     \
+      ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
+  EXPECT_CALL(*mock_var, Show()).Times(0);                                   \
   EXPECT_CALL(*mock_var, Hide()).Times(0);
 
 class WizardControllerTest : public WizardInProcessBrowserTest {
@@ -170,12 +244,56 @@ class WizardControllerTest : public WizardInProcessBrowserTest {
       WizardController::kTestNoScreenName) {}
   virtual ~WizardControllerTest() {}
 
-  virtual void SetUpOnMainThread() OVERRIDE {
+  virtual void SetUpOnMainThread() override {
     AccessibilityManager::Get()->
         SetProfileForTest(ProfileHelper::GetSigninProfile());
     WizardInProcessBrowserTest::SetUpOnMainThread();
   }
 
+  ErrorScreen* GetErrorScreen() {
+    return static_cast<BaseScreenDelegate*>(
+               WizardController::default_controller())->GetErrorScreen();
+  }
+
+  content::WebContents* GetWebContents() {
+    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
+        LoginDisplayHostImpl::default_host());
+    if (!host)
+      return NULL;
+    WebUILoginView* webui_login_view = host->GetWebUILoginView();
+    if (!webui_login_view)
+      return NULL;
+    return webui_login_view->GetWebContents();
+  }
+
+  void WaitUntilJSIsReady() {
+    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
+        LoginDisplayHostImpl::default_host());
+    if (!host)
+      return;
+    chromeos::OobeUI* oobe_ui = host->GetOobeUI();
+    if (!oobe_ui)
+      return;
+    base::RunLoop run_loop;
+    const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
+    if (!oobe_ui_ready)
+      run_loop.Run();
+  }
+
+  bool JSExecuteBooleanExpression(const std::string& expression) {
+    bool result;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+        GetWebContents(),
+        "window.domAutomationController.send(!!(" + expression + "));",
+        &result));
+    return result;
+  }
+
+  void CheckCurrentScreen(const std::string& screen_name) {
+    EXPECT_EQ(WizardController::default_controller()->GetScreen(screen_name),
+              WizardController::default_controller()->current_screen());
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
 };
@@ -189,15 +307,15 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
   EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale());
   EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage());
   EXPECT_FALSE(base::i18n::IsRTL());
-  const std::wstring en_str =
-      base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
+  const base::string16 en_str =
+      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
 
   RunSwitchLanguageTest("fr", "fr", true);
   EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
   EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
   EXPECT_FALSE(base::i18n::IsRTL());
-  const std::wstring fr_str =
-      base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
+  const base::string16 fr_str =
+      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
 
   EXPECT_NE(en_str, fr_str);
 
@@ -205,8 +323,8 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
   EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
   EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
   EXPECT_TRUE(base::i18n::IsRTL());
-  const std::wstring ar_str =
-      base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
+  const base::string16 ar_str =
+      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
 
   EXPECT_NE(fr_str, ar_str);
 }
@@ -240,135 +358,289 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
             cras->GetOutputVolumePercent());
 }
 
+class WizardControllerTestURLFetcherFactory
+    : public net::TestURLFetcherFactory {
+ public:
+  virtual net::URLFetcher* CreateURLFetcher(
+      int id,
+      const GURL& url,
+      net::URLFetcher::RequestType request_type,
+      net::URLFetcherDelegate* d) override {
+    if (StartsWithASCII(
+            url.spec(),
+            SimpleGeolocationProvider::DefaultGeolocationProviderURL().spec(),
+            true)) {
+      return new net::FakeURLFetcher(url,
+                                     d,
+                                     std::string(kGeolocationResponseBody),
+                                     net::HTTP_OK,
+                                     net::URLRequestStatus::SUCCESS);
+    }
+    if (StartsWithASCII(url.spec(),
+                        chromeos::DefaultTimezoneProviderURL().spec(),
+                        true)) {
+      return new net::FakeURLFetcher(url,
+                                     d,
+                                     std::string(kTimezoneResponseBody),
+                                     net::HTTP_OK,
+                                     net::URLRequestStatus::SUCCESS);
+    }
+    return net::TestURLFetcherFactory::CreateURLFetcher(
+        id, url, request_type, d);
+  }
+  virtual ~WizardControllerTestURLFetcherFactory() {}
+};
+
+class TimeZoneTestRunner {
+ public:
+  void OnResolved() { loop_.Quit(); }
+  void Run() { loop_.Run(); }
+
+ private:
+  base::RunLoop loop_;
+};
+
 class WizardControllerFlowTest : public WizardControllerTest {
  protected:
   WizardControllerFlowTest() {}
   // Overriden from InProcessBrowserTest:
-  virtual void SetUpOnMainThread() OVERRIDE {
+  virtual void SetUpOnMainThread() override {
     WizardControllerTest::SetUpOnMainThread();
 
     // Make sure that OOBE is run as an "official" build.
-    WizardController::default_controller()->is_official_build_ = true;
+    WizardController* wizard_controller =
+        WizardController::default_controller();
+    wizard_controller->is_official_build_ = true;
 
     // Clear portal list (as it is by default in OOBE).
     NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
 
     // Set up the mocks for all screens.
-    MOCK(mock_network_screen_, network_screen_,
-         MockNetworkScreen, MockNetworkScreenActor);
-    MOCK(mock_update_screen_, update_screen_,
-         MockUpdateScreen, MockUpdateScreenActor);
-    MOCK(mock_eula_screen_, eula_screen_, MockEulaScreen, MockEulaScreenActor);
-    MOCK(mock_enrollment_screen_, enrollment_screen_,
-         MockEnrollmentScreen, MockEnrollmentScreenActor);
+    MOCK(mock_network_screen_,
+         kNetworkScreenName,
+         MockNetworkScreen,
+         MockNetworkScreenActor);
+    MOCK(mock_update_screen_,
+         kUpdateScreenName,
+         MockUpdateScreen,
+         MockUpdateScreenActor);
+    MOCK_WITH_DELEGATE(mock_eula_screen_,
+                       kEulaScreenName,
+                       MockEulaScreen,
+                       MockEulaScreenActor);
+    MOCK(mock_enrollment_screen_,
+         kEnrollmentScreenName,
+         MockEnrollmentScreen,
+         MockEnrollmentScreenActor);
+    MOCK(mock_auto_enrollment_check_screen_,
+         kAutoEnrollmentCheckScreenName,
+         MockAutoEnrollmentCheckScreen,
+         MockAutoEnrollmentCheckScreenActor);
+    device_disabled_screen_actor_.reset(new MockDeviceDisabledScreenActor);
+    wizard_controller->screens_[WizardController::kDeviceDisabledScreenName] =
+        make_linked_ptr(new DeviceDisabledScreen(
+            wizard_controller,
+            device_disabled_screen_actor_.get()));
+    EXPECT_CALL(*device_disabled_screen_actor_, Show()).Times(0);
 
     // Switch to the initial screen.
-    EXPECT_EQ(NULL, WizardController::default_controller()->current_screen());
+    EXPECT_EQ(NULL, wizard_controller->current_screen());
     EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
-    WizardController::default_controller()->AdvanceToScreen(
-        WizardController::kNetworkScreenName);
+    wizard_controller->AdvanceToScreen(WizardController::kNetworkScreenName);
   }
 
-  void OnExit(ScreenObserver::ExitCodes exit_code) {
+  void TearDownOnMainThread() override {
+    device_disabled_screen_actor_.reset();
+    WizardControllerTest::TearDownOnMainThread();
+  }
+
+  virtual void TearDown() {
+    if (fallback_fetcher_factory_) {
+      fetcher_factory_.reset();
+      net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get());
+      fallback_fetcher_factory_.reset();
+    }
+  }
+
+  void InitTimezoneResolver() {
+    fallback_fetcher_factory_.reset(new WizardControllerTestURLFetcherFactory);
+    net::URLFetcherImpl::set_factory(NULL);
+    fetcher_factory_.reset(
+        new net::FakeURLFetcherFactory(fallback_fetcher_factory_.get()));
+
+    network_portal_detector_ = new NetworkPortalDetectorTestImpl();
+    NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
+
+    NetworkPortalDetector::CaptivePortalState online_state;
+    online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
+    online_state.response_code = 204;
+
+    // Default detworks happens to be usually "eth1" in tests.
+    const NetworkState* default_network =
+        NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
+
+    network_portal_detector_->SetDefaultNetworkForTesting(
+        default_network->guid());
+    network_portal_detector_->SetDetectionResultsForTesting(
+        default_network->guid(),
+        online_state);
+  }
+
+  void OnExit(BaseScreenDelegate::ExitCodes exit_code) {
     WizardController::default_controller()->OnExit(exit_code);
   }
 
+  chromeos::SimpleGeolocationProvider* GetGeolocationProvider() {
+    return WizardController::default_controller()->geolocation_provider_.get();
+  }
+
+  void WaitUntilTimezoneResolved() {
+    scoped_ptr<TimeZoneTestRunner> runner(new TimeZoneTestRunner);
+    if (!WizardController::default_controller()
+             ->SetOnTimeZoneResolvedForTesting(
+                 base::Bind(&TimeZoneTestRunner::OnResolved,
+                            base::Unretained(runner.get()))))
+      return;
+
+    runner->Run();
+  }
+
+  void ResetAutoEnrollmentCheckScreen() {
+    WizardController::default_controller()->screens_.erase(
+        WizardController::kAutoEnrollmentCheckScreenName);
+  }
+
   MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
       mock_network_screen_;
   MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
   MockOutShowHide<MockEulaScreen, MockEulaScreenActor>* mock_eula_screen_;
   MockOutShowHide<MockEnrollmentScreen,
       MockEnrollmentScreenActor>* mock_enrollment_screen_;
+  MockOutShowHide<MockAutoEnrollmentCheckScreen,
+      MockAutoEnrollmentCheckScreenActor>* mock_auto_enrollment_check_screen_;
+  scoped_ptr<MockDeviceDisabledScreenActor> device_disabled_screen_actor_;
 
  private:
+  NetworkPortalDetectorTestImpl* network_portal_detector_;
+
+  // Use a test factory as a fallback so we don't have to deal with other
+  // requests.
+  scoped_ptr<WizardControllerTestURLFetcherFactory> fallback_fetcher_factory_;
+  scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
 };
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
   EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
+
+  WaitUntilJSIsReady();
+
+  // Check visibility of the header bar.
+  ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
+
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
+
+  CheckCurrentScreen(WizardController::kEulaScreenName);
+
+  // Header bar should still be visible.
+  ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::EULA_ACCEPTED);
+  // Enable TimeZone resolve
+  InitTimezoneResolver();
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+  EXPECT_TRUE(GetGeolocationProvider());
+
   // Let update screen smooth time process (time = 0ms).
   content::RunAllPendingInMessageLoop();
 
-  EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
-            WizardController::default_controller()->current_screen());
-  EXPECT_CALL(*mock_update_screen_, Hide()).Times(0);
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
+  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
-  OnExit(ScreenObserver::UPDATE_INSTALLED);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
 
   EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
   EXPECT_EQ("ethernet,wifi,cellular",
             NetworkHandler::Get()->network_state_handler()
             ->GetCheckPortalListForTest());
+
+  WaitUntilTimezoneResolved();
+  EXPECT_EQ("America/Anchorage",
+            base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
+                                  ->GetCurrentTimezoneID()));
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEulaScreenName);
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::EULA_ACCEPTED);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
   // Let update screen smooth time process (time = 0ms).
   content::RunAllPendingInMessageLoop();
 
-  EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
-            WizardController::default_controller()->current_screen());
-  EXPECT_CALL(*mock_update_screen_, Hide()).Times(0);
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
+  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_ERROR_UPDATING);
+
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
-  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(0);  // last transition
-  OnExit(ScreenObserver::UPDATE_ERROR_UPDATING);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
 
   EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEulaScreenName);
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
   WizardController::default_controller()->SkipUpdateEnrollAfterEula();
   EXPECT_CALL(*mock_enrollment_screen_->actor(),
               SetParameters(mock_enrollment_screen_,
-                            false,  // is_auto_enrollment
-                            true,   // can_exit_enrollment
+                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
                             ""))
       .Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+  content::RunAllPendingInMessageLoop();
+
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(0);
-  OnExit(ScreenObserver::EULA_ACCEPTED);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
   content::RunAllPendingInMessageLoop();
 
-  EXPECT_EQ(WizardController::default_controller()->GetEnrollmentScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
   EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
   EXPECT_EQ("ethernet,wifi,cellular",
             NetworkHandler::Get()->network_state_handler()
@@ -376,33 +648,28 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEulaScreenName);
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(0);  // last transition
-  OnExit(ScreenObserver::EULA_BACK);
+  OnExit(BaseScreenDelegate::EULA_BACK);
 
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
                        ControlFlowEnrollmentCompleted) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
   EXPECT_CALL(*mock_enrollment_screen_->actor(),
               SetParameters(mock_enrollment_screen_,
-                            false,  // is_auto_enrollment
-                            true,   // can_exit_enrollment
+                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
                             ""))
       .Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
@@ -410,10 +677,8 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
 
   WizardController::default_controller()->AdvanceToScreen(
       WizardController::kEnrollmentScreenName);
-  EnrollmentScreen* screen =
-      WizardController::default_controller()->GetEnrollmentScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
-  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
+  OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
 
   EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
 }
@@ -421,12 +686,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
                        ControlFlowAutoEnrollmentCompleted) {
   WizardController::default_controller()->SkipPostLoginScreensForTesting();
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
 
-  LoginUtils::Set(new TestLoginUtils(kUsername, kPassword));
-  MockConsumer mock_consumer;
+  UserContext user_context(kUsername);
+  user_context.SetKey(Key(kPassword));
+  user_context.SetUserIDHash(user_context.GetUserID());
+  LoginUtils::Set(new TestLoginUtils(user_context));
+  MockAuthStatusConsumer mock_consumer;
 
   // Must have a pending signin to resume after auto-enrollment:
   LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
@@ -436,58 +703,214 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
       &mock_consumer);
   // This calls StartWizard, destroying the current controller() and its mocks;
   // don't set expectations on those objects.
-  ExistingUserController::current_controller()->CompleteLogin(
-      UserContext(kUsername, kPassword, ""));
+  ExistingUserController::current_controller()->CompleteLogin(user_context);
   // Run the tasks posted to complete the login:
   base::MessageLoop::current()->RunUntilIdle();
 
-  EnrollmentScreen* screen =
-      WizardController::default_controller()->GetEnrollmentScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
   // This is the main expectation: after auto-enrollment, login is resumed.
-  EXPECT_CALL(mock_consumer, OnLoginSuccess(_)).Times(1);
-  OnExit(ScreenObserver::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
+  EXPECT_CALL(mock_consumer, OnAuthSuccess(_)).Times(1);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
   // Prevent browser launch when the profile is prepared:
   browser_shutdown::SetTryingToQuit(true);
   // Run the tasks posted to complete the login:
   base::MessageLoop::current()->RunUntilIdle();
 }
 
-IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowResetScreen) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
+                       ControlFlowWrongHWIDScreenFromLogin) {
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
 
   LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
   EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
-  ExistingUserController::current_controller()->OnStartDeviceReset();
+  ExistingUserController::current_controller()->ShowWrongHWIDScreen();
 
-  ResetScreen* screen =
-      WizardController::default_controller()->GetResetScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kWrongHWIDScreenName);
 
-  // After reset screen is canceled, it returns to sign-in screen.
+  // After warning is skipped, user returns to sign-in screen.
   // And this destroys WizardController.
-  OnExit(ScreenObserver::RESET_CANCELED);
+  OnExit(BaseScreenDelegate::WRONG_HWID_WARNING_SKIPPED);
   EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
 }
 
-IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
-                       ControlFlowWrongHWIDScreenFromLogin) {
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
+class WizardControllerDeviceStateTest : public WizardControllerFlowTest {
+ protected:
+  WizardControllerDeviceStateTest()
+      : install_attributes_(std::string(),
+                            std::string(),
+                            std::string(),
+                            policy::DEVICE_MODE_NOT_SET) {
+    fake_statistics_provider_.SetMachineStatistic("serial_number", "test");
+    fake_statistics_provider_.SetMachineStatistic(system::kActivateDateKey,
+                                                  "2000-01");
+  }
+
+  virtual void SetUpCommandLine(CommandLine* command_line) override {
+    WizardControllerFlowTest::SetUpCommandLine(command_line);
+
+    command_line->AppendSwitchASCII(
+        switches::kEnterpriseEnableForcedReEnrollment,
+        chromeos::AutoEnrollmentController::kForcedReEnrollmentAlways);
+    command_line->AppendSwitchASCII(
+        switches::kEnterpriseEnrollmentInitialModulus, "1");
+    command_line->AppendSwitchASCII(
+        switches::kEnterpriseEnrollmentModulusLimit, "2");
+  }
+
+  system::ScopedFakeStatisticsProvider fake_statistics_provider_;
+
+ private:
+  policy::ScopedStubEnterpriseInstallAttributes install_attributes_;
+
+  DISALLOW_COPY_AND_ASSIGN(WizardControllerDeviceStateTest);
+};
+
+IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
+                       ControlFlowForcedReEnrollment) {
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
+  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
+
+  CheckCurrentScreen(WizardController::kEulaScreenName);
+  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
+  // Let update screen smooth time process (time = 0ms).
+  content::RunAllPendingInMessageLoop();
+
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
+  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  AutoEnrollmentCheckScreen* screen =
+      AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
+  EXPECT_EQ(screen,
             WizardController::default_controller()->current_screen());
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
+  screen->Start();
 
-  LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
-  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
-  ExistingUserController::current_controller()->ShowWrongHWIDScreen();
+  // Wait for auto-enrollment controller to encounter the connection error.
+  WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
 
-  WrongHWIDScreen* screen =
-      WizardController::default_controller()->GetWrongHWIDScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
+  // The error screen shows up if there's no auto-enrollment decision.
+  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
+  EXPECT_EQ(GetErrorScreen(),
+            WizardController::default_controller()->current_screen());
+  base::DictionaryValue device_state;
+  device_state.SetString(policy::kDeviceStateRestoreMode,
+                         policy::kDeviceStateRestoreModeReEnrollmentEnforced);
+  g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
+                                        device_state);
+  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
+  EXPECT_CALL(*mock_enrollment_screen_->actor(),
+              SetParameters(mock_enrollment_screen_,
+                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
+                            "")).Times(1);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
 
-  // After warning is skipped, user returns to sign-in screen.
-  // And this destroys WizardController.
-  OnExit(ScreenObserver::WRONG_HWID_WARNING_SKIPPED);
-  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
+  ResetAutoEnrollmentCheckScreen();
+
+  // Make sure enterprise enrollment page shows up.
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
+  OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
+
+  EXPECT_TRUE(StartupUtils::IsOobeCompleted());
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
+                       ControlFlowNoForcedReEnrollmentOnFirstBoot) {
+  fake_statistics_provider_.ClearMachineStatistic(system::kActivateDateKey);
+  EXPECT_NE(policy::AUTO_ENROLLMENT_STATE_NO_ENROLLMENT,
+            LoginDisplayHostImpl::default_host()
+                ->GetAutoEnrollmentController()
+                ->state());
+
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
+  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
+
+  CheckCurrentScreen(WizardController::kEulaScreenName);
+  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
+  // Let update screen smooth time process (time = 0ms).
+  content::RunAllPendingInMessageLoop();
+
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
+  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  AutoEnrollmentCheckScreen* screen =
+      AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
+  EXPECT_EQ(screen,
+            WizardController::default_controller()->current_screen());
+  screen->Start();
+  EXPECT_EQ(policy::AUTO_ENROLLMENT_STATE_NO_ENROLLMENT,
+            LoginDisplayHostImpl::default_host()
+                ->GetAutoEnrollmentController()
+                ->state());
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
+                       ControlFlowDeviceDisabled) {
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
+  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
+
+  CheckCurrentScreen(WizardController::kEulaScreenName);
+  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
+  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
+  // Let update screen smooth time process (time = 0ms).
+  content::RunAllPendingInMessageLoop();
+
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
+  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  AutoEnrollmentCheckScreen* screen =
+      AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
+  EXPECT_EQ(screen,
+            WizardController::default_controller()->current_screen());
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
+  screen->Start();
+
+  // Wait for auto-enrollment controller to encounter the connection error.
+  WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
+
+  // The error screen shows up if device state could not be retrieved.
+  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
+  EXPECT_EQ(GetErrorScreen(),
+            WizardController::default_controller()->current_screen());
+  base::DictionaryValue device_state;
+  device_state.SetString(policy::kDeviceStateRestoreMode,
+                         policy::kDeviceStateRestoreModeDisabled);
+  device_state.SetString(policy::kDeviceStateDisabledMessage, kDisabledMessage);
+  g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
+                                        device_state);
+  EXPECT_CALL(*device_disabled_screen_actor_,
+              UpdateMessage(kDisabledMessage)).Times(1);
+  EXPECT_CALL(*device_disabled_screen_actor_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
+
+  ResetAutoEnrollmentCheckScreen();
+
+  // Make sure the device disabled screen is shown.
+  CheckCurrentScreen(WizardController::kDeviceDisabledScreenName);
+
+  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
 }
 
 class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
@@ -498,19 +921,15 @@ class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
 
   virtual ~WizardControllerBrokenLocalStateTest() {}
 
-  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
+  virtual void SetUpInProcessBrowserTestFixture() override {
     WizardControllerTest::SetUpInProcessBrowserTestFixture();
 
-    FakeDBusThreadManager* fake_dbus_thread_manager =
-        new FakeDBusThreadManager();
-    fake_dbus_thread_manager->SetFakeClients();
     fake_session_manager_client_ = new FakeSessionManagerClient;
-    fake_dbus_thread_manager->SetSessionManagerClient(
+    DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient(
         scoped_ptr<SessionManagerClient>(fake_session_manager_client_));
-    DBusThreadManager::SetInstanceForTesting(fake_dbus_thread_manager);
   }
 
-  virtual void SetUpOnMainThread() OVERRIDE {
+  virtual void SetUpOnMainThread() override {
     base::PrefServiceFactory factory;
     factory.set_user_prefs(make_scoped_refptr(new PrefStoreStub()));
     local_state_ = factory.Create(new PrefRegistrySimple()).Pass();
@@ -522,49 +941,6 @@ class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
     WizardController::default_controller()->is_official_build_ = true;
   }
 
-  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
-    WizardControllerTest::TearDownInProcessBrowserTestFixture();
-  }
-
-  ErrorScreen* GetErrorScreen() {
-    return ((ScreenObserver*) WizardController::default_controller())->
-        GetErrorScreen();
-  }
-
-  content::WebContents* GetWebContents() {
-    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
-        LoginDisplayHostImpl::default_host());
-    if (!host)
-      return NULL;
-    WebUILoginView* webui_login_view = host->GetWebUILoginView();
-    if (!webui_login_view)
-      return NULL;
-    return webui_login_view->GetWebContents();
-  }
-
-  void WaitUntilJSIsReady() {
-    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
-        LoginDisplayHostImpl::default_host());
-    if (!host)
-      return;
-    chromeos::OobeUI* oobe_ui = host->GetOobeUI();
-    if (!oobe_ui)
-      return;
-    base::RunLoop run_loop;
-    const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
-    if (!oobe_ui_ready)
-      run_loop.Run();
-  }
-
-  bool JSExecuteBooleanExpression(const std::string& expression) {
-    bool result;
-    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-        GetWebContents(),
-        "window.domAutomationController.send(!!(" + expression + "));",
-        &result));
-    return result;
-  }
-
   FakeSessionManagerClient* fake_session_manager_client() const {
     return fake_session_manager_client_;
   }
@@ -612,18 +988,18 @@ class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
   virtual ~WizardControllerProxyAuthOnSigninTest() {}
 
   // Overridden from WizardControllerTest:
-  virtual void SetUp() OVERRIDE {
+  virtual void SetUp() override {
     ASSERT_TRUE(proxy_server_.Start());
     WizardControllerTest::SetUp();
   }
 
-  virtual void SetUpOnMainThread() OVERRIDE {
+  virtual void SetUpOnMainThread() override {
     WizardControllerTest::SetUpOnMainThread();
     WizardController::default_controller()->AdvanceToScreen(
         WizardController::kNetworkScreenName);
   }
 
-  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
+  virtual void SetUpCommandLine(CommandLine* command_line) override {
     command_line->AppendSwitchASCII(::switches::kProxyServer,
                                     proxy_server_.host_port_pair().ToString());
   }
@@ -636,15 +1012,13 @@ class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
   DISALLOW_COPY_AND_ASSIGN(WizardControllerProxyAuthOnSigninTest);
 };
 
-// Broken after turning on SAML. http://crbug.com/338087
 IN_PROC_BROWSER_TEST_F(WizardControllerProxyAuthOnSigninTest,
-                       DISABLED_ProxyAuthDialogOnSigninScreen) {
+                       ProxyAuthDialogOnSigninScreen) {
   content::WindowedNotificationObserver auth_needed_waiter(
       chrome::NOTIFICATION_AUTH_NEEDED,
       content::NotificationService::AllSources());
 
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
 
   LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
   auth_needed_waiter.Wait();
@@ -655,7 +1029,7 @@ class WizardControllerKioskFlowTest : public WizardControllerFlowTest {
   WizardControllerKioskFlowTest() {}
 
   // Overridden from InProcessBrowserTest:
-  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
+  virtual void SetUpCommandLine(CommandLine* command_line) override {
     base::FilePath test_data_dir;
     ASSERT_TRUE(chromeos::test_utils::GetTestDataPath(
                     "app_mode", "kiosk_manifest", &test_data_dir));
@@ -672,40 +1046,40 @@ IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
                        ControlFlowKioskForcedEnrollment) {
   EXPECT_CALL(*mock_enrollment_screen_->actor(),
               SetParameters(mock_enrollment_screen_,
-                            false,  // is_auto_enrollment
-                            false,  // can_exit_enrollment
+                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
                             ""))
       .Times(1);
 
   EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEulaScreenName);
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::EULA_ACCEPTED);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
   // Let update screen smooth time process (time = 0ms).
   content::RunAllPendingInMessageLoop();
 
-  EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
   EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::UPDATE_INSTALLED);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
 
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
 
   // Make sure enterprise enrollment page shows up right after update screen.
-  EnrollmentScreen* screen =
-      WizardController::default_controller()->GetEnrollmentScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
-  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
+  OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
 
   EXPECT_TRUE(StartupUtils::IsOobeCompleted());
 }
@@ -713,56 +1087,125 @@ IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
 
 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
                        ControlFlowEnrollmentBack) {
-
   EXPECT_CALL(*mock_enrollment_screen_->actor(),
               SetParameters(mock_enrollment_screen_,
-                            false,  // is_auto_enrollment
-                            false,  // can_exit_enrollment
+                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
                             ""))
       .Times(1);
 
   EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
-  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::NETWORK_CONNECTED);
+  OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
 
-  EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kEulaScreenName);
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
-  OnExit(ScreenObserver::EULA_ACCEPTED);
+  OnExit(BaseScreenDelegate::EULA_ACCEPTED);
+
   // Let update screen smooth time process (time = 0ms).
   content::RunAllPendingInMessageLoop();
 
-  EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kUpdateScreenName);
   EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
+
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
   EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(1);
-  OnExit(ScreenObserver::UPDATE_INSTALLED);
+  OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
 
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
 
   // Make sure enterprise enrollment page shows up right after update screen.
-  EnrollmentScreen* screen =
-      WizardController::default_controller()->GetEnrollmentScreen();
-  EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
-  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_BACK);
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
+  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
+  OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_BACK);
 
-  EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
-            WizardController::default_controller()->current_screen());
+  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
 }
 
+class WizardControllerOobeResumeTest : public WizardControllerTest {
+ protected:
+  WizardControllerOobeResumeTest() {}
+  // Overriden from InProcessBrowserTest:
+  virtual void SetUpOnMainThread() override {
+    WizardControllerTest::SetUpOnMainThread();
+
+    // Make sure that OOBE is run as an "official" build.
+    WizardController::default_controller()->is_official_build_ = true;
+
+    // Clear portal list (as it is by default in OOBE).
+    NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
+
+    // Set up the mocks for all screens.
+    MOCK(mock_network_screen_,
+         kNetworkScreenName,
+         MockNetworkScreen,
+         MockNetworkScreenActor);
+    MOCK(mock_enrollment_screen_,
+         kEnrollmentScreenName,
+         MockEnrollmentScreen,
+         MockEnrollmentScreenActor);
+  }
+
+  void OnExit(BaseScreenDelegate::ExitCodes exit_code) {
+    WizardController::default_controller()->OnExit(exit_code);
+  }
+
+  std::string GetFirstScreenName() {
+    return WizardController::default_controller()->first_screen_name();
+  }
+
+  MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
+      mock_network_screen_;
+  MockOutShowHide<MockEnrollmentScreen,
+      MockEnrollmentScreenActor>* mock_enrollment_screen_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WizardControllerOobeResumeTest);
+};
+
+IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
+                       PRE_ControlFlowResumeInterruptedOobe) {
+  // Switch to the initial screen.
+  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
+  WizardController::default_controller()->AdvanceToScreen(
+      WizardController::kNetworkScreenName);
+  CheckCurrentScreen(WizardController::kNetworkScreenName);
+  EXPECT_CALL(*mock_enrollment_screen_->actor(),
+              SetParameters(mock_enrollment_screen_,
+                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
+                            "")).Times(1);
+  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
+  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
+
+  WizardController::default_controller()->AdvanceToScreen(
+      WizardController::kEnrollmentScreenName);
+  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
+}
+
+IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
+                       ControlFlowResumeInterruptedOobe) {
+  EXPECT_EQ(WizardController::kEnrollmentScreenName, GetFirstScreenName());
+}
+
 // TODO(dzhioev): Add test emaulating device with wrong HWID.
 
 // TODO(nkostylev): Add test for WebUI accelerators http://crosbug.com/22571
 
-COMPILE_ASSERT(ScreenObserver::EXIT_CODES_COUNT == 19,
+// TODO(merkulova): Add tests for bluetooth HID detection screen variations when
+// UI and logic is ready. http://crbug.com/127016
+
+// TODO(dzhioev): Add tests for controller/host pairing flow.
+// http://crbug.com/375191
+
+COMPILE_ASSERT(BaseScreenDelegate::EXIT_CODES_COUNT == 23,
                add_tests_for_new_control_flow_you_just_introduced);
 
 }  // namespace chromeos