1 // Copyright (c) 2012 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.
8 #include "base/callback.h"
9 #include "base/compiler_specific.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/prefs/pref_registry_simple.h"
13 #include "base/prefs/testing_pref_service.h"
14 #include "base/test/test_simple_task_runner.h"
15 #include "base/time/time.h"
16 #include "base/values.h"
17 #include "chrome/browser/policy/external_data_fetcher.h"
18 #include "chrome/browser/policy/mock_policy_service.h"
19 #include "chrome/browser/policy/policy_map.h"
20 #include "chrome/browser/policy/policy_statistics_collector.h"
21 #include "chrome/browser/policy/policy_types.h"
22 #include "components/policy/core/common/policy_pref_names.h"
23 #include "policy/policy_constants.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
33 using testing::Return;
34 using testing::ReturnRef;
36 // Arbitrary policy names used for testing.
37 const char* const kTestPolicy1 = key::kAlternateErrorPagesEnabled;
38 const char* const kTestPolicy2 = key::kSearchSuggestEnabled;
40 class TestPolicyStatisticsCollector : public PolicyStatisticsCollector {
42 TestPolicyStatisticsCollector(
43 PolicyService* policy_service,
45 const scoped_refptr<base::TaskRunner>& task_runner)
46 : PolicyStatisticsCollector(policy_service, prefs, task_runner) {
49 MOCK_METHOD1(RecordPolicyUse, void(int));
54 class PolicyStatisticsCollectorTest : public testing::Test {
56 PolicyStatisticsCollectorTest()
57 : update_delay_(base::TimeDelta::FromMilliseconds(
58 PolicyStatisticsCollector::kStatisticsUpdateRate)),
61 task_runner_(new base::TestSimpleTaskRunner()) {
64 virtual void SetUp() OVERRIDE {
65 prefs_.registry()->RegisterInt64Pref(
66 policy_prefs::kLastPolicyStatisticsUpdate, 0);
68 // Find ids for kTestPolicy1 and kTestPolicy2.
69 const policy::PolicyDefinitionList* policy_list =
70 policy::GetChromePolicyDefinitionList();
71 for (const policy::PolicyDefinitionList::Entry* policy = policy_list->begin;
72 policy != policy_list->end; ++policy) {
73 if (strcmp(policy->name, kTestPolicy1) == 0)
74 test_policy_id1_ = policy->id;
75 else if (strcmp(policy->name, kTestPolicy2) == 0)
76 test_policy_id2_ = policy->id;
78 ASSERT_TRUE(test_policy_id1_ != -1);
79 ASSERT_TRUE(test_policy_id2_ != -1);
81 // Set up default function behaviour.
82 EXPECT_CALL(policy_service_,
83 GetPolicies(PolicyNamespace(POLICY_DOMAIN_CHROME,
85 .WillRepeatedly(ReturnRef(policy_map_));
87 // Arbitrary negative value (so it'll be different from |update_delay_|).
88 last_delay_ = base::TimeDelta::FromDays(-1);
90 policy_statistics_collector_.reset(new TestPolicyStatisticsCollector(
96 void SetPolicy(const std::string& name) {
97 policy_map_.Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
98 base::Value::CreateBooleanValue(true), NULL);
101 base::TimeDelta GetFirstDelay() const {
102 if (task_runner_->GetPendingTasks().empty()) {
104 return base::TimeDelta();
106 return task_runner_->GetPendingTasks().front().delay;
109 const base::TimeDelta update_delay_;
111 int test_policy_id1_;
112 int test_policy_id2_;
114 base::TimeDelta last_delay_;
116 TestingPrefServiceSimple prefs_;
117 MockPolicyService policy_service_;
118 PolicyMap policy_map_;
120 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
121 scoped_ptr<TestPolicyStatisticsCollector> policy_statistics_collector_;
124 TEST_F(PolicyStatisticsCollectorTest, CollectPending) {
125 SetPolicy(kTestPolicy1);
127 prefs_.SetInt64(policy_prefs::kLastPolicyStatisticsUpdate,
128 (base::Time::Now() - update_delay_).ToInternalValue());
130 EXPECT_CALL(*policy_statistics_collector_.get(),
131 RecordPolicyUse(test_policy_id1_));
133 policy_statistics_collector_->Initialize();
134 EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
135 EXPECT_EQ(update_delay_, GetFirstDelay());
138 TEST_F(PolicyStatisticsCollectorTest, CollectPendingVeryOld) {
139 SetPolicy(kTestPolicy1);
141 // Must not be 0.0 (read comment for Time::FromDoubleT).
142 prefs_.SetInt64(policy_prefs::kLastPolicyStatisticsUpdate,
143 base::Time::FromDoubleT(1.0).ToInternalValue());
145 EXPECT_CALL(*policy_statistics_collector_.get(),
146 RecordPolicyUse(test_policy_id1_));
148 policy_statistics_collector_->Initialize();
149 EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
150 EXPECT_EQ(update_delay_, GetFirstDelay());
153 TEST_F(PolicyStatisticsCollectorTest, CollectLater) {
154 SetPolicy(kTestPolicy1);
156 prefs_.SetInt64(policy_prefs::kLastPolicyStatisticsUpdate,
157 (base::Time::Now() - update_delay_ / 2).ToInternalValue());
159 policy_statistics_collector_->Initialize();
160 EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
161 EXPECT_LT(GetFirstDelay(), update_delay_);
164 TEST_F(PolicyStatisticsCollectorTest, MultiplePolicies) {
165 SetPolicy(kTestPolicy1);
166 SetPolicy(kTestPolicy2);
168 prefs_.SetInt64(policy_prefs::kLastPolicyStatisticsUpdate,
169 (base::Time::Now() - update_delay_).ToInternalValue());
171 EXPECT_CALL(*policy_statistics_collector_.get(),
172 RecordPolicyUse(test_policy_id1_));
173 EXPECT_CALL(*policy_statistics_collector_.get(),
174 RecordPolicyUse(test_policy_id2_));
176 policy_statistics_collector_->Initialize();
177 EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
180 } // namespace policy