Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(497)

Unified Diff: chrome/browser/chromeos/policy/device_local_account_policy_service_unittest.cc

Issue 822523003: Implement device-local account policy pushing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@f_2_442800_switch_device_cloud_policy_invalidator
Patch Set: Removed the need to initialize singletons in unit tests. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698