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 "components/password_manager/content/common/credential_manager_messages.h"
6 #include "components/password_manager/content/renderer/credential_manager_client.h"
7 #include "content/public/test/render_view_test.h"
8 #include "ipc/ipc_test_sink.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/WebKit/public/platform/WebCredential.h"
11 #include "third_party/WebKit/public/platform/WebCredentialManagerClient.h"
12 #include "third_party/WebKit/public/platform/WebCredentialManagerError.h"
13 #include "third_party/WebKit/public/platform/WebPasswordCredential.h"
15 namespace password_manager
{
19 class CredentialManagerClientTest
: public content::RenderViewTest
{
21 CredentialManagerClientTest()
22 : callback_errored_(false), callback_succeeded_(false) {}
23 ~CredentialManagerClientTest() override
{}
25 void SetUp() override
{
26 content::RenderViewTest::SetUp();
27 credential_
.reset(new blink::WebPasswordCredential("", "", "", GURL()));
28 client_
.reset(new CredentialManagerClient(view_
));
31 void TearDown() override
{
34 content::RenderViewTest::TearDown();
37 IPC::TestSink
& sink() { return render_thread_
->sink(); }
39 blink::WebCredential
* credential() { return credential_
.get(); }
41 // The browser's response to any of the messages the client sends must contain
42 // a request ID so that the client knows which request is being serviced. This
43 // method grabs the ID from an outgoing |message_id| message, and sets the
44 // |request_id| param to its value. If no request ID can be found, the method
45 // returns false, and the |request_id| is set to -1.
47 // Clears any pending messages upon return.
48 bool ExtractRequestId(uint32 message_id
, int& request_id
) {
50 const IPC::Message
* message
= sink().GetFirstMessageMatching(message_id
);
55 case CredentialManagerHostMsg_NotifyFailedSignIn::ID
: {
56 base::Tuple
<int, CredentialInfo
> param
;
57 CredentialManagerHostMsg_NotifyFailedSignIn::Read(message
, ¶m
);
58 request_id
= base::get
<0>(param
);
62 case CredentialManagerHostMsg_NotifySignedIn::ID
: {
63 base::Tuple
<int, CredentialInfo
> param
;
64 CredentialManagerHostMsg_NotifySignedIn::Read(message
, ¶m
);
65 request_id
= base::get
<0>(param
);
69 case CredentialManagerHostMsg_RequireUserMediation::ID
: {
70 base::Tuple
<int> param
;
71 CredentialManagerHostMsg_RequireUserMediation::Read(message
, ¶m
);
72 request_id
= base::get
<0>(param
);
76 case CredentialManagerHostMsg_RequestCredential::ID
: {
77 base::Tuple
<int, bool, std::vector
<GURL
>> param
;
78 CredentialManagerHostMsg_RequestCredential::Read(message
, ¶m
);
79 request_id
= base::get
<0>(param
);
86 sink().ClearMessages();
87 return request_id
!= -1;
90 bool callback_errored() const { return callback_errored_
; }
91 void set_callback_errored(bool state
) { callback_errored_
= state
; }
92 bool callback_succeeded() const { return callback_succeeded_
; }
93 void set_callback_succeeded(bool state
) { callback_succeeded_
= state
; }
96 scoped_ptr
<CredentialManagerClient
> client_
;
98 // True if a message's callback's 'onSuccess'/'onError' methods were called,
99 // false otherwise. We put these on the test object rather than on the
100 // Test*Callbacks objects because ownership of those objects passes into the
101 // client, which destroys the callbacks after calling them to resolve the
102 // pending Blink-side Promise.
103 bool callback_errored_
;
104 bool callback_succeeded_
;
106 scoped_ptr
<blink::WebPasswordCredential
> credential_
;
109 class TestNotificationCallbacks
110 : public blink::WebCredentialManagerClient::NotificationCallbacks
{
112 explicit TestNotificationCallbacks(CredentialManagerClientTest
* test
)
115 virtual ~TestNotificationCallbacks() {}
117 virtual void onSuccess() { test_
->set_callback_succeeded(true); }
119 virtual void onError(blink::WebCredentialManagerError
* reason
) {
120 test_
->set_callback_errored(true);
124 CredentialManagerClientTest
* test_
;
127 class TestRequestCallbacks
128 : public blink::WebCredentialManagerClient::RequestCallbacks
{
130 explicit TestRequestCallbacks(CredentialManagerClientTest
* test
)
133 virtual ~TestRequestCallbacks() {}
135 virtual void onSuccess(blink::WebCredential
*) {
136 test_
->set_callback_succeeded(true);
139 virtual void onError(blink::WebCredentialManagerError
* reason
) {
140 test_
->set_callback_errored(true);
144 CredentialManagerClientTest
* test_
;
149 TEST_F(CredentialManagerClientTest
, SendNotifyFailedSignIn
) {
151 EXPECT_FALSE(ExtractRequestId(CredentialManagerHostMsg_NotifyFailedSignIn::ID
,
154 scoped_ptr
<TestNotificationCallbacks
> callbacks(
155 new TestNotificationCallbacks(this));
156 client_
->dispatchFailedSignIn(*credential(), callbacks
.release());
158 EXPECT_TRUE(ExtractRequestId(CredentialManagerHostMsg_NotifyFailedSignIn::ID
,
161 client_
->OnAcknowledgeFailedSignIn(request_id
);
162 EXPECT_TRUE(callback_succeeded());
163 EXPECT_FALSE(callback_errored());
166 TEST_F(CredentialManagerClientTest
, SendNotifySignedIn
) {
168 EXPECT_FALSE(ExtractRequestId(CredentialManagerHostMsg_NotifySignedIn::ID
,
171 scoped_ptr
<TestNotificationCallbacks
> callbacks(
172 new TestNotificationCallbacks(this));
173 client_
->dispatchSignedIn(*credential(), callbacks
.release());
175 EXPECT_TRUE(ExtractRequestId(CredentialManagerHostMsg_NotifySignedIn::ID
,
178 client_
->OnAcknowledgeSignedIn(request_id
);
179 EXPECT_TRUE(callback_succeeded());
180 EXPECT_FALSE(callback_errored());
183 TEST_F(CredentialManagerClientTest
, SendRequestUserMediation
) {
185 EXPECT_FALSE(ExtractRequestId(
186 CredentialManagerHostMsg_RequireUserMediation::ID
, request_id
));
188 scoped_ptr
<TestNotificationCallbacks
> callbacks(
189 new TestNotificationCallbacks(this));
190 client_
->dispatchRequireUserMediation(callbacks
.release());
192 EXPECT_TRUE(ExtractRequestId(
193 CredentialManagerHostMsg_RequireUserMediation::ID
, request_id
));
195 client_
->OnAcknowledgeRequireUserMediation(request_id
);
196 EXPECT_TRUE(callback_succeeded());
197 EXPECT_FALSE(callback_errored());
200 TEST_F(CredentialManagerClientTest
, SendRequestCredential
) {
202 EXPECT_FALSE(ExtractRequestId(CredentialManagerHostMsg_RequestCredential::ID
,
205 scoped_ptr
<TestRequestCallbacks
> callbacks(new TestRequestCallbacks(this));
206 std::vector
<GURL
> federations
;
207 client_
->dispatchRequest(false, federations
, callbacks
.release());
209 EXPECT_TRUE(ExtractRequestId(CredentialManagerHostMsg_RequestCredential::ID
,
213 info
.type
= CredentialType::CREDENTIAL_TYPE_PASSWORD
;
214 client_
->OnSendCredential(request_id
, info
);
215 EXPECT_TRUE(callback_succeeded());
216 EXPECT_FALSE(callback_errored());
219 TEST_F(CredentialManagerClientTest
, SendRequestCredentialEmpty
) {
221 EXPECT_FALSE(ExtractRequestId(CredentialManagerHostMsg_RequestCredential::ID
,
224 scoped_ptr
<TestRequestCallbacks
> callbacks(new TestRequestCallbacks(this));
225 std::vector
<GURL
> federations
;
226 client_
->dispatchRequest(false, federations
, callbacks
.release());
228 EXPECT_TRUE(ExtractRequestId(CredentialManagerHostMsg_RequestCredential::ID
,
231 CredentialInfo info
; // Send an empty credential in response.
232 client_
->OnSendCredential(request_id
, info
);
233 EXPECT_TRUE(callback_succeeded());
234 EXPECT_FALSE(callback_errored());
237 } // namespace password_manager