Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: chrome/browser/password_manager/chrome_password_manager_client_unittest.cc

Issue 1415533013: Fix password manager internals renderer reporting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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/password_manager/chrome_password_manager_client.h" 5 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/metrics/field_trial.h" 8 #include "base/metrics/field_trial.h"
9 #include "base/prefs/pref_registry_simple.h" 9 #include "base/prefs/pref_registry_simple.h"
10 #include "base/prefs/pref_service.h" 10 #include "base/prefs/pref_service.h"
11 #include "base/prefs/testing_pref_service.h" 11 #include "base/prefs/testing_pref_service.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/sync/profile_sync_service_factory.h" 14 #include "chrome/browser/sync/profile_sync_service_factory.h"
15 #include "chrome/browser/sync/profile_sync_service_mock.h" 15 #include "chrome/browser/sync/profile_sync_service_mock.h"
16 #include "chrome/common/channel_info.h" 16 #include "chrome/common/channel_info.h"
17 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 17 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
18 #include "chrome/test/base/testing_profile.h" 18 #include "chrome/test/base/testing_profile.h"
19 #include "components/autofill/content/common/autofill_messages.h" 19 #include "components/autofill/content/common/autofill_messages.h"
20 #include "components/password_manager/content/browser/password_manager_internals _service_factory.h" 20 #include "components/password_manager/content/browser/password_manager_internals _service_factory.h"
21 #include "components/password_manager/content/common/credential_manager_messages .h" 21 #include "components/password_manager/content/common/credential_manager_messages .h"
22 #include "components/password_manager/core/browser/credentials_filter.h" 22 #include "components/password_manager/core/browser/credentials_filter.h"
23 #include "components/password_manager/core/browser/log_receiver.h"
24 #include "components/password_manager/core/browser/password_manager_internals_se rvice.h"
25 #include "components/password_manager/core/common/credential_manager_types.h" 23 #include "components/password_manager/core/common/credential_manager_types.h"
26 #include "components/password_manager/core/common/password_manager_pref_names.h" 24 #include "components/password_manager/core/common/password_manager_pref_names.h"
27 #include "components/password_manager/core/common/password_manager_switches.h" 25 #include "components/password_manager/core/common/password_manager_switches.h"
28 #include "components/syncable_prefs/testing_pref_service_syncable.h" 26 #include "components/syncable_prefs/testing_pref_service_syncable.h"
29 #include "components/version_info/version_info.h" 27 #include "components/version_info/version_info.h"
30 #include "content/public/browser/browser_context.h" 28 #include "content/public/browser/browser_context.h"
31 #include "content/public/browser/web_contents.h" 29 #include "content/public/browser/web_contents.h"
32 #include "content/public/test/mock_render_process_host.h" 30 #include "content/public/test/mock_render_process_host.h"
33 #include "testing/gmock/include/gmock/gmock.h" 31 #include "testing/gmock/include/gmock/gmock.h"
34 #include "testing/gtest/include/gtest/gtest.h" 32 #include "testing/gtest/include/gtest/gtest.h"
35 33
36 using content::BrowserContext; 34 using content::BrowserContext;
37 using content::WebContents; 35 using content::WebContents;
38 using testing::Return; 36 using testing::Return;
39 using testing::_; 37 using testing::_;
40 38
41 namespace { 39 namespace {
42 40
43 const char kPasswordManagerSettingsBehaviourChangeFieldTrialName[] = 41 const char kPasswordManagerSettingsBehaviourChangeFieldTrialName[] =
44 "PasswordManagerSettingsBehaviourChange"; 42 "PasswordManagerSettingsBehaviourChange";
45 const char kPasswordManagerSettingsBehaviourChangeEnabledGroupName[] = 43 const char kPasswordManagerSettingsBehaviourChangeEnabledGroupName[] =
46 "PasswordManagerSettingsBehaviourChange.Active"; 44 "PasswordManagerSettingsBehaviourChange.Active";
47 const char kPasswordManagerSettingsBehaviourChangeDisabledGroupName[] = 45 const char kPasswordManagerSettingsBehaviourChangeDisabledGroupName[] =
48 "PasswordManagerSettingsBehaviourChange.NotActive"; 46 "PasswordManagerSettingsBehaviourChange.NotActive";
49 47
50 const char kTestText[] = "abcd1234";
51
52 class MockLogReceiver : public password_manager::LogReceiver {
53 public:
54 MOCK_METHOD1(LogSavePasswordProgress, void(const std::string&));
55 };
56
57 // TODO(vabr): Get rid of the mocked client in the client's own test, see 48 // TODO(vabr): Get rid of the mocked client in the client's own test, see
58 // http://crbug.com/474577. 49 // http://crbug.com/474577.
59 class MockChromePasswordManagerClient : public ChromePasswordManagerClient { 50 class MockChromePasswordManagerClient : public ChromePasswordManagerClient {
60 public: 51 public:
61 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); 52 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool());
62 53
63 explicit MockChromePasswordManagerClient(content::WebContents* web_contents) 54 explicit MockChromePasswordManagerClient(content::WebContents* web_contents)
64 : ChromePasswordManagerClient(web_contents, nullptr) { 55 : ChromePasswordManagerClient(web_contents, nullptr) {
65 ON_CALL(*this, DidLastPageLoadEncounterSSLErrors()) 56 ON_CALL(*this, DidLastPageLoadEncounterSSLErrors())
66 .WillByDefault(testing::Return(false)); 57 .WillByDefault(testing::Return(false));
67 } 58 }
68 ~MockChromePasswordManagerClient() override {} 59 ~MockChromePasswordManagerClient() override {}
69 60
70 private: 61 private:
71 DISALLOW_COPY_AND_ASSIGN(MockChromePasswordManagerClient); 62 DISALLOW_COPY_AND_ASSIGN(MockChromePasswordManagerClient);
72 }; 63 };
73 64
74 } // namespace 65 } // namespace
75 66
76 class ChromePasswordManagerClientTest : public ChromeRenderViewHostTestHarness { 67 class ChromePasswordManagerClientTest : public ChromeRenderViewHostTestHarness {
77 public: 68 public:
78 ChromePasswordManagerClientTest() 69 ChromePasswordManagerClientTest() : field_trial_list_(nullptr) {}
79 : service_(nullptr), field_trial_list_(nullptr) {}
80 void SetUp() override; 70 void SetUp() override;
81 71
82 syncable_prefs::TestingPrefServiceSyncable* prefs() { 72 syncable_prefs::TestingPrefServiceSyncable* prefs() {
83 return profile()->GetTestingPrefService(); 73 return profile()->GetTestingPrefService();
84 } 74 }
85 75
86 void EnforcePasswordManagerSettingsBehaviourChangeExperimentGroup( 76 void EnforcePasswordManagerSettingsBehaviourChangeExperimentGroup(
87 const char* name) { 77 const char* name) {
88 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( 78 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
89 kPasswordManagerSettingsBehaviourChangeFieldTrialName, name)); 79 kPasswordManagerSettingsBehaviourChangeFieldTrialName, name));
90 } 80 }
91 81
92 protected: 82 protected:
93 ChromePasswordManagerClient* GetClient(); 83 ChromePasswordManagerClient* GetClient();
94 84
95 // If the test IPC sink contains an AutofillMsg_SetLoggingState message, then 85 // If the test IPC sink contains an AutofillMsg_SetLoggingState message, then
96 // copies its argument into |activation_flag| and returns true. Otherwise 86 // copies its argument into |activation_flag| and returns true. Otherwise
97 // returns false. 87 // returns false.
98 bool WasLoggingActivationMessageSent(bool* activation_flag); 88 bool WasLoggingActivationMessageSent(bool* activation_flag);
99 89
100 password_manager::PasswordManagerInternalsService* service_;
101
102 testing::StrictMock<MockLogReceiver> receiver_;
103 TestingPrefServiceSimple prefs_; 90 TestingPrefServiceSimple prefs_;
104 base::FieldTrialList field_trial_list_; 91 base::FieldTrialList field_trial_list_;
105 }; 92 };
106 93
107 void ChromePasswordManagerClientTest::SetUp() { 94 void ChromePasswordManagerClientTest::SetUp() {
108 ChromeRenderViewHostTestHarness::SetUp(); 95 ChromeRenderViewHostTestHarness::SetUp();
109 prefs_.registry()->RegisterBooleanPref( 96 prefs_.registry()->RegisterBooleanPref(
110 password_manager::prefs::kPasswordManagerSavingEnabled, true); 97 password_manager::prefs::kPasswordManagerSavingEnabled, true);
111 ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( 98 ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
112 web_contents(), nullptr); 99 web_contents(), nullptr);
113 service_ = password_manager::PasswordManagerInternalsServiceFactory::
114 GetForBrowserContext(profile());
115 ASSERT_TRUE(service_);
116 } 100 }
117 101
118 ChromePasswordManagerClient* ChromePasswordManagerClientTest::GetClient() { 102 ChromePasswordManagerClient* ChromePasswordManagerClientTest::GetClient() {
119 return ChromePasswordManagerClient::FromWebContents(web_contents()); 103 return ChromePasswordManagerClient::FromWebContents(web_contents());
120 } 104 }
121 105
122 bool ChromePasswordManagerClientTest::WasLoggingActivationMessageSent( 106 bool ChromePasswordManagerClientTest::WasLoggingActivationMessageSent(
123 bool* activation_flag) { 107 bool* activation_flag) {
124 const uint32 kMsgID = AutofillMsg_SetLoggingState::ID; 108 const uint32 kMsgID = AutofillMsg_SetLoggingState::ID;
125 const IPC::Message* message = 109 const IPC::Message* message =
126 process()->sink().GetFirstMessageMatching(kMsgID); 110 process()->sink().GetFirstMessageMatching(kMsgID);
127 if (!message) 111 if (!message)
128 return false; 112 return false;
129 base::Tuple<bool> param; 113 base::Tuple<bool> param;
130 AutofillMsg_SetLoggingState::Read(message, &param); 114 AutofillMsg_SetLoggingState::Read(message, &param);
131 *activation_flag = base::get<0>(param); 115 *activation_flag = base::get<0>(param);
132 process()->sink().ClearMessages(); 116 process()->sink().ClearMessages();
133 return true; 117 return true;
134 } 118 }
135 119
136 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNoReceiver) {
137 ChromePasswordManagerClient* client = GetClient();
138
139 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0);
140 // Before attaching the receiver, no text should be passed.
141 client->LogSavePasswordProgress(kTestText);
142 EXPECT_FALSE(client->IsLoggingActive());
143 }
144
145 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressAttachReceiver) {
146 ChromePasswordManagerClient* client = GetClient();
147 EXPECT_FALSE(client->IsLoggingActive());
148
149 // After attaching the logger, text should be passed.
150 service_->RegisterReceiver(&receiver_);
151 EXPECT_TRUE(client->IsLoggingActive());
152 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
153 client->LogSavePasswordProgress(kTestText);
154 service_->UnregisterReceiver(&receiver_);
155 EXPECT_FALSE(client->IsLoggingActive());
156 }
157
158 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressDetachReceiver) {
159 ChromePasswordManagerClient* client = GetClient();
160
161 service_->RegisterReceiver(&receiver_);
162 EXPECT_TRUE(client->IsLoggingActive());
163 service_->UnregisterReceiver(&receiver_);
164 EXPECT_FALSE(client->IsLoggingActive());
165
166 // After detaching the logger, no text should be passed.
167 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0);
168 client->LogSavePasswordProgress(kTestText);
169 }
170
171 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNotifyRenderer) { 120 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNotifyRenderer) {
172 ChromePasswordManagerClient* client = GetClient(); 121 ChromePasswordManagerClient* client = GetClient();
173 bool logging_active = false; 122 bool logging_active = false;
123 // Ensure the existence of a driver, which will send the IPCs we listen for
124 // below.
125 NavigateAndCommit(GURL("about:blank"));
174 126
175 // Initially, the logging should be off, so no IPC messages. 127 // Initially, the logging should be off, so no IPC messages.
176 EXPECT_FALSE(WasLoggingActivationMessageSent(&logging_active)); 128 EXPECT_FALSE(WasLoggingActivationMessageSent(&logging_active));
177 129
178 service_->RegisterReceiver(&receiver_); 130 client->NotifyDriversAboutLoggingAvailability(true);
179 EXPECT_TRUE(client->IsLoggingActive());
180 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); 131 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active));
181 EXPECT_TRUE(logging_active); 132 EXPECT_TRUE(logging_active);
182 133
183 service_->UnregisterReceiver(&receiver_); 134 client->NotifyDriversAboutLoggingAvailability(false);
184 EXPECT_FALSE(client->IsLoggingActive());
185 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); 135 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active));
186 EXPECT_FALSE(logging_active); 136 EXPECT_FALSE(logging_active);
187 } 137 }
188
189 TEST_F(ChromePasswordManagerClientTest, AnswerToPingsAboutLoggingState_Active) {
190 service_->RegisterReceiver(&receiver_);
191
192 process()->sink().ClearMessages();
193
194 // Ping the client for logging activity update.
195 AutofillHostMsg_PasswordAutofillAgentConstructed msg(0);
196 static_cast<content::WebContentsObserver*>(GetClient())->OnMessageReceived(
197 msg, web_contents()->GetMainFrame());
198
199 bool logging_active = false;
200 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active));
201 EXPECT_TRUE(logging_active);
202
203 service_->UnregisterReceiver(&receiver_);
204 }
205
206 TEST_F(ChromePasswordManagerClientTest,
207 AnswerToPingsAboutLoggingState_Inactive) {
208 process()->sink().ClearMessages();
209
210 // Ping the client for logging activity update.
211 AutofillHostMsg_PasswordAutofillAgentConstructed msg(0);
212 static_cast<content::WebContentsObserver*>(GetClient())->OnMessageReceived(
213 msg, web_contents()->GetMainFrame());
214
215 bool logging_active = true;
216 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active));
217 EXPECT_FALSE(logging_active);
218 }
219 138
220 TEST_F(ChromePasswordManagerClientTest, 139 TEST_F(ChromePasswordManagerClientTest,
221 IsAutomaticPasswordSavingEnabledDefaultBehaviourTest) { 140 IsAutomaticPasswordSavingEnabledDefaultBehaviourTest) {
222 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); 141 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled());
223 } 142 }
224 143
225 TEST_F(ChromePasswordManagerClientTest, 144 TEST_F(ChromePasswordManagerClientTest,
226 IsAutomaticPasswordSavingEnabledWhenFlagIsSetTest) { 145 IsAutomaticPasswordSavingEnabledWhenFlagIsSetTest) {
227 base::CommandLine::ForCurrentProcess()->AppendSwitch( 146 base::CommandLine::ForCurrentProcess()->AppendSwitch(
228 password_manager::switches::kEnableAutomaticPasswordSaving); 147 password_manager::switches::kEnableAutomaticPasswordSaving);
229 if (chrome::GetChannel() == version_info::Channel::UNKNOWN) 148 if (chrome::GetChannel() == version_info::Channel::UNKNOWN)
230 EXPECT_TRUE(GetClient()->IsAutomaticPasswordSavingEnabled()); 149 EXPECT_TRUE(GetClient()->IsAutomaticPasswordSavingEnabled());
231 else 150 else
232 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); 151 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled());
233 } 152 }
234 153
235 TEST_F(ChromePasswordManagerClientTest, LogToAReceiver) {
236 ChromePasswordManagerClient* client = GetClient();
237 service_->RegisterReceiver(&receiver_);
238 EXPECT_TRUE(client->IsLoggingActive());
239
240 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
241 client->LogSavePasswordProgress(kTestText);
242
243 service_->UnregisterReceiver(&receiver_);
244 EXPECT_FALSE(client->IsLoggingActive());
245 }
246
247 TEST_F(ChromePasswordManagerClientTest, GetPasswordSyncState) { 154 TEST_F(ChromePasswordManagerClientTest, GetPasswordSyncState) {
248 ChromePasswordManagerClient* client = GetClient(); 155 ChromePasswordManagerClient* client = GetClient();
249 156
250 ProfileSyncServiceMock* mock_sync_service = 157 ProfileSyncServiceMock* mock_sync_service =
251 static_cast<ProfileSyncServiceMock*>( 158 static_cast<ProfileSyncServiceMock*>(
252 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( 159 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
253 profile(), ProfileSyncServiceMock::BuildMockProfileSyncService)); 160 profile(), ProfileSyncServiceMock::BuildMockProfileSyncService));
254 161
255 syncer::ModelTypeSet active_types; 162 syncer::ModelTypeSet active_types;
256 active_types.Put(syncer::PASSWORDS); 163 active_types.Put(syncer::PASSWORDS);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 EXPECT_EQ(GURL::EmptyGURL(), GetClient()->GetLastCommittedEntryURL()); 304 EXPECT_EQ(GURL::EmptyGURL(), GetClient()->GetLastCommittedEntryURL());
398 } 305 }
399 306
400 TEST_F(ChromePasswordManagerClientTest, GetLastCommittedEntryURL) { 307 TEST_F(ChromePasswordManagerClientTest, GetLastCommittedEntryURL) {
401 GURL kUrl( 308 GURL kUrl(
402 "https://accounts.google.com/ServiceLogin?continue=" 309 "https://accounts.google.com/ServiceLogin?continue="
403 "https://passwords.google.com/settings"); 310 "https://passwords.google.com/settings");
404 NavigateAndCommit(kUrl); 311 NavigateAndCommit(kUrl);
405 EXPECT_EQ(kUrl, GetClient()->GetLastCommittedEntryURL()); 312 EXPECT_EQ(kUrl, GetClient()->GetLastCommittedEntryURL());
406 } 313 }
314
315 TEST_F(ChromePasswordManagerClientTest, GetLogRouter) {
316 EXPECT_TRUE(GetClient()->GetLogRouter());
317 }
318
319 TEST_F(ChromePasswordManagerClientTest, GetLogRouter_WebUI) {
320 // No router for WebUI.
321 NavigateAndCommit(GURL("about:password-manager-internals"));
322 EXPECT_FALSE(GetClient()->GetLogRouter());
323 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698