1 // Copyright 2014 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.
5 #include "base/metrics/histogram_samples.h"
6 #include "base/prefs/pref_service.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/test/statistics_delta_reader.h"
9 #include "chrome/browser/ui/passwords/manage_passwords_bubble.h"
10 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
11 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h"
12 #include "chrome/test/base/testing_profile.h"
13 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
14 #include "components/password_manager/core/common/password_manager_ui.h"
15 #include "content/public/test/test_browser_thread_bundle.h"
16 #include "content/public/test/web_contents_tester.h"
17 #include "testing/gtest/include/gtest/gtest.h"
19 const char kUIDismissalReasonMetric[] = "PasswordManager.UIDismissalReason";
21 class ManagePasswordsBubbleModelTest : public testing::Test {
23 ManagePasswordsBubbleModelTest()
25 content::WebContentsTester::CreateTestWebContents(&profile_,
28 virtual void SetUp() OVERRIDE {
29 // Create the test UIController here so that it's bound to
30 // |test_web_contents_| and therefore accessible to the model.
31 new ManagePasswordsUIControllerMock(test_web_contents_.get());
33 model_.reset(new ManagePasswordsBubbleModel(test_web_contents_.get()));
36 virtual void TearDown() OVERRIDE { model_.reset(); }
38 void PretendPasswordWaiting() {
39 model_->set_state(password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE);
40 model_->OnBubbleShown(ManagePasswordsBubble::AUTOMATIC);
41 controller()->SetState(
42 password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE);
45 void PretendManagingPasswords() {
46 model_->set_state(password_manager::ui::MANAGE_STATE);
47 model_->OnBubbleShown(ManagePasswordsBubble::USER_ACTION);
48 controller()->SetState(password_manager::ui::MANAGE_STATE);
51 void PretendBlacklisted() {
52 model_->set_state(password_manager::ui::BLACKLIST_STATE);
53 model_->OnBubbleShown(ManagePasswordsBubble::USER_ACTION);
55 base::string16 kTestUsername = base::ASCIIToUTF16("test_username");
56 autofill::ConstPasswordFormMap map;
57 map[kTestUsername] = &test_form_;
58 controller()->SetPasswordFormMap(map);
59 controller()->SetState(password_manager::ui::BLACKLIST_STATE);
62 ManagePasswordsUIControllerMock* controller() {
63 return static_cast<ManagePasswordsUIControllerMock*>(
64 ManagePasswordsUIController::FromWebContents(
65 test_web_contents_.get()));
69 scoped_ptr<ManagePasswordsBubbleModel> model_;
70 autofill::PasswordForm test_form_;
73 content::TestBrowserThreadBundle thread_bundle_;
74 TestingProfile profile_;
75 scoped_ptr<content::WebContents> test_web_contents_;
78 TEST_F(ManagePasswordsBubbleModelTest, DefaultValues) {
79 EXPECT_EQ(model_->display_disposition(),
80 password_manager::metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING);
81 EXPECT_EQ(model_->dismissal_reason(),
82 password_manager::metrics_util::NOT_DISPLAYED);
83 EXPECT_FALSE(controller()->saved_password());
84 EXPECT_FALSE(controller()->never_saved_password());
87 TEST_F(ManagePasswordsBubbleModelTest, CloseWithoutLogging) {
88 base::StatisticsDeltaReader statistics_delta_reader;
89 model_->OnBubbleHidden();
90 EXPECT_EQ(model_->dismissal_reason(),
91 password_manager::metrics_util::NOT_DISPLAYED);
92 EXPECT_FALSE(controller()->saved_password());
93 EXPECT_FALSE(controller()->never_saved_password());
95 scoped_ptr<base::HistogramSamples> samples(
96 statistics_delta_reader.GetHistogramSamplesSinceCreation(
97 kUIDismissalReasonMetric));
98 EXPECT_EQ(NULL, samples.get());
101 TEST_F(ManagePasswordsBubbleModelTest, CloseWithoutInteraction) {
102 base::StatisticsDeltaReader statistics_delta_reader;
103 PretendPasswordWaiting();
104 model_->OnBubbleHidden();
105 EXPECT_EQ(model_->dismissal_reason(),
106 password_manager::metrics_util::NO_DIRECT_INTERACTION);
107 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE,
109 EXPECT_FALSE(controller()->saved_password());
110 EXPECT_FALSE(controller()->never_saved_password());
112 scoped_ptr<base::HistogramSamples> samples(
113 statistics_delta_reader.GetHistogramSamplesSinceCreation(
114 kUIDismissalReasonMetric));
117 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
118 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
119 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
121 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
123 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
124 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
127 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
130 TEST_F(ManagePasswordsBubbleModelTest, ClickSave) {
131 base::StatisticsDeltaReader statistics_delta_reader;
132 PretendPasswordWaiting();
133 model_->OnSaveClicked();
134 model_->OnBubbleHidden();
135 EXPECT_EQ(model_->dismissal_reason(),
136 password_manager::metrics_util::CLICKED_SAVE);
137 EXPECT_EQ(password_manager::ui::MANAGE_STATE, model_->state());
138 EXPECT_TRUE(controller()->saved_password());
139 EXPECT_FALSE(controller()->never_saved_password());
141 scoped_ptr<base::HistogramSamples> samples(
142 statistics_delta_reader.GetHistogramSamplesSinceCreation(
143 kUIDismissalReasonMetric));
146 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
147 EXPECT_EQ(1, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
148 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
150 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
152 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
153 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
156 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
159 TEST_F(ManagePasswordsBubbleModelTest, ClickNope) {
160 base::StatisticsDeltaReader statistics_delta_reader;
161 PretendPasswordWaiting();
162 model_->OnNopeClicked();
163 model_->OnBubbleHidden();
164 EXPECT_EQ(model_->dismissal_reason(),
165 password_manager::metrics_util::CLICKED_NOPE);
166 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, model_->state());
167 EXPECT_FALSE(controller()->saved_password());
168 EXPECT_FALSE(controller()->never_saved_password());
170 scoped_ptr<base::HistogramSamples> samples(
171 statistics_delta_reader.GetHistogramSamplesSinceCreation(
172 kUIDismissalReasonMetric));
175 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
176 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
177 EXPECT_EQ(1, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
179 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
181 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
182 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
185 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
188 TEST_F(ManagePasswordsBubbleModelTest, ClickNever) {
189 base::StatisticsDeltaReader statistics_delta_reader;
190 PretendPasswordWaiting();
191 model_->OnNeverForThisSiteClicked();
192 model_->OnBubbleHidden();
193 EXPECT_EQ(model_->dismissal_reason(),
194 password_manager::metrics_util::CLICKED_NEVER);
195 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, model_->state());
196 EXPECT_FALSE(controller()->saved_password());
197 EXPECT_TRUE(controller()->never_saved_password());
199 scoped_ptr<base::HistogramSamples> samples(
200 statistics_delta_reader.GetHistogramSamplesSinceCreation(
201 kUIDismissalReasonMetric));
204 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
205 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
206 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
208 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
210 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
211 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
214 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
217 TEST_F(ManagePasswordsBubbleModelTest, ClickManage) {
218 base::StatisticsDeltaReader statistics_delta_reader;
219 PretendManagingPasswords();
220 model_->OnManageLinkClicked();
221 model_->OnBubbleHidden();
222 EXPECT_EQ(model_->dismissal_reason(),
223 password_manager::metrics_util::CLICKED_MANAGE);
224 EXPECT_EQ(password_manager::ui::MANAGE_STATE, model_->state());
225 EXPECT_FALSE(controller()->saved_password());
226 EXPECT_FALSE(controller()->never_saved_password());
228 scoped_ptr<base::HistogramSamples> samples(
229 statistics_delta_reader.GetHistogramSamplesSinceCreation(
230 kUIDismissalReasonMetric));
233 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
234 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
235 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
237 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
239 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
240 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
243 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
246 TEST_F(ManagePasswordsBubbleModelTest, ClickDone) {
247 base::StatisticsDeltaReader statistics_delta_reader;
248 PretendManagingPasswords();
249 model_->OnDoneClicked();
250 model_->OnBubbleHidden();
251 EXPECT_EQ(model_->dismissal_reason(),
252 password_manager::metrics_util::CLICKED_DONE);
253 EXPECT_EQ(password_manager::ui::MANAGE_STATE, model_->state());
254 EXPECT_FALSE(controller()->saved_password());
255 EXPECT_FALSE(controller()->never_saved_password());
257 scoped_ptr<base::HistogramSamples> samples(
258 statistics_delta_reader.GetHistogramSamplesSinceCreation(
259 kUIDismissalReasonMetric));
262 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
263 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
264 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
266 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
268 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
269 EXPECT_EQ(1, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
272 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
275 TEST_F(ManagePasswordsBubbleModelTest, ClickUnblacklist) {
276 base::StatisticsDeltaReader statistics_delta_reader;
277 PretendBlacklisted();
278 model_->OnUnblacklistClicked();
279 model_->OnBubbleHidden();
280 EXPECT_EQ(model_->dismissal_reason(),
281 password_manager::metrics_util::CLICKED_UNBLACKLIST);
282 EXPECT_EQ(password_manager::ui::MANAGE_STATE, model_->state());
283 EXPECT_FALSE(controller()->saved_password());
284 EXPECT_FALSE(controller()->never_saved_password());
286 scoped_ptr<base::HistogramSamples> samples(
287 statistics_delta_reader.GetHistogramSamplesSinceCreation(
288 kUIDismissalReasonMetric));
291 samples->GetCount(password_manager::metrics_util::NO_DIRECT_INTERACTION));
292 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_SAVE));
293 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_NOPE));
295 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER));
297 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE));
298 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE));
301 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST));
304 TEST_F(ManagePasswordsBubbleModelTest, PasswordPendingUserDecision) {
305 EXPECT_FALSE(password_manager::ui::IsPendingState(model_->state()));
307 model_->set_state(password_manager::ui::INACTIVE_STATE);
308 EXPECT_FALSE(password_manager::ui::IsPendingState(model_->state()));
309 model_->set_state(password_manager::ui::MANAGE_STATE);
310 EXPECT_FALSE(password_manager::ui::IsPendingState(model_->state()));
311 model_->set_state(password_manager::ui::BLACKLIST_STATE);
312 EXPECT_FALSE(password_manager::ui::IsPendingState(model_->state()));
314 model_->set_state(password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE);
315 EXPECT_TRUE(password_manager::ui::IsPendingState(model_->state()));
316 model_->set_state(password_manager::ui::PENDING_PASSWORD_STATE);
317 EXPECT_TRUE(password_manager::ui::IsPendingState(model_->state()));