| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 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 "ios/web/net/cert_verifier_block_adapter.h" | |
| 6 | |
| 7 #include "base/message_loop/message_loop.h" | |
| 8 #include "base/test/ios/wait_util.h" | |
| 9 #include "ios/web/public/test/test_web_thread_bundle.h" | |
| 10 #include "net/base/net_errors.h" | |
| 11 #include "net/cert/cert_verifier.h" | |
| 12 #include "net/cert/cert_verify_result.h" | |
| 13 #include "net/cert/crl_set.h" | |
| 14 #include "net/cert/mock_cert_verifier.h" | |
| 15 #include "net/cert/x509_certificate.h" | |
| 16 #include "net/log/net_log.h" | |
| 17 #include "net/test/cert_test_util.h" | |
| 18 #include "net/test/test_data_directory.h" | |
| 19 #include "testing/platform_test.h" | |
| 20 | |
| 21 namespace web { | |
| 22 | |
| 23 namespace { | |
| 24 // Test cert filename. | |
| 25 const char kCertFileName[] = "ok_cert.pem"; | |
| 26 // Test hostname for CertVerifier. | |
| 27 const char kHostName[] = "www.example.com"; | |
| 28 | |
| 29 } // namespace | |
| 30 | |
| 31 // Test fixture to test CertVerifierBlockAdapter class. | |
| 32 class CertVerifierBlockAdapterTest : public PlatformTest { | |
| 33 protected: | |
| 34 void SetUp() override { | |
| 35 PlatformTest::SetUp(); | |
| 36 cert_ = | |
| 37 net::ImportCertFromFile(net::GetTestCertsDirectory(), kCertFileName); | |
| 38 ASSERT_TRUE(cert_); | |
| 39 } | |
| 40 | |
| 41 // Performs synchronous verification. | |
| 42 void Verify(CertVerifierBlockAdapter* cert_verifier_adapter, | |
| 43 CertVerifierBlockAdapter::Params params, | |
| 44 net::CertVerifyResult* result, | |
| 45 int* error) { | |
| 46 __block bool verification_completed = false; | |
| 47 cert_verifier_adapter->Verify( | |
| 48 params, ^(net::CertVerifyResult callback_result, int callback_error) { | |
| 49 *result = callback_result; | |
| 50 *error = callback_error; | |
| 51 verification_completed = true; | |
| 52 }); | |
| 53 base::test::ios::WaitUntilCondition(^{ | |
| 54 return verification_completed; | |
| 55 }, base::MessageLoop::current(), base::TimeDelta()); | |
| 56 } | |
| 57 | |
| 58 web::TestWebThreadBundle thread_bundle_; | |
| 59 scoped_refptr<net::X509Certificate> cert_; | |
| 60 net::NetLog net_log_; | |
| 61 }; | |
| 62 | |
| 63 // Tests |Verify| with default params and synchronous verification. | |
| 64 TEST_F(CertVerifierBlockAdapterTest, DefaultParamsAndSync) { | |
| 65 // Set up verifier mock. | |
| 66 net::MockCertVerifier verifier; | |
| 67 CertVerifierBlockAdapter test_adapter(&verifier, &net_log_); | |
| 68 const int kExpectedError = net::ERR_CERT_AUTHORITY_INVALID; | |
| 69 net::CertVerifyResult expected_result; | |
| 70 expected_result.cert_status = net::CERT_STATUS_AUTHORITY_INVALID; | |
| 71 expected_result.verified_cert = cert_; | |
| 72 verifier.AddResultForCertAndHost(cert_.get(), kHostName, expected_result, | |
| 73 kExpectedError); | |
| 74 | |
| 75 // Call |Verify|. | |
| 76 net::CertVerifyResult actual_result; | |
| 77 int actual_error = -1; | |
| 78 CertVerifierBlockAdapter::Params params(cert_.get(), kHostName); | |
| 79 Verify(&test_adapter, params, &actual_result, &actual_error); | |
| 80 | |
| 81 // Ensure that Verification results are correct. | |
| 82 EXPECT_EQ(kExpectedError, actual_error); | |
| 83 EXPECT_EQ(expected_result.cert_status, actual_result.cert_status); | |
| 84 } | |
| 85 | |
| 86 // Tests |Verify| with default params and asynchronous verification using real | |
| 87 // net::CertVerifier and ok_cert.pem cert. | |
| 88 TEST_F(CertVerifierBlockAdapterTest, DefaultParamsAndAsync) { | |
| 89 // Call |Verify|. | |
| 90 std::unique_ptr<net::CertVerifier> verifier( | |
| 91 net::CertVerifier::CreateDefault()); | |
| 92 CertVerifierBlockAdapter test_adapter(verifier.get(), &net_log_); | |
| 93 CertVerifierBlockAdapter::Params params(cert_.get(), kHostName); | |
| 94 net::CertVerifyResult actual_result; | |
| 95 int actual_error = -1; | |
| 96 Verify(&test_adapter, params, &actual_result, &actual_error); | |
| 97 | |
| 98 // Ensure that Verification results are correct. | |
| 99 EXPECT_FALSE(actual_result.is_issued_by_known_root); | |
| 100 EXPECT_EQ(net::ERR_CERT_AUTHORITY_INVALID, actual_error); | |
| 101 } | |
| 102 | |
| 103 // Tests |Verify| with invalid cert argument. | |
| 104 TEST_F(CertVerifierBlockAdapterTest, InvalidCert) { | |
| 105 // Call |Verify|. | |
| 106 net::MockCertVerifier verifier; | |
| 107 CertVerifierBlockAdapter test_adapter(&verifier, &net_log_); | |
| 108 net::CertVerifyResult actual_result; | |
| 109 int actual_error = -1; | |
| 110 CertVerifierBlockAdapter::Params params(nullptr, kHostName); | |
| 111 Verify(&test_adapter, params, &actual_result, &actual_error); | |
| 112 | |
| 113 // Ensure that Verification results are correct. | |
| 114 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, actual_error); | |
| 115 } | |
| 116 | |
| 117 // Tests |Verify| with invalid hostname argument. | |
| 118 TEST_F(CertVerifierBlockAdapterTest, InvalidHostname) { | |
| 119 // Call |Verify|. | |
| 120 net::MockCertVerifier verifier; | |
| 121 CertVerifierBlockAdapter test_adapter(&verifier, &net_log_); | |
| 122 net::CertVerifyResult actual_result; | |
| 123 int actual_error = -1; | |
| 124 CertVerifierBlockAdapter::Params params(cert_.get(), std::string()); | |
| 125 Verify(&test_adapter, params, &actual_result, &actual_error); | |
| 126 | |
| 127 // Ensure that Verification results are correct. | |
| 128 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, actual_error); | |
| 129 } | |
| 130 | |
| 131 // Tests |Verify| with synchronous error. | |
| 132 TEST_F(CertVerifierBlockAdapterTest, DefaultParamsAndSyncError) { | |
| 133 // Set up expectation. | |
| 134 net::MockCertVerifier verifier; | |
| 135 CertVerifierBlockAdapter test_adapter(&verifier, &net_log_); | |
| 136 const int kExpectedError = net::ERR_INSUFFICIENT_RESOURCES; | |
| 137 net::CertVerifyResult expected_result; | |
| 138 expected_result.verified_cert = cert_; | |
| 139 verifier.AddResultForCertAndHost(cert_.get(), kHostName, expected_result, | |
| 140 kExpectedError); | |
| 141 | |
| 142 // Call |Verify|. | |
| 143 net::CertVerifyResult actual_result; | |
| 144 int actual_error = -1; | |
| 145 CertVerifierBlockAdapter::Params params(cert_.get(), kHostName); | |
| 146 Verify(&test_adapter, params, &actual_result, &actual_error); | |
| 147 | |
| 148 // Ensure that Verification results are correct. | |
| 149 EXPECT_EQ(kExpectedError, actual_error); | |
| 150 } | |
| 151 | |
| 152 // Tests that the completion handler passed to |Verify()| is called, even if the | |
| 153 // adapter is destroyed. | |
| 154 TEST_F(CertVerifierBlockAdapterTest, CompletionHandlerIsAlwaysCalled) { | |
| 155 std::unique_ptr<net::CertVerifier> verifier( | |
| 156 net::CertVerifier::CreateDefault()); | |
| 157 std::unique_ptr<CertVerifierBlockAdapter> test_adapter( | |
| 158 new CertVerifierBlockAdapter(verifier.get(), &net_log_)); | |
| 159 | |
| 160 // Call |Verify| and destroy the adapter. | |
| 161 CertVerifierBlockAdapter::Params params(cert_.get(), kHostName); | |
| 162 __block bool verification_completed = false; | |
| 163 test_adapter->Verify(params, ^(net::CertVerifyResult, int) { | |
| 164 verification_completed = true; | |
| 165 }); | |
| 166 test_adapter.reset(); | |
| 167 | |
| 168 // Make sure that the completion handler is called. | |
| 169 base::test::ios::WaitUntilCondition(^{ | |
| 170 return verification_completed; | |
| 171 }, base::MessageLoop::current(), base::TimeDelta()); | |
| 172 } | |
| 173 | |
| 174 } // namespace web | |
| OLD | NEW |