Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 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/cloud_policy_cache.h" | |
| 6 | |
| 7 #include <limits> | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/file_util.h" | |
| 11 #include "base/message_loop.h" | |
| 12 #include "base/scoped_temp_dir.h" | |
| 13 #include "base/values.h" | |
| 14 #include "chrome/browser/browser_thread.h" | |
| 15 #include "chrome/browser/policy/proto/cloud_policy.pb.h" | |
| 16 #include "chrome/browser/policy/proto/device_management_backend.pb.h" | |
| 17 #include "chrome/browser/policy/proto/device_management_local.pb.h" | |
| 18 #include "testing/gtest/include/gtest/gtest.h" | |
| 19 | |
| 20 namespace policy { | |
| 21 | |
| 22 Value* DecodeIntegerValue(google::protobuf::int64 value); | |
| 23 ListValue* DecodeStringList(const em::StringList& string_list); | |
| 24 | |
| 25 // Tests the device management policy cache. | |
| 26 class CloudPolicyCacheTest : public testing::Test { | |
| 27 protected: | |
| 28 CloudPolicyCacheTest() | |
| 29 : loop_(MessageLoop::TYPE_UI), | |
| 30 ui_thread_(BrowserThread::UI, &loop_), | |
| 31 file_thread_(BrowserThread::FILE, &loop_) {} | |
| 32 | |
| 33 void SetUp() { | |
| 34 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | |
| 35 } | |
| 36 | |
| 37 void TearDown() { | |
| 38 loop_.RunAllPending(); | |
| 39 } | |
| 40 | |
| 41 // Creates a (signed) CloudPolicyResponse setting the given |homepage| and | |
| 42 // featuring the given |timestamp| (as issued by the server). | |
| 43 // Mildly hacky special feature: pass an empty string as |homepage| to get | |
| 44 // a completely empty policy. | |
| 45 em::CloudPolicyResponse* CreateHomepagePolicy(const std::string& homepage, | |
| 46 const base::Time& timestamp) { | |
|
gfeher
2011/02/02 08:42:45
Nit: indent.
Jakob Kummerow
2011/02/03 14:36:52
Done.
| |
| 47 em::SignedCloudPolicyResponse signed_response; | |
| 48 if (homepage != "") { | |
| 49 em::CloudPolicySettings* settings = signed_response.mutable_settings(); | |
| 50 em::HomepageProto* homepage_proto = settings->mutable_homepage(); | |
| 51 homepage_proto->set_homepagelocation(homepage); | |
| 52 } | |
| 53 signed_response.set_timestamp(timestamp.ToTimeT()); | |
| 54 std::string serialized_signed_response; | |
| 55 EXPECT_TRUE(signed_response.SerializeToString(&serialized_signed_response)); | |
| 56 | |
| 57 em::CloudPolicyResponse* response = new em::CloudPolicyResponse; | |
| 58 response->set_signed_response(serialized_signed_response); | |
| 59 // TODO(jkummerow): Set proper certificate_chain and signature (when | |
| 60 // implementing support for signature verification). | |
| 61 response->set_signature("TODO"); | |
| 62 response->add_certificate_chain("TODO"); | |
| 63 return response; | |
| 64 } | |
| 65 | |
| 66 void WritePolicy(const em::CloudPolicyResponse& policy) { | |
| 67 std::string data; | |
| 68 em::CachedCloudPolicyResponse cached_policy; | |
| 69 cached_policy.mutable_policy_response()->CopyFrom(policy); | |
| 70 EXPECT_TRUE(cached_policy.SerializeToString(&data)); | |
| 71 int size = static_cast<int>(data.size()); | |
| 72 EXPECT_EQ(size, file_util::WriteFile(test_file(), data.c_str(), size)); | |
| 73 } | |
| 74 | |
| 75 FilePath test_file() { | |
| 76 return temp_dir_.path().AppendASCII("CloudPolicyCacheTest"); | |
| 77 } | |
| 78 | |
| 79 bool Equals(const PolicyMapType* a, const PolicyMapType* b) const { | |
| 80 return CloudPolicyCache::Equals(a, b); | |
| 81 } | |
| 82 | |
| 83 MessageLoop loop_; | |
| 84 | |
| 85 private: | |
| 86 ScopedTempDir temp_dir_; | |
| 87 BrowserThread ui_thread_; | |
| 88 BrowserThread file_thread_; | |
| 89 }; | |
| 90 | |
| 91 TEST_F(CloudPolicyCacheTest, Equals) { | |
| 92 PolicyMapType a; | |
| 93 a.insert(std::make_pair(kPolicyHomepageLocation, | |
| 94 Value::CreateStringValue("aaa"))); | |
| 95 PolicyMapType a2; | |
| 96 a2.insert(std::make_pair(kPolicyHomepageLocation, | |
| 97 Value::CreateStringValue("aaa"))); | |
| 98 PolicyMapType b; | |
| 99 b.insert(std::make_pair(kPolicyHomepageLocation, | |
| 100 Value::CreateStringValue("bbb"))); | |
| 101 PolicyMapType c; | |
| 102 c.insert(std::make_pair(kPolicyHomepageLocation, | |
| 103 Value::CreateStringValue("aaa"))); | |
| 104 c.insert(std::make_pair(kPolicyHomepageIsNewTabPage, | |
| 105 Value::CreateBooleanValue(true))); | |
| 106 EXPECT_FALSE(Equals(&a, &b)); | |
| 107 EXPECT_FALSE(Equals(&b, &a)); | |
| 108 EXPECT_FALSE(Equals(&a, &c)); | |
| 109 EXPECT_FALSE(Equals(&c, &a)); | |
| 110 EXPECT_TRUE(Equals(&a, &a2)); | |
| 111 EXPECT_TRUE(Equals(&a2, &a)); | |
| 112 } | |
| 113 | |
| 114 TEST_F(CloudPolicyCacheTest, DecodePolicy) { | |
| 115 em::CloudPolicySettings settings; | |
| 116 settings.mutable_homepage()->set_homepagelocation("chromium.org"); | |
| 117 settings.mutable_javascriptenabled()->set_javascriptenabled(true); | |
| 118 settings.mutable_javascriptenabled()->mutable_policy_options()->set_mode( | |
| 119 em::PolicyOptions::MANDATORY); | |
| 120 settings.mutable_policyrefreshrate()->set_policyrefreshrate(5); | |
| 121 settings.mutable_policyrefreshrate()->mutable_policy_options()->set_mode( | |
| 122 em::PolicyOptions::RECOMMENDED); | |
| 123 scoped_ptr<PolicyMapType> mandatory_policy(new PolicyMapType); | |
| 124 scoped_ptr<PolicyMapType> recommended_policy(new PolicyMapType); | |
| 125 DecodePolicy(settings, mandatory_policy.get(), recommended_policy.get()); | |
| 126 PolicyMapType mandatory; | |
| 127 mandatory.insert(std::make_pair(kPolicyHomepageLocation, | |
| 128 Value::CreateStringValue("chromium.org"))); | |
| 129 mandatory.insert(std::make_pair(kPolicyJavascriptEnabled, | |
| 130 Value::CreateBooleanValue(true))); | |
| 131 PolicyMapType recommended; | |
| 132 recommended.insert(std::make_pair(kPolicyPolicyRefreshRate, | |
| 133 Value::CreateIntegerValue(5))); | |
| 134 EXPECT_TRUE(Equals(&mandatory, mandatory_policy.get())); | |
| 135 EXPECT_TRUE(Equals(&recommended, recommended_policy.get())); | |
| 136 } | |
| 137 | |
| 138 TEST_F(CloudPolicyCacheTest, DecodeIntegerValue) { | |
| 139 const int min = std::numeric_limits<int>::min(); | |
| 140 const int max = std::numeric_limits<int>::max(); | |
| 141 scoped_ptr<Value> value( | |
| 142 DecodeIntegerValue(static_cast<google::protobuf::int64>(42))); | |
| 143 ASSERT_TRUE(value.get()); | |
| 144 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(42))); | |
| 145 value.reset( | |
| 146 DecodeIntegerValue(static_cast<google::protobuf::int64>(min - 1LL))); | |
| 147 EXPECT_EQ(NULL, value.get()); | |
| 148 value.reset(DecodeIntegerValue(static_cast<google::protobuf::int64>(min))); | |
| 149 ASSERT_TRUE(value.get()); | |
| 150 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(min))); | |
| 151 value.reset( | |
| 152 DecodeIntegerValue(static_cast<google::protobuf::int64>(max + 1LL))); | |
| 153 EXPECT_EQ(NULL, value.get()); | |
| 154 value.reset(DecodeIntegerValue(static_cast<google::protobuf::int64>(max))); | |
| 155 ASSERT_TRUE(value.get()); | |
| 156 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(max))); | |
| 157 } | |
| 158 | |
| 159 TEST_F(CloudPolicyCacheTest, DecodeStringList) { | |
| 160 em::StringList string_list; | |
| 161 string_list.add_entries("ponies"); | |
| 162 string_list.add_entries("more ponies"); | |
| 163 scoped_ptr<ListValue> decoded(DecodeStringList(string_list)); | |
| 164 ListValue expected; | |
| 165 expected.Append(Value::CreateStringValue("ponies")); | |
| 166 expected.Append(Value::CreateStringValue("more ponies")); | |
| 167 EXPECT_TRUE(decoded->Equals(&expected)); | |
| 168 } | |
| 169 | |
| 170 TEST_F(CloudPolicyCacheTest, Empty) { | |
| 171 CloudPolicyCache cache(test_file()); | |
| 172 PolicyMapType empty; | |
| 173 scoped_ptr<PolicyMapType> policy(cache.GetPolicy()); | |
| 174 EXPECT_TRUE(Equals(&empty, policy.get())); | |
| 175 EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); | |
| 176 } | |
| 177 | |
| 178 TEST_F(CloudPolicyCacheTest, LoadNoFile) { | |
| 179 CloudPolicyCache cache(test_file()); | |
| 180 cache.LoadPolicyFromFile(); | |
| 181 PolicyMapType empty; | |
| 182 scoped_ptr<PolicyMapType> policy(cache.GetPolicy()); | |
| 183 EXPECT_TRUE(Equals(&empty, policy.get())); | |
| 184 EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); | |
| 185 } | |
| 186 | |
| 187 TEST_F(CloudPolicyCacheTest, RejectFuture) { | |
| 188 scoped_ptr<em::CloudPolicyResponse> policy_response( | |
| 189 CreateHomepagePolicy("", base::Time::NowFromSystemTime() + | |
| 190 base::TimeDelta::FromMinutes(5))); | |
| 191 WritePolicy(*policy_response); | |
| 192 CloudPolicyCache cache(test_file()); | |
| 193 cache.LoadPolicyFromFile(); | |
| 194 PolicyMapType empty; | |
| 195 scoped_ptr<PolicyMapType> policy(cache.GetPolicy()); | |
| 196 EXPECT_TRUE(Equals(&empty, policy.get())); | |
| 197 EXPECT_EQ(base::Time(), cache.last_policy_refresh_time()); | |
| 198 } | |
| 199 | |
| 200 TEST_F(CloudPolicyCacheTest, LoadWithFile) { | |
| 201 scoped_ptr<em::CloudPolicyResponse> policy_response( | |
| 202 CreateHomepagePolicy("", base::Time::NowFromSystemTime())); | |
| 203 WritePolicy(*policy_response); | |
| 204 CloudPolicyCache cache(test_file()); | |
| 205 cache.LoadPolicyFromFile(); | |
| 206 PolicyMapType empty; | |
| 207 scoped_ptr<PolicyMapType> policy(cache.GetPolicy()); | |
| 208 EXPECT_TRUE(Equals(&empty, policy.get())); | |
| 209 EXPECT_NE(base::Time(), cache.last_policy_refresh_time()); | |
| 210 EXPECT_GE(base::Time::Now(), cache.last_policy_refresh_time()); | |
| 211 } | |
| 212 | |
| 213 TEST_F(CloudPolicyCacheTest, LoadWithData) { | |
| 214 scoped_ptr<em::CloudPolicyResponse> policy( | |
| 215 CreateHomepagePolicy("http://www.example.com", | |
| 216 base::Time::NowFromSystemTime())); | |
| 217 WritePolicy(*policy); | |
| 218 CloudPolicyCache cache(test_file()); | |
| 219 cache.LoadPolicyFromFile(); | |
| 220 PolicyMapType expected; | |
| 221 expected.insert( | |
| 222 std::make_pair(kPolicyHomepageLocation, | |
| 223 Value::CreateStringValue("http://www.example.com"))); | |
| 224 scoped_ptr<PolicyMapType> policy_value(cache.GetPolicy()); | |
| 225 EXPECT_TRUE(Equals(&expected, policy_value.get())); | |
| 226 } | |
| 227 | |
| 228 TEST_F(CloudPolicyCacheTest, SetPolicy) { | |
| 229 CloudPolicyCache cache(test_file()); | |
| 230 scoped_ptr<em::CloudPolicyResponse> policy( | |
| 231 CreateHomepagePolicy("http://www.example.com", | |
| 232 base::Time::NowFromSystemTime())); | |
| 233 EXPECT_TRUE(cache.SetPolicy(*policy)); | |
| 234 scoped_ptr<em::CloudPolicyResponse> policy2( | |
| 235 CreateHomepagePolicy("http://www.example.com", | |
| 236 base::Time::NowFromSystemTime())); | |
| 237 EXPECT_FALSE(cache.SetPolicy(*policy2)); | |
| 238 PolicyMapType expected; | |
| 239 expected.insert( | |
| 240 std::make_pair(kPolicyHomepageLocation, | |
| 241 Value::CreateStringValue("http://www.example.com"))); | |
| 242 scoped_ptr<PolicyMapType> policy_value(cache.GetPolicy()); | |
| 243 EXPECT_TRUE(Equals(&expected, policy_value.get())); | |
| 244 } | |
| 245 | |
| 246 TEST_F(CloudPolicyCacheTest, ResetPolicy) { | |
| 247 CloudPolicyCache cache(test_file()); | |
| 248 | |
| 249 scoped_ptr<em::CloudPolicyResponse> policy( | |
| 250 CreateHomepagePolicy("http://www.example.com", | |
| 251 base::Time::NowFromSystemTime())); | |
| 252 EXPECT_TRUE(cache.SetPolicy(*policy)); | |
| 253 PolicyMapType expected; | |
| 254 expected.insert( | |
| 255 std::make_pair(kPolicyHomepageLocation, | |
| 256 Value::CreateStringValue("http://www.example.com"))); | |
| 257 scoped_ptr<PolicyMapType> policy_value(cache.GetPolicy()); | |
| 258 EXPECT_TRUE(Equals(&expected, policy_value.get())); | |
| 259 | |
| 260 scoped_ptr<em::CloudPolicyResponse> empty_policy( | |
| 261 CreateHomepagePolicy("", base::Time::NowFromSystemTime())); | |
| 262 EXPECT_TRUE(cache.SetPolicy(*empty_policy)); | |
| 263 policy_value.reset(cache.GetPolicy()); | |
| 264 PolicyMapType empty; | |
| 265 EXPECT_TRUE(Equals(&empty, policy_value.get())); | |
| 266 } | |
| 267 | |
| 268 TEST_F(CloudPolicyCacheTest, PersistPolicy) { | |
| 269 { | |
| 270 CloudPolicyCache cache(test_file()); | |
| 271 scoped_ptr<em::CloudPolicyResponse> policy( | |
| 272 CreateHomepagePolicy("http://www.example.com", | |
| 273 base::Time::NowFromSystemTime())); | |
| 274 cache.SetPolicy(*policy); | |
| 275 } | |
| 276 | |
| 277 loop_.RunAllPending(); | |
| 278 | |
| 279 EXPECT_TRUE(file_util::PathExists(test_file())); | |
| 280 CloudPolicyCache cache(test_file()); | |
| 281 cache.LoadPolicyFromFile(); | |
| 282 PolicyMapType expected; | |
| 283 expected.insert( | |
| 284 std::make_pair(kPolicyHomepageLocation, | |
| 285 Value::CreateStringValue("http://www.example.com"))); | |
| 286 scoped_ptr<PolicyMapType> policy_value(cache.GetPolicy()); | |
| 287 EXPECT_TRUE(Equals(&expected, policy_value.get())); | |
| 288 } | |
| 289 | |
| 290 TEST_F(CloudPolicyCacheTest, FreshPolicyOverride) { | |
| 291 scoped_ptr<em::CloudPolicyResponse> policy( | |
| 292 CreateHomepagePolicy("http://www.example.com", | |
| 293 base::Time::NowFromSystemTime())); | |
| 294 WritePolicy(*policy); | |
| 295 | |
| 296 CloudPolicyCache cache(test_file()); | |
| 297 scoped_ptr<em::CloudPolicyResponse> updated_policy( | |
| 298 CreateHomepagePolicy("http://www.chromium.org", | |
| 299 base::Time::NowFromSystemTime())); | |
| 300 EXPECT_TRUE(cache.SetPolicy(*updated_policy)); | |
| 301 | |
| 302 cache.LoadPolicyFromFile(); | |
| 303 PolicyMapType expected; | |
| 304 expected.insert( | |
| 305 std::make_pair(kPolicyHomepageLocation, | |
| 306 Value::CreateStringValue("http://www.chromium.org"))); | |
| 307 scoped_ptr<PolicyMapType> policy_value(cache.GetPolicy()); | |
| 308 EXPECT_TRUE(Equals(&expected, policy_value.get())); | |
| 309 } | |
| 310 | |
| 311 } // namespace policy | |
| OLD | NEW |