1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/cros/mock_login_library.h"
6 #include "chrome/browser/chromeos/cros/mock_network_library.h"
7 #include "chrome/browser/chromeos/cros/mock_update_library.h"
8 #include "chrome/browser/chromeos/login/mock_screen_observer.h"
9 #include "chrome/browser/chromeos/login/update_screen.h"
10 #include "chrome/browser/chromeos/login/wizard_controller.h"
11 #include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace chromeos {
15 using ::testing::_;
16 using ::testing::AnyNumber;
17 using ::testing::AtLeast;
18 using ::testing::Return;
19 using ::testing::ReturnRef;
20 using ::testing::Invoke;
21
RequestUpdateCheckSuccess(UpdateCallback callback,void * userdata)22 static void RequestUpdateCheckSuccess(UpdateCallback callback, void* userdata) {
23 callback(userdata, chromeos::UPDATE_RESULT_SUCCESS, NULL);
24 }
25
26 class UpdateScreenTest : public WizardInProcessBrowserTest {
27 public:
UpdateScreenTest()28 UpdateScreenTest() : WizardInProcessBrowserTest("update"),
29 mock_login_library_(NULL),
30 mock_update_library_(NULL),
31 mock_network_library_(NULL) {}
32
33 protected:
SetUpInProcessBrowserTestFixture()34 virtual void SetUpInProcessBrowserTestFixture() {
35 WizardInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
36 cros_mock_->InitStatusAreaMocks();
37 cros_mock_->SetStatusAreaMocksExpectations();
38 ASSERT_TRUE(CrosLibrary::Get()->EnsureLoaded());
39
40 mock_login_library_ = new MockLoginLibrary();
41 cros_mock_->test_api()->SetLoginLibrary(mock_login_library_, true);
42 EXPECT_CALL(*mock_login_library_, EmitLoginPromptReady())
43 .Times(1);
44
45 mock_update_library_ = new MockUpdateLibrary();
46 cros_mock_->test_api()->SetUpdateLibrary(mock_update_library_, true);
47
48 // UpdateScreen::StartUpdate() will be called by the WizardController
49 // just after creating the update screen, so the expectations for that
50 // should be set up here.
51 EXPECT_CALL(*mock_update_library_, AddObserver(_))
52 .Times(1);
53 EXPECT_CALL(*mock_update_library_, RemoveObserver(_))
54 .Times(AtLeast(1));
55 EXPECT_CALL(*mock_update_library_, RequestUpdateCheck(_,_))
56 .Times(1)
57 .WillOnce(Invoke(RequestUpdateCheckSuccess));
58
59 mock_network_library_ = cros_mock_->mock_network_library();
60 EXPECT_CALL(*mock_network_library_, Connected())
61 .Times(1) // also called by NetworkMenu::InitMenuItems()
62 .WillRepeatedly((Return(false)))
63 .RetiresOnSaturation();
64 EXPECT_CALL(*mock_network_library_, AddNetworkManagerObserver(_))
65 .Times(1)
66 .RetiresOnSaturation();
67 EXPECT_CALL(*mock_network_library_, FindWifiDevice())
68 .Times(AnyNumber());
69 EXPECT_CALL(*mock_network_library_, FindEthernetDevice())
70 .Times(AnyNumber());
71 }
72
TearDownInProcessBrowserTestFixture()73 virtual void TearDownInProcessBrowserTestFixture() {
74 cros_mock_->test_api()->SetUpdateLibrary(NULL, true);
75 WizardInProcessBrowserTest::TearDownInProcessBrowserTestFixture();
76 }
77
78 MockLoginLibrary* mock_login_library_;
79 MockUpdateLibrary* mock_update_library_;
80 MockNetworkLibrary* mock_network_library_;
81
82 private:
83 DISALLOW_COPY_AND_ASSIGN(UpdateScreenTest);
84 };
85
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestBasic)86 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestBasic) {
87 ASSERT_TRUE(controller() != NULL);
88 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
89 controller()->set_observer(mock_screen_observer.get());
90 UpdateScreen* update_screen = controller()->GetUpdateScreen();
91 ASSERT_TRUE(update_screen != NULL);
92 ASSERT_EQ(controller()->current_screen(), update_screen);
93 UpdateView* update_view = update_screen->view();
94 ASSERT_TRUE(update_view != NULL);
95 controller()->set_observer(NULL);
96 }
97
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestNoUpdate)98 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestNoUpdate) {
99 ASSERT_TRUE(controller() != NULL);
100 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
101 controller()->set_observer(mock_screen_observer.get());
102 UpdateScreen* update_screen = controller()->GetUpdateScreen();
103 ASSERT_TRUE(update_screen != NULL);
104 ASSERT_EQ(controller()->current_screen(), update_screen);
105
106 UpdateLibrary::Status status;
107 status.status = UPDATE_STATUS_IDLE;
108 EXPECT_CALL(*mock_update_library_, status())
109 .Times(AtLeast(1))
110 .WillRepeatedly(ReturnRef(status));
111 EXPECT_CALL(*mock_screen_observer, OnExit(ScreenObserver::UPDATE_NOUPDATE))
112 .Times(1);
113 update_screen->UpdateStatusChanged(mock_update_library_);
114
115 controller()->set_observer(NULL);
116 }
117
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestUpdateAvailable)118 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestUpdateAvailable) {
119 ASSERT_TRUE(controller() != NULL);
120 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
121 controller()->set_observer(mock_screen_observer.get());
122 UpdateScreen* update_screen = controller()->GetUpdateScreen();
123 ASSERT_TRUE(update_screen != NULL);
124 ASSERT_EQ(controller()->current_screen(), update_screen);
125 update_screen->SetAllUpdatesCritical(true);
126
127 UpdateLibrary::Status status;
128
129 status.status = UPDATE_STATUS_UPDATE_AVAILABLE;
130 status.new_version = "latest and greatest";
131 EXPECT_CALL(*mock_update_library_, status())
132 .Times(AtLeast(1))
133 .WillRepeatedly(ReturnRef(status));
134 update_screen->UpdateStatusChanged(mock_update_library_);
135
136 status.status = UPDATE_STATUS_DOWNLOADING;
137 status.download_progress = 0.0;
138 EXPECT_CALL(*mock_update_library_, status())
139 .Times(AtLeast(1))
140 .WillRepeatedly(ReturnRef(status));
141 update_screen->UpdateStatusChanged(mock_update_library_);
142
143 status.download_progress = 0.5;
144 EXPECT_CALL(*mock_update_library_, status())
145 .Times(AtLeast(1))
146 .WillRepeatedly(ReturnRef(status));
147 update_screen->UpdateStatusChanged(mock_update_library_);
148
149 status.download_progress = 1.0;
150 EXPECT_CALL(*mock_update_library_, status())
151 .Times(AtLeast(1))
152 .WillRepeatedly(ReturnRef(status));
153 update_screen->UpdateStatusChanged(mock_update_library_);
154
155 status.status = UPDATE_STATUS_VERIFYING;
156 EXPECT_CALL(*mock_update_library_, status())
157 .Times(AtLeast(1))
158 .WillRepeatedly(ReturnRef(status));
159 update_screen->UpdateStatusChanged(mock_update_library_);
160
161 status.status = UPDATE_STATUS_FINALIZING;
162 EXPECT_CALL(*mock_update_library_, status())
163 .Times(AtLeast(1))
164 .WillRepeatedly(ReturnRef(status));
165 update_screen->UpdateStatusChanged(mock_update_library_);
166
167 status.status = UPDATE_STATUS_UPDATED_NEED_REBOOT;
168 EXPECT_CALL(*mock_update_library_, status())
169 .Times(AtLeast(1))
170 .WillRepeatedly(ReturnRef(status));
171 EXPECT_CALL(*mock_update_library_, RebootAfterUpdate())
172 .Times(1);
173 update_screen->UpdateStatusChanged(mock_update_library_);
174
175 controller()->set_observer(NULL);
176 }
177
RequestUpdateCheckFail(UpdateCallback callback,void * userdata)178 static void RequestUpdateCheckFail(UpdateCallback callback, void* userdata) {
179 callback(userdata, chromeos::UPDATE_RESULT_FAILED, NULL);
180 }
181
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestErrorIssuingUpdateCheck)182 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorIssuingUpdateCheck) {
183 ASSERT_TRUE(controller() != NULL);
184 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
185 controller()->set_observer(mock_screen_observer.get());
186 UpdateScreen* update_screen = controller()->GetUpdateScreen();
187 ASSERT_TRUE(update_screen != NULL);
188 ASSERT_EQ(controller()->current_screen(), update_screen);
189
190 // First, cancel the update that is already in progress.
191 EXPECT_CALL(*mock_screen_observer,
192 OnExit(ScreenObserver::UPDATE_NOUPDATE))
193 .Times(1);
194 update_screen->CancelUpdate();
195
196 // Run UpdateScreen::StartUpdate() again, but CheckForUpdate() will fail
197 // issuing the update check this time.
198 EXPECT_CALL(*mock_update_library_, AddObserver(_))
199 .Times(1);
200 EXPECT_CALL(*mock_update_library_, RemoveObserver(_))
201 .Times(AtLeast(1));
202 EXPECT_CALL(*mock_update_library_, RequestUpdateCheck(_,_))
203 .Times(1)
204 .WillOnce(Invoke(RequestUpdateCheckFail));
205 EXPECT_CALL(*mock_screen_observer,
206 OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
207 .Times(1);
208 update_screen->StartUpdate();
209
210 controller()->set_observer(NULL);
211 }
212
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestErrorCheckingForUpdate)213 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorCheckingForUpdate) {
214 ASSERT_TRUE(controller() != NULL);
215 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
216 controller()->set_observer(mock_screen_observer.get());
217 UpdateScreen* update_screen = controller()->GetUpdateScreen();
218 ASSERT_TRUE(update_screen != NULL);
219 ASSERT_EQ(controller()->current_screen(), update_screen);
220
221 UpdateLibrary::Status status;
222 status.status = UPDATE_STATUS_ERROR;
223 EXPECT_CALL(*mock_update_library_, status())
224 .Times(AtLeast(1))
225 .WillRepeatedly(ReturnRef(status));
226 EXPECT_CALL(*mock_screen_observer,
227 OnExit(ScreenObserver::UPDATE_ERROR_CHECKING_FOR_UPDATE))
228 .Times(1);
229 update_screen->UpdateStatusChanged(mock_update_library_);
230
231 controller()->set_observer(NULL);
232 }
233
IN_PROC_BROWSER_TEST_F(UpdateScreenTest,TestErrorUpdating)234 IN_PROC_BROWSER_TEST_F(UpdateScreenTest, TestErrorUpdating) {
235 ASSERT_TRUE(controller() != NULL);
236 scoped_ptr<MockScreenObserver> mock_screen_observer(new MockScreenObserver());
237 controller()->set_observer(mock_screen_observer.get());
238 UpdateScreen* update_screen = controller()->GetUpdateScreen();
239 ASSERT_TRUE(update_screen != NULL);
240 ASSERT_EQ(controller()->current_screen(), update_screen);
241
242 UpdateLibrary::Status status;
243
244 status.status = UPDATE_STATUS_UPDATE_AVAILABLE;
245 status.new_version = "latest and greatest";
246 EXPECT_CALL(*mock_update_library_, status())
247 .Times(AtLeast(1))
248 .WillRepeatedly(ReturnRef(status));
249 update_screen->UpdateStatusChanged(mock_update_library_);
250
251 status.status = UPDATE_STATUS_ERROR;
252 EXPECT_CALL(*mock_update_library_, status())
253 .Times(AtLeast(1))
254 .WillRepeatedly(ReturnRef(status));
255 EXPECT_CALL(*mock_screen_observer,
256 OnExit(ScreenObserver::UPDATE_ERROR_UPDATING))
257 .Times(1);
258 update_screen->UpdateStatusChanged(mock_update_library_);
259
260 controller()->set_observer(NULL);
261 }
262
263 } // namespace chromeos
264