Home | History | Annotate | Download | only in policy
      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.
      4 
      5 #include <cstring>
      6 #include <string>
      7 
      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/testing_pref_service.h"
     13 #include "base/test/test_simple_task_runner.h"
     14 #include "base/time/time.h"
     15 #include "base/values.h"
     16 #include "chrome/browser/policy/external_data_fetcher.h"
     17 #include "chrome/browser/policy/mock_policy_service.h"
     18 #include "chrome/browser/policy/policy_map.h"
     19 #include "chrome/browser/policy/policy_statistics_collector.h"
     20 #include "chrome/browser/policy/policy_types.h"
     21 #include "chrome/browser/prefs/browser_prefs.h"
     22 #include "chrome/common/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"
     26 
     27 namespace policy {
     28 
     29 namespace {
     30 
     31 using testing::_;
     32 using testing::Lt;
     33 using testing::Return;
     34 using testing::ReturnRef;
     35 
     36 // Arbitrary policy names used for testing.
     37 const char* const kTestPolicy1 = key::kAlternateErrorPagesEnabled;
     38 const char* const kTestPolicy2 = key::kSearchSuggestEnabled;
     39 
     40 class TestPolicyStatisticsCollector : public PolicyStatisticsCollector {
     41  public:
     42   TestPolicyStatisticsCollector(
     43       PolicyService* policy_service,
     44       PrefService* prefs,
     45       const scoped_refptr<base::TaskRunner>& task_runner)
     46       : PolicyStatisticsCollector(policy_service, prefs, task_runner) {
     47   }
     48 
     49   MOCK_METHOD1(RecordPolicyUse, void(int));
     50 };
     51 
     52 }  // namespace
     53 
     54 class PolicyStatisticsCollectorTest : public testing::Test {
     55  protected:
     56   PolicyStatisticsCollectorTest()
     57       : update_delay_(base::TimeDelta::FromMilliseconds(
     58             PolicyStatisticsCollector::kStatisticsUpdateRate)),
     59         test_policy_id1_(-1),
     60         test_policy_id2_(-1),
     61         task_runner_(new base::TestSimpleTaskRunner()) {
     62   }
     63 
     64   virtual void SetUp() OVERRIDE {
     65     chrome::RegisterLocalState(prefs_.registry());
     66 
     67     // Find ids for kTestPolicy1 and kTestPolicy2.
     68     const policy::PolicyDefinitionList* policy_list =
     69         policy::GetChromePolicyDefinitionList();
     70     for (const policy::PolicyDefinitionList::Entry* policy = policy_list->begin;
     71          policy != policy_list->end; ++policy) {
     72       if (strcmp(policy->name, kTestPolicy1) == 0)
     73         test_policy_id1_ = policy->id;
     74       else if (strcmp(policy->name, kTestPolicy2) == 0)
     75         test_policy_id2_ = policy->id;
     76     }
     77     ASSERT_TRUE(test_policy_id1_ != -1);
     78     ASSERT_TRUE(test_policy_id2_ != -1);
     79 
     80     // Set up default function behaviour.
     81     EXPECT_CALL(policy_service_,
     82                 GetPolicies(PolicyNamespace(POLICY_DOMAIN_CHROME,
     83                                             std::string())))
     84         .WillRepeatedly(ReturnRef(policy_map_));
     85 
     86     // Arbitrary negative value (so it'll be different from |update_delay_|).
     87     last_delay_ = base::TimeDelta::FromDays(-1);
     88     policy_map_.Clear();
     89     policy_statistics_collector_.reset(new TestPolicyStatisticsCollector(
     90         &policy_service_,
     91         &prefs_,
     92         task_runner_));
     93   }
     94 
     95   void SetPolicy(const std::string& name) {
     96     policy_map_.Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
     97                     base::Value::CreateBooleanValue(true), NULL);
     98   }
     99 
    100   base::TimeDelta GetFirstDelay() const {
    101     if (task_runner_->GetPendingTasks().empty()) {
    102       ADD_FAILURE();
    103       return base::TimeDelta();
    104     }
    105     return task_runner_->GetPendingTasks().front().delay;
    106   }
    107 
    108   const base::TimeDelta update_delay_;
    109 
    110   int test_policy_id1_;
    111   int test_policy_id2_;
    112 
    113   base::TimeDelta last_delay_;
    114 
    115   TestingPrefServiceSimple prefs_;
    116   MockPolicyService policy_service_;
    117   PolicyMap policy_map_;
    118 
    119   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
    120   scoped_ptr<TestPolicyStatisticsCollector> policy_statistics_collector_;
    121 };
    122 
    123 TEST_F(PolicyStatisticsCollectorTest, CollectPending) {
    124   SetPolicy(kTestPolicy1);
    125 
    126   prefs_.SetInt64(prefs::kLastPolicyStatisticsUpdate,
    127                   (base::Time::Now() - update_delay_).ToInternalValue());
    128 
    129   EXPECT_CALL(*policy_statistics_collector_.get(),
    130               RecordPolicyUse(test_policy_id1_));
    131 
    132   policy_statistics_collector_->Initialize();
    133   EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
    134   EXPECT_EQ(update_delay_, GetFirstDelay());
    135 }
    136 
    137 TEST_F(PolicyStatisticsCollectorTest, CollectPendingVeryOld) {
    138   SetPolicy(kTestPolicy1);
    139 
    140   // Must not be 0.0 (read comment for Time::FromDoubleT).
    141   prefs_.SetInt64(prefs::kLastPolicyStatisticsUpdate,
    142                   base::Time::FromDoubleT(1.0).ToInternalValue());
    143 
    144   EXPECT_CALL(*policy_statistics_collector_.get(),
    145               RecordPolicyUse(test_policy_id1_));
    146 
    147   policy_statistics_collector_->Initialize();
    148   EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
    149   EXPECT_EQ(update_delay_, GetFirstDelay());
    150 }
    151 
    152 TEST_F(PolicyStatisticsCollectorTest, CollectLater) {
    153   SetPolicy(kTestPolicy1);
    154 
    155   prefs_.SetInt64(prefs::kLastPolicyStatisticsUpdate,
    156                   (base::Time::Now() - update_delay_ / 2).ToInternalValue());
    157 
    158   policy_statistics_collector_->Initialize();
    159   EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
    160   EXPECT_LT(GetFirstDelay(), update_delay_);
    161 }
    162 
    163 TEST_F(PolicyStatisticsCollectorTest, MultiplePolicies) {
    164   SetPolicy(kTestPolicy1);
    165   SetPolicy(kTestPolicy2);
    166 
    167   prefs_.SetInt64(prefs::kLastPolicyStatisticsUpdate,
    168                   (base::Time::Now() - update_delay_).ToInternalValue());
    169 
    170   EXPECT_CALL(*policy_statistics_collector_.get(),
    171               RecordPolicyUse(test_policy_id1_));
    172   EXPECT_CALL(*policy_statistics_collector_.get(),
    173               RecordPolicyUse(test_policy_id2_));
    174 
    175   policy_statistics_collector_->Initialize();
    176   EXPECT_EQ(1u, task_runner_->GetPendingTasks().size());
    177 }
    178 
    179 }  // namespace policy
    180