| Index: chrome/browser/website_settings_model_unittest.cc
|
| diff --git a/chrome/browser/website_settings_model_unittest.cc b/chrome/browser/website_settings_model_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..29baeb7f71d77e4bbd5138e5d27f0e451b139dd6
|
| --- /dev/null
|
| +++ b/chrome/browser/website_settings_model_unittest.cc
|
| @@ -0,0 +1,224 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/website_settings_model.h"
|
| +
|
| +#include "base/at_exit.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "chrome/test/base/testing_profile.h"
|
| +#include "content/browser/cert_store.h"
|
| +#include "content/public/common/ssl_status.h"
|
| +#include "net/base/cert_status_flags.h"
|
| +#include "net/base/ssl_connection_status_flags.h"
|
| +#include "net/base/test_certificate_data.h"
|
| +#include "net/base/x509_certificate.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using content::SSLStatus;
|
| +using namespace testing;
|
| +
|
| +namespace {
|
| +
|
| +// SSL cipher suite like specified in RFC5246 Appendix A.5. "The Cipher Suite".
|
| +static int TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x3D;
|
| +
|
| +int SetSSLVersion(int connection_status, int version) {
|
| + // Clear SSL version bits (Bits 20, 21 and 22).
|
| + connection_status &=
|
| + ~(net::SSL_CONNECTION_VERSION_MASK << net::SSL_CONNECTION_VERSION_SHIFT);
|
| + int bitmask = version << net::SSL_CONNECTION_VERSION_SHIFT;
|
| + return bitmask | connection_status;
|
| +}
|
| +
|
| +int SetSSLCipherSuite(int connection_status, int cipher_suite) {
|
| + // Clear cipher suite bits (the 16 lowest bits).
|
| + connection_status &= ~net::SSL_CONNECTION_CIPHERSUITE_MASK;
|
| + return cipher_suite | connection_status;
|
| +}
|
| +
|
| +class MockCertStore : public CertStore {
|
| + public:
|
| + virtual ~MockCertStore() {}
|
| + MOCK_METHOD2(StoreCert, int(net::X509Certificate*, int));
|
| + MOCK_METHOD2(RetrieveCert, bool(int, scoped_refptr<net::X509Certificate>*));
|
| + MOCK_METHOD1(RemoveCertsForRenderProcesHost, void(int));
|
| +};
|
| +
|
| +class WebsiteSettingsModelTest : public testing::Test {
|
| + public:
|
| + WebsiteSettingsModelTest() : testing::Test(),
|
| + profile_(new TestingProfile()),
|
| + cert_id_(0) {
|
| + }
|
| +
|
| + virtual ~WebsiteSettingsModelTest() {
|
| + }
|
| +
|
| + virtual void SetUp() {
|
| + cert_id_ = 1;
|
| +
|
| + base::Time start_date = base::Time::Now();
|
| + base::Time expiration_date = base::Time::FromInternalValue(
|
| + start_date.ToInternalValue() + base::Time::kMicrosecondsPerWeek);
|
| + cert_ = new net::X509Certificate("subject",
|
| + "issuer",
|
| + start_date,
|
| + expiration_date);
|
| +
|
| + EXPECT_CALL(cert_store_, RetrieveCert(cert_id_, _) )
|
| + .Times(AnyNumber())
|
| + .WillRepeatedly(DoAll(SetArgPointee<1>(cert_), Return(true)));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + EXPECT_TRUE(Mock::VerifyAndClear(&cert_store_));
|
| + }
|
| +
|
| + Profile* profile() const { return profile_.get(); }
|
| +
|
| + scoped_ptr<Profile> profile_;
|
| + int cert_id_;
|
| + scoped_refptr<net::X509Certificate> cert_;
|
| + MockCertStore cert_store_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPConnection) {
|
| + GURL url = GURL("http://www.example.com");
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_UNAUTHENTICATED;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &cert_store_));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_UNENCRYPTED,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_NO_CERT,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(string16(), model->organization_name());
|
| +}
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPSConnection) {
|
| + GURL url = GURL("https://www.example.com");
|
| +
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_AUTHENTICATED;
|
| + ssl.cert_id = cert_id_;
|
| + ssl.cert_status = 0;
|
| + ssl.security_bits = 81; // No error if > 80.
|
| + int status = 0;
|
| + status = SetSSLVersion(status, net::SSL_CONNECTION_VERSION_TLS1);
|
| + status = SetSSLCipherSuite(status, TLS_RSA_WITH_AES_256_CBC_SHA256);
|
| + ssl.connection_status = status;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &cert_store_));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_ENCRYPTED,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(string16(), model->organization_name());
|
| +}
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPSMixedContent) {
|
| + GURL url = GURL("https://www.example.com");
|
| +
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_AUTHENTICATED;
|
| + ssl.cert_id = cert_id_;
|
| + ssl.cert_status = 0;
|
| + ssl.security_bits = 81; // No error if > 80.
|
| + ssl.content_status = SSLStatus::DISPLAYED_INSECURE_CONTENT;
|
| + int status = 0;
|
| + status = SetSSLVersion(status, net::SSL_CONNECTION_VERSION_TLS1);
|
| + status = SetSSLCipherSuite(status, TLS_RSA_WITH_AES_256_CBC_SHA256);
|
| + ssl.connection_status = status;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &cert_store_));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_MIXED_CONTENT,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(string16(), model->organization_name());
|
| +}
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPSEVCert) {
|
| + GURL url = GURL("https://www.example.com");
|
| +
|
| + scoped_refptr<net::X509Certificate> ev_cert =
|
| + net::X509Certificate::CreateFromBytes(
|
| + reinterpret_cast<const char*>(google_der),
|
| + sizeof(google_der));
|
| + int ev_cert_id = 1;
|
| + MockCertStore tmp_cert_store;
|
| + EXPECT_CALL(tmp_cert_store, RetrieveCert(ev_cert_id, _) ).WillRepeatedly(
|
| + DoAll(SetArgPointee<1>(ev_cert),
|
| + Return(true)));
|
| +
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_AUTHENTICATED;
|
| + ssl.cert_id = ev_cert_id;
|
| + ssl.cert_status = net::CERT_STATUS_IS_EV;
|
| + ssl.security_bits = 81; // No error if > 80.
|
| + ssl.content_status = SSLStatus::DISPLAYED_INSECURE_CONTENT;
|
| + int status = 0;
|
| + status = SetSSLVersion(status, net::SSL_CONNECTION_VERSION_TLS1);
|
| + status = SetSSLCipherSuite(status, TLS_RSA_WITH_AES_256_CBC_SHA256);
|
| + ssl.connection_status = status;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &tmp_cert_store));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_MIXED_CONTENT,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_EV_CERT,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(UTF8ToUTF16("Google Inc"), model->organization_name());
|
| + EXPECT_TRUE(Mock::VerifyAndClear(&tmp_cert_store));
|
| +}
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPSRevocationError) {
|
| + GURL url = GURL("https://www.example.com");
|
| +
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_AUTHENTICATED;
|
| + ssl.cert_id = cert_id_;
|
| + ssl.cert_status = net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
|
| + ssl.security_bits = 81; // No error if > 80.
|
| + int status = 0;
|
| + status = SetSSLVersion(status, net::SSL_CONNECTION_VERSION_TLS1);
|
| + status = SetSSLCipherSuite(status, TLS_RSA_WITH_AES_256_CBC_SHA256);
|
| + ssl.connection_status = status;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &cert_store_));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_ENCRYPTED,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(string16(), model->organization_name());
|
| +}
|
| +
|
| +TEST_F(WebsiteSettingsModelTest, HTTPSConnectionError) {
|
| + GURL url = GURL("https://www.example.com");
|
| +
|
| + SSLStatus ssl;
|
| + ssl.security_style = content::SECURITY_STYLE_AUTHENTICATED;
|
| + ssl.cert_id = cert_id_;
|
| + ssl.cert_status = 0;
|
| + ssl.security_bits = 1;
|
| + int status = 0;
|
| + status = SetSSLVersion(status, net::SSL_CONNECTION_VERSION_TLS1);
|
| + status = SetSSLCipherSuite(status, TLS_RSA_WITH_AES_256_CBC_SHA256);
|
| + ssl.connection_status = status;
|
| +
|
| + scoped_ptr<WebsiteSettingsModel> model(
|
| + new WebsiteSettingsModel(profile(), url, ssl, &cert_store_));
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_CONNECTION_STATUS_ENCRYPTED_ERROR,
|
| + model->site_connection_status());
|
| + EXPECT_EQ(WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT,
|
| + model->site_identity_status());
|
| + EXPECT_EQ(string16(), model->organization_name());
|
| +}
|
|
|