15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/wizard_controller.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/basictypes.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/compiler_specific.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/pref_service.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/prefs/pref_service_factory.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/testing_pref_store.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/run_loop.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/base/locale_util.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/existing_user_controller.h"
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/error_screen.h"
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/chromeos/login/screens/hid_detection_screen.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/network_screen.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/reset_screen.h"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/user_image_screen.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/test_login_utils.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/timezone/timezone_request.h"
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/pref_names.h"
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h"
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
55a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_test_utils.h"
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/dbus/fake_session_manager_client.h"
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/key.h"
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/mock_auth_status_consumer.h"
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/mock_authenticator.h"
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/user_context.h"
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/network/network_state.h"
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/settings/timezone_settings.h"
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/test_utils.h"
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_fetcher_impl.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/locid.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using ::testing::Exactly;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing ::testing::Invoke;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using ::testing::Return;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsername[] = "test_user@managedchrome.com";
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPassword[] = "test_password";
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kGeolocationResponseBody[] =
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "{\n"
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  \"location\": {\n"
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"lat\": 51.0,\n"
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"lng\": -0.1\n"
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  },\n"
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  \"accuracy\": 1200.4\n"
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "}";
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Timezone should not match kGeolocationResponseBody to check that exactly
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// this value will be used.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kTimezoneResponseBody[] =
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "{\n"
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"dstOffset\" : 0.0,\n"
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"rawOffset\" : -32400.0,\n"
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"status\" : \"OK\",\n"
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"timeZoneId\" : \"America/Anchorage\",\n"
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "    \"timeZoneName\" : \"Pacific Standard Time\"\n"
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "}";
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PrefStoreStub : public TestingPrefStore {
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TestingPrefStore overrides:
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PrefReadError GetReadError() const OVERRIDE {
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE;
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool IsInitializationComplete() const OVERRIDE {
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return true;
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~PrefStoreStub() {}
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct SwitchLanguageTestData {
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SwitchLanguageTestData() : success(false), done(false) {}
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string requested_locale;
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string loaded_locale;
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool success;
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool done;
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void OnLocaleSwitched(SwitchLanguageTestData* self,
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const std::string& locale,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const std::string& loaded_locale,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const bool success) {
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  self->requested_locale = locale;
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  self->loaded_locale = loaded_locale;
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  self->success = success;
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  self->done = true;
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RunSwitchLanguageTest(const std::string& locale,
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  const std::string& expected_locale,
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  const bool expect_success) {
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SwitchLanguageTestData data;
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<locale_util::SwitchLanguageCallback> callback(
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new locale_util::SwitchLanguageCallback(
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::Bind(&OnLocaleSwitched, base::Unretained(&data))));
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  locale_util::SwitchLanguage(locale, true, false, callback.Pass());
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Token writing moves control to BlockingPool and back.
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RunAllBlockingPoolTasksUntilIdle();
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(data.done, true);
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(data.requested_locale, locale);
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(data.loaded_locale, expected_locale);
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(data.success, expect_success);
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetUpCrasAndEnableChromeVox(int volume_percent, bool mute_on) {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccessibilityManager* a11y = AccessibilityManager::Get();
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrasAudioHandler* cras = CrasAudioHandler::Get();
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Audio output is at |volume_percent| and |mute_on|. Spoken feedback
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is disabled.
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cras->SetOutputVolumePercent(volume_percent);
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cras->SetOutputMute(mute_on);
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  a11y->EnableSpokenFeedback(false, ash::A11Y_NOTIFICATION_NONE);
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Spoken feedback is enabled.
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  a11y->EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_NONE);
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid QuitLoopOnAutoEnrollmentProgress(
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    policy::AutoEnrollmentState expected_state,
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::RunLoop* loop,
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    policy::AutoEnrollmentState actual_state) {
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (expected_state == actual_state)
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    loop->Quit();
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WaitForAutoEnrollmentState(policy::AutoEnrollmentState state) {
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::RunLoop loop;
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AutoEnrollmentController* auto_enrollment_controller =
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      progress_subscription(
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          auto_enrollment_controller->RegisterProgressCallback(
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              base::Bind(&QuitLoopOnAutoEnrollmentProgress, state, &loop)));
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  loop.Run();
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T, class H>
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockOutShowHide : public T {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class P> explicit  MockOutShowHide(P p) : T(p) {}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class P> MockOutShowHide(P p, H* actor)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : T(p, actor), actor_(actor) {}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  H* actor() const { return actor_.get(); }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Show, void());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Hide, void());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<H> actor_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MOCK(mock_var, screen_name, mocked_class, actor_class)               \
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mock_var = new MockOutShowHide<mocked_class, actor_class>(                 \
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WizardController::default_controller(), new actor_class);              \
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WizardController::default_controller()                                     \
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_var, Show()).Times(0);                                   \
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_var, Hide()).Times(0);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WizardControllerTest : public WizardInProcessBrowserTest {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardControllerTest() : WizardInProcessBrowserTest(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WizardController::kTestNoScreenName) {}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WizardControllerTest() {}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AccessibilityManager::Get()->
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SetProfileForTest(ProfileHelper::GetSigninProfile());
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WizardInProcessBrowserTest::SetUpOnMainThread();
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ErrorScreen* GetErrorScreen() {
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return static_cast<ScreenObserver*>(WizardController::default_controller())
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        ->GetErrorScreen();
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  content::WebContents* GetWebContents() {
2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        LoginDisplayHostImpl::default_host());
2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!host)
2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return NULL;
2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WebUILoginView* webui_login_view = host->GetWebUILoginView();
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!webui_login_view)
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return NULL;
2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return webui_login_view->GetWebContents();
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void WaitUntilJSIsReady() {
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        LoginDisplayHostImpl::default_host());
2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!host)
2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return;
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    chromeos::OobeUI* oobe_ui = host->GetOobeUI();
2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!oobe_ui)
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return;
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop run_loop;
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!oobe_ui_ready)
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      run_loop.Run();
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool JSExecuteBooleanExpression(const std::string& expression) {
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool result;
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        GetWebContents(),
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "window.domAutomationController.send(!!(" + expression + "));",
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        &result));
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return result;
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CheckCurrentScreen(const std::string& screen_name) {
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(WizardController::default_controller()->GetScreen(screen_name),
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              WizardController::default_controller()->current_screen());
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WizardController::default_controller() != NULL);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardController::default_controller()->AdvanceToScreen(
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WizardController::kNetworkScreenName);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checking the default locale. Provided that the profile is cleared in SetUp.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(base::i18n::IsRTL());
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16 en_str =
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunSwitchLanguageTest("fr", "fr", true);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(base::i18n::IsRTL());
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16 fr_str =
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(en_str, fr_str);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunSwitchLanguageTest("ar", "ar", true);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::i18n::IsRTL());
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16 ar_str =
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(fr_str, ar_str);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsChangedForChromeVox) {
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetUpCrasAndEnableChromeVox(75 /* volume_percent */, true /* mute_on */);
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that output is unmuted now and at some level.
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrasAudioHandler* cras = CrasAudioHandler::Get();
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(cras->IsOutputMuted());
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            cras->GetOutputVolumePercent());
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsUnchangedForChromeVox) {
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetUpCrasAndEnableChromeVox(75 /* volume_percent */, false /* mute_on */);
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that output is unmuted now and at some level.
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrasAudioHandler* cras = CrasAudioHandler::Get();
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(cras->IsOutputMuted());
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(75, cras->GetOutputVolumePercent());
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetUpCrasAndEnableChromeVox(5 /* volume_percent */, false /* mute_on */);
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that output is unmuted now and at some level.
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrasAudioHandler* cras = CrasAudioHandler::Get();
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(cras->IsOutputMuted());
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            cras->GetOutputVolumePercent());
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class WizardControllerTestURLFetcherFactory
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : public net::TestURLFetcherFactory {
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual net::URLFetcher* CreateURLFetcher(
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int id,
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const GURL& url,
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLFetcher::RequestType request_type,
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLFetcherDelegate* d) OVERRIDE {
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (StartsWithASCII(
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            url.spec(),
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            SimpleGeolocationProvider::DefaultGeolocationProviderURL().spec(),
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            true)) {
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return new net::FakeURLFetcher(url,
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     d,
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     std::string(kGeolocationResponseBody),
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     net::HTTP_OK,
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     net::URLRequestStatus::SUCCESS);
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (StartsWithASCII(url.spec(),
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        chromeos::DefaultTimezoneProviderURL().spec(),
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        true)) {
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return new net::FakeURLFetcher(url,
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     d,
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     std::string(kTimezoneResponseBody),
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     net::HTTP_OK,
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     net::URLRequestStatus::SUCCESS);
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return net::TestURLFetcherFactory::CreateURLFetcher(
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        id, url, request_type, d);
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~WizardControllerTestURLFetcherFactory() {}
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TimeZoneTestRunner {
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnResolved() { loop_.Quit(); }
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Run() { loop_.Run(); }
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RunLoop loop_;
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WizardControllerFlowTest : public WizardControllerTest {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardControllerFlowTest() {}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden from InProcessBrowserTest:
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WizardControllerTest::SetUpOnMainThread();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure that OOBE is run as an "official" build.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WizardController::default_controller()->is_official_build_ = true;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear portal list (as it is by default in OOBE).
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set up the mocks for all screens.
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_network_screen_,
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kNetworkScreenName,
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockNetworkScreen,
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockNetworkScreenActor);
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_update_screen_,
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kUpdateScreenName,
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockUpdateScreen,
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockUpdateScreenActor);
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_eula_screen_,
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kEulaScreenName,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEulaScreen,
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEulaScreenActor);
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_enrollment_screen_,
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kEnrollmentScreenName,
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEnrollmentScreen,
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEnrollmentScreenActor);
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_auto_enrollment_check_screen_,
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kAutoEnrollmentCheckScreenName,
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockAutoEnrollmentCheckScreen,
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockAutoEnrollmentCheckScreenActor);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Switch to the initial screen.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, WizardController::default_controller()->current_screen());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WizardController::default_controller()->AdvanceToScreen(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WizardController::kNetworkScreenName);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TearDown() {
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (fallback_fetcher_factory_) {
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fetcher_factory_.reset();
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get());
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fallback_fetcher_factory_.reset();
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void InitTimezoneResolver() {
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    fallback_fetcher_factory_.reset(new WizardControllerTestURLFetcherFactory);
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    net::URLFetcherImpl::set_factory(NULL);
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    fetcher_factory_.reset(
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new net::FakeURLFetcherFactory(fallback_fetcher_factory_.get()));
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    network_portal_detector_ = new NetworkPortalDetectorTestImpl();
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NetworkPortalDetector::CaptivePortalState online_state;
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    online_state.response_code = 204;
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Default detworks happens to be usually "eth1" in tests.
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const NetworkState* default_network =
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    network_portal_detector_->SetDefaultNetworkForTesting(
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        default_network->guid());
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    network_portal_detector_->SetDetectionResultsForTesting(
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        default_network->guid(),
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        online_state);
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExit(ScreenObserver::ExitCodes exit_code) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WizardController::default_controller()->OnExit(exit_code);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::SimpleGeolocationProvider* GetGeolocationProvider() {
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return WizardController::default_controller()->geolocation_provider_.get();
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void WaitUntilTimezoneResolved() {
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<TimeZoneTestRunner> runner(new TimeZoneTestRunner);
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!WizardController::default_controller()
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             ->SetOnTimeZoneResolvedForTesting(
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Bind(&TimeZoneTestRunner::OnResolved,
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            base::Unretained(runner.get()))))
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    runner->Run();
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void ResetAutoEnrollmentCheckScreen() {
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WizardController::default_controller()->screens_.erase(
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        WizardController::kAutoEnrollmentCheckScreenName);
47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_network_screen_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockOutShowHide<MockEulaScreen, MockEulaScreenActor>* mock_eula_screen_;
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockOutShowHide<MockEnrollmentScreen,
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MockEnrollmentScreenActor>* mock_enrollment_screen_;
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MockOutShowHide<MockAutoEnrollmentCheckScreen,
48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      MockAutoEnrollmentCheckScreenActor>* mock_auto_enrollment_check_screen_;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NetworkPortalDetectorTestImpl* network_portal_detector_;
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Use a test factory as a fallback so we don't have to deal with other
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // requests.
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<WizardControllerTestURLFetcherFactory> fallback_fetcher_factory_;
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_;
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
5040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  WaitUntilJSIsReady();
5060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Check visibility of the header bar.
5080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
5090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
5150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Header bar should still be visible.
5170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
5180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Enable TimeZone resolve
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitTimezoneResolver();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::EULA_ACCEPTED);
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(GetGeolocationProvider());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let update screen smooth time process (time = 0ms).
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kUpdateScreenName);
53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::UPDATE_INSTALLED);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ("ethernet,wifi,cellular",
541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            NetworkHandler::Get()->network_state_handler()
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            ->GetCheckPortalListForTest());
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitUntilTimezoneResolved();
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("America/Anchorage",
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  ->GetCurrentTimezoneID()));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::EULA_ACCEPTED);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let update screen smooth time process (time = 0ms).
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kUpdateScreenName);
56746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
56846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::UPDATE_ERROR_UPDATING);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
57446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WizardController::default_controller()->SkipUpdateEnrollAfterEula();
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_->actor(),
59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              SetParameters(mock_enrollment_screen_,
59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            ""))
59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .Times(1);
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OnExit(ScreenObserver::EULA_ACCEPTED);
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(0);
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  content::RunAllPendingInMessageLoop();
60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("ethernet,wifi,cellular",
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            NetworkHandler::Get()->network_state_handler()
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            ->GetCheckPortalListForTest());
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(0);  // last transition
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::EULA_BACK);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       ControlFlowEnrollmentCompleted) {
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_->actor(),
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetParameters(mock_enrollment_screen_,
637effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            ""))
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(1);
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardController::default_controller()->AdvanceToScreen(
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      WizardController::kEnrollmentScreenName);
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       ControlFlowAutoEnrollmentCompleted) {
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WizardController::default_controller()->SkipPostLoginScreensForTesting();
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UserContext user_context(kUsername);
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  user_context.SetKey(Key(kPassword));
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  user_context.SetUserIDHash(user_context.GetUserID());
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LoginUtils::Set(new TestLoginUtils(user_context));
661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockAuthStatusConsumer mock_consumer;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must have a pending signin to resume after auto-enrollment:
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExistingUserController::current_controller()->DoAutoEnrollment();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExistingUserController::current_controller()->set_login_status_consumer(
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &mock_consumer);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This calls StartWizard, destroying the current controller() and its mocks;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't set expectations on those objects.
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExistingUserController::current_controller()->CompleteLogin(user_context);
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Run the tasks posted to complete the login:
67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the main expectation: after auto-enrollment, login is resumed.
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(mock_consumer, OnAuthSuccess(_)).Times(1);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevent browser launch when the profile is prepared:
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_shutdown::SetTryingToQuit(true);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the tasks posted to complete the login:
68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       ControlFlowWrongHWIDScreenFromLogin) {
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExistingUserController::current_controller()->ShowWrongHWIDScreen();
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kWrongHWIDScreenName);
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // After warning is skipped, user returns to sign-in screen.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // And this destroys WizardController.
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnExit(ScreenObserver::WRONG_HWID_WARNING_SKIPPED);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
701effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass WizardControllerEnrollmentFlowTest : public WizardControllerFlowTest {
702effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
703effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WizardControllerEnrollmentFlowTest() {}
704effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
705effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
706effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    WizardControllerFlowTest::SetUpCommandLine(command_line);
707effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
708c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    command_line->AppendSwitchASCII(
709c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        switches::kEnterpriseEnableForcedReEnrollment,
710c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        chromeos::AutoEnrollmentController::kForcedReEnrollmentAlways);
711effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(
712effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        switches::kEnterpriseEnrollmentInitialModulus, "1");
713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(
714effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        switches::kEnterpriseEnrollmentModulusLimit, "2");
715effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
716effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
717effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
718effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WizardControllerEnrollmentFlowTest);
719effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
720effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
721effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(WizardControllerEnrollmentFlowTest,
722effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ControlFlowForcedReEnrollment) {
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
724effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
725effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
726effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OnExit(ScreenObserver::NETWORK_CONNECTED);
727effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OnExit(ScreenObserver::EULA_ACCEPTED);
733effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Let update screen smooth time process (time = 0ms).
734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  content::RunAllPendingInMessageLoop();
735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kUpdateScreenName);
737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
73846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OnExit(ScreenObserver::UPDATE_INSTALLED);
740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
74146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AutoEnrollmentCheckScreen* screen =
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
74346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(screen,
74446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            WizardController::default_controller()->current_screen());
74546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
74646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  screen->Start();
747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Wait for auto-enrollment controller to encounter the connection error.
748effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
749effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
750effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The error screen shows up if there's no auto-enrollment decision.
751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GetErrorScreen(),
753effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            WizardController::default_controller()->current_screen());
754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::DictionaryValue device_state;
755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  device_state.SetString(policy::kDeviceStateRestoreMode,
756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         policy::kDeviceStateRestoreModeReEnrollmentEnforced);
757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        device_state);
759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*mock_enrollment_screen_->actor(),
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SetParameters(mock_enrollment_screen_,
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            "")).Times(1);
764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ResetAutoEnrollmentCheckScreen();
76746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Make sure enterprise enrollment page shows up.
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(StartupUtils::IsOobeCompleted());
773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WizardControllerBrokenLocalStateTest()
77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : fake_session_manager_client_(NULL) {
77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
78058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~WizardControllerBrokenLocalStateTest() {}
78258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
78358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
78458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardControllerTest::SetUpInProcessBrowserTestFixture();
78558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fake_session_manager_client_ = new FakeSessionManagerClient;
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient(
788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scoped_ptr<SessionManagerClient>(fake_session_manager_client_));
78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
79058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::PrefServiceFactory factory;
793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    factory.set_user_prefs(make_scoped_refptr(new PrefStoreStub()));
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    local_state_ = factory.Create(new PrefRegistrySimple()).Pass();
79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardController::set_local_state_for_testing(local_state_.get());
79658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardControllerTest::SetUpOnMainThread();
79858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Make sure that OOBE is run as an "official" build.
80058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardController::default_controller()->is_official_build_ = true;
80158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
80258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
80358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
80458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardControllerTest::TearDownInProcessBrowserTestFixture();
80558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
80658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
80758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
80858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeSessionManagerClient* fake_session_manager_client() const {
80958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return fake_session_manager_client_;
81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
81258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
81358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<PrefService> local_state_;
81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeSessionManagerClient* fake_session_manager_client_;
81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
81658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerBrokenLocalStateTest);
81758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
81858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
81958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerBrokenLocalStateTest,
82058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       LocalStateCorrupted) {
82158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checks that after wizard controller initialization error screen
82258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // in the proper state is displayed.
82358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(GetErrorScreen(),
82458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WizardController::default_controller()->current_screen());
82558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(ErrorScreen::UI_STATE_LOCAL_STATE_ERROR,
82658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GetErrorScreen()->GetUIState());
82758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
82858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WaitUntilJSIsReady();
82958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
83058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checks visibility of the error message and powerwash button.
83158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(JSExecuteBooleanExpression("$('error-message').hidden"));
83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(JSExecuteBooleanExpression(
83358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "$('error-message').classList.contains('ui-state-local-state-error')"));
83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(JSExecuteBooleanExpression("$('progress-dots').hidden"));
83558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
83658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Emulates user click on the "Restart and Powerwash" button.
83858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(0, fake_session_manager_client()->start_device_wipe_call_count());
83958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
84058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetWebContents(),
84158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "$('error-message-restart-and-powerwash-button').click();"));
84258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1, fake_session_manager_client()->start_device_wipe_call_count());
84358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
84558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WizardControllerProxyAuthOnSigninTest()
84858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : proxy_server_(net::SpawnedTestServer::TYPE_BASIC_AUTH_PROXY,
84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      net::SpawnedTestServer::kLocalhost,
85058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      base::FilePath()) {
85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
85258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~WizardControllerProxyAuthOnSigninTest() {}
85358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
85458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Overridden from WizardControllerTest:
85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
85658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(proxy_server_.Start());
85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardControllerTest::SetUp();
85858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardControllerTest::SetUpOnMainThread();
86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    WizardController::default_controller()->AdvanceToScreen(
86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        WizardController::kNetworkScreenName);
86458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
86558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    command_line->AppendSwitchASCII(::switches::kProxyServer,
86858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                    proxy_server_.host_port_pair().ToString());
86958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
87058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::SpawnedTestServer& proxy_server() { return proxy_server_; }
87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::SpawnedTestServer proxy_server_;
87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerProxyAuthOnSigninTest);
87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerProxyAuthOnSigninTest,
88023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       ProxyAuthDialogOnSigninScreen) {
88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WindowedNotificationObserver auth_needed_waiter(
88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_AUTH_NEEDED,
88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::NotificationService::AllSources());
88458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
88658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_needed_waiter.Wait();
88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WizardControllerKioskFlowTest : public WizardControllerFlowTest {
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WizardControllerKioskFlowTest() {}
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Overridden from InProcessBrowserTest:
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath test_data_dir;
898a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ASSERT_TRUE(chromeos::test_utils::GetTestDataPath(
899a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                    "app_mode", "kiosk_manifest", &test_data_dir));
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    command_line->AppendSwitchPath(
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        switches::kAppOemManifestFile,
902a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        test_data_dir.AppendASCII("kiosk_manifest.json"));
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerKioskFlowTest);
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       ControlFlowKioskForcedEnrollment) {
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_->actor(),
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetParameters(mock_enrollment_screen_,
913effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            ""))
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnExit(ScreenObserver::EULA_ACCEPTED);
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Let update screen smooth time process (time = 0ms).
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RunAllPendingInMessageLoop();
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kUpdateScreenName);
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
93346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnExit(ScreenObserver::UPDATE_INSTALLED);
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
93746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
93846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
93946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
94046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
94146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Make sure enterprise enrollment page shows up right after update screen.
9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(StartupUtils::IsOobeCompleted());
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       ControlFlowEnrollmentBack) {
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_->actor(),
955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              SetParameters(mock_enrollment_screen_,
956effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            ""))
958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .Times(1);
959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
9611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OnExit(ScreenObserver::NETWORK_CONNECTED);
966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEulaScreenName);
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OnExit(ScreenObserver::EULA_ACCEPTED);
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Let update screen smooth time process (time = 0ms).
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::RunAllPendingInMessageLoop();
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kUpdateScreenName);
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
97746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
97846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::UPDATE_INSTALLED);
97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
98146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(1);
98446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make sure enterprise enrollment page shows up right after update screen.
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_BACK);
991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class WizardControllerOobeResumeTest : public WizardControllerTest {
997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WizardControllerOobeResumeTest() {}
999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overriden from InProcessBrowserTest:
1000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WizardControllerTest::SetUpOnMainThread();
1002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Make sure that OOBE is run as an "official" build.
1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WizardController::default_controller()->is_official_build_ = true;
1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Clear portal list (as it is by default in OOBE).
1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Set up the mocks for all screens.
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_network_screen_,
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kNetworkScreenName,
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockNetworkScreen,
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockNetworkScreenActor);
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOCK(mock_enrollment_screen_,
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         kEnrollmentScreenName,
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEnrollmentScreen,
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         MockEnrollmentScreenActor);
1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnExit(ScreenObserver::ExitCodes exit_code) {
1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WizardController::default_controller()->OnExit(exit_code);
1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string GetFirstScreenName() {
1025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return WizardController::default_controller()->first_screen_name();
1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      mock_network_screen_;
1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MockOutShowHide<MockEnrollmentScreen,
1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      MockEnrollmentScreenActor>* mock_enrollment_screen_;
1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
1034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardControllerOobeResumeTest);
1035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       PRE_ControlFlowResumeInterruptedOobe) {
1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Switch to the initial screen.
1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
1041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WizardController::default_controller()->AdvanceToScreen(
1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      WizardController::kNetworkScreenName);
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kNetworkScreenName);
1044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_->actor(),
1045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              SetParameters(mock_enrollment_screen_,
1046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            "")).Times(1);
1048cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
1049cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
1050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WizardController::default_controller()->AdvanceToScreen(
1052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      WizardController::kEnrollmentScreenName);
10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckCurrentScreen(WizardController::kEnrollmentScreenName);
1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       ControlFlowResumeInterruptedOobe) {
1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(WizardController::kEnrollmentScreenName, GetFirstScreenName());
1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(dzhioev): Add test emaulating device with wrong HWID.
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(nkostylev): Add test for WebUI accelerators http://crosbug.com/22571
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// TODO(merkulova): Add tests for bluetooth HID detection screen variations when
1066a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// UI and logic is ready. http://crbug.com/127016
1067a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(dzhioev): Add tests for controller/host pairing flow.
1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// http://crbug.com/375191
1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1071116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCOMPILE_ASSERT(ScreenObserver::EXIT_CODES_COUNT == 23,
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               add_tests_for_new_control_flow_you_just_introduced);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1075