| Index: chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
|
| diff --git a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
|
| index dcb55edfac60dcb38eb1b4b80a453594935e220a..357f817d9c0041559a8efd9d874fc74e1ee0e7a7 100644
|
| --- a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
|
| +++ b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
|
| @@ -27,7 +27,9 @@
|
| #include "components/policy/core/common/policy_service_impl.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "content/public/test/test_utils.h"
|
| +#include "crypto/scoped_nss_types.h"
|
| #include "net/base/test_data_directory.h"
|
| +#include "net/cert/nss_cert_database_chromeos.h"
|
| #include "net/cert/x509_certificate.h"
|
| #include "net/test/cert_test_util.h"
|
| #include "policy/policy_constants.h"
|
| @@ -134,8 +136,8 @@ MATCHER(IsEmpty, std::string(negation ? "isn't" : "is") + " empty.") {
|
| }
|
|
|
| ACTION_P(SetCertificateList, list) {
|
| - if (arg2)
|
| - *arg2 = list;
|
| + if (arg3)
|
| + *arg3 = list;
|
| return true;
|
| }
|
|
|
| @@ -148,7 +150,7 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
|
|
| virtual void SetUp() OVERRIDE {
|
| EXPECT_CALL(provider_, IsInitializationComplete(_))
|
| - .WillRepeatedly(Return(true));
|
| + .WillRepeatedly(Return(false));
|
| provider_.Init();
|
| PolicyServiceImpl::Providers providers;
|
| providers.push_back(&provider_);
|
| @@ -175,6 +177,12 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
| certificate_importer_ =
|
| new StrictMock<chromeos::onc::MockCertificateImporter>();
|
| certificate_importer_owned_.reset(certificate_importer_);
|
| +
|
| + // The database will not acutally be used for importing certificates, so
|
| + // it's OK to have empty slots.
|
| + test_nssdb_.reset(new net::NSSCertDatabaseChromeOS(
|
| + crypto::ScopedPK11Slot(),
|
| + crypto::ScopedPK11Slot()));
|
| }
|
|
|
| virtual void TearDown() OVERRIDE {
|
| @@ -183,6 +191,15 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| + void MarkPolicyProviderInitialized() {
|
| + Mock::VerifyAndClearExpectations(&provider_);
|
| + EXPECT_CALL(provider_, IsInitializationComplete(_))
|
| + .WillRepeatedly(Return(true));
|
| + provider_.SetAutoRefresh();
|
| + provider_.RefreshPolicies();
|
| + base::RunLoop().RunUntilIdle();
|
| + }
|
| +
|
| void UpdateProviderPolicy(const PolicyMap& policy) {
|
| provider_.UpdateChromePolicy(policy);
|
| base::RunLoop().RunUntilIdle();
|
| @@ -190,7 +207,8 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
|
|
| UserNetworkConfigurationUpdater*
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - bool allow_trusted_certs_from_policy) {
|
| + bool allow_trusted_certs_from_policy,
|
| + bool set_cert_database) {
|
| UserNetworkConfigurationUpdater* updater =
|
| UserNetworkConfigurationUpdater::CreateForUserPolicy(
|
| allow_trusted_certs_from_policy,
|
| @@ -198,6 +216,8 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
| certificate_importer_owned_.Pass(),
|
| policy_service_.get(),
|
| &network_config_handler_).release();
|
| + if (set_cert_database)
|
| + updater->SetCertDatabase(test_nssdb_.get());
|
| network_configuration_updater_.reset(updater);
|
| return updater;
|
| }
|
| @@ -236,13 +256,15 @@ class NetworkConfigurationUpdaterTest : public testing::Test {
|
|
|
| scoped_ptr<NetworkConfigurationUpdater> network_configuration_updater_;
|
| content::TestBrowserThreadBundle thread_bundle_;
|
| +
|
| + scoped_ptr<net::NSSCertDatabaseChromeOS> test_nssdb_;
|
| };
|
|
|
| TEST_F(NetworkConfigurationUpdaterTest, CellularAllowRoaming) {
|
| // Ignore networ config updates.
|
| EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _)).Times(AtLeast(1));
|
| - EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _))
|
| - .Times(AtLeast(1));
|
| + EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _, _))
|
| + .Times(AnyNumber());
|
|
|
| // Setup the DataRoaming device setting.
|
| chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
|
| @@ -259,6 +281,7 @@ TEST_F(NetworkConfigurationUpdaterTest, CellularAllowRoaming) {
|
| EXPECT_FALSE(network_device_handler_.allow_roaming_);
|
|
|
| CreateNetworkConfigurationUpdaterForDevicePolicy();
|
| + MarkPolicyProviderInitialized();
|
| chromeos::CrosSettings::Get()->Set(chromeos::kSignedDataRoamingEnabled,
|
| base::FundamentalValue(true));
|
| EXPECT_TRUE(network_device_handler_.allow_roaming_);
|
| @@ -286,6 +309,7 @@ TEST_F(NetworkConfigurationUpdaterTest, PolicyIsValidatedAndRepaired) {
|
|
|
| std::string onc_policy =
|
| chromeos::onc::test_utils::ReadTestData("toplevel_partially_invalid.onc");
|
| +
|
| PolicyMap policy;
|
| policy.Set(key::kOpenNetworkConfiguration,
|
| POLICY_LEVEL_MANDATORY,
|
| @@ -299,11 +323,14 @@ TEST_F(NetworkConfigurationUpdaterTest, PolicyIsValidatedAndRepaired) {
|
| _,
|
| IsEqualTo(network_configs_repaired),
|
| IsEqualTo(global_config_repaired)));
|
| - EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _));
|
| + EXPECT_CALL(
|
| + *certificate_importer_,
|
| + ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, test_nssdb_.get(), _));
|
|
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - false /* do not allow trusted certs from policy */ );
|
| + false /* do not allow trusted certs from policy */,
|
| + true /* set certificate database */);
|
| + MarkPolicyProviderInitialized();
|
| }
|
|
|
| TEST_F(NetworkConfigurationUpdaterTest,
|
| @@ -317,12 +344,15 @@ TEST_F(NetworkConfigurationUpdaterTest,
|
|
|
| EXPECT_CALL(network_config_handler_,
|
| SetPolicy(onc::ONC_SOURCE_USER_POLICY, _, _, _));
|
| - EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _))
|
| + EXPECT_CALL(*certificate_importer_,
|
| + ImportCertificates(_, _, test_nssdb_.get(), _))
|
| .WillRepeatedly(SetCertificateList(cert_list));
|
|
|
| UserNetworkConfigurationUpdater* updater =
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - false /* do not allow trusted certs from policy */);
|
| + false /* do not allow trusted certs from policy */,
|
| + true /* set certificate database */);
|
| + MarkPolicyProviderInitialized();
|
|
|
| // Certificates with the "Web" trust flag set should not be forwarded to
|
| // observers.
|
| @@ -352,13 +382,16 @@ TEST_F(NetworkConfigurationUpdaterTest,
|
| net::X509Certificate::FORMAT_AUTO);
|
| ASSERT_EQ(1u, cert_list.size());
|
|
|
| - EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _))
|
| - .WillRepeatedly(SetCertificateList(cert_list));
|
| + EXPECT_CALL(
|
| + *certificate_importer_,
|
| + ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, test_nssdb_.get(), _))
|
| + .WillRepeatedly(SetCertificateList(cert_list));
|
|
|
| UserNetworkConfigurationUpdater* updater =
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - true /* allow trusted certs from policy */);
|
| + true /* allow trusted certs from policy */,
|
| + true /* set certificate database */);
|
| + MarkPolicyProviderInitialized();
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -368,6 +401,44 @@ TEST_F(NetworkConfigurationUpdaterTest,
|
| EXPECT_EQ(1u, trust_anchors.size());
|
| }
|
|
|
| +TEST_F(NetworkConfigurationUpdaterTest, ReapplyUserPolicyWhenCertDBSet) {
|
| + PolicyMap policy;
|
| + policy.Set(key::kOpenNetworkConfiguration, POLICY_LEVEL_MANDATORY,
|
| + POLICY_SCOPE_USER, new base::StringValue(kFakeONC), NULL);
|
| + UpdateProviderPolicy(policy);
|
| +
|
| + EXPECT_CALL(network_config_handler_,
|
| + SetPolicy(onc::ONC_SOURCE_USER_POLICY,
|
| + kFakeUsernameHash,
|
| + IsEqualTo(&fake_network_configs_),
|
| + IsEqualTo(&fake_global_network_config_)));
|
| + EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _ ,_ , _)).Times(0);
|
| +
|
| + UserNetworkConfigurationUpdater* updater =
|
| + CreateNetworkConfigurationUpdaterForUserPolicy(
|
| + true /* allow trusted certs from policy */,
|
| + false /* do not set certificate database */);
|
| + MarkPolicyProviderInitialized();
|
| +
|
| + // If cert loader does not have its database set, Certificate import should
|
| + // be skipped.
|
| + Mock::VerifyAndClearExpectations(&network_config_handler_);
|
| + Mock::VerifyAndClearExpectations(certificate_importer_);
|
| +
|
| + EXPECT_CALL(network_config_handler_,
|
| + SetPolicy(onc::ONC_SOURCE_USER_POLICY,
|
| + kFakeUsernameHash,
|
| + IsEqualTo(&fake_network_configs_),
|
| + IsEqualTo(&fake_global_network_config_)));
|
| + EXPECT_CALL(*certificate_importer_,
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + onc::ONC_SOURCE_USER_POLICY,
|
| + test_nssdb_.get(),
|
| + _));
|
| +
|
| + updater->SetCertDatabase(test_nssdb_.get());
|
| +}
|
| +
|
| TEST_F(NetworkConfigurationUpdaterTest,
|
| AllowTrustedCertificatesFromPolicyOnUpdate) {
|
| // Ignore network configuration changes.
|
| @@ -375,13 +446,16 @@ TEST_F(NetworkConfigurationUpdaterTest,
|
| .Times(AnyNumber());
|
|
|
| // Start with an empty certificate list.
|
| - EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _))
|
| - .WillRepeatedly(SetCertificateList(net::CertificateList()));
|
| + EXPECT_CALL(
|
| + *certificate_importer_,
|
| + ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, test_nssdb_.get(), _))
|
| + .WillRepeatedly(SetCertificateList(net::CertificateList()));
|
|
|
| UserNetworkConfigurationUpdater* updater =
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - true /* allow trusted certs from policy */);
|
| + true /* allow trusted certs from policy */,
|
| + true /* set certificate database */);
|
| + MarkPolicyProviderInitialized();
|
|
|
| FakeWebTrustedCertsObserver observer;
|
| updater->AddTrustedCertsObserver(&observer);
|
| @@ -405,9 +479,10 @@ TEST_F(NetworkConfigurationUpdaterTest,
|
| net::X509Certificate::FORMAT_AUTO);
|
| ASSERT_EQ(1u, cert_list.size());
|
|
|
| - EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _))
|
| - .WillOnce(SetCertificateList(cert_list));
|
| + EXPECT_CALL(
|
| + *certificate_importer_,
|
| + ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, test_nssdb_.get(), _))
|
| + .WillOnce(SetCertificateList(cert_list));
|
|
|
| // Change to any non-empty policy, so that updates are triggered. The actual
|
| // content of the policy is irrelevant.
|
| @@ -452,10 +527,17 @@ class NetworkConfigurationUpdaterTestWithParam
|
| return std::string();
|
| }
|
|
|
| + size_t ExpectedImportCertificatesCallCount() {
|
| + if (GetParam() == key::kOpenNetworkConfiguration)
|
| + return 1u;
|
| + return 0u;
|
| + }
|
| +
|
| void CreateNetworkConfigurationUpdater() {
|
| if (GetParam() == key::kOpenNetworkConfiguration) {
|
| CreateNetworkConfigurationUpdaterForUserPolicy(
|
| - false /* do not allow trusted certs from policy */);
|
| + false /* do not allow trusted certs from policy */,
|
| + true /* do not set certificate database */);
|
| } else {
|
| CreateNetworkConfigurationUpdaterForDevicePolicy();
|
| }
|
| @@ -474,19 +556,89 @@ TEST_P(NetworkConfigurationUpdaterTestWithParam, InitialUpdates) {
|
| IsEqualTo(&fake_network_configs_),
|
| IsEqualTo(&fake_global_network_config_)));
|
| EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(
|
| - IsEqualTo(&fake_certificates_), CurrentONCSource(), _));
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + CurrentONCSource(),
|
| + test_nssdb_.get(),
|
| + _))
|
| + .Times(ExpectedImportCertificatesCallCount());
|
| +
|
| + CreateNetworkConfigurationUpdater();
|
| + MarkPolicyProviderInitialized();
|
| +}
|
| +
|
| +TEST_P(NetworkConfigurationUpdaterTestWithParam,
|
| + PolicyNotSetBeforePolicyProviderInitialized) {
|
| + PolicyMap policy;
|
| + policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + new base::StringValue(kFakeONC), NULL);
|
| + UpdateProviderPolicy(policy);
|
| +
|
| + EXPECT_CALL(network_config_handler_,
|
| + SetPolicy(CurrentONCSource(),
|
| + ExpectedUsernameHash(),
|
| + IsEqualTo(&fake_network_configs_),
|
| + IsEqualTo(&fake_global_network_config_)))
|
| + .Times(0);
|
| + EXPECT_CALL(*certificate_importer_,
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + CurrentONCSource(),
|
| + test_nssdb_.get(),
|
| + _))
|
| + .Times(0);
|
|
|
| CreateNetworkConfigurationUpdater();
|
| +
|
| + Mock::VerifyAndClearExpectations(&network_config_handler_);
|
| + Mock::VerifyAndClearExpectations(certificate_importer_);
|
| +
|
| + EXPECT_CALL(network_config_handler_,
|
| + SetPolicy(CurrentONCSource(),
|
| + ExpectedUsernameHash(),
|
| + IsEqualTo(&fake_network_configs_),
|
| + IsEqualTo(&fake_global_network_config_)));
|
| + EXPECT_CALL(*certificate_importer_,
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + CurrentONCSource(),
|
| + test_nssdb_.get(),
|
| + _))
|
| + .Times(ExpectedImportCertificatesCallCount());
|
| +
|
| + MarkPolicyProviderInitialized();
|
| }
|
|
|
| +TEST_P(NetworkConfigurationUpdaterTestWithParam,
|
| + PolicyProviderInitializedBeforeUpdater) {
|
| + MarkPolicyProviderInitialized();
|
| + PolicyMap policy;
|
| + policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + new base::StringValue(kFakeONC), NULL);
|
| + UpdateProviderPolicy(policy);
|
| +
|
| + // Should be called when network configuration updater is created and
|
| + // initialized and when the updater database gets set (if it gets set).
|
| + EXPECT_CALL(network_config_handler_,
|
| + SetPolicy(CurrentONCSource(),
|
| + ExpectedUsernameHash(),
|
| + IsEqualTo(&fake_network_configs_),
|
| + IsEqualTo(&fake_global_network_config_)))
|
| + .Times(ExpectedImportCertificatesCallCount() + 1);
|
| + EXPECT_CALL(*certificate_importer_,
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + CurrentONCSource(),
|
| + test_nssdb_.get(),
|
| + _))
|
| + .Times(ExpectedImportCertificatesCallCount());
|
| +
|
| + CreateNetworkConfigurationUpdater();
|
| +}
|
|
|
| TEST_P(NetworkConfigurationUpdaterTestWithParam, PolicyChange) {
|
| // Ignore the initial updates.
|
| EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _)).Times(AtLeast(1));
|
| - EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _))
|
| - .Times(AtLeast(1));
|
| + EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _, _))
|
| + .Times(AtLeast(ExpectedImportCertificatesCallCount()));
|
| CreateNetworkConfigurationUpdater();
|
| + MarkPolicyProviderInitialized();
|
| Mock::VerifyAndClearExpectations(&network_config_handler_);
|
| Mock::VerifyAndClearExpectations(certificate_importer_);
|
|
|
| @@ -497,8 +649,11 @@ TEST_P(NetworkConfigurationUpdaterTestWithParam, PolicyChange) {
|
| IsEqualTo(&fake_network_configs_),
|
| IsEqualTo(&fake_global_network_config_)));
|
| EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(
|
| - IsEqualTo(&fake_certificates_), CurrentONCSource(), _));
|
| + ImportCertificates(IsEqualTo(&fake_certificates_),
|
| + CurrentONCSource(),
|
| + test_nssdb_.get(),
|
| + _))
|
| + .Times(ExpectedImportCertificatesCallCount());
|
|
|
| PolicyMap policy;
|
| policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| @@ -510,8 +665,10 @@ TEST_P(NetworkConfigurationUpdaterTestWithParam, PolicyChange) {
|
| // Another update is expected if the policy goes away.
|
| EXPECT_CALL(network_config_handler_,
|
| SetPolicy(CurrentONCSource(), _, IsEmpty(), IsEmpty()));
|
| - EXPECT_CALL(*certificate_importer_,
|
| - ImportCertificates(IsEmpty(), CurrentONCSource(), _));
|
| + EXPECT_CALL(
|
| + *certificate_importer_,
|
| + ImportCertificates(IsEmpty(), CurrentONCSource(), test_nssdb_.get(), _))
|
| + .Times(ExpectedImportCertificatesCallCount());
|
|
|
| policy.Erase(GetParam());
|
| UpdateProviderPolicy(policy);
|
|
|