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

Side by Side Diff: android_webview/native/aw_contents_client_bridge_unittest.cc

Issue 859213006: Cancel client auth requests when not promptable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@client-auth-cancel-1
Patch Set: extension test Created 5 years, 10 months 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 "android_webview/native/aw_contents_client_bridge.h" 5 #include "android_webview/native/aw_contents_client_bridge.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h" 8 #include "base/android/jni_array.h"
9 #include "base/android/scoped_java_ref.h" 9 #include "base/android/scoped_java_ref.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/macros.h"
11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
12 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "content/public/browser/client_certificate_delegate.h"
13 #include "content/public/test/test_browser_thread_bundle.h" 15 #include "content/public/test/test_browser_thread_bundle.h"
14 #include "jni/MockAwContentsClientBridge_jni.h" 16 #include "jni/MockAwContentsClientBridge_jni.h"
15 #include "net/android/net_jni_registrar.h" 17 #include "net/android/net_jni_registrar.h"
16 #include "net/ssl/ssl_cert_request_info.h" 18 #include "net/ssl/ssl_cert_request_info.h"
17 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 22
21 using base::android::AttachCurrentThread; 23 using base::android::AttachCurrentThread;
22 using base::android::ScopedJavaLocalRef; 24 using base::android::ScopedJavaLocalRef;
23 using net::SSLCertRequestInfo; 25 using net::SSLCertRequestInfo;
24 using net::SSLClientCertType; 26 using net::SSLClientCertType;
25 using net::X509Certificate; 27 using net::X509Certificate;
26 using testing::NotNull; 28 using testing::NotNull;
27 using testing::Test; 29 using testing::Test;
28 30
29 namespace android_webview { 31 namespace android_webview {
30 32
31 namespace { 33 namespace {
32 34
33 // Tests the android_webview contents client bridge. 35 // Tests the android_webview contents client bridge.
34 class AwContentsClientBridgeTest : public Test { 36 class AwContentsClientBridgeTest : public Test {
35 public: 37 public:
36 typedef AwContentsClientBridge::SelectCertificateCallback 38 AwContentsClientBridgeTest() { }
37 SelectCertificateCallback;
38 39
39 AwContentsClientBridgeTest() { } 40 scoped_ptr<content::ClientCertificateDelegate> CreateDelegate();
40 41
41 // Callback method called when a cert is selected. 42 // Callback method called when a cert is selected.
42 void CertSelected(X509Certificate* cert); 43 void CertSelected(X509Certificate* cert);
43 protected: 44 protected:
44 void SetUp() override; 45 void SetUp() override;
45 void TestCertType(SSLClientCertType type, const std::string& expected_name); 46 void TestCertType(SSLClientCertType type, const std::string& expected_name);
46 // Create the TestBrowserThreads. Just instantiate the member variable. 47 // Create the TestBrowserThreads. Just instantiate the member variable.
47 content::TestBrowserThreadBundle thread_bundle_; 48 content::TestBrowserThreadBundle thread_bundle_;
48 base::android::ScopedJavaGlobalRef<jobject> jbridge_; 49 base::android::ScopedJavaGlobalRef<jobject> jbridge_;
49 scoped_ptr<AwContentsClientBridge> bridge_; 50 scoped_ptr<AwContentsClientBridge> bridge_;
50 scoped_refptr<SSLCertRequestInfo> cert_request_info_; 51 scoped_refptr<SSLCertRequestInfo> cert_request_info_;
51 X509Certificate* selected_cert_; 52 X509Certificate* selected_cert_;
52 int cert_selected_callbacks_; 53 int cert_selected_callbacks_;
53 JNIEnv* env_; 54 JNIEnv* env_;
54 }; 55 };
55 56
57 class TestClientCertificateDelegate
58 : public content::ClientCertificateDelegate {
59 public:
60 TestClientCertificateDelegate(AwContentsClientBridgeTest* test)
61 : test_(test) {}
62
63 // content::ClientCertificateDelegate.
64 void ContinueWithCertificate(net::X509Certificate* cert) override {
65 test_->CertSelected(cert);
66 }
67
68 void CancelCertificateSelection() override {
69 ADD_FAILURE() << "Selection canceled";
70 }
71
72 private:
73 AwContentsClientBridgeTest* test_;
74 DISALLOW_COPY_AND_ASSIGN(TestClientCertificateDelegate);
75 };
76
56 } // namespace 77 } // namespace
57 78
58 void AwContentsClientBridgeTest::SetUp() { 79 void AwContentsClientBridgeTest::SetUp() {
59 env_ = AttachCurrentThread(); 80 env_ = AttachCurrentThread();
60 ASSERT_THAT(env_, NotNull()); 81 ASSERT_THAT(env_, NotNull());
61 ASSERT_TRUE(android_webview::RegisterAwContentsClientBridge(env_)); 82 ASSERT_TRUE(android_webview::RegisterAwContentsClientBridge(env_));
62 ASSERT_TRUE(RegisterNativesImpl(env_)); 83 ASSERT_TRUE(RegisterNativesImpl(env_));
63 ASSERT_TRUE(net::android::RegisterJni(env_)); 84 ASSERT_TRUE(net::android::RegisterJni(env_));
64 jbridge_.Reset(env_, 85 jbridge_.Reset(env_,
65 Java_MockAwContentsClientBridge_getAwContentsClientBridge(env_).obj()); 86 Java_MockAwContentsClientBridge_getAwContentsClientBridge(env_).obj());
66 bridge_.reset(new AwContentsClientBridge(env_, jbridge_.obj())); 87 bridge_.reset(new AwContentsClientBridge(env_, jbridge_.obj()));
67 selected_cert_ = NULL; 88 selected_cert_ = NULL;
68 cert_selected_callbacks_ = 0; 89 cert_selected_callbacks_ = 0;
69 cert_request_info_ = new net::SSLCertRequestInfo; 90 cert_request_info_ = new net::SSLCertRequestInfo;
70 } 91 }
71 92
93 scoped_ptr<content::ClientCertificateDelegate>
94 AwContentsClientBridgeTest::CreateDelegate() {
95 return scoped_ptr<content::ClientCertificateDelegate>(
96 new TestClientCertificateDelegate(this));
97 }
98
72 void AwContentsClientBridgeTest::CertSelected(X509Certificate* cert) { 99 void AwContentsClientBridgeTest::CertSelected(X509Certificate* cert) {
73 selected_cert_ = cert; 100 selected_cert_ = cert;
74 cert_selected_callbacks_++; 101 cert_selected_callbacks_++;
75 } 102 }
76 103
77 TEST_F(AwContentsClientBridgeTest, TestClientCertKeyTypesCorrectlyEncoded) { 104 TEST_F(AwContentsClientBridgeTest, TestClientCertKeyTypesCorrectlyEncoded) {
78 SSLClientCertType cert_types[3] = {net::CLIENT_CERT_RSA_SIGN, 105 SSLClientCertType cert_types[3] = {net::CLIENT_CERT_RSA_SIGN,
79 net::CLIENT_CERT_DSS_SIGN, net::CLIENT_CERT_ECDSA_SIGN}; 106 net::CLIENT_CERT_DSS_SIGN, net::CLIENT_CERT_ECDSA_SIGN};
80 std::string expected_names[3] = {"RSA", "DSA" ,"ECDSA"}; 107 std::string expected_names[3] = {"RSA", "DSA" ,"ECDSA"};
81 108
82 for(int i = 0; i < 3; i++) { 109 for(int i = 0; i < 3; i++) {
83 TestCertType(cert_types[i], expected_names[i]); 110 TestCertType(cert_types[i], expected_names[i]);
84 } 111 }
85 } 112 }
86 113
87 void AwContentsClientBridgeTest::TestCertType(SSLClientCertType type, 114 void AwContentsClientBridgeTest::TestCertType(SSLClientCertType type,
88 const std::string& expected_name) { 115 const std::string& expected_name) {
89 cert_request_info_->cert_key_types.clear(); 116 cert_request_info_->cert_key_types.clear();
90 cert_request_info_->cert_key_types.push_back(type); 117 cert_request_info_->cert_key_types.push_back(type);
91 bridge_->SelectClientCertificate( 118 bridge_->SelectClientCertificate(cert_request_info_.get(), CreateDelegate());
92 cert_request_info_.get(),
93 base::Bind(
94 &AwContentsClientBridgeTest::CertSelected,
95 base::Unretained(static_cast<AwContentsClientBridgeTest*>(this))));
96 base::RunLoop().RunUntilIdle(); 119 base::RunLoop().RunUntilIdle();
97 EXPECT_EQ(0, cert_selected_callbacks_); 120 EXPECT_EQ(0, cert_selected_callbacks_);
98 ScopedJavaLocalRef<jobjectArray> key_types = 121 ScopedJavaLocalRef<jobjectArray> key_types =
99 Java_MockAwContentsClientBridge_getKeyTypes(env_, jbridge_.obj()); 122 Java_MockAwContentsClientBridge_getKeyTypes(env_, jbridge_.obj());
100 std::vector<std::string> vec; 123 std::vector<std::string> vec;
101 base::android::AppendJavaStringArrayToStringVector(env_, 124 base::android::AppendJavaStringArrayToStringVector(env_,
102 key_types.obj(), 125 key_types.obj(),
103 &vec); 126 &vec);
104 EXPECT_EQ(1u, vec.size()); 127 EXPECT_EQ(1u, vec.size());
105 EXPECT_EQ(expected_name, vec[0]); 128 EXPECT_EQ(expected_name, vec[0]);
106 } 129 }
107 130
108 // Verify that ProvideClientCertificateResponse works properly when the client 131 // Verify that ProvideClientCertificateResponse works properly when the client
109 // responds with a null key. 132 // responds with a null key.
110 TEST_F(AwContentsClientBridgeTest, 133 TEST_F(AwContentsClientBridgeTest,
111 TestProvideClientCertificateResponseCallsCallbackOnNullKey) { 134 TestProvideClientCertificateResponseCallsCallbackOnNullKey) {
112 // Call SelectClientCertificate to create a callback id that mock java object 135 // Call SelectClientCertificate to create a callback id that mock java object
113 // can call on. 136 // can call on.
114 bridge_->SelectClientCertificate( 137 bridge_->SelectClientCertificate(cert_request_info_.get(), CreateDelegate());
115 cert_request_info_.get(),
116 base::Bind(
117 &AwContentsClientBridgeTest::CertSelected,
118 base::Unretained(static_cast<AwContentsClientBridgeTest*>(this))));
119 bridge_->ProvideClientCertificateResponse(env_, jbridge_.obj(), 138 bridge_->ProvideClientCertificateResponse(env_, jbridge_.obj(),
120 Java_MockAwContentsClientBridge_getRequestId(env_, jbridge_.obj()), 139 Java_MockAwContentsClientBridge_getRequestId(env_, jbridge_.obj()),
121 Java_MockAwContentsClientBridge_createTestCertChain( 140 Java_MockAwContentsClientBridge_createTestCertChain(
122 env_, jbridge_.obj()).obj(), 141 env_, jbridge_.obj()).obj(),
123 NULL); 142 NULL);
124 base::RunLoop().RunUntilIdle(); 143 base::RunLoop().RunUntilIdle();
125 EXPECT_EQ(NULL, selected_cert_); 144 EXPECT_EQ(NULL, selected_cert_);
126 EXPECT_EQ(1, cert_selected_callbacks_); 145 EXPECT_EQ(1, cert_selected_callbacks_);
127 } 146 }
128 147
129 // Verify that ProvideClientCertificateResponse calls the callback with 148 // Verify that ProvideClientCertificateResponse calls the callback with
130 // NULL parameters when private key is not provided. 149 // NULL parameters when private key is not provided.
131 TEST_F(AwContentsClientBridgeTest, 150 TEST_F(AwContentsClientBridgeTest,
132 TestProvideClientCertificateResponseCallsCallbackOnNullChain) { 151 TestProvideClientCertificateResponseCallsCallbackOnNullChain) {
133 // Call SelectClientCertificate to create a callback id that mock java object 152 // Call SelectClientCertificate to create a callback id that mock java object
134 // can call on. 153 // can call on.
135 bridge_->SelectClientCertificate( 154 bridge_->SelectClientCertificate(cert_request_info_.get(), CreateDelegate());
136 cert_request_info_.get(),
137 base::Bind(
138 &AwContentsClientBridgeTest::CertSelected,
139 base::Unretained(static_cast<AwContentsClientBridgeTest*>(this))));
140 int requestId = 155 int requestId =
141 Java_MockAwContentsClientBridge_getRequestId(env_, jbridge_.obj()); 156 Java_MockAwContentsClientBridge_getRequestId(env_, jbridge_.obj());
142 bridge_->ProvideClientCertificateResponse(env_, jbridge_.obj(), 157 bridge_->ProvideClientCertificateResponse(env_, jbridge_.obj(),
143 requestId, 158 requestId,
144 NULL, 159 NULL,
145 Java_MockAwContentsClientBridge_createTestPrivateKey( 160 Java_MockAwContentsClientBridge_createTestPrivateKey(
146 env_, jbridge_.obj()).obj()); 161 env_, jbridge_.obj()).obj());
147 base::RunLoop().RunUntilIdle(); 162 base::RunLoop().RunUntilIdle();
148 EXPECT_EQ(NULL, selected_cert_); 163 EXPECT_EQ(NULL, selected_cert_);
149 EXPECT_EQ(1, cert_selected_callbacks_); 164 EXPECT_EQ(1, cert_selected_callbacks_);
150 } 165 }
151 166
152 } // android_webview 167 } // android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698