1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/policy/asynchronous_policy_loader.h"
6 #include "chrome/browser/policy/asynchronous_policy_test_base.h"
7 #include "chrome/browser/policy/configuration_policy_pref_store.h"
8 #include "chrome/browser/policy/configuration_policy_store_interface.h"
9 #include "chrome/browser/policy/file_based_policy_provider.h"
10 #include "chrome/browser/policy/mock_configuration_policy_store.h"
11 #include "policy/policy_constants.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using testing::_;
16 using testing::InSequence;
17 using testing::Return;
18
19 namespace policy {
20
21 class FileBasedPolicyProviderDelegateMock
22 : public FileBasedPolicyProvider::ProviderDelegate {
23 public:
FileBasedPolicyProviderDelegateMock()24 FileBasedPolicyProviderDelegateMock()
25 : FileBasedPolicyProvider::ProviderDelegate(FilePath()) {}
26 MOCK_METHOD0(Load, DictionaryValue*());
27 MOCK_METHOD0(GetLastModification, base::Time());
28 };
29
TEST_F(AsynchronousPolicyTestBase,ProviderInit)30 TEST_F(AsynchronousPolicyTestBase, ProviderInit) {
31 base::Time last_modified;
32 FileBasedPolicyProviderDelegateMock* provider_delegate =
33 new FileBasedPolicyProviderDelegateMock();
34 EXPECT_CALL(*provider_delegate, GetLastModification()).WillRepeatedly(
35 Return(last_modified));
36 InSequence s;
37 EXPECT_CALL(*provider_delegate, Load()).WillOnce(Return(
38 new DictionaryValue));
39 DictionaryValue* policies = new DictionaryValue();
40 policies->SetBoolean(policy::key::kSyncDisabled, true);
41 // A second call to Load gets triggered during the provider's construction
42 // when the file watcher is initialized, since this file may have changed
43 // between the initial load and creating watcher.
44 EXPECT_CALL(*provider_delegate, Load()).WillOnce(Return(policies));
45 FileBasedPolicyProvider provider(
46 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
47 provider_delegate);
48 loop_.RunAllPending();
49 EXPECT_CALL(*store_, Apply(policy::kPolicySyncDisabled, _)).Times(1);
50 provider.Provide(store_.get());
51 }
52
TEST_F(AsynchronousPolicyTestBase,ProviderRefresh)53 TEST_F(AsynchronousPolicyTestBase, ProviderRefresh) {
54 base::Time last_modified;
55 FileBasedPolicyProviderDelegateMock* provider_delegate =
56 new FileBasedPolicyProviderDelegateMock();
57 EXPECT_CALL(*provider_delegate, GetLastModification()).WillRepeatedly(
58 Return(last_modified));
59 InSequence s;
60 EXPECT_CALL(*provider_delegate, Load()).WillOnce(Return(
61 new DictionaryValue));
62 FileBasedPolicyProvider file_based_provider(
63 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
64 provider_delegate);
65 // A second call to Load gets triggered during the provider's construction
66 // when the file watcher is initialized, since this file may have changed
67 // between the initial load and creating watcher.
68 EXPECT_CALL(*provider_delegate, Load()).WillOnce(Return(
69 new DictionaryValue));
70 loop_.RunAllPending();
71 // A third and final call to Load is made by the explicit Reload. This
72 // should be the one that provides the current policy.
73 DictionaryValue* policies = new DictionaryValue();
74 policies->SetBoolean(policy::key::kSyncDisabled, true);
75 EXPECT_CALL(*provider_delegate, Load()).WillOnce(Return(policies));
76 file_based_provider.loader()->Reload();
77 loop_.RunAllPending();
78 EXPECT_CALL(*store_, Apply(policy::kPolicySyncDisabled, _)).Times(1);
79 file_based_provider.Provide(store_.get());
80 }
81
82 } // namespace policy
83