Index: chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc |
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc |
index 155e2e3732a78923a62eca261283dca34d82645f..33ef5046121999a760855f442969b3cd56946d6f 100644 |
--- a/chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc |
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc |
@@ -26,9 +26,15 @@ |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
#include "chrome/browser/chromeos/settings/device_settings_service.h" |
#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" |
+#include "chrome/browser/invalidation/fake_invalidation_service.h" |
+#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" |
#include "chrome/common/chrome_paths.h" |
+#include "chrome/test/base/testing_browser_process.h" |
+#include "chrome/test/base/testing_profile_manager.h" |
#include "chromeos/chromeos_paths.h" |
#include "chromeos/dbus/power_policy_controller.h" |
+#include "components/invalidation/invalidation.h" |
+#include "components/invalidation/object_id_invalidation_map.h" |
#include "components/policy/core/common/cloud/cloud_policy_client.h" |
#include "components/policy/core/common/cloud/cloud_policy_constants.h" |
#include "components/policy/core/common/cloud/cloud_policy_service.h" |
@@ -39,6 +45,7 @@ |
#include "components/policy/core/common/policy_bundle.h" |
#include "components/policy/core/common/policy_map.h" |
#include "components/policy/core/common/schema_registry.h" |
+#include "google/cacheinvalidation/include/types.h" |
#include "net/url_request/url_request_context_getter.h" |
#include "net/url_request/url_request_test_util.h" |
#include "policy/policy_constants.h" |
@@ -67,6 +74,9 @@ const char kExtensionVersion[] = "1.0.0.0"; |
const char kExtensionCRXPath[] = "extensions/hosted_app.crx"; |
const char kUpdateURL[] = "https://clients2.google.com/service/update2/crx"; |
+const int kInvalidationSource = 123; |
+const char kInvalidationName[] = "invalidation"; |
+ |
} // namespace |
class MockDeviceLocalAccountPolicyServiceObserver |
@@ -98,6 +108,9 @@ class DeviceLocalAccountPolicyServiceTestBase |
chromeos::CrosSettings cros_settings_; |
scoped_refptr<base::TestSimpleTaskRunner> extension_cache_task_runner_; |
MockDeviceManagementService mock_device_management_service_; |
+ TestingProfileManager profile_manager_; |
+ scoped_ptr<AffiliatedInvalidationServiceProvider> |
+ affiliated_invalidation_service_provider_; |
scoped_ptr<DeviceLocalAccountPolicyService> service_; |
private: |
@@ -117,6 +130,8 @@ class DeviceLocalAccountPolicyServiceTest |
void InstallDevicePolicy() override; |
+ void FlushDeviceLocalAccountPolicyFetch(); |
pneubeck (no reviews)
2015/01/30 14:23:58
i think this function has enough side effect that
bartfab (slow)
2015/02/03 18:31:06
Obsolete.
|
+ |
MockDeviceLocalAccountPolicyServiceObserver service_observer_; |
private: |
@@ -132,12 +147,23 @@ DeviceLocalAccountPolicyServiceTestBase:: |
kAccount2, |
DeviceLocalAccount::TYPE_PUBLIC_SESSION)), |
cros_settings_(&device_settings_service_), |
- extension_cache_task_runner_(new base::TestSimpleTaskRunner) { |
+ extension_cache_task_runner_(new base::TestSimpleTaskRunner), |
+ profile_manager_(TestingBrowserProcess::GetGlobal()) { |
} |
void DeviceLocalAccountPolicyServiceTestBase::SetUp() { |
chromeos::DeviceSettingsTestBase::SetUp(); |
+ ASSERT_TRUE(profile_manager_.SetUp()); |
+ |
+ affiliated_invalidation_service_provider_.reset( |
+ new AffiliatedInvalidationServiceProvider); |
pneubeck (no reviews)
2015/01/30 14:23:58
you could make the relevant methods of the provide
bartfab (slow)
2015/02/03 18:31:06
Done.
|
+ // Mark the |affiliated_invalidation_service_provider_| as shut down |
+ // immediately. This will prevent it from trying to find an available |
+ // invalidation service, which pulls in a lot of additional run-time |
+ // dependencies. |
+ affiliated_invalidation_service_provider_->Shutdown(); |
+ |
expected_policy_map_.Set(key::kDisableSpdy, |
POLICY_LEVEL_MANDATORY, |
POLICY_SCOPE_USER, |
@@ -162,6 +188,7 @@ void DeviceLocalAccountPolicyServiceTestBase::CreatePolicyService() { |
&device_settings_test_helper_, |
&device_settings_service_, |
&cros_settings_, |
+ affiliated_invalidation_service_provider_.get(), |
base::MessageLoopProxy::current(), |
extension_cache_task_runner_, |
base::MessageLoopProxy::current(), |
@@ -194,11 +221,12 @@ void DeviceLocalAccountPolicyServiceTestBase::InstallDevicePolicy() { |
} |
DeviceLocalAccountPolicyServiceTest::DeviceLocalAccountPolicyServiceTest() { |
- CreatePolicyService(); |
} |
void DeviceLocalAccountPolicyServiceTest::SetUp() { |
DeviceLocalAccountPolicyServiceTestBase::SetUp(); |
+ |
+ CreatePolicyService(); |
service_->AddObserver(&service_observer_); |
} |
@@ -213,6 +241,54 @@ void DeviceLocalAccountPolicyServiceTest::InstallDevicePolicy() { |
Mock::VerifyAndClearExpectations(&service_observer_); |
} |
+void DeviceLocalAccountPolicyServiceTest::FlushDeviceLocalAccountPolicyFetch() { |
+ em::DeviceManagementRequest request; |
+ em::DeviceManagementResponse response; |
+ response.mutable_policy_response()->add_response()->CopyFrom( |
+ device_local_account_policy_.policy()); |
+ EXPECT_CALL(mock_device_management_service_, |
+ CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _)) |
+ .WillOnce(mock_device_management_service_.SucceedJob(response)); |
+ EXPECT_CALL(mock_device_management_service_, |
+ StartJob(dm_protocol::kValueRequestPolicy, |
+ std::string(), std::string(), |
+ device_policy_.policy_data().request_token(), |
+ dm_protocol::kValueUserAffiliationManaged, |
+ device_policy_.policy_data().device_id(), |
+ _)) |
+ .WillOnce(SaveArg<6>(&request)); |
+ // This will be called twice, because the ComponentCloudPolicyService will |
+ // also become ready after flushing all the pending tasks. |
+ EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_)).Times(2); |
+ FlushDeviceSettings(); |
+ |
+ Mock::VerifyAndClearExpectations(&service_observer_); |
+ Mock::VerifyAndClearExpectations(&mock_device_management_service_); |
+ |
+ EXPECT_TRUE(request.has_policy_request()); |
+ ASSERT_EQ(2, request.policy_request().request_size()); |
+ |
+ const em::PolicyFetchRequest* public_account = |
+ &request.policy_request().request(0); |
+ const em::PolicyFetchRequest* extensions = |
+ &request.policy_request().request(1); |
+ // The order is not guarateed. |
+ if (extensions->policy_type() == |
+ dm_protocol::kChromePublicAccountPolicyType) { |
+ std::swap(public_account, extensions); |
+ } |
+ |
+ EXPECT_EQ(dm_protocol::kChromePublicAccountPolicyType, |
+ public_account->policy_type()); |
+ EXPECT_FALSE(public_account->has_machine_id()); |
+ EXPECT_EQ(kAccount1, public_account->settings_entity_id()); |
+ |
+ EXPECT_EQ(dm_protocol::kChromeExtensionPolicyType, |
+ extensions->policy_type()); |
+ EXPECT_FALSE(extensions->has_machine_id()); |
+ EXPECT_FALSE(extensions->has_settings_entity_id()); |
+} |
+ |
TEST_F(DeviceLocalAccountPolicyServiceTest, NoAccounts) { |
EXPECT_FALSE(service_->GetBrokerForUser(account_1_user_id_)); |
} |
@@ -393,50 +469,7 @@ TEST_F(DeviceLocalAccountPolicyServiceTest, FetchPolicy) { |
service_->Connect(&mock_device_management_service_); |
EXPECT_TRUE(broker->core()->client()); |
- em::DeviceManagementRequest request; |
- em::DeviceManagementResponse response; |
- response.mutable_policy_response()->add_response()->CopyFrom( |
- device_local_account_policy_.policy()); |
- EXPECT_CALL(mock_device_management_service_, |
- CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _)) |
- .WillOnce(mock_device_management_service_.SucceedJob(response)); |
- EXPECT_CALL(mock_device_management_service_, |
- StartJob(dm_protocol::kValueRequestPolicy, |
- std::string(), std::string(), |
- device_policy_.policy_data().request_token(), |
- dm_protocol::kValueUserAffiliationManaged, |
- device_policy_.policy_data().device_id(), |
- _)) |
- .WillOnce(SaveArg<6>(&request)); |
- // This will be called twice, because the ComponentCloudPolicyService will |
- // also become ready after flushing all the pending tasks. |
- EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_)).Times(2); |
- broker->core()->client()->FetchPolicy(); |
pneubeck (no reviews)
2015/01/30 14:23:58
you dropped this FetchPolicy call during the refac
bartfab (slow)
2015/02/03 18:31:06
Yes, this was intentional. We should test that the
|
- FlushDeviceSettings(); |
- Mock::VerifyAndClearExpectations(&service_observer_); |
- Mock::VerifyAndClearExpectations(&mock_device_management_service_); |
- EXPECT_TRUE(request.has_policy_request()); |
- ASSERT_EQ(2, request.policy_request().request_size()); |
- |
- const em::PolicyFetchRequest* public_account = |
- &request.policy_request().request(0); |
- const em::PolicyFetchRequest* extensions = |
- &request.policy_request().request(1); |
- // The order is not guarateed. |
- if (extensions->policy_type() == |
- dm_protocol::kChromePublicAccountPolicyType) { |
- std::swap(public_account, extensions); |
- } |
- |
- EXPECT_EQ(dm_protocol::kChromePublicAccountPolicyType, |
- public_account->policy_type()); |
- EXPECT_FALSE(public_account->has_machine_id()); |
- EXPECT_EQ(kAccount1, public_account->settings_entity_id()); |
- |
- EXPECT_EQ(dm_protocol::kChromeExtensionPolicyType, |
- extensions->policy_type()); |
- EXPECT_FALSE(extensions->has_machine_id()); |
- EXPECT_FALSE(extensions->has_settings_entity_id()); |
+ FlushDeviceLocalAccountPolicyFetch(); |
ASSERT_TRUE(broker->core()->store()); |
EXPECT_EQ(CloudPolicyStore::STATUS_OK, |
@@ -488,6 +521,139 @@ TEST_F(DeviceLocalAccountPolicyServiceTest, RefreshPolicy) { |
EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_)); |
} |
+TEST_F(DeviceLocalAccountPolicyServiceTest, Invalidation) { |
+ device_local_account_policy_.policy_data().set_invalidation_source( |
+ kInvalidationSource); |
+ device_local_account_policy_.policy_data().set_invalidation_name( |
+ "invalidation"); |
+ InstallDeviceLocalAccountPolicy(kAccount1); |
+ |
+ AddDeviceLocalAccountToPolicy(kAccount1); |
+ EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_)); |
+ InstallDevicePolicy(); |
+ Mock::VerifyAndClearExpectations(&service_observer_); |
+ |
+ DeviceLocalAccountPolicyBroker* broker = |
+ service_->GetBrokerForUser(account_1_user_id_); |
+ ASSERT_TRUE(broker); |
+ EXPECT_EQ(account_1_user_id_, broker->user_id()); |
pneubeck (no reviews)
2015/01/30 14:23:58
this seems to be tested already in TEST_F(..., Get
bartfab (slow)
2015/02/03 18:31:06
Obsolete.
|
+ ASSERT_TRUE(broker->core()->store()); |
+ |
+ // Make a first invalidation service available. |
+ invalidation::FakeInvalidationService invalidation_service_1; |
+ broker->OnInvalidationServiceSet(&invalidation_service_1); |
+ |
+ // Verify that no invalidator exists initially. |
+ EXPECT_FALSE(broker->GetInvalidatorForTest()); |
+ |
+ service_->Connect(&mock_device_management_service_); |
+ |
+ // Verify that an invalidator backed by the first invalidation service has |
+ // been created and its highest handled invalidation version starts out as 0. |
+ CloudPolicyInvalidator* invalidator = broker->GetInvalidatorForTest(); |
+ ASSERT_TRUE(invalidator); |
+ EXPECT_EQ(0, invalidator->highest_handled_invalidation_version()); |
+ EXPECT_EQ(&invalidation_service_1, |
+ invalidator->invalidation_service_for_test()); |
+ |
+ // Trigger an invalidation. The invalidation version is interpreted as a |
+ // timestamp in microseconds. The policy blob contains a timestamp in |
+ // milliseconds. Convert from one to the other by multiplying by 1000. |
+ const int64 invalidation_version = |
+ broker->core()->store()->policy()->timestamp() * 1000; |
+ syncer::Invalidation invalidation = syncer::Invalidation::Init( |
+ invalidation::ObjectId(kInvalidationSource, kInvalidationName), |
+ invalidation_version, |
+ "dummy payload"); |
+ syncer::ObjectIdInvalidationMap invalidation_map; |
+ invalidation_map.Insert(invalidation); |
+ invalidator->OnIncomingInvalidation(invalidation_map); |
+ |
+ // Verify that the invalidation causes a policy refresh. |
+ FlushDeviceLocalAccountPolicyFetch(); |
+ |
+ // Verify that the highest handled invalidation version has been recorded. |
+ EXPECT_EQ(invalidation_version, |
+ invalidator->highest_handled_invalidation_version()); |
+ |
+ // Make the first invalidation service unavailable. |
+ broker->OnInvalidationServiceSet(nullptr); |
+ |
+ // Verify that the invalidator has been destroyed. |
+ EXPECT_FALSE(broker->GetInvalidatorForTest()); |
+ |
+ // Make a second invalidation service available instead. |
+ invalidation::FakeInvalidationService invalidation_service_2; |
+ broker->OnInvalidationServiceSet(&invalidation_service_2); |
+ |
+ // Verify that an invalidator backed by the second invalidation service has |
+ // been created and its highest handled invalidation version starts out as the |
+ // highest invalidation version handled by the previous invalidator. |
+ invalidator = broker->GetInvalidatorForTest(); |
+ ASSERT_TRUE(invalidator); |
+ EXPECT_EQ(invalidation_version, |
+ invalidator->highest_handled_invalidation_version()); |
+ EXPECT_EQ(&invalidation_service_2, |
+ invalidator->invalidation_service_for_test()); |
+ |
+ // Make the first invalidation service available again. This implies that the |
+ // second invalidation service is no longer available. |
+ broker->OnInvalidationServiceSet(&invalidation_service_1); |
+ |
+ // Verify that the invalidator backed by the second invalidation service was |
+ // destroyed and an invalidation backed by the first invalidation service has |
+ // been created instead. Also verify that its highest handled invalidation |
+ // version starts out as 1. |
+ invalidator = broker->GetInvalidatorForTest(); |
+ ASSERT_TRUE(invalidator); |
+ EXPECT_EQ(invalidation_version, |
+ invalidator->highest_handled_invalidation_version()); |
+ EXPECT_EQ(&invalidation_service_1, |
+ invalidator->invalidation_service_for_test()); |
+ |
+ // Make the first invalidation service unavailable. |
+ broker->OnInvalidationServiceSet(nullptr); |
+} |
+ |
+TEST_F(DeviceLocalAccountPolicyServiceTest, |
pneubeck (no reviews)
2015/01/30 14:23:58
If I checked it correctly, by parameterizing Devic
bartfab (slow)
2015/02/03 18:31:06
Done. After making this change, I renamed DeviceCl
|
+ ConnectBeforeInvalidationServiceAvailable) { |
+ device_local_account_policy_.policy_data().set_invalidation_source(123); |
+ device_local_account_policy_.policy_data().set_invalidation_name( |
+ kInvalidationName); |
+ InstallDeviceLocalAccountPolicy(kAccount1); |
+ |
+ AddDeviceLocalAccountToPolicy(kAccount1); |
+ EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_)); |
+ InstallDevicePolicy(); |
+ Mock::VerifyAndClearExpectations(&service_observer_); |
+ |
+ DeviceLocalAccountPolicyBroker* broker = |
+ service_->GetBrokerForUser(account_1_user_id_); |
+ ASSERT_TRUE(broker); |
+ EXPECT_EQ(account_1_user_id_, broker->user_id()); |
pneubeck (no reviews)
2015/01/30 14:23:58
same as above, please remove
bartfab (slow)
2015/02/03 18:31:06
Obsolete.
|
+ ASSERT_TRUE(broker->core()->store()); |
+ |
+ service_->Connect(&mock_device_management_service_); |
+ |
+ // Verify that no invalidator exists initially. |
+ EXPECT_FALSE(broker->GetInvalidatorForTest()); |
+ |
+ // Make an invalidation service available. |
+ invalidation::FakeInvalidationService invalidation_service; |
+ broker->OnInvalidationServiceSet(&invalidation_service); |
+ |
+ // Verify that an invalidator backed by the invalidation service has been |
+ // created and its highest handled invalidation version starts out as 0. |
+ CloudPolicyInvalidator* invalidator = broker->GetInvalidatorForTest(); |
+ ASSERT_TRUE(invalidator); |
+ EXPECT_EQ(0, invalidator->highest_handled_invalidation_version()); |
+ EXPECT_EQ(&invalidation_service, |
+ invalidator->invalidation_service_for_test()); |
+ |
+ // Make the invalidation service unavailable. |
+ broker->OnInvalidationServiceSet(nullptr); |
+} |
+ |
class DeviceLocalAccountPolicyExtensionCacheTest |
: public DeviceLocalAccountPolicyServiceTestBase { |
protected: |
@@ -784,15 +950,16 @@ class DeviceLocalAccountPolicyProviderTest |
}; |
DeviceLocalAccountPolicyProviderTest::DeviceLocalAccountPolicyProviderTest() { |
+} |
+ |
+void DeviceLocalAccountPolicyProviderTest::SetUp() { |
+ DeviceLocalAccountPolicyServiceTestBase::SetUp(); |
+ |
CreatePolicyService(); |
provider_ = DeviceLocalAccountPolicyProvider::Create( |
GenerateDeviceLocalAccountUserId(kAccount1, |
DeviceLocalAccount::TYPE_PUBLIC_SESSION), |
service_.get()); |
-} |
- |
-void DeviceLocalAccountPolicyProviderTest::SetUp() { |
- DeviceLocalAccountPolicyServiceTestBase::SetUp(); |
provider_->Init(&schema_registry_); |
provider_->AddObserver(&provider_observer_); |