1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/browser_process.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/mock_error_screen.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/mock_screen_observer.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/update_screen.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/dbus_thread_manager.h"
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/dbus/fake_update_engine_client.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AnyNumber;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AtLeast;
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::Exactly;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::Invoke;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::Return;
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::_;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kStubEthernetGuid[] = "eth0";
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kStubWifiGuid[] = "wlan0";
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class UpdateScreenTest : public WizardInProcessBrowserTest {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateScreenTest() : WizardInProcessBrowserTest("update"),
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                       fake_update_engine_client_(NULL),
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       network_portal_detector_(NULL) {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fake_update_engine_client_ = new FakeUpdateEngineClient;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chromeos::DBusThreadManager::GetSetterForTesting()->SetUpdateEngineClient(
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scoped_ptr<UpdateEngineClient>(fake_update_engine_client_));
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WizardInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Setup network portal detector to return online state for both
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // ethernet and wifi networks. Ethernet is an active network by
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // default.
588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    network_portal_detector_ = new NetworkPortalDetectorTestImpl();
598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkPortalDetector::CaptivePortalState online_state;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    online_state.response_code = 204;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetDefaultNetwork(kStubEthernetGuid);
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetDetectionResults(kStubEthernetGuid, online_state);
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetDetectionResults(kStubWifiGuid, online_state);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WizardInProcessBrowserTest::SetUpOnMainThread();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_screen_observer_.reset(new MockScreenObserver());
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_error_screen_actor_.reset(new MockErrorScreenActor());
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_error_screen_.reset(
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new MockErrorScreen(mock_screen_observer_.get(),
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            mock_error_screen_actor_.get()));
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_screen_observer_, ShowCurrentScreen())
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber());
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_screen_observer_, GetErrorScreen())
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber())
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillRepeatedly(Return(mock_error_screen_.get()));
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(WizardController::default_controller() != NULL);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    update_screen_ = UpdateScreen::Get(WizardController::default_controller());
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(update_screen_ != NULL);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(WizardController::default_controller()->current_screen(),
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              update_screen_);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    update_screen_->screen_observer_ = mock_screen_observer_.get();
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    mock_error_screen_.reset();
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    mock_error_screen_actor_.reset();
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    WizardInProcessBrowserTest::TearDownOnMainThread();
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    NetworkPortalDetector::Shutdown();
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WizardInProcessBrowserTest::TearDownInProcessBrowserTestFixture();
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetDefaultNetwork(const std::string& guid) {
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(network_portal_detector_);
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    network_portal_detector_->SetDefaultNetworkForTesting(guid);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetDetectionResults(
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::string& guid,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const NetworkPortalDetector::CaptivePortalState& state) {
1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(network_portal_detector_);
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    network_portal_detector_->SetDetectionResultsForTesting(guid, state);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NotifyPortalDetectionCompleted() {
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(network_portal_detector_);
1158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    network_portal_detector_->NotifyObserversForTesting();
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FakeUpdateEngineClient* fake_update_engine_client_;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockScreenObserver> mock_screen_observer_;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorScreenActor> mock_error_screen_actor_;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorScreen> mock_error_screen_;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateScreen* update_screen_;
1238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  NetworkPortalDetectorTestImpl* network_portal_detector_;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UpdateScreenTest);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestBasic) {
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(update_screen_->actor_ != NULL);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestNoUpdate) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->SetIgnoreIdleStatus(true);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEngineClient::Status status;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_IDLE;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_IDLE;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetLastStatus() will be called via ExitUpdate() called from
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UpdateStatusChanged().
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fake_update_engine_client_->set_default_status(status);
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, OnExit(ScreenObserver::UPDATE_NOUPDATE))
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestUpdateAvailable) {
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->is_ignore_update_deadlines_ = true;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEngineClient::Status status;
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.new_version = "latest and greatest";
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_DOWNLOADING;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.download_progress = 0.0;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.download_progress = 0.5;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.download_progress = 1.0;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_VERIFYING;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_FINALIZING;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // UpdateStatusChanged(status) calls RebootAfterUpdate().
177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, fake_update_engine_client_->reboot_after_update_call_count());
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check that OOBE will resume back at this screen.
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(StartupUtils::IsOobeCompleted());
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(update_screen_->GetName(),
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      g_browser_process->local_state()->GetString(prefs::kOobeScreenPending));
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorIssuingUpdateCheck) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // First, cancel the update that is already in progress.
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_NOUPDATE))
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->CancelUpdate();
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  fake_update_engine_client_->set_update_check_result(
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::UpdateEngineClient::UPDATE_RESULT_FAILED);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->StartNetworkCheck();
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorCheckingForUpdate) {
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEngineClient::Status status;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_ERROR;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetLastStatus() will be called via ExitUpdate() called from
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UpdateStatusChanged().
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fake_update_engine_client_->set_default_status(status);
206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorUpdating) {
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEngineClient::Status status;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.new_version = "latest and greatest";
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetLastStatus() will be called via ExitUpdate() called from
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UpdateStatusChanged().
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fake_update_engine_client_->set_default_status(status);
220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.status = UpdateEngineClient::UPDATE_STATUS_ERROR;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetLastStatus() will be called via ExitUpdate() called from
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UpdateStatusChanged().
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fake_update_engine_client_->set_default_status(status);
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_ERROR_UPDATING))
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->UpdateStatusChanged(status);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestTemproraryOfflineNetwork) {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_NOUPDATE))
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->CancelUpdate();
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Change ethernet state to portal.
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkPortalDetector::CaptivePortalState portal_state;
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  portal_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL;
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  portal_state.response_code = 200;
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDetectionResults(kStubEthernetGuid, portal_state);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update screen will show error message about portal state because
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ethernet is behind captive portal.
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetUIState(ErrorScreen::UI_STATE_UPDATE))
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetErrorState(ErrorScreen::ERROR_STATE_PORTAL, std::string()))
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_, FixCaptivePortal())
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, ShowErrorScreen())
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->StartNetworkCheck();
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkPortalDetector::CaptivePortalState online_state;
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  online_state.response_code = 204;
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDetectionResults(kStubEthernetGuid, online_state);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Second notification from portal detector will be about online state,
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so update screen will hide error message and proceed to update.
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, HideErrorScreen(update_screen_))
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  fake_update_engine_client_->set_update_check_result(
271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::UpdateEngineClient::UPDATE_RESULT_FAILED);
272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyPortalDetectionCompleted();
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestTwoOfflineNetworks) {
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_NOUPDATE))
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->CancelUpdate();
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Change ethernet state to portal.
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkPortalDetector::CaptivePortalState portal_state;
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  portal_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL;
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  portal_state.response_code = 200;
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDetectionResults(kStubEthernetGuid, portal_state);
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update screen will show error message about portal state because
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ethernet is behind captive portal.
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetUIState(ErrorScreen::UI_STATE_UPDATE))
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetErrorState(ErrorScreen::ERROR_STATE_PORTAL, std::string()))
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_, FixCaptivePortal())
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, ShowErrorScreen())
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  update_screen_->StartNetworkCheck();
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Change active network to the wifi behind proxy.
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkPortalDetector::CaptivePortalState proxy_state;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy_state.status =
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED;
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy_state.response_code = -1;
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDefaultNetwork(kStubWifiGuid);
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDetectionResults(kStubWifiGuid, proxy_state);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update screen will show message about proxy error because wifie
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // network requires proxy authentication.
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SetErrorState(ErrorScreen::ERROR_STATE_PROXY, std::string()))
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(1);
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyPortalDetectionCompleted();
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestVoidNetwork) {
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDefaultNetwork(std::string());
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Cancels pending update request.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_,
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              OnExit(ScreenObserver::UPDATE_NOUPDATE))
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  update_screen_->CancelUpdate();
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // First portal detection attempt returns NULL network and undefined
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // results, so detection is restarted.
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              SetUIState(_))
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(Exactly(0));
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              SetErrorState(_, _))
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(Exactly(0));
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, ShowErrorScreen())
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(Exactly(0));
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  update_screen_->StartNetworkCheck();
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Second portal detection also returns NULL network and undefined
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // results.  In this case, offline message should be displayed.
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              SetUIState(ErrorScreen::UI_STATE_UPDATE))
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1);
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_error_screen_actor_,
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE, std::string()))
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1);
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*mock_screen_observer_, ShowErrorScreen())
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1);
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NotifyPortalDetectionCompleted();
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochIN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestAPReselection) {
3602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_screen_observer_,
3612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              OnExit(ScreenObserver::UPDATE_NOUPDATE))
3622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  update_screen_->CancelUpdate();
3642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Change ethernet state to portal.
3662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  NetworkPortalDetector::CaptivePortalState portal_state;
3672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  portal_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL;
3682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  portal_state.response_code = 200;
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDetectionResults(kStubEthernetGuid, portal_state);
3702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Update screen will show error message about portal state because
3722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // ethernet is behind captive portal.
3732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_error_screen_actor_,
3742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              SetUIState(ErrorScreen::UI_STATE_UPDATE))
3752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_error_screen_actor_,
3772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              SetErrorState(ErrorScreen::ERROR_STATE_PORTAL, std::string()))
3782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_error_screen_actor_, FixCaptivePortal())
3802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_screen_observer_, ShowErrorScreen())
3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  update_screen_->StartNetworkCheck();
3852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // User re-selects the same network manually. In this case, hide
3872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // offline message and skip network check. Since ethernet is still
3882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // behind portal, update engine fails to update.
3892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_screen_observer_, HideErrorScreen(update_screen_))
3902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  fake_update_engine_client_->set_update_check_result(
3922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      chromeos::UpdateEngineClient::UPDATE_RESULT_FAILED);
3932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_CALL(*mock_screen_observer_,
3942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
3952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      .Times(1);
3962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  update_screen_->OnConnectToNetworkRequested();
3982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::MessageLoop::current()->RunUntilIdle();
3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
402