1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/user_policy_cache.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <limits> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_util.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/message_loop.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/configuration_policy_provider.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/cloud_policy.pb.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/device_management_local.pb.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/old_generic_format.pb.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/browser_thread.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gmock/include/gmock/gmock.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace policy { 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Decodes a CloudPolicySettings object into two maps with mandatory and 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// recommended settings, respectively. The implementation is generated code 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// in policy/cloud_policy_generated.cc. 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DecodePolicy(const em::CloudPolicySettings& policy, 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap* mandatory, PolicyMap* recommended); 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The implementations of these methods are in cloud_policy_generated.cc. 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenValue* DecodeIntegerValue(google::protobuf::int64 value); 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenListValue* DecodeStringList(const em::StringList& string_list); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass MockConfigurationPolicyProviderObserver 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : public ConfigurationPolicyProvider::Observer { 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockConfigurationPolicyProviderObserver() {} 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~MockConfigurationPolicyProviderObserver() {} 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnUpdatePolicy, void()); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnProviderGoingAway() {} 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests the device management policy cache. 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass UserPolicyCacheTest : public testing::Test { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCacheTest() 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : loop_(MessageLoop::TYPE_UI), 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_thread_(BrowserThread::UI, &loop_), 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen file_thread_(BrowserThread::FILE, &loop_) {} 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetUp() { 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void TearDown() { 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen loop_.RunAllPending(); 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Creates a (signed) PolicyFetchResponse setting the given |homepage| and 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // featuring the given |timestamp| (as issued by the server). 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Mildly hacky special feature: pass an empty string as |homepage| to get 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // a completely empty policy. 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* CreateHomepagePolicy( 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& homepage, 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const base::Time& timestamp, 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const em::PolicyOptions::PolicyMode policy_mode) { 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyData signed_response; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (homepage != "") { 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::CloudPolicySettings settings; 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::HomepageLocationProto* homepagelocation_proto = 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_homepagelocation(); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen homepagelocation_proto->set_homepagelocation(homepage); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen homepagelocation_proto->mutable_policy_options()->set_mode(policy_mode); 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE( 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.SerializeToString(signed_response.mutable_policy_value())); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen signed_response.set_timestamp( 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (timestamp - base::Time::UnixEpoch()).InMilliseconds()); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string serialized_signed_response; 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(signed_response.SerializeToString(&serialized_signed_response)); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* response = new em::PolicyFetchResponse; 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen response->set_policy_data(serialized_signed_response); 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(jkummerow): Set proper new_public_key and signature (when 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // implementing support for signature verification). 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen response->set_policy_data_signature("TODO"); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen response->set_new_public_key("TODO"); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return response; 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void WritePolicy(const em::PolicyFetchResponse& policy) { 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string data; 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::CachedCloudPolicyResponse cached_policy; 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cached_policy.mutable_cloud_policy()->CopyFrom(policy); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(cached_policy.SerializeToString(&data)); 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int size = static_cast<int>(data.size()); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(size, file_util::WriteFile(test_file(), data.c_str(), size)); 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Takes ownership of |policy_response|. 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetPolicy(UserPolicyCache* cache, 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* policy_response, 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool expect_changed_policy) { 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy(policy_response); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ConfigurationPolicyObserverRegistrar registrar; 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar.Init(cache->GetManagedPolicyProvider(), &observer); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (expect_changed_policy) 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(observer, OnUpdatePolicy()).Times(1); 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(observer, OnUpdatePolicy()).Times(0); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache->SetPolicy(*policy); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::Mock::VerifyAndClearExpectations(&observer); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath test_file() { 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return temp_dir_.path().AppendASCII("UserPolicyCacheTest"); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const PolicyMap& mandatory_policy(const UserPolicyCache& cache) { 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return cache.mandatory_policy_; 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const PolicyMap& recommended_policy(const UserPolicyCache& cache) { 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return cache.recommended_policy_; 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop loop_; 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockConfigurationPolicyProviderObserver observer; 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScopedTempDir temp_dir_; 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread ui_thread_; 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread file_thread_; 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, DecodePolicy) { 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::CloudPolicySettings settings; 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_homepagelocation()->set_homepagelocation("chromium.org"); 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_javascriptenabled()->set_javascriptenabled(true); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_javascriptenabled()->mutable_policy_options()->set_mode( 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_policyrefreshrate()->set_policyrefreshrate(5); 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.mutable_policyrefreshrate()->mutable_policy_options()->set_mode( 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::RECOMMENDED); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap mandatory_policy; 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap recommended_policy; 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DecodePolicy(settings, &mandatory_policy, &recommended_policy); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap mandatory; 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mandatory.Set(kPolicyHomepageLocation, 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("chromium.org")); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mandatory.Set(kPolicyJavascriptEnabled, Value::CreateBooleanValue(true)); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap recommended; 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen recommended.Set(kPolicyPolicyRefreshRate, Value::CreateIntegerValue(5)); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(mandatory.Equals(mandatory_policy)); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(recommended.Equals(recommended_policy)); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, DecodeIntegerValue) { 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int min = std::numeric_limits<int>::min(); 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int max = std::numeric_limits<int>::max(); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<Value> value( 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DecodeIntegerValue(static_cast<google::protobuf::int64>(42))); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(value.get()); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue expected_42(42); 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(value->Equals(&expected_42)); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value.reset( 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DecodeIntegerValue(static_cast<google::protobuf::int64>(min - 1LL))); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(NULL, value.get()); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value.reset(DecodeIntegerValue(static_cast<google::protobuf::int64>(min))); 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(value.get()); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue expected_min(min); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(value->Equals(&expected_min)); 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value.reset( 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DecodeIntegerValue(static_cast<google::protobuf::int64>(max + 1LL))); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(NULL, value.get()); 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value.reset(DecodeIntegerValue(static_cast<google::protobuf::int64>(max))); 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(value.get()); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue expected_max(max); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(value->Equals(&expected_max)); 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, DecodeStringList) { 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::StringList string_list; 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string_list.add_entries("ponies"); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string_list.add_entries("more ponies"); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<ListValue> decoded(DecodeStringList(string_list)); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue expected; 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Append(Value::CreateStringValue("ponies")); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Append(Value::CreateStringValue("more ponies")); 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(decoded->Equals(&expected)); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, Empty) { 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(recommended_policy(cache))); 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, LoadNoFile) { 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, RejectFuture) { 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy_response( 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("", base::Time::NowFromSystemTime() + 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::TimeDelta::FromMinutes(5), 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY)); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WritePolicy(*policy_response); 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, LoadWithFile) { 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy_response( 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("", base::Time::NowFromSystemTime(), 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY)); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WritePolicy(*policy_response); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(base::Time(), cache.last_policy_refresh_time()); 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_GE(base::Time::Now(), cache.last_policy_refresh_time()); 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, LoadWithData) { 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy( 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY)); 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WritePolicy(*policy); 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.example.com")); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, SetPolicy) { 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* policy = 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy, true); 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* policy2 = 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy2, false); 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.example.com")); 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(recommended_policy(cache))); 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen policy = CreateHomepagePolicy("http://www.example.com", 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::RECOMMENDED); 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy, true); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(recommended_policy(cache))); 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, ResetPolicy) { 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* policy = 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy, true); 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.example.com")); 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* empty_policy = 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("", base::Time::NowFromSystemTime(), 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, empty_policy, true); 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, PersistPolicy) { 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy( 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY)); 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.SetPolicy(*policy); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen loop_.RunAllPending(); 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(file_util::PathExists(test_file())); 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.example.com")); 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, FreshPolicyOverride) { 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<em::PolicyFetchResponse> policy( 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.example.com", 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY)); 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WritePolicy(*policy); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* updated_policy = 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateHomepagePolicy("http://www.chromium.org", 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::MANDATORY); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, updated_policy, true); 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache.Load(); 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.chromium.org")); 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Test case for the temporary support for GenericNamedValues in the 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// CloudPolicySettings protobuf. Can be removed when this support is no longer 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// required. 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(UserPolicyCacheTest, OldStylePolicy) { 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserPolicyCache cache(test_file()); 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyFetchResponse* policy = new em::PolicyFetchResponse(); 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyData signed_response; 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::LegacyChromeSettingsProto settings; 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::GenericNamedValue* named_value = settings.add_named_value(); 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen named_value->set_name("HomepageLocation"); 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::GenericValue* value_container = named_value->mutable_value(); 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value_container->set_value_type(em::GenericValue::VALUE_TYPE_STRING); 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value_container->set_string_value("http://www.example.com"); 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE( 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen settings.SerializeToString(signed_response.mutable_policy_value())); 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::TimeDelta timestamp = 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime() - base::Time::UnixEpoch(); 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen signed_response.set_timestamp(timestamp.InMilliseconds()); 357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE( 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen signed_response.SerializeToString(policy->mutable_policy_data())); 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy, true); 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap expected; 362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected.Set(kPolicyHomepageLocation, 363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value::CreateStringValue("http://www.example.com")); 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PolicyMap empty; 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(mandatory_policy(cache))); 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(recommended_policy(cache))); 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If new-style policy comes in, it should override old-style policy. 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen policy = CreateHomepagePolicy("http://www.example.com", 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time::NowFromSystemTime(), 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen em::PolicyOptions::RECOMMENDED); 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetPolicy(&cache, policy, true); 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(expected.Equals(recommended_policy(cache))); 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(empty.Equals(mandatory_policy(cache))); 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace policy 377