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. 4 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" 18 19 const char kUIDismissalReasonMetric[] = "PasswordManager.UIDismissalReason"; 20 21 class ManagePasswordsBubbleModelTest : public testing::Test { 22 public: 23 ManagePasswordsBubbleModelTest() 24 : test_web_contents_( 25 content::WebContentsTester::CreateTestWebContents(&profile_, 26 NULL)) {} 27 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()); 32 33 model_.reset(new ManagePasswordsBubbleModel(test_web_contents_.get())); 34 } 35 36 virtual void TearDown() OVERRIDE { model_.reset(); } 37 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); 43 } 44 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); 49 } 50 51 void PretendBlacklisted() { 52 model_->set_state(password_manager::ui::BLACKLIST_STATE); 53 model_->OnBubbleShown(ManagePasswordsBubble::USER_ACTION); 54 55 base::string16 kTestUsername = base::ASCIIToUTF16("test_username"); 56 autofill::PasswordFormMap map; 57 map[kTestUsername] = &test_form_; 58 controller()->SetPasswordFormMap(map); 59 controller()->SetState(password_manager::ui::BLACKLIST_STATE); 60 } 61 62 ManagePasswordsUIControllerMock* controller() { 63 return static_cast<ManagePasswordsUIControllerMock*>( 64 ManagePasswordsUIController::FromWebContents( 65 test_web_contents_.get())); 66 } 67 68 protected: 69 scoped_ptr<ManagePasswordsBubbleModel> model_; 70 autofill::PasswordForm test_form_; 71 72 private: 73 content::TestBrowserThreadBundle thread_bundle_; 74 TestingProfile profile_; 75 scoped_ptr<content::WebContents> test_web_contents_; 76 }; 77 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()); 85 } 86 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()); 94 95 scoped_ptr<base::HistogramSamples> samples( 96 statistics_delta_reader.GetHistogramSamplesSinceCreation( 97 kUIDismissalReasonMetric)); 98 EXPECT_EQ(NULL, samples.get()); 99 } 100 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, 108 model_->state()); 109 EXPECT_FALSE(controller()->saved_password()); 110 EXPECT_FALSE(controller()->never_saved_password()); 111 112 scoped_ptr<base::HistogramSamples> samples( 113 statistics_delta_reader.GetHistogramSamplesSinceCreation( 114 kUIDismissalReasonMetric)); 115 EXPECT_EQ( 116 1, 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)); 120 EXPECT_EQ(0, 121 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 122 EXPECT_EQ(0, 123 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 124 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 125 EXPECT_EQ( 126 0, 127 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 128 } 129 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()); 140 141 scoped_ptr<base::HistogramSamples> samples( 142 statistics_delta_reader.GetHistogramSamplesSinceCreation( 143 kUIDismissalReasonMetric)); 144 EXPECT_EQ( 145 0, 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)); 149 EXPECT_EQ(0, 150 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 151 EXPECT_EQ(0, 152 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 153 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 154 EXPECT_EQ( 155 0, 156 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 157 } 158 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()); 169 170 scoped_ptr<base::HistogramSamples> samples( 171 statistics_delta_reader.GetHistogramSamplesSinceCreation( 172 kUIDismissalReasonMetric)); 173 EXPECT_EQ( 174 0, 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)); 178 EXPECT_EQ(0, 179 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 180 EXPECT_EQ(0, 181 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 182 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 183 EXPECT_EQ( 184 0, 185 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 186 } 187 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()); 198 199 scoped_ptr<base::HistogramSamples> samples( 200 statistics_delta_reader.GetHistogramSamplesSinceCreation( 201 kUIDismissalReasonMetric)); 202 EXPECT_EQ( 203 0, 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)); 207 EXPECT_EQ(1, 208 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 209 EXPECT_EQ(0, 210 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 211 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 212 EXPECT_EQ( 213 0, 214 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 215 } 216 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()); 227 228 scoped_ptr<base::HistogramSamples> samples( 229 statistics_delta_reader.GetHistogramSamplesSinceCreation( 230 kUIDismissalReasonMetric)); 231 EXPECT_EQ( 232 0, 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)); 236 EXPECT_EQ(0, 237 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 238 EXPECT_EQ(1, 239 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 240 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 241 EXPECT_EQ( 242 0, 243 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 244 } 245 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()); 256 257 scoped_ptr<base::HistogramSamples> samples( 258 statistics_delta_reader.GetHistogramSamplesSinceCreation( 259 kUIDismissalReasonMetric)); 260 EXPECT_EQ( 261 0, 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)); 265 EXPECT_EQ(0, 266 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 267 EXPECT_EQ(0, 268 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 269 EXPECT_EQ(1, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 270 EXPECT_EQ( 271 0, 272 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 273 } 274 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()); 285 286 scoped_ptr<base::HistogramSamples> samples( 287 statistics_delta_reader.GetHistogramSamplesSinceCreation( 288 kUIDismissalReasonMetric)); 289 EXPECT_EQ( 290 0, 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)); 294 EXPECT_EQ(0, 295 samples->GetCount(password_manager::metrics_util::CLICKED_NEVER)); 296 EXPECT_EQ(0, 297 samples->GetCount(password_manager::metrics_util::CLICKED_MANAGE)); 298 EXPECT_EQ(0, samples->GetCount(password_manager::metrics_util::CLICKED_DONE)); 299 EXPECT_EQ( 300 1, 301 samples->GetCount(password_manager::metrics_util::CLICKED_UNBLACKLIST)); 302 } 303 304 TEST_F(ManagePasswordsBubbleModelTest, PasswordPendingUserDecision) { 305 EXPECT_FALSE(password_manager::ui::IsPendingState(model_->state())); 306 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())); 313 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())); 318 } 319