Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Side by Side Diff: chrome/browser/policy/cloud/cloud_policy_browsertest.cc

Issue 14761012: Updated SessionManagerClient to use the multi-profile user policy calls. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added TODO Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h" 8 #include "base/files/scoped_temp_dir.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 25 matching lines...) Expand all
36 #include "policy/proto/chrome_settings.pb.h" 36 #include "policy/proto/chrome_settings.pb.h"
37 #include "policy/proto/cloud_policy.pb.h" 37 #include "policy/proto/cloud_policy.pb.h"
38 #include "testing/gmock/include/gmock/gmock.h" 38 #include "testing/gmock/include/gmock/gmock.h"
39 #include "testing/gtest/include/gtest/gtest.h" 39 #include "testing/gtest/include/gtest/gtest.h"
40 40
41 #if defined(OS_CHROMEOS) 41 #if defined(OS_CHROMEOS)
42 #include "chrome/browser/chromeos/login/user_manager.h" 42 #include "chrome/browser/chromeos/login/user_manager.h"
43 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 43 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
44 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h" 44 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h"
45 #include "chromeos/chromeos_paths.h" 45 #include "chromeos/chromeos_paths.h"
46 #include "chromeos/dbus/mock_cryptohome_client.h" 46 #include "chromeos/dbus/cryptohome_client.h"
47 #include "chromeos/dbus/mock_dbus_thread_manager.h"
48 #include "chromeos/dbus/mock_session_manager_client.h"
49 #include "chromeos/dbus/mock_update_engine_client.h"
50 #else 47 #else
51 #include "chrome/browser/policy/cloud/user_cloud_policy_manager.h" 48 #include "chrome/browser/policy/cloud/user_cloud_policy_manager.h"
52 #include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h" 49 #include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
53 #include "chrome/browser/signin/signin_manager.h" 50 #include "chrome/browser/signin/signin_manager.h"
54 #include "chrome/browser/signin/signin_manager_factory.h" 51 #include "chrome/browser/signin/signin_manager_factory.h"
55 #endif 52 #endif
56 53
57 using testing::AnyNumber; 54 using testing::AnyNumber;
58 using testing::InvokeWithoutArgs; 55 using testing::InvokeWithoutArgs;
59 using testing::Mock; 56 using testing::Mock;
60 using testing::Return; 57 using testing::Return;
61 using testing::_; 58 using testing::_;
62 59
63 namespace em = enterprise_management; 60 namespace em = enterprise_management;
64 61
65 namespace policy { 62 namespace policy {
66 63
67 namespace { 64 namespace {
68 65
69 #if defined(OS_CHROMEOS)
70
71 const char kSanitizedUsername[] = "0123456789ABCDEF0123456789ABCDEF01234567";
72
73 ACTION(GetSanitizedUsername) {
74 MessageLoop::current()->PostTask(
75 FROM_HERE,
76 base::Bind(arg1, chromeos::DBUS_METHOD_CALL_SUCCESS, kSanitizedUsername));
77 }
78
79 ACTION_P(RetrieveUserPolicy, storage) {
80 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(arg0, *storage));
81 }
82
83 ACTION_P2(StoreUserPolicy, storage, user_policy_key_file) {
84 // The session_manager stores a copy of the policy key at
85 // /var/run/user_policy/$hash/policy.pub. Simulate that behavior here, so
86 // that the policy signature can be validated.
87 em::PolicyFetchResponse policy;
88 ASSERT_TRUE(policy.ParseFromString(arg0));
89 if (policy.has_new_public_key()) {
90 ASSERT_TRUE(file_util::CreateDirectory(user_policy_key_file.DirName()));
91 int result = file_util::WriteFile(
92 user_policy_key_file,
93 policy.new_public_key().data(),
94 policy.new_public_key().size());
95 ASSERT_EQ(static_cast<int>(policy.new_public_key().size()), result);
96 }
97
98 *storage = arg0;
99 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(arg1, true));
100 }
101
102 #endif
103
104 const char* GetTestUser() { 66 const char* GetTestUser() {
105 #if defined(OS_CHROMEOS) 67 #if defined(OS_CHROMEOS)
106 return chromeos::UserManager::kStubUser; 68 return chromeos::UserManager::kStubUser;
107 #else 69 #else
108 return "user@example.com"; 70 return "user@example.com";
109 #endif 71 #endif
110 } 72 }
111 73
112 std::string GetEmptyPolicy() { 74 std::string GetEmptyPolicy() {
113 const char kEmptyPolicy[] = 75 const char kEmptyPolicy[] =
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 139 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
178 ASSERT_NO_FATAL_FAILURE(SetServerPolicy(GetEmptyPolicy())); 140 ASSERT_NO_FATAL_FAILURE(SetServerPolicy(GetEmptyPolicy()));
179 141
180 test_server_.reset(new LocalPolicyTestServer(policy_file_path())); 142 test_server_.reset(new LocalPolicyTestServer(policy_file_path()));
181 ASSERT_TRUE(test_server_->Start()); 143 ASSERT_TRUE(test_server_->Start());
182 144
183 std::string url = test_server_->GetServiceURL().spec(); 145 std::string url = test_server_->GetServiceURL().spec();
184 146
185 CommandLine* command_line = CommandLine::ForCurrentProcess(); 147 CommandLine* command_line = CommandLine::ForCurrentProcess();
186 command_line->AppendSwitchASCII(switches::kDeviceManagementUrl, url); 148 command_line->AppendSwitchASCII(switches::kDeviceManagementUrl, url);
187
188 #if defined(OS_CHROMEOS)
189 ASSERT_TRUE(PathService::Override(chromeos::DIR_USER_POLICY_KEYS,
190 user_policy_key_dir()));
191
192 mock_dbus_thread_manager_ = new chromeos::MockDBusThreadManager();
193 chromeos::DBusThreadManager::InitializeForTesting(
194 mock_dbus_thread_manager_);
195 EXPECT_CALL(*mock_dbus_thread_manager_->mock_cryptohome_client(),
196 GetSanitizedUsername(_, _))
197 .WillRepeatedly(GetSanitizedUsername());
198 EXPECT_CALL(*mock_dbus_thread_manager_->mock_session_manager_client(),
199 StoreUserPolicy(_, _))
200 .WillRepeatedly(StoreUserPolicy(&session_manager_user_policy_,
201 user_policy_key_file()));
202 EXPECT_CALL(*mock_dbus_thread_manager_->mock_session_manager_client(),
203 RetrieveUserPolicy(_))
204 .WillRepeatedly(RetrieveUserPolicy(&session_manager_user_policy_));
205 EXPECT_CALL(*mock_dbus_thread_manager_->mock_update_engine_client(),
206 GetLastStatus())
207 .Times(1)
208 .WillOnce(Return(chromeos::MockUpdateEngineClient::Status()));
209 #endif
210 } 149 }
211 150
212 virtual void SetUpOnMainThread() OVERRIDE { 151 virtual void SetUpOnMainThread() OVERRIDE {
213 ASSERT_TRUE(PolicyServiceIsEmpty(g_browser_process->policy_service())) 152 ASSERT_TRUE(PolicyServiceIsEmpty(g_browser_process->policy_service()))
214 << "Pre-existing policies in this machine will make this test fail."; 153 << "Pre-existing policies in this machine will make this test fail.";
215 154
216 BrowserPolicyConnector* connector = 155 BrowserPolicyConnector* connector =
217 g_browser_process->browser_policy_connector(); 156 g_browser_process->browser_policy_connector();
218 connector->ScheduleServiceInitialization(0); 157 connector->ScheduleServiceInitialization(0);
219 158
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 em::DeviceRegisterRequest::USER; 192 em::DeviceRegisterRequest::USER;
254 #else 193 #else
255 em::DeviceRegisterRequest::BROWSER; 194 em::DeviceRegisterRequest::BROWSER;
256 #endif 195 #endif
257 policy_manager->core()->client()->Register( 196 policy_manager->core()->client()->Register(
258 registration_type, "bogus", std::string(), false); 197 registration_type, "bogus", std::string(), false);
259 run_loop.Run(); 198 run_loop.Run();
260 Mock::VerifyAndClearExpectations(&observer); 199 Mock::VerifyAndClearExpectations(&observer);
261 policy_manager->core()->client()->RemoveObserver(&observer); 200 policy_manager->core()->client()->RemoveObserver(&observer);
262 EXPECT_TRUE(policy_manager->core()->client()->is_registered()); 201 EXPECT_TRUE(policy_manager->core()->client()->is_registered());
263 }
264 202
265 #if defined(OS_CHROMEOS) 203 #if defined(OS_CHROMEOS)
266 base::FilePath user_policy_key_dir() { 204 // Get the path to the user policy key file.
267 return temp_dir_.path().AppendASCII("user_policy"); 205 base::FilePath user_policy_key_dir;
206 ASSERT_TRUE(
207 PathService::Get(chromeos::DIR_USER_POLICY_KEYS, &user_policy_key_dir));
208 std::string sanitized_username =
209 chromeos::CryptohomeClient::GetStubSanitizedUsername(GetTestUser());
210 user_policy_key_file_ = user_policy_key_dir.AppendASCII(sanitized_username)
211 .AppendASCII("policy.pub");
212 #endif
268 } 213 }
269 214
270 base::FilePath user_policy_key_file() {
271 return user_policy_key_dir().AppendASCII(kSanitizedUsername)
272 .AppendASCII("policy.pub");
273 }
274 #endif
275
276 PolicyService* GetPolicyService() { 215 PolicyService* GetPolicyService() {
277 ProfilePolicyConnector* profile_connector = 216 ProfilePolicyConnector* profile_connector =
278 ProfilePolicyConnectorFactory::GetForProfile(browser()->profile()); 217 ProfilePolicyConnectorFactory::GetForProfile(browser()->profile());
279 return profile_connector->policy_service(); 218 return profile_connector->policy_service();
280 } 219 }
281 220
282 void SetServerPolicy(const std::string& policy) { 221 void SetServerPolicy(const std::string& policy) {
283 int result = file_util::WriteFile(policy_file_path(), policy.data(), 222 int result = file_util::WriteFile(policy_file_path(), policy.data(),
284 policy.size()); 223 policy.size());
285 ASSERT_EQ(static_cast<int>(policy.size()), result); 224 ASSERT_EQ(static_cast<int>(policy.size()), result);
286 } 225 }
287 226
288 base::FilePath policy_file_path() const { 227 base::FilePath policy_file_path() const {
289 return temp_dir_.path().AppendASCII("policy.json"); 228 return temp_dir_.path().AppendASCII("policy.json");
290 } 229 }
291 230
292 base::ScopedTempDir temp_dir_; 231 base::ScopedTempDir temp_dir_;
293 scoped_ptr<LocalPolicyTestServer> test_server_; 232 scoped_ptr<LocalPolicyTestServer> test_server_;
294 233 base::FilePath user_policy_key_file_;
295 #if defined(OS_CHROMEOS)
296 std::string session_manager_user_policy_;
297 chromeos::MockDBusThreadManager* mock_dbus_thread_manager_;
298 #endif
299 }; 234 };
300 235
301 IN_PROC_BROWSER_TEST_F(CloudPolicyTest, FetchPolicy) { 236 IN_PROC_BROWSER_TEST_F(CloudPolicyTest, FetchPolicy) {
302 PolicyService* policy_service = GetPolicyService(); 237 PolicyService* policy_service = GetPolicyService();
303 { 238 {
304 base::RunLoop run_loop; 239 base::RunLoop run_loop;
305 // This does the initial fetch and stores the initial key. 240 // This does the initial fetch and stores the initial key.
306 policy_service->RefreshPolicies(run_loop.QuitClosure()); 241 policy_service->RefreshPolicies(run_loop.QuitClosure());
307 run_loop.Run(); 242 run_loop.Run();
308 } 243 }
(...skipping 21 matching lines...) Expand all
330 { 265 {
331 base::RunLoop run_loop; 266 base::RunLoop run_loop;
332 // This does the initial fetch and stores the initial key. 267 // This does the initial fetch and stores the initial key.
333 policy_service->RefreshPolicies(run_loop.QuitClosure()); 268 policy_service->RefreshPolicies(run_loop.QuitClosure());
334 run_loop.Run(); 269 run_loop.Run();
335 } 270 }
336 271
337 // Read the initial key. 272 // Read the initial key.
338 std::string initial_key; 273 std::string initial_key;
339 ASSERT_TRUE( 274 ASSERT_TRUE(
340 file_util::ReadFileToString(user_policy_key_file(), &initial_key)); 275 file_util::ReadFileToString(user_policy_key_file_, &initial_key));
341 276
342 PolicyMap empty; 277 PolicyMap empty;
343 EXPECT_TRUE(empty.Equals(policy_service->GetPolicies( 278 EXPECT_TRUE(empty.Equals(policy_service->GetPolicies(
344 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())))); 279 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))));
345 280
346 // Set the new policies and a new key at the server. 281 // Set the new policies and a new key at the server.
347 ASSERT_NO_FATAL_FAILURE(SetServerPolicy(GetTestPolicy(1))); 282 ASSERT_NO_FATAL_FAILURE(SetServerPolicy(GetTestPolicy(1)));
348 PolicyMap expected; 283 PolicyMap expected;
349 GetExpectedTestPolicy(&expected); 284 GetExpectedTestPolicy(&expected);
350 { 285 {
351 base::RunLoop run_loop; 286 base::RunLoop run_loop;
352 // This fetches the new policies and does a key rotation. 287 // This fetches the new policies and does a key rotation.
353 policy_service->RefreshPolicies(run_loop.QuitClosure()); 288 policy_service->RefreshPolicies(run_loop.QuitClosure());
354 run_loop.Run(); 289 run_loop.Run();
355 } 290 }
356 EXPECT_TRUE(expected.Equals(policy_service->GetPolicies( 291 EXPECT_TRUE(expected.Equals(policy_service->GetPolicies(
357 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())))); 292 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))));
358 293
359 // Verify that the key was rotated. 294 // Verify that the key was rotated.
360 std::string rotated_key; 295 std::string rotated_key;
361 ASSERT_TRUE( 296 ASSERT_TRUE(
362 file_util::ReadFileToString(user_policy_key_file(), &rotated_key)); 297 file_util::ReadFileToString(user_policy_key_file_, &rotated_key));
363 EXPECT_NE(rotated_key, initial_key); 298 EXPECT_NE(rotated_key, initial_key);
364 299
365 // Another refresh using the same key won't rotate it again. 300 // Another refresh using the same key won't rotate it again.
366 { 301 {
367 base::RunLoop run_loop; 302 base::RunLoop run_loop;
368 policy_service->RefreshPolicies(run_loop.QuitClosure()); 303 policy_service->RefreshPolicies(run_loop.QuitClosure());
369 run_loop.Run(); 304 run_loop.Run();
370 } 305 }
371 EXPECT_TRUE(expected.Equals(policy_service->GetPolicies( 306 EXPECT_TRUE(expected.Equals(policy_service->GetPolicies(
372 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())))); 307 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))));
373 std::string current_key; 308 std::string current_key;
374 ASSERT_TRUE( 309 ASSERT_TRUE(
375 file_util::ReadFileToString(user_policy_key_file(), &current_key)); 310 file_util::ReadFileToString(user_policy_key_file_, &current_key));
376 EXPECT_EQ(rotated_key, current_key); 311 EXPECT_EQ(rotated_key, current_key);
377 } 312 }
378 #endif 313 #endif
379 314
380 TEST(CloudPolicyProtoTest, VerifyProtobufEquivalence) { 315 TEST(CloudPolicyProtoTest, VerifyProtobufEquivalence) {
381 // There are 2 protobufs that can be used for user cloud policy: 316 // There are 2 protobufs that can be used for user cloud policy:
382 // cloud_policy.proto and chrome_settings.proto. chrome_settings.proto is the 317 // cloud_policy.proto and chrome_settings.proto. chrome_settings.proto is the
383 // version used by the server, but generates one proto message per policy; to 318 // version used by the server, but generates one proto message per policy; to
384 // save binary size on the client, the other version shares proto messages for 319 // save binary size on the client, the other version shares proto messages for
385 // policies of the same type. They generate the same bytes on the wire though, 320 // policies of the same type. They generate the same bytes on the wire though,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 355
421 // They should now serialize to the same bytes. 356 // They should now serialize to the same bytes.
422 std::string chrome_settings_serialized; 357 std::string chrome_settings_serialized;
423 std::string cloud_policy_serialized; 358 std::string cloud_policy_serialized;
424 ASSERT_TRUE(chrome_settings.SerializeToString(&chrome_settings_serialized)); 359 ASSERT_TRUE(chrome_settings.SerializeToString(&chrome_settings_serialized));
425 ASSERT_TRUE(cloud_policy.SerializeToString(&cloud_policy_serialized)); 360 ASSERT_TRUE(cloud_policy.SerializeToString(&cloud_policy_serialized));
426 EXPECT_EQ(chrome_settings_serialized, cloud_policy_serialized); 361 EXPECT_EQ(chrome_settings_serialized, cloud_policy_serialized);
427 } 362 }
428 363
429 } // namespace policy 364 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698