| OLD | NEW |
| 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 "chrome/browser/policy/device_cloud_policy_manager_chromeos.h" | 5 #include "chrome/browser/policy/device_cloud_policy_manager_chromeos.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "base/run_loop.h" |
| 12 #include "chrome/browser/chromeos/cros/cryptohome_library.h" | 13 #include "chrome/browser/chromeos/cros/cryptohome_library.h" |
| 13 #include "chrome/browser/chromeos/settings/device_settings_service.h" | 14 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
| 14 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h" | 15 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h" |
| 15 #include "chrome/browser/chromeos/settings/mock_owner_key_util.h" | 16 #include "chrome/browser/chromeos/settings/mock_owner_key_util.h" |
| 17 #include "chrome/browser/policy/cloud_policy_client.h" |
| 16 #include "chrome/browser/policy/device_cloud_policy_store_chromeos.h" | 18 #include "chrome/browser/policy/device_cloud_policy_store_chromeos.h" |
| 17 #include "chrome/browser/policy/enterprise_install_attributes.h" | 19 #include "chrome/browser/policy/enterprise_install_attributes.h" |
| 18 #include "chrome/browser/policy/mock_device_management_service.h" | 20 #include "chrome/browser/policy/mock_device_management_service.h" |
| 19 #include "chrome/browser/policy/policy_builder.h" | 21 #include "chrome/browser/policy/policy_builder.h" |
| 20 #include "chrome/browser/policy/proto/chrome_device_policy.pb.h" | 22 #include "chrome/browser/policy/proto/chrome_device_policy.pb.h" |
| 23 #include "chrome/browser/policy/proto/device_management_backend.pb.h" |
| 21 #include "chrome/browser/prefs/browser_prefs.h" | 24 #include "chrome/browser/prefs/browser_prefs.h" |
| 22 #include "chrome/test/base/testing_pref_service.h" | 25 #include "chrome/test/base/testing_pref_service.h" |
| 23 #include "content/public/test/test_browser_thread.h" | 26 #include "content/public/test/test_browser_thread.h" |
| 24 #include "policy/policy_constants.h" | 27 #include "policy/policy_constants.h" |
| 28 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 26 | 30 |
| 31 using testing::AtMost; |
| 32 using testing::Mock; |
| 33 using testing::_; |
| 34 |
| 35 namespace em = enterprise_management; |
| 36 |
| 27 namespace policy { | 37 namespace policy { |
| 28 namespace { | 38 namespace { |
| 29 | 39 |
| 30 class DeviceCloudPolicyManagerChromeOSTest : public testing::Test { | 40 class DeviceCloudPolicyManagerChromeOSTest : public testing::Test { |
| 31 protected: | 41 protected: |
| 32 DeviceCloudPolicyManagerChromeOSTest() | 42 DeviceCloudPolicyManagerChromeOSTest() |
| 33 : loop_(MessageLoop::TYPE_UI), | 43 : loop_(MessageLoop::TYPE_UI), |
| 34 ui_thread_(content::BrowserThread::UI, &loop_), | 44 ui_thread_(content::BrowserThread::UI, &loop_), |
| 35 file_thread_(content::BrowserThread::FILE, &loop_), | 45 file_thread_(content::BrowserThread::FILE, &loop_), |
| 36 owner_key_util_(new chromeos::MockOwnerKeyUtil()), | 46 owner_key_util_(new chromeos::MockOwnerKeyUtil()), |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 PolicyBundle bundle; | 137 PolicyBundle bundle; |
| 128 EXPECT_TRUE(manager_.policies().Equals(bundle)); | 138 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 129 | 139 |
| 130 manager_.Connect(&local_state_, &device_management_service_); | 140 manager_.Connect(&local_state_, &device_management_service_); |
| 131 EXPECT_TRUE(manager_.policies().Equals(bundle)); | 141 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 132 | 142 |
| 133 manager_.Shutdown(); | 143 manager_.Shutdown(); |
| 134 EXPECT_TRUE(manager_.policies().Equals(bundle)); | 144 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 135 } | 145 } |
| 136 | 146 |
| 147 class DeviceCloudPolicyManagerChromeOSEnrollmentTest |
| 148 : public DeviceCloudPolicyManagerChromeOSTest { |
| 149 public: |
| 150 void Done(EnrollmentStatus status) { |
| 151 EXPECT_EQ(expected_enrollment_status_, status.status()); |
| 152 EXPECT_EQ(expected_dm_status_, status.client_status()); |
| 153 EXPECT_EQ(expected_validation_status_, status.validation_status()); |
| 154 EXPECT_EQ(expected_store_status_, status.store_status()); |
| 155 done_ = true; |
| 156 } |
| 157 |
| 158 protected: |
| 159 DeviceCloudPolicyManagerChromeOSEnrollmentTest() |
| 160 : register_status_(DM_STATUS_SUCCESS), |
| 161 fetch_status_(DM_STATUS_SUCCESS), |
| 162 store_result_(true), |
| 163 expected_enrollment_status_(EnrollmentStatus::STATUS_SUCCESS), |
| 164 expected_dm_status_(DM_STATUS_SUCCESS), |
| 165 expected_validation_status_(CloudPolicyValidatorBase::VALIDATION_OK), |
| 166 expected_store_status_(CloudPolicyStore::STATUS_OK), |
| 167 done_(false) {} |
| 168 |
| 169 virtual void SetUp() OVERRIDE { |
| 170 DeviceCloudPolicyManagerChromeOSTest::SetUp(); |
| 171 |
| 172 // Set up test data. |
| 173 policy_.set_new_signing_key(PolicyBuilder::CreateTestNewSigningKey()); |
| 174 policy_.policy_data().set_timestamp( |
| 175 (base::Time::NowFromSystemTime() - |
| 176 base::Time::UnixEpoch()).InMilliseconds()); |
| 177 policy_.Build(); |
| 178 |
| 179 register_response_.mutable_register_response()->set_device_management_token( |
| 180 PolicyBuilder::kFakeToken); |
| 181 fetch_response_.mutable_policy_response()->add_response()->CopyFrom( |
| 182 policy_.policy()); |
| 183 loaded_blob_ = policy_.GetBlob(); |
| 184 |
| 185 // Initialize the manager. |
| 186 device_settings_test_helper_.Flush(); |
| 187 EXPECT_EQ(CloudPolicyStore::STATUS_BAD_STATE, store_->status()); |
| 188 EXPECT_TRUE(manager_.IsInitializationComplete()); |
| 189 |
| 190 PolicyBundle bundle; |
| 191 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 192 |
| 193 manager_.Connect(&local_state_, &device_management_service_); |
| 194 } |
| 195 |
| 196 virtual void TearDown() OVERRIDE { |
| 197 RunTest(); |
| 198 |
| 199 // Enrollment should have completed. |
| 200 EXPECT_TRUE(done_); |
| 201 PolicyBundle bundle; |
| 202 if (expected_enrollment_status_ != EnrollmentStatus::STATUS_SUCCESS) { |
| 203 EXPECT_FALSE(store_->has_policy()); |
| 204 EXPECT_FALSE(store_->is_managed()); |
| 205 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 206 } else { |
| 207 EXPECT_EQ(DEVICE_MODE_ENTERPRISE, install_attributes_.GetMode()); |
| 208 EXPECT_TRUE(store_->has_policy()); |
| 209 EXPECT_TRUE(store_->is_managed()); |
| 210 ASSERT_TRUE(manager_.cloud_policy_client()); |
| 211 EXPECT_TRUE(manager_.cloud_policy_client()->is_registered()); |
| 212 |
| 213 bundle.Get(POLICY_DOMAIN_CHROME, std::string()).Set( |
| 214 key::kDeviceMetricsReportingEnabled, POLICY_LEVEL_MANDATORY, |
| 215 POLICY_SCOPE_MACHINE, Value::CreateBooleanValue(true)); |
| 216 EXPECT_TRUE(manager_.policies().Equals(bundle)); |
| 217 } |
| 218 |
| 219 DeviceCloudPolicyManagerChromeOSTest::TearDown(); |
| 220 } |
| 221 |
| 222 void RunTest() { |
| 223 // Trigger enrollment. |
| 224 MockDeviceManagementJob* register_job = NULL; |
| 225 EXPECT_CALL(device_management_service_, |
| 226 CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION)) |
| 227 .Times(AtMost(1)) |
| 228 .WillOnce(device_management_service_.CreateAsyncJob(®ister_job)); |
| 229 EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _)) |
| 230 .Times(AtMost(1)); |
| 231 DeviceCloudPolicyManagerChromeOS::AllowedDeviceModes modes; |
| 232 modes[DEVICE_MODE_ENTERPRISE] = true; |
| 233 manager_.StartEnrollment( |
| 234 "auth token", modes, |
| 235 base::Bind(&DeviceCloudPolicyManagerChromeOSEnrollmentTest::Done, |
| 236 base::Unretained(this))); |
| 237 Mock::VerifyAndClearExpectations(&device_management_service_); |
| 238 |
| 239 if (done_) |
| 240 return; |
| 241 |
| 242 // Process registration. |
| 243 ASSERT_TRUE(register_job); |
| 244 MockDeviceManagementJob* fetch_job = NULL; |
| 245 EXPECT_CALL(device_management_service_, |
| 246 CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH)) |
| 247 .Times(AtMost(1)) |
| 248 .WillOnce(device_management_service_.CreateAsyncJob(&fetch_job)); |
| 249 EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _)) |
| 250 .Times(AtMost(1)); |
| 251 register_job->SendResponse(register_status_, register_response_); |
| 252 Mock::VerifyAndClearExpectations(&device_management_service_); |
| 253 |
| 254 if (done_) |
| 255 return; |
| 256 |
| 257 // Process policy fetch. |
| 258 ASSERT_TRUE(fetch_job); |
| 259 fetch_job->SendResponse(fetch_status_, fetch_response_); |
| 260 |
| 261 if (done_) |
| 262 return; |
| 263 |
| 264 // Process verification. |
| 265 base::RunLoop().RunUntilIdle(); |
| 266 |
| 267 if (done_) |
| 268 return; |
| 269 |
| 270 // Process policy store. |
| 271 device_settings_test_helper_.set_store_result(store_result_); |
| 272 device_settings_test_helper_.FlushStore(); |
| 273 EXPECT_EQ(policy_.GetBlob(), device_settings_test_helper_.policy_blob()); |
| 274 |
| 275 if (done_) |
| 276 return; |
| 277 |
| 278 // Key installation and policy load. |
| 279 device_settings_test_helper_.set_policy_blob(loaded_blob_); |
| 280 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.new_signing_key()); |
| 281 device_settings_service_.OwnerKeySet(true); |
| 282 device_settings_test_helper_.Flush(); |
| 283 } |
| 284 |
| 285 DeviceManagementStatus register_status_; |
| 286 em::DeviceManagementResponse register_response_; |
| 287 |
| 288 DeviceManagementStatus fetch_status_; |
| 289 em::DeviceManagementResponse fetch_response_; |
| 290 |
| 291 bool store_result_; |
| 292 std::string loaded_blob_; |
| 293 |
| 294 EnrollmentStatus::Status expected_enrollment_status_; |
| 295 DeviceManagementStatus expected_dm_status_; |
| 296 CloudPolicyValidatorBase::Status expected_validation_status_; |
| 297 CloudPolicyStore::Status expected_store_status_; |
| 298 bool done_; |
| 299 |
| 300 private: |
| 301 DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyManagerChromeOSEnrollmentTest); |
| 302 }; |
| 303 |
| 304 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Success) { |
| 305 // The defaults should result in successful enrollment. |
| 306 } |
| 307 |
| 308 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Reenrollment) { |
| 309 ASSERT_EQ(EnterpriseInstallAttributes::LOCK_SUCCESS, |
| 310 install_attributes_.LockDevice(PolicyBuilder::kFakeUsername, |
| 311 DEVICE_MODE_ENTERPRISE, |
| 312 PolicyBuilder::kFakeDeviceId)); |
| 313 } |
| 314 |
| 315 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, RegistrationFailed) { |
| 316 register_status_ = DM_STATUS_REQUEST_FAILED; |
| 317 expected_enrollment_status_ = EnrollmentStatus::STATUS_REGISTRATION_FAILED; |
| 318 expected_dm_status_ = DM_STATUS_REQUEST_FAILED; |
| 319 } |
| 320 |
| 321 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, PolicyFetchFailed) { |
| 322 fetch_status_ = DM_STATUS_REQUEST_FAILED; |
| 323 expected_enrollment_status_ = EnrollmentStatus::STATUS_POLICY_FETCH_FAILED; |
| 324 expected_dm_status_ = DM_STATUS_REQUEST_FAILED; |
| 325 } |
| 326 |
| 327 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, ValidationFailed) { |
| 328 policy_.policy().set_policy_data_signature("bad"); |
| 329 fetch_response_.clear_policy_response(); |
| 330 fetch_response_.mutable_policy_response()->add_response()->CopyFrom( |
| 331 policy_.policy()); |
| 332 expected_enrollment_status_ = EnrollmentStatus::STATUS_VALIDATION_FAILED; |
| 333 expected_validation_status_ = |
| 334 CloudPolicyValidatorBase::VALIDATION_BAD_SIGNATURE; |
| 335 } |
| 336 |
| 337 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, StoreError) { |
| 338 store_result_ = false; |
| 339 expected_enrollment_status_ = EnrollmentStatus::STATUS_STORE_ERROR; |
| 340 expected_store_status_ = CloudPolicyStore::STATUS_STORE_ERROR; |
| 341 } |
| 342 |
| 343 TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) { |
| 344 loaded_blob_.clear(); |
| 345 expected_enrollment_status_ = EnrollmentStatus::STATUS_STORE_ERROR; |
| 346 expected_store_status_ = CloudPolicyStore::STATUS_LOAD_ERROR; |
| 347 } |
| 348 |
| 137 } // namespace | 349 } // namespace |
| 138 } // namespace policy | 350 } // namespace policy |
| OLD | NEW |