OLD | NEW |
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 |
OLD | NEW |