device_local_account_policy_service_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file.
48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/bind.h"
88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/bind_helpers.h"
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/callback.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/file_util.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h"
128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/message_loop/message_loop.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/path_service.h"
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/run_loop.h"
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/strings/stringprintf.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/test/scoped_path_override.h"
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/test/test_simple_task_runner.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/policy/device_local_account_policy_provider.h"
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/chromeos/settings/cros_settings.h"
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_paths.h"
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/power_policy_controller.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_client.h"
318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_service.h"
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "components/policy/core/common/cloud/mock_device_management_service.h"
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/cloud/policy_builder.h"
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h"
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/common/policy_bundle.h"
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h"
408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_test_util.h"
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "policy/policy_constants.h"
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "policy/proto/cloud_policy.pb.h"
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::AnyNumber;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::AtLeast;
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::Mock;
498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using testing::SaveArg;
508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using testing::_;
518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace em = enterprise_management;
538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace policy {
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kAccount1[] = "account1@localhost";
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kAccount2[] = "account2@localhost";
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kAccount3[] = "account3@localhost";
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kExtensionID[] = "kbmnembihfiondgfjekmnmcbddelicoi";
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kExtensionVersion[] = "1.0.0.0";
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kExtensionCRXPath[] = "extensions/hosted_app.crx";
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kUpdateURL[] = "https://clients2.google.com/service/update2/crx";
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class MockDeviceLocalAccountPolicyServiceObserver
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    : public DeviceLocalAccountPolicyService::Observer {
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  MOCK_METHOD1(OnPolicyUpdated, void(const std::string&));
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  MOCK_METHOD0(OnDeviceLocalAccountsChanged, void(void));
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class DeviceLocalAccountPolicyServiceTestBase
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    : public chromeos::DeviceSettingsTestBase {
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DeviceLocalAccountPolicyServiceTestBase();
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TearDown() OVERRIDE;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CreatePolicyService();
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void InstallDeviceLocalAccountPolicy(const std::string& account_id);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void AddDeviceLocalAccountToPolicy(const std::string& account_id);
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void InstallDevicePolicy();
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::string account_1_user_id_;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string account_2_user_id_;
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PolicyMap expected_policy_map_;
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  UserPolicyBuilder device_local_account_policy_;
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  chromeos::CrosSettings cros_settings_;
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<base::TestSimpleTaskRunner> extension_cache_task_runner_;
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  MockDeviceManagementService mock_device_management_service_;
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<DeviceLocalAccountPolicyService> service_;
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private:
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyServiceTestBase);
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class DeviceLocalAccountPolicyServiceTest
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : public DeviceLocalAccountPolicyServiceTestBase {
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  MOCK_METHOD1(OnRefreshDone, void(bool));
1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected:
1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyServiceTest();
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void InstallDevicePolicy() OVERRIDE;
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MockDeviceLocalAccountPolicyServiceObserver service_observer_;
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyServiceTest);
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
123a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochDeviceLocalAccountPolicyServiceTestBase::
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DeviceLocalAccountPolicyServiceTestBase()
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : account_1_user_id_(GenerateDeviceLocalAccountUserId(
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          kAccount1,
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          DeviceLocalAccount::TYPE_PUBLIC_SESSION)),
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      account_2_user_id_(GenerateDeviceLocalAccountUserId(
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          kAccount2,
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          DeviceLocalAccount::TYPE_PUBLIC_SESSION)),
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cros_settings_(&device_settings_service_),
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_cache_task_runner_(new base::TestSimpleTaskRunner) {
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTestBase::SetUp() {
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  chromeos::DeviceSettingsTestBase::SetUp();
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  expected_policy_map_.Set(key::kDisableSpdy,
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                           POLICY_LEVEL_MANDATORY,
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                           POLICY_SCOPE_USER,
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           new base::FundamentalValue(true),
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           NULL);
1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.payload().mutable_disablespdy()->set_value(
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      true);
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  device_local_account_policy_.policy_data().set_policy_type(
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      dm_protocol::kChromePublicAccountPolicyType);
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTestBase::TearDown() {
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  service_->Shutdown();
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  service_.reset();
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  extension_cache_task_runner_->RunUntilIdle();
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::DeviceSettingsTestBase::TearDown();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceLocalAccountPolicyServiceTestBase::CreatePolicyService() {
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_.reset(new DeviceLocalAccountPolicyService(
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      &device_settings_test_helper_,
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      &device_settings_service_,
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      &cros_settings_,
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      loop_.message_loop_proxy(),
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extension_cache_task_runner_,
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      loop_.message_loop_proxy(),
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      loop_.message_loop_proxy(),
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new net::TestURLRequestContextGetter(
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          base::MessageLoop::current()->message_loop_proxy())));
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTestBase::
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    InstallDeviceLocalAccountPolicy(const std::string& account_id) {
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  device_local_account_policy_.policy_data().set_settings_entity_id(account_id);
1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.policy_data().set_username(account_id);
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.Build();
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  device_settings_test_helper_.set_device_local_account_policy_blob(
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      account_id, device_local_account_policy_.GetBlob());
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTestBase::AddDeviceLocalAccountToPolicy(
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& account_id) {
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  em::DeviceLocalAccountInfoProto* account =
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      device_policy_.payload().mutable_device_local_accounts()->add_account();
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  account->set_account_id(account_id);
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  account->set_type(
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION);
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTestBase::InstallDevicePolicy() {
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_policy_.Build();
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob());
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReloadDeviceSettings();
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)DeviceLocalAccountPolicyServiceTest::DeviceLocalAccountPolicyServiceTest() {
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CreatePolicyService();
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTest::SetUp() {
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DeviceLocalAccountPolicyServiceTestBase::SetUp();
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  service_->AddObserver(&service_observer_);
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTest::TearDown() {
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  service_->RemoveObserver(&service_observer_);
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DeviceLocalAccountPolicyServiceTestBase::TearDown();
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DeviceLocalAccountPolicyServiceTest::InstallDevicePolicy() {
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_CALL(service_observer_, OnDeviceLocalAccountsChanged());
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DeviceLocalAccountPolicyServiceTestBase::InstallDevicePolicy();
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, NoAccounts) {
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(service_->GetBrokerForUser(account_1_user_id_));
2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, GetBroker) {
219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InstallDeviceLocalAccountPolicy(kAccount1);
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetBrokerForUser(account_1_user_id_);
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(broker);
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(account_1_user_id_, broker->user_id());
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_OK, broker->core()->store()->status());
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(broker->core()->client());
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(broker->core()->store()->policy_map().empty());
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
234a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DeviceLocalAccountPolicyServiceTest, LoadNoPolicy) {
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      service_->GetBrokerForUser(account_1_user_id_);
2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(broker);
2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(account_1_user_id_, broker->user_id());
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_LOAD_ERROR,
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            broker->core()->store()->status());
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(broker->core()->store()->policy_map().empty());
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(service_->IsPolicyAvailableForUser(account_1_user_id_));
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, LoadValidationFailure) {
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  device_local_account_policy_.policy_data().set_policy_type(
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dm_protocol::kChromeUserPolicyType);
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service_->GetBrokerForUser(account_1_user_id_);
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(broker);
2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(account_1_user_id_, broker->user_id());
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR,
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            broker->core()->store()->status());
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(broker->core()->store()->policy_map().empty());
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(service_->IsPolicyAvailableForUser(account_1_user_id_));
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, LoadPolicy) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InstallDevicePolicy();
274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
2768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service_->GetBrokerForUser(account_1_user_id_);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(broker);
2788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(account_1_user_id_, broker->user_id());
2798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_OK, broker->core()->store()->status());
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(broker->core()->store()->policy());
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(device_local_account_policy_.policy_data().SerializeAsString(),
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            broker->core()->store()->policy()->SerializeAsString());
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(expected_policy_map_.Equals(
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      broker->core()->store()->policy_map()));
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_));
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
289a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DeviceLocalAccountPolicyServiceTest, StoreValidationFailure) {
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InstallDevicePolicy();
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
2968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service_->GetBrokerForUser(account_1_user_id_);
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(broker);
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(account_1_user_id_, broker->user_id());
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
3008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.policy_data().set_policy_type(
3028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      dm_protocol::kChromeUserPolicyType);
3038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.Build();
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  broker->core()->store()->Store(device_local_account_policy_.policy());
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
3068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FlushDeviceSettings();
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR,
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            broker->core()->store()->status());
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_WRONG_POLICY_TYPE,
31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            broker->core()->store()->validation_status());
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(service_->IsPolicyAvailableForUser(account_1_user_id_));
31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, StorePolicy) {
3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstallDevicePolicy();
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service_->GetBrokerForUser(account_1_user_id_);
3238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(broker);
3248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(account_1_user_id_, broker->user_id());
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_local_account_policy_.policy_data().set_settings_entity_id(kAccount1);
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_local_account_policy_.policy_data().set_username(kAccount1);
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_local_account_policy_.Build();
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  broker->core()->store()->Store(device_local_account_policy_.policy());
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FlushDeviceSettings();
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_OK, broker->core()->store()->status());
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store()->policy());
336a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(device_local_account_policy_.policy_data().SerializeAsString(),
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            broker->core()->store()->policy()->SerializeAsString());
33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(expected_policy_map_.Equals(
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      broker->core()->store()->policy_map()));
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_));
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceLocalAccountPolicyServiceTest, DevicePolicyChange) {
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InstallDeviceLocalAccountPolicy(kAccount1);
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddDeviceLocalAccountToPolicy(kAccount1);
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InstallDevicePolicy();
3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  device_policy_.payload().mutable_device_local_accounts()->clear_account();
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InstallDevicePolicy();
351a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(service_->GetBrokerForUser(account_1_user_id_));
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, DuplicateAccounts) {
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InstallDevicePolicy();
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Add a second entry with a duplicate account name to device policy.
36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
3648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
3658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Make sure the broker is accessible and policy got loaded.
367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DeviceLocalAccountPolicyBroker* broker =
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      service_->GetBrokerForUser(account_1_user_id_);
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(broker);
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(account_1_user_id_, broker->user_id());
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(broker->core()->store());
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(CloudPolicyStore::STATUS_OK, broker->core()->store()->status());
3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store()->policy());
3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(device_local_account_policy_.policy_data().SerializeAsString(),
375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            broker->core()->store()->policy()->SerializeAsString());
3768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(expected_policy_map_.Equals(
3778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      broker->core()->store()->policy_map()));
3788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_));
3798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, FetchPolicy) {
3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddDeviceLocalAccountToPolicy(kAccount1);
3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
3858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker =
388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      service_->GetBrokerForUser(account_1_user_id_);
389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(broker);
3908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service_->Connect(&mock_device_management_service_);
39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(broker->core()->client());
39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  em::DeviceManagementRequest request;
39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  em::DeviceManagementResponse response;
39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  response.mutable_policy_response()->add_response()->CopyFrom(
39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      device_local_account_policy_.policy());
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock_device_management_service_,
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _))
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(mock_device_management_service_.SucceedJob(response));
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(mock_device_management_service_,
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              StartJob(dm_protocol::kValueRequestPolicy,
4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       std::string(), std::string(),
4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       device_policy_.policy_data().request_token(),
4058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       dm_protocol::kValueUserAffiliationManaged,
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       device_policy_.policy_data().device_id(),
40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       _))
40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .WillOnce(SaveArg<6>(&request));
40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  broker->core()->client()->FetchPolicy();
411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  FlushDeviceSettings();
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&mock_device_management_service_);
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(request.has_policy_request());
41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, request.policy_request().request_size());
41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(dm_protocol::kChromePublicAccountPolicyType,
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            request.policy_request().request(0).policy_type());
41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(request.policy_request().request(0).has_machine_id());
41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kAccount1,
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            request.policy_request().request(0).settings_entity_id());
42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(broker->core()->store());
42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(CloudPolicyStore::STATUS_OK,
42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            broker->core()->store()->status());
42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store()->policy());
42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(device_local_account_policy_.policy_data().SerializeAsString(),
42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            broker->core()->store()->policy()->SerializeAsString());
42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(expected_policy_map_.Equals(
42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      broker->core()->store()->policy_map()));
43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_));
4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyServiceTest, RefreshPolicy) {
4348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
4358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
4368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
4378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDevicePolicy();
438a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DeviceLocalAccountPolicyBroker* broker =
44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      service_->GetBrokerForUser(account_1_user_id_);
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(broker);
442a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  service_->Connect(&mock_device_management_service_);
444a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(broker->core()->service());
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  em::DeviceManagementResponse response;
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response.mutable_policy_response()->add_response()->CopyFrom(
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_local_account_policy_.policy());
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(mock_device_management_service_, CreateJob(_, _))
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(mock_device_management_service_.SucceedJob(response));
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(mock_device_management_service_, StartJob(_, _, _, _, _, _, _));
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*this, OnRefreshDone(true)).Times(1);
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(service_observer_, OnPolicyUpdated(account_1_user_id_));
454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  broker->core()->service()->RefreshPolicy(
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&DeviceLocalAccountPolicyServiceTest::OnRefreshDone,
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FlushDeviceSettings();
4588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&service_observer_);
4598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Mock::VerifyAndClearExpectations(&mock_device_management_service_);
4618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(broker->core()->store());
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(CloudPolicyStore::STATUS_OK,
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            broker->core()->store()->status());
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(expected_policy_map_.Equals(
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      broker->core()->store()->policy_map()));
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->IsPolicyAvailableForUser(account_1_user_id_));
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class DeviceLocalAccountPolicyExtensionCacheTest
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public DeviceLocalAccountPolicyServiceTestBase {
47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected:
47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DeviceLocalAccountPolicyExtensionCacheTest();
4748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath GetCacheDirectoryForAccountID(const std::string& account_id);
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedTempDir cache_root_dir_;
480a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::ScopedPathOverride> cache_root_dir_override_;
481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath cache_dir_1_;
4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath cache_dir_2_;
4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath cache_dir_3_;
4858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyExtensionCacheTest);
4888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)DeviceLocalAccountPolicyExtensionCacheTest::
4918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DeviceLocalAccountPolicyExtensionCacheTest() {
4928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
493a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
494a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DeviceLocalAccountPolicyExtensionCacheTest::SetUp() {
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DeviceLocalAccountPolicyServiceTestBase::SetUp();
4968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(cache_root_dir_.CreateUniqueTempDir());
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cache_root_dir_override_.reset(new base::ScopedPathOverride(
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::DIR_DEVICE_LOCAL_ACCOUNT_EXTENSIONS,
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cache_root_dir_.path()));
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cache_dir_1_ = GetCacheDirectoryForAccountID(kAccount1);
502a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cache_dir_2_ = GetCacheDirectoryForAccountID(kAccount2);
503a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cache_dir_3_ = GetCacheDirectoryForAccountID(kAccount3);
5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  em::StringList* forcelist = device_local_account_policy_.payload()
5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .mutable_extensioninstallforcelist()->mutable_value();
5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  forcelist->add_entries(base::StringPrintf("%s;%s", kExtensionID, kUpdateURL));
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath DeviceLocalAccountPolicyExtensionCacheTest::
5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    GetCacheDirectoryForAccountID(const std::string& account_id) {
5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return cache_root_dir_.path().Append(base::HexEncode(account_id.c_str(),
513a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                       account_id.size()));
514a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Verifies that during startup, orphaned cache directories are deleted,
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// cache directories belonging to an existing account are preserved and missing
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// cache directories are created. Also verifies that when startup is complete,
5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// the caches for all existing accounts are running.
5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DeviceLocalAccountPolicyExtensionCacheTest, Startup) {
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath test_data_dir;
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const base::FilePath source_crx_file =
5246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      test_data_dir.Append(kExtensionCRXPath);
5256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const std::string target_crx_file_name =
5266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::StringPrintf("%s-%s.crx", kExtensionID, kExtensionVersion);
5276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Create and pre-populate a cache directory for account 1.
5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(cache_dir_1_));
5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(CopyFile(source_crx_file,
5316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       cache_dir_1_.Append(target_crx_file_name)));
5326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
533a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Create and pre-populate a cache directory for account 3.
5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(cache_dir_3_));
5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(CopyFile(source_crx_file,
5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       cache_dir_3_.Append(target_crx_file_name)));
537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Add accounts 1 and 2 to device policy.
5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount1);
5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InstallDeviceLocalAccountPolicy(kAccount2);
5416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount1);
5426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AddDeviceLocalAccountToPolicy(kAccount2);
5436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  InstallDevicePolicy();
5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Create the DeviceLocalAccountPolicyService, allowing it to finish the
5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // deletion of orphaned cache directories.
5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CreatePolicyService();
5486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FlushDeviceSettings();
549a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  extension_cache_task_runner_->RunUntilIdle();
5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Verify that the cache directory for account 1 and its contents still exist.
5528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(base::DirectoryExists(cache_dir_1_));
5538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ContentsEqual(source_crx_file,
5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                            cache_dir_1_.Append(target_crx_file_name)));
5558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Verify that a cache directory for account 2 was created.
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(base::DirectoryExists(cache_dir_2_));
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify that the cache directory for account 3 was deleted.
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(base::DirectoryExists(cache_dir_3_));
561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify that the cache for account 1 has been started.
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DeviceLocalAccountPolicyBroker* broker =
564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetBrokerForUser(account_1_user_id_);
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(broker);
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify that the cache for account 2 has been started.
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  broker = service_->GetBrokerForUser(account_2_user_id_);
570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(broker);
571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that while the deletion of orphaned cache directories is in
575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// progress, the caches for accounts which existed before the deletion started
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// are running but caches for newly added accounts are not started.
577116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DeviceLocalAccountPolicyExtensionCacheTest, RaceAgainstOrphanDeletion) {
578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Add account 1 to device policy.
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InstallDeviceLocalAccountPolicy(kAccount1);
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddDeviceLocalAccountToPolicy(kAccount1);
581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InstallDevicePolicy();
582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create the DeviceLocalAccountPolicyService, triggering the deletion of
584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // orphaned cache directories.
585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreatePolicyService();
586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FlushDeviceSettings();
587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify that the cache for account 1 has been started as it is unaffected by
589a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // the orphan deletion.
590  DeviceLocalAccountPolicyBroker* broker =
591      service_->GetBrokerForUser(account_1_user_id_);
592  ASSERT_TRUE(broker);
593  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
594
595  // Add account 2 to device policy.
596  InstallDeviceLocalAccountPolicy(kAccount2);
597  AddDeviceLocalAccountToPolicy(kAccount2);
598  InstallDevicePolicy();
599
600  // Verify that the cache for account 2 has not been started yet as the orphan
601  // deletion is still in progress.
602  broker = service_->GetBrokerForUser(account_2_user_id_);
603  ASSERT_TRUE(broker);
604  EXPECT_FALSE(broker->extension_loader()->IsCacheRunning());
605
606  // Allow the orphan deletion to finish.
607  extension_cache_task_runner_->RunUntilIdle();
608  base::RunLoop().RunUntilIdle();
609
610  // Verify that the cache for account 2 has been started.
611  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
612}
613
614// Verifies that while the shutdown of a cache is in progress, no new cache is
615// started if an account with the same ID is re-added.
616TEST_F(DeviceLocalAccountPolicyExtensionCacheTest, RaceAgainstCacheShutdown) {
617  // Add account 1 to device policy.
618  InstallDeviceLocalAccountPolicy(kAccount1);
619  AddDeviceLocalAccountToPolicy(kAccount1);
620  InstallDevicePolicy();
621
622  // Create the DeviceLocalAccountPolicyService, allowing it to finish the
623  // deletion of orphaned cache directories.
624  CreatePolicyService();
625  FlushDeviceSettings();
626  extension_cache_task_runner_->RunUntilIdle();
627
628  // Remove account 1 from device policy, triggering a shutdown of its cache.
629  device_policy_.payload().mutable_device_local_accounts()->clear_account();
630  InstallDevicePolicy();
631
632  // Re-add account 1 to device policy.
633  AddDeviceLocalAccountToPolicy(kAccount1);
634  InstallDevicePolicy();
635
636  // Verify that the cache for account 1 has not been started yet as the
637  // shutdown of a previous cache for this account ID is still in progress.
638  DeviceLocalAccountPolicyBroker* broker =
639      service_->GetBrokerForUser(account_1_user_id_);
640  ASSERT_TRUE(broker);
641  EXPECT_FALSE(broker->extension_loader()->IsCacheRunning());
642
643  // Allow the cache shutdown to finish.
644  extension_cache_task_runner_->RunUntilIdle();
645  base::RunLoop().RunUntilIdle();
646
647  // Verify that the cache directory for account 1 still exists.
648  EXPECT_TRUE(base::DirectoryExists(cache_dir_1_));
649
650  // Verify that the cache for account 1 has been started, reusing the existing
651  // cache directory.
652  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
653}
654
655// Verifies that while the deletion of an obsolete cache directory is in
656// progress, no new cache is started if an account with the same ID is re-added.
657TEST_F(DeviceLocalAccountPolicyExtensionCacheTest,
658       RaceAgainstObsoleteDeletion) {
659  // Add account 1 to device policy.
660  InstallDeviceLocalAccountPolicy(kAccount1);
661  AddDeviceLocalAccountToPolicy(kAccount1);
662  InstallDevicePolicy();
663
664  // Create the DeviceLocalAccountPolicyService, allowing it to finish the
665  // deletion of orphaned cache directories.
666  CreatePolicyService();
667  FlushDeviceSettings();
668  extension_cache_task_runner_->RunUntilIdle();
669
670  // Remove account 1 from device policy, allowing the shutdown of its cache to
671  // finish and the deletion of its now obsolete cache directory to begin.
672  device_policy_.payload().mutable_device_local_accounts()->clear_account();
673  InstallDevicePolicy();
674  extension_cache_task_runner_->RunUntilIdle();
675  base::RunLoop().RunUntilIdle();
676
677  // Re-add account 1 to device policy.
678  AddDeviceLocalAccountToPolicy(kAccount1);
679  InstallDevicePolicy();
680
681  // Verify that the cache for account 1 has not been started yet as the
682  // deletion of the cache directory for this account ID is still in progress.
683  DeviceLocalAccountPolicyBroker* broker =
684      service_->GetBrokerForUser(account_1_user_id_);
685  ASSERT_TRUE(broker);
686  EXPECT_FALSE(broker->extension_loader()->IsCacheRunning());
687
688  // Allow the deletion to finish.
689  extension_cache_task_runner_->RunUntilIdle();
690  base::RunLoop().RunUntilIdle();
691
692  // Verify that the cache directory for account 1 was deleted.
693  EXPECT_FALSE(base::DirectoryExists(cache_dir_1_));
694
695  // Verify that the cache for account 1 has been started.
696  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
697}
698
699// Verifies that when an account is added and no deletion of cache directories
700// affecting this account is in progress, its cache is started immediately.
701TEST_F(DeviceLocalAccountPolicyExtensionCacheTest, AddAccount) {
702  // Create the DeviceLocalAccountPolicyService, allowing it to finish the
703  // deletion of orphaned cache directories.
704  InstallDevicePolicy();
705  CreatePolicyService();
706  FlushDeviceSettings();
707  extension_cache_task_runner_->RunUntilIdle();
708
709  // Add account 1 to device policy.
710  InstallDeviceLocalAccountPolicy(kAccount1);
711  AddDeviceLocalAccountToPolicy(kAccount1);
712  InstallDevicePolicy();
713
714  // Verify that the cache for account 1 has been started.
715  DeviceLocalAccountPolicyBroker* broker =
716      service_->GetBrokerForUser(account_1_user_id_);
717  ASSERT_TRUE(broker);
718  EXPECT_TRUE(broker->extension_loader()->IsCacheRunning());
719}
720
721// Verifies that when an account is removed, its cache directory is deleted.
722TEST_F(DeviceLocalAccountPolicyExtensionCacheTest, RemoveAccount) {
723  // Add account 1 to device policy.
724  InstallDeviceLocalAccountPolicy(kAccount1);
725  AddDeviceLocalAccountToPolicy(kAccount1);
726  InstallDevicePolicy();
727
728  // Create the DeviceLocalAccountPolicyService, allowing it to finish the
729  // deletion of orphaned cache directories.
730  CreatePolicyService();
731  FlushDeviceSettings();
732  extension_cache_task_runner_->RunUntilIdle();
733
734  // Verify that a cache directory has been created for account 1.
735  EXPECT_TRUE(base::DirectoryExists(cache_dir_1_));
736
737  // Remove account 1 from device policy, allowing the deletion of its now
738  // obsolete cache directory to finish.
739  device_policy_.payload().mutable_device_local_accounts()->clear_account();
740  InstallDevicePolicy();
741  extension_cache_task_runner_->RunUntilIdle();
742  base::RunLoop().RunUntilIdle();
743  extension_cache_task_runner_->RunUntilIdle();
744
745  // Verify that the cache directory for account 1 was deleted.
746  EXPECT_FALSE(base::DirectoryExists(cache_dir_1_));
747}
748
749class DeviceLocalAccountPolicyProviderTest
750    : public DeviceLocalAccountPolicyServiceTestBase {
751 protected:
752  DeviceLocalAccountPolicyProviderTest();
753
754  virtual void SetUp() OVERRIDE;
755  virtual void TearDown() OVERRIDE;
756
757  SchemaRegistry schema_registry_;
758  scoped_ptr<DeviceLocalAccountPolicyProvider> provider_;
759  MockConfigurationPolicyObserver provider_observer_;
760
761 private:
762  DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyProviderTest);
763};
764
765DeviceLocalAccountPolicyProviderTest::DeviceLocalAccountPolicyProviderTest() {
766  CreatePolicyService();
767  provider_ = DeviceLocalAccountPolicyProvider::Create(
768      GenerateDeviceLocalAccountUserId(kAccount1,
769                                       DeviceLocalAccount::TYPE_PUBLIC_SESSION),
770      service_.get());
771}
772
773void DeviceLocalAccountPolicyProviderTest::SetUp() {
774  DeviceLocalAccountPolicyServiceTestBase::SetUp();
775  provider_->Init(&schema_registry_);
776  provider_->AddObserver(&provider_observer_);
777
778  // Values implicitly enforced for public accounts.
779  expected_policy_map_.Set(key::kLidCloseAction,
780                           POLICY_LEVEL_MANDATORY,
781                           POLICY_SCOPE_MACHINE,
782                           new base::FundamentalValue(
783                               chromeos::PowerPolicyController::
784                                   ACTION_STOP_SESSION),
785                           NULL);
786  expected_policy_map_.Set(key::kShelfAutoHideBehavior,
787                           POLICY_LEVEL_MANDATORY,
788                           POLICY_SCOPE_MACHINE,
789                           new base::StringValue("Never"),
790                           NULL);
791  expected_policy_map_.Set(key::kShowLogoutButtonInTray,
792                           POLICY_LEVEL_MANDATORY,
793                           POLICY_SCOPE_MACHINE,
794                           new base::FundamentalValue(true),
795                           NULL);
796  expected_policy_map_.Set(key::kFullscreenAllowed,
797                           POLICY_LEVEL_MANDATORY,
798                           POLICY_SCOPE_MACHINE,
799                           new base::FundamentalValue(false),
800                           NULL);
801}
802
803void DeviceLocalAccountPolicyProviderTest::TearDown() {
804  provider_->RemoveObserver(&provider_observer_);
805  provider_->Shutdown();
806  provider_.reset();
807  DeviceLocalAccountPolicyServiceTestBase::TearDown();
808}
809
810TEST_F(DeviceLocalAccountPolicyProviderTest, Initialization) {
811  EXPECT_FALSE(provider_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
812
813  // Policy change should complete initialization.
814  InstallDeviceLocalAccountPolicy(kAccount1);
815  AddDeviceLocalAccountToPolicy(kAccount1);
816  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
817      .Times(AtLeast(1));
818  InstallDevicePolicy();
819  Mock::VerifyAndClearExpectations(&provider_observer_);
820
821  EXPECT_TRUE(provider_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
822
823  // The account disappearing should *not* flip the initialization flag back.
824  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
825      .Times(AnyNumber());
826  device_policy_.payload().mutable_device_local_accounts()->clear_account();
827  InstallDevicePolicy();
828  Mock::VerifyAndClearExpectations(&provider_observer_);
829
830  EXPECT_TRUE(provider_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
831}
832
833TEST_F(DeviceLocalAccountPolicyProviderTest, Policy) {
834  // Policy should load successfully.
835  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
836      .Times(AtLeast(1));
837  InstallDeviceLocalAccountPolicy(kAccount1);
838  AddDeviceLocalAccountToPolicy(kAccount1);
839  InstallDevicePolicy();
840  Mock::VerifyAndClearExpectations(&provider_observer_);
841
842  PolicyBundle expected_policy_bundle;
843  expected_policy_bundle.Get(PolicyNamespace(
844      POLICY_DOMAIN_CHROME, std::string())).CopyFrom(expected_policy_map_);
845  EXPECT_TRUE(expected_policy_bundle.Equals(provider_->policies()));
846
847  // Policy change should be reported.
848  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
849      .Times(AtLeast(1));
850  device_local_account_policy_.payload().mutable_disablespdy()->set_value(
851      false);
852  InstallDeviceLocalAccountPolicy(kAccount1);
853  DeviceLocalAccountPolicyBroker* broker =
854      service_->GetBrokerForUser(account_1_user_id_);
855  ASSERT_TRUE(broker);
856  broker->core()->store()->Load();
857  FlushDeviceSettings();
858  Mock::VerifyAndClearExpectations(&provider_observer_);
859
860  expected_policy_bundle.Get(
861      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
862      .Set(key::kDisableSpdy,
863           POLICY_LEVEL_MANDATORY,
864           POLICY_SCOPE_USER,
865           new base::FundamentalValue(false),
866           NULL);
867  EXPECT_TRUE(expected_policy_bundle.Equals(provider_->policies()));
868
869  // Any values set for the |ShelfAutoHideBehavior|, |ShowLogoutButtonInTray|
870  // and |ExtensionAllowedTypes| policies should be overridden.
871  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
872      .Times(AtLeast(1));
873  device_local_account_policy_.payload().mutable_shelfautohidebehavior()->
874      set_value("Always");
875  device_local_account_policy_.payload().mutable_showlogoutbuttonintray()->
876      set_value(false);
877  InstallDeviceLocalAccountPolicy(kAccount1);
878  broker->core()->store()->Load();
879  FlushDeviceSettings();
880  Mock::VerifyAndClearExpectations(&provider_observer_);
881  EXPECT_TRUE(expected_policy_bundle.Equals(provider_->policies()));
882
883  // Account disappears, policy should stay in effect.
884  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
885      .Times(AnyNumber());
886  device_policy_.payload().mutable_device_local_accounts()->clear_account();
887  InstallDevicePolicy();
888  Mock::VerifyAndClearExpectations(&provider_observer_);
889
890  EXPECT_TRUE(expected_policy_bundle.Equals(provider_->policies()));
891}
892
893TEST_F(DeviceLocalAccountPolicyProviderTest, RefreshPolicies) {
894  // If there's no device policy, the refresh completes immediately.
895  EXPECT_FALSE(service_->GetBrokerForUser(account_1_user_id_));
896  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
897      .Times(AtLeast(1));
898  provider_->RefreshPolicies();
899  Mock::VerifyAndClearExpectations(&provider_observer_);
900
901  // Make device settings appear.
902  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
903      .Times(AnyNumber());
904  AddDeviceLocalAccountToPolicy(kAccount1);
905  InstallDevicePolicy();
906  EXPECT_TRUE(service_->GetBrokerForUser(account_1_user_id_));
907
908  // If there's no cloud connection, refreshes are still immediate.
909  DeviceLocalAccountPolicyBroker* broker =
910      service_->GetBrokerForUser(account_1_user_id_);
911  ASSERT_TRUE(broker);
912  EXPECT_FALSE(broker->core()->client());
913  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
914      .Times(AtLeast(1));
915  provider_->RefreshPolicies();
916  Mock::VerifyAndClearExpectations(&provider_observer_);
917
918  // Bring up the cloud connection. The refresh scheduler may fire refreshes at
919  // this point which are not relevant for the test.
920  EXPECT_CALL(mock_device_management_service_, CreateJob(_, _))
921      .WillRepeatedly(
922          mock_device_management_service_.FailJob(DM_STATUS_REQUEST_FAILED));
923  EXPECT_CALL(mock_device_management_service_, StartJob(_, _, _, _, _, _, _))
924      .Times(AnyNumber());
925  service_->Connect(&mock_device_management_service_);
926  FlushDeviceSettings();
927  Mock::VerifyAndClearExpectations(&mock_device_management_service_);
928
929  // No callbacks until the refresh completes.
930  EXPECT_CALL(provider_observer_, OnUpdatePolicy(_)).Times(0);
931  MockDeviceManagementJob* request_job;
932  EXPECT_CALL(mock_device_management_service_, CreateJob(_, _))
933      .WillOnce(mock_device_management_service_.CreateAsyncJob(&request_job));
934  EXPECT_CALL(mock_device_management_service_, StartJob(_, _, _, _, _, _, _));
935  provider_->RefreshPolicies();
936  ReloadDeviceSettings();
937  Mock::VerifyAndClearExpectations(&provider_observer_);
938  Mock::VerifyAndClearExpectations(&mock_device_management_service_);
939  EXPECT_TRUE(provider_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
940
941  // When the response comes in, it should propagate and fire the notification.
942  EXPECT_CALL(provider_observer_, OnUpdatePolicy(provider_.get()))
943      .Times(AtLeast(1));
944  ASSERT_TRUE(request_job);
945  em::DeviceManagementResponse response;
946  device_local_account_policy_.Build();
947  response.mutable_policy_response()->add_response()->CopyFrom(
948      device_local_account_policy_.policy());
949  request_job->SendResponse(DM_STATUS_SUCCESS, response);
950  FlushDeviceSettings();
951  Mock::VerifyAndClearExpectations(&provider_observer_);
952}
953
954}  // namespace policy
955