OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/extensions/chooser_dialog_view.h" | 5 #include "chrome/browser/ui/views/extensions/chooser_dialog_view.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/strings/utf_string_conversions.h" | |
8 #include "chrome/browser/chooser_controller/mock_chooser_controller.h" | 9 #include "chrome/browser/chooser_controller/mock_chooser_controller.h" |
9 #include "chrome/browser/extensions/extension_browsertest.h" | 10 #include "chrome/browser/extensions/extension_browsertest.h" |
10 #include "chrome/browser/platform_util.h" | 11 #include "chrome/browser/platform_util.h" |
11 #include "chrome/browser/ui/browser_window.h" | 12 #include "chrome/browser/ui/browser_window.h" |
12 #include "chrome/browser/ui/views/chooser_content_view.h" | 13 #include "chrome/browser/ui/views/chooser_content_view.h" |
13 #include "chrome/grit/generated_resources.h" | 14 #include "chrome/grit/generated_resources.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "ui/base/l10n/l10n_util.h" | 17 #include "ui/base/l10n/l10n_util.h" |
18 #include "ui/views/controls/button/label_button.h" | |
19 #include "ui/views/controls/link.h" | |
17 #include "ui/views/controls/styled_label.h" | 20 #include "ui/views/controls/styled_label.h" |
18 #include "ui/views/controls/table/table_view.h" | 21 #include "ui/views/controls/table/table_view.h" |
22 #include "ui/views/controls/throbber.h" | |
19 #include "ui/views/widget/widget.h" | 23 #include "ui/views/widget/widget.h" |
20 #include "ui/views/window/dialog_client_view.h" | 24 #include "ui/views/window/dialog_client_view.h" |
21 | 25 |
22 class ChooserDialogViewTest : public ExtensionBrowserTest { | 26 class ChooserDialogViewTest : public ExtensionBrowserTest { |
msw
2016/07/26 00:18:56
It'd be nice to make all these test fixtures unit
juncai
2016/07/26 23:30:01
Now the only remaining part at browser test is to
msw
2016/07/26 23:47:31
Afaict, the only change you'd need to make to move
juncai
2016/07/27 19:41:51
Changed chooser_dialog_view_browsertest.cc to be c
| |
23 public: | 27 public: |
24 ChooserDialogViewTest() {} | 28 ChooserDialogViewTest() {} |
25 ~ChooserDialogViewTest() override {} | 29 ~ChooserDialogViewTest() override {} |
26 | 30 |
27 void SetUpOnMainThread() override { | 31 void SetUpOnMainThread() override { |
28 std::unique_ptr<MockChooserController> mock_chooser_controller( | 32 std::unique_ptr<MockChooserController> mock_chooser_controller( |
29 new MockChooserController(nullptr)); | 33 new MockChooserController(nullptr)); |
30 mock_chooser_controller_ = mock_chooser_controller.get(); | 34 mock_chooser_controller_ = mock_chooser_controller.get(); |
31 std::unique_ptr<ChooserDialogView> chooser_dialog_view( | 35 std::unique_ptr<ChooserDialogView> chooser_dialog_view( |
32 new ChooserDialogView(std::move(mock_chooser_controller))); | 36 new ChooserDialogView(std::move(mock_chooser_controller))); |
33 chooser_dialog_view_ = chooser_dialog_view.get(); | 37 chooser_dialog_view_ = chooser_dialog_view.get(); |
34 table_view_ = chooser_dialog_view_->chooser_content_view_for_test() | 38 table_view_ = chooser_dialog_view_->chooser_content_view_for_test() |
35 ->table_view_for_test(); | 39 ->table_view_for_test(); |
36 ASSERT_TRUE(table_view_); | 40 ASSERT_TRUE(table_view_); |
37 table_model_ = table_view_->model(); | 41 table_model_ = table_view_->model(); |
38 ASSERT_TRUE(table_model_); | 42 ASSERT_TRUE(table_model_); |
39 views::Widget* modal_dialog = views::DialogDelegate::CreateDialogWidget( | 43 views::Widget* modal_dialog = views::DialogDelegate::CreateDialogWidget( |
40 chooser_dialog_view.release(), nullptr, | 44 chooser_dialog_view.release(), nullptr, |
41 platform_util::GetViewForWindow( | 45 platform_util::GetViewForWindow( |
42 browser()->window()->GetNativeWindow())); | 46 browser()->window()->GetNativeWindow())); |
43 modal_dialog->Show(); | 47 modal_dialog->Show(); |
48 throbber_ = chooser_dialog_view_->chooser_content_view_for_test() | |
49 ->throbber_for_test(); | |
50 ASSERT_TRUE(throbber_); | |
51 discovery_state_ = chooser_dialog_view_->chooser_content_view_for_test() | |
52 ->discovery_state_for_test(); | |
53 ASSERT_TRUE(discovery_state_); | |
54 ok_button_ = chooser_dialog_view_->GetDialogClientView()->ok_button(); | |
55 ASSERT_TRUE(ok_button_); | |
56 cancel_button_ = | |
57 chooser_dialog_view_->GetDialogClientView()->cancel_button(); | |
58 ASSERT_TRUE(cancel_button_); | |
44 styled_label_ = chooser_dialog_view_->chooser_content_view_for_test() | 59 styled_label_ = chooser_dialog_view_->chooser_content_view_for_test() |
45 ->styled_label_for_test(); | 60 ->styled_label_for_test(); |
46 ASSERT_TRUE(styled_label_); | 61 ASSERT_TRUE(styled_label_); |
47 } | 62 } |
48 | 63 |
49 protected: | 64 protected: |
50 MockChooserController* mock_chooser_controller_; | 65 MockChooserController* mock_chooser_controller_; |
51 ChooserDialogView* chooser_dialog_view_; | 66 ChooserDialogView* chooser_dialog_view_; |
52 views::TableView* table_view_; | 67 views::TableView* table_view_; |
53 ui::TableModel* table_model_; | 68 ui::TableModel* table_model_; |
69 views::Throbber* throbber_; | |
70 views::Link* discovery_state_; | |
71 views::LabelButton* ok_button_; | |
72 views::LabelButton* cancel_button_; | |
54 views::StyledLabel* styled_label_; | 73 views::StyledLabel* styled_label_; |
55 | 74 |
56 private: | 75 private: |
57 DISALLOW_COPY_AND_ASSIGN(ChooserDialogViewTest); | 76 DISALLOW_COPY_AND_ASSIGN(ChooserDialogViewTest); |
58 }; | 77 }; |
59 | 78 |
60 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, InitialState) { | 79 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, InitialState) { |
61 // Since "No devices found." needs to be displayed on the |table_view_|, | 80 EXPECT_FALSE(throbber_->visible()); |
62 // the number of rows is 1. | 81 // OK button is disabled since there is no option. |
63 EXPECT_EQ(1, table_view_->RowCount()); | 82 EXPECT_FALSE(ok_button_->enabled()); |
83 // Cancel button is always enabled. | |
84 EXPECT_TRUE(cancel_button_->enabled()); | |
64 EXPECT_EQ( | 85 EXPECT_EQ( |
65 l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT), | 86 l10n_util::GetStringUTF16(IDS_USB_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT), |
66 table_model_->GetText(0, 0)); | 87 ok_button_->GetText()); |
67 // |table_view_| should be disabled since there is no option shown. | 88 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_CANCEL_BUTTON_TEXT), |
68 EXPECT_FALSE(table_view_->enabled()); | 89 cancel_button_->GetText()); |
69 // No option selected. | 90 } |
70 EXPECT_EQ(0, table_view_->SelectedRowCount()); | 91 |
71 EXPECT_EQ(-1, table_view_->FirstSelectedRow()); | 92 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, SelectAndDeselectAnOption) { |
93 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
94 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
95 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
96 // OK button is disabled since no option is selected. | |
97 EXPECT_FALSE(ok_button_->enabled()); | |
98 EXPECT_TRUE(cancel_button_->enabled()); | |
99 | |
100 // Select option 0. | |
101 table_view_->Select(0); | |
102 // OK button is enabled since an option is selected. | |
103 EXPECT_TRUE(ok_button_->enabled()); | |
104 EXPECT_TRUE(cancel_button_->enabled()); | |
105 | |
106 // Unselect option 0. | |
107 table_view_->Select(-1); | |
108 // OK button is disabled since no option is selected. | |
109 EXPECT_FALSE(ok_button_->enabled()); | |
110 EXPECT_TRUE(cancel_button_->enabled()); | |
111 | |
112 // Select option 1. | |
113 table_view_->Select(1); | |
114 // OK button is enabled since an option is selected. | |
115 EXPECT_TRUE(ok_button_->enabled()); | |
116 EXPECT_TRUE(cancel_button_->enabled()); | |
117 | |
118 // Unselect option 1. | |
119 table_view_->Select(-1); | |
120 // OK button is disabled since no option is selected. | |
121 EXPECT_FALSE(ok_button_->enabled()); | |
122 EXPECT_TRUE(cancel_button_->enabled()); | |
123 } | |
124 | |
125 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, | |
126 SelectAnOptionAndThenSelectAnotherOption) { | |
127 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
128 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
129 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
130 EXPECT_FALSE(ok_button_->enabled()); | |
131 EXPECT_TRUE(cancel_button_->enabled()); | |
132 | |
133 // Select option 0. | |
134 table_view_->Select(0); | |
135 EXPECT_TRUE(ok_button_->enabled()); | |
136 EXPECT_TRUE(cancel_button_->enabled()); | |
137 | |
138 // Select option 1. | |
139 table_view_->Select(1); | |
140 // Both OK and Cancel buttons are still enabled. | |
141 EXPECT_TRUE(ok_button_->enabled()); | |
142 EXPECT_TRUE(cancel_button_->enabled()); | |
143 | |
144 // Select option 2. | |
145 table_view_->Select(2); | |
146 // Both OK and Cancel buttons are still enabled. | |
147 EXPECT_TRUE(ok_button_->enabled()); | |
148 EXPECT_TRUE(cancel_button_->enabled()); | |
149 } | |
150 | |
151 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, | |
152 SelectAnOptionAndRemoveAnotherOption) { | |
153 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
154 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
155 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
156 EXPECT_FALSE(ok_button_->enabled()); | |
157 EXPECT_TRUE(cancel_button_->enabled()); | |
158 | |
159 // Select option 1. | |
160 table_view_->Select(1); | |
161 EXPECT_TRUE(ok_button_->enabled()); | |
162 EXPECT_TRUE(cancel_button_->enabled()); | |
163 | |
164 // Remove option 0, the list becomes: b c. | |
165 mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a")); | |
166 // Both OK and Cancel buttons are still enabled. | |
167 EXPECT_TRUE(ok_button_->enabled()); | |
168 EXPECT_TRUE(cancel_button_->enabled()); | |
169 | |
170 // Remove option 1. | |
171 mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c")); | |
172 // Both OK and Cancel buttons are still enabled. | |
173 EXPECT_TRUE(ok_button_->enabled()); | |
174 EXPECT_TRUE(cancel_button_->enabled()); | |
175 } | |
176 | |
177 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, | |
178 SelectAnOptionAndRemoveTheSelectedOption) { | |
179 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
180 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
181 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
182 EXPECT_FALSE(ok_button_->enabled()); | |
183 EXPECT_TRUE(cancel_button_->enabled()); | |
184 | |
185 // Select option 1. | |
186 table_view_->Select(1); | |
187 EXPECT_TRUE(ok_button_->enabled()); | |
188 EXPECT_TRUE(cancel_button_->enabled()); | |
189 | |
190 // Remove option 1. | |
191 mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b")); | |
192 // OK button is disabled since the selected option is removed. | |
193 EXPECT_FALSE(ok_button_->enabled()); | |
194 EXPECT_TRUE(cancel_button_->enabled()); | |
195 } | |
196 | |
197 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, | |
198 AddAnOptionAndSelectItAndRemoveTheSelectedOption) { | |
199 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
200 EXPECT_FALSE(ok_button_->enabled()); | |
201 EXPECT_TRUE(cancel_button_->enabled()); | |
202 | |
203 // Select option 0. | |
204 table_view_->Select(0); | |
205 EXPECT_TRUE(ok_button_->enabled()); | |
206 EXPECT_TRUE(cancel_button_->enabled()); | |
207 | |
208 // Remove option 0. | |
209 mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a")); | |
210 // There is no option shown now and the OK button is disabled. | |
211 EXPECT_FALSE(ok_button_->enabled()); | |
212 EXPECT_TRUE(cancel_button_->enabled()); | |
72 } | 213 } |
73 | 214 |
74 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Accept) { | 215 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Accept) { |
75 EXPECT_CALL(*mock_chooser_controller_, Select(testing::_)).Times(1); | 216 EXPECT_CALL(*mock_chooser_controller_, Select(testing::_)).Times(1); |
76 chooser_dialog_view_->Accept(); | 217 chooser_dialog_view_->Accept(); |
77 } | 218 } |
78 | 219 |
79 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Cancel) { | 220 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Cancel) { |
80 EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(1); | 221 EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(1); |
81 chooser_dialog_view_->Cancel(); | 222 chooser_dialog_view_->Cancel(); |
82 } | 223 } |
83 | 224 |
84 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Close) { | 225 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, Close) { |
85 EXPECT_CALL(*mock_chooser_controller_, Close()).Times(1); | 226 EXPECT_CALL(*mock_chooser_controller_, Close()).Times(1); |
86 chooser_dialog_view_->Close(); | 227 chooser_dialog_view_->Close(); |
87 } | 228 } |
88 | 229 |
89 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, ClickStyledLabelLink) { | 230 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, ClickStyledLabelLink) { |
90 EXPECT_CALL(*mock_chooser_controller_, OpenHelpCenterUrl()).Times(1); | 231 EXPECT_CALL(*mock_chooser_controller_, OpenHelpCenterUrl()).Times(1); |
91 styled_label_->LinkClicked(nullptr, 0); | 232 styled_label_->LinkClicked(nullptr, 0); |
92 } | 233 } |
234 | |
235 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, AdapterOnAndOffAndOn) { | |
236 mock_chooser_controller_->OnAdapterPresenceChanged( | |
237 content::BluetoothChooser::AdapterPresence::POWERED_ON); | |
238 EXPECT_FALSE(ok_button_->enabled()); | |
239 EXPECT_TRUE(cancel_button_->enabled()); | |
240 | |
241 // Add options. | |
242 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
243 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
244 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
245 EXPECT_FALSE(ok_button_->enabled()); | |
246 EXPECT_TRUE(cancel_button_->enabled()); | |
247 | |
248 // Select option 1. | |
249 table_view_->Select(1); | |
250 EXPECT_TRUE(ok_button_->enabled()); | |
251 EXPECT_TRUE(cancel_button_->enabled()); | |
252 | |
253 mock_chooser_controller_->OnAdapterPresenceChanged( | |
254 content::BluetoothChooser::AdapterPresence::POWERED_OFF); | |
255 // Since the adapter is turned off, the previously selected option | |
256 // becomes invalid, the OK button is disabled. | |
257 EXPECT_EQ(0u, mock_chooser_controller_->NumOptions()); | |
258 EXPECT_FALSE(ok_button_->enabled()); | |
259 EXPECT_TRUE(cancel_button_->enabled()); | |
260 | |
261 mock_chooser_controller_->OnAdapterPresenceChanged( | |
262 content::BluetoothChooser::AdapterPresence::POWERED_ON); | |
263 EXPECT_EQ(0u, mock_chooser_controller_->NumOptions()); | |
264 EXPECT_FALSE(ok_button_->enabled()); | |
265 EXPECT_TRUE(cancel_button_->enabled()); | |
266 } | |
267 | |
268 IN_PROC_BROWSER_TEST_F(ChooserDialogViewTest, DiscoveringAndIdle) { | |
269 // Add options. | |
270 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("a")); | |
271 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("b")); | |
272 mock_chooser_controller_->OptionAdded(base::ASCIIToUTF16("c")); | |
273 EXPECT_TRUE(table_view_->visible()); | |
274 EXPECT_EQ(3, table_view_->RowCount()); | |
275 EXPECT_TRUE(table_view_->enabled()); | |
276 // No option selected. | |
277 EXPECT_EQ(0, table_view_->SelectedRowCount()); | |
278 EXPECT_EQ(-1, table_view_->FirstSelectedRow()); | |
279 // Select option 1. | |
280 table_view_->Select(1); | |
281 EXPECT_EQ(1, table_view_->SelectedRowCount()); | |
282 EXPECT_EQ(1, table_view_->FirstSelectedRow()); | |
283 EXPECT_FALSE(throbber_->visible()); | |
284 // Both OK and Cancel buttons are enabled. | |
285 EXPECT_TRUE(ok_button_->enabled()); | |
286 EXPECT_TRUE(cancel_button_->enabled()); | |
287 // |discovery_state_|'s text is an empty string. | |
288 EXPECT_TRUE(discovery_state_->text().empty()); | |
289 | |
290 mock_chooser_controller_->OnDiscoveryStateChanged( | |
291 content::BluetoothChooser::DiscoveryState::DISCOVERING); | |
292 EXPECT_FALSE(table_view_->visible()); | |
293 EXPECT_TRUE(throbber_->visible()); | |
294 // |discovery_state_| is disabled and shows a label instead of a link. | |
295 EXPECT_FALSE(discovery_state_->enabled()); | |
296 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING), | |
297 discovery_state_->text()); | |
298 // OK button is disabled since the chooser is refreshing options. | |
299 EXPECT_FALSE(ok_button_->enabled()); | |
300 EXPECT_TRUE(cancel_button_->enabled()); | |
301 | |
302 mock_chooser_controller_->OnDiscoveryStateChanged( | |
303 content::BluetoothChooser::DiscoveryState::IDLE); | |
304 EXPECT_TRUE(table_view_->visible()); | |
305 // Since "No devices found." needs to be displayed on the |table_view_|, | |
306 // the number of rows is 1. | |
307 EXPECT_EQ(1, table_view_->RowCount()); | |
308 EXPECT_EQ( | |
309 l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT), | |
310 table_model_->GetText(0, 0)); | |
311 // |table_view_| should be disabled since there is no option shown. | |
312 EXPECT_FALSE(table_view_->enabled()); | |
313 // No option selected. | |
314 EXPECT_EQ(0, table_view_->SelectedRowCount()); | |
315 EXPECT_EQ(-1, table_view_->FirstSelectedRow()); | |
316 EXPECT_FALSE(throbber_->visible()); | |
317 // |discovery_state_| is enabled and shows a link. | |
318 EXPECT_TRUE(discovery_state_->enabled()); | |
319 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN), | |
320 discovery_state_->text()); | |
321 // OK button is disabled since the chooser refreshed options. | |
322 EXPECT_FALSE(ok_button_->enabled()); | |
323 EXPECT_TRUE(cancel_button_->enabled()); | |
324 } | |
OLD | NEW |