Home | History | Annotate | Download | only in passwords
      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