Index: chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc |
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc |
index f1a84e18c63945fa9c86fabc2aff7703847ba8fc..4f7089dd8f286c31b826b628ada406b2ba387a38 100644 |
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc |
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc |
@@ -33,6 +33,8 @@ |
#include "chrome/browser/prefs/browser_prefs.h" |
#include "chrome/test/base/testing_browser_process.h" |
#include "chrome/test/base/testing_profile.h" |
+#include "chromeos/attestation/mock_attestation_flow.h" |
+#include "chromeos/cryptohome/async_method_caller.h" |
#include "chromeos/cryptohome/system_salt_getter.h" |
#include "chromeos/dbus/dbus_client_implementation_type.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
@@ -60,10 +62,13 @@ |
using testing::AnyNumber; |
using testing::AtMost; |
using testing::DoAll; |
+using testing::Invoke; |
using testing::Mock; |
using testing::Return; |
using testing::SaveArg; |
using testing::SetArgumentPointee; |
+using testing::StrictMock; |
+using testing::WithArgs; |
using testing::_; |
namespace em = enterprise_management; |
@@ -78,6 +83,13 @@ void CopyLockResult(base::RunLoop* loop, |
loop->Quit(); |
} |
+void CertCallbackSuccess( |
+ const chromeos::attestation::AttestationFlow::CertificateCallback& |
+ callback) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(callback, true, "fake_cert")); |
+} |
+ |
class TestingDeviceCloudPolicyManagerChromeOS |
: public DeviceCloudPolicyManagerChromeOS { |
public: |
@@ -112,11 +124,14 @@ class DeviceCloudPolicyManagerChromeOSTest |
chromeos::system::StatisticsProvider::SetTestProvider(NULL); |
} |
+ virtual bool ShouldRegisterWitCert() const { return false; } |
+ |
void SetUp() override { |
DeviceSettingsTestBase::SetUp(); |
- |
dbus_setter_->SetCryptohomeClient( |
std::unique_ptr<chromeos::CryptohomeClient>(fake_cryptohome_client_)); |
+ chromeos::DBusThreadManager::Get()->GetCryptohomeClient(); |
+ cryptohome::AsyncMethodCaller::Initialize(); |
install_attributes_.reset( |
new EnterpriseInstallAttributes(fake_cryptohome_client_)); |
@@ -149,7 +164,20 @@ class DeviceCloudPolicyManagerChromeOSTest |
AllowUninterestingRemoteCommandFetches(); |
} |
+ StrictMock<chromeos::attestation::MockAttestationFlow>* |
+ CreateAttestationFlow() { |
+ StrictMock<chromeos::attestation::MockAttestationFlow>* mock = |
+ new StrictMock<chromeos::attestation::MockAttestationFlow>(); |
+ if (ShouldRegisterWitCert()) { |
+ EXPECT_CALL(*mock, GetCertificate(_, _, _, _, _)) |
+ .WillOnce(WithArgs<4>(Invoke(CertCallbackSuccess))); |
+ } |
+ return mock; |
+ } |
+ |
void TearDown() override { |
+ cryptohome::AsyncMethodCaller::Shutdown(); |
+ |
manager_->RemoveDeviceCloudPolicyManagerObserver(this); |
manager_->Shutdown(); |
if (initializer_) |
@@ -174,12 +202,15 @@ class DeviceCloudPolicyManagerChromeOSTest |
} |
void ConnectManager() { |
+ std::unique_ptr<chromeos::attestation::AttestationFlow> unique_flow( |
+ CreateAttestationFlow()); |
manager_->Initialize(&local_state_); |
manager_->AddDeviceCloudPolicyManagerObserver(this); |
initializer_.reset(new DeviceCloudPolicyInitializer( |
&local_state_, &device_management_service_, |
base::ThreadTaskRunnerHandle::Get(), install_attributes_.get(), |
- &state_keys_broker_, store_, manager_.get(), nullptr, nullptr)); |
+ &state_keys_broker_, store_, manager_.get(), |
+ cryptohome::AsyncMethodCaller::GetInstance(), std::move(unique_flow))); |
initializer_->Init(); |
} |
@@ -228,7 +259,6 @@ class DeviceCloudPolicyManagerChromeOSTest |
SchemaRegistry schema_registry_; |
std::unique_ptr<TestingDeviceCloudPolicyManagerChromeOS> manager_; |
std::unique_ptr<DeviceCloudPolicyInitializer> initializer_; |
- |
private: |
DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyManagerChromeOSTest); |
}; |
@@ -429,14 +459,21 @@ class DeviceCloudPolicyManagerChromeOSEnrollmentTest |
} |
void RunTest() { |
+ const bool with_cert = ShouldRegisterWitCert(); |
// Trigger enrollment. |
MockDeviceManagementJob* register_job = NULL; |
- EXPECT_CALL(device_management_service_, |
- CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION, _)) |
+ EXPECT_CALL( |
+ device_management_service_, |
+ CreateJob(with_cert |
+ ? DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION |
+ : DeviceManagementRequestJob::TYPE_REGISTRATION, |
+ _)) |
.Times(AtMost(1)) |
.WillOnce(device_management_service_.CreateAsyncJob(®ister_job)); |
EXPECT_CALL(device_management_service_, |
- StartJob(dm_protocol::kValueRequestRegister, _, _, _, _, _)) |
+ StartJob(with_cert ? dm_protocol::kValueRequestCertBasedRegister |
+ : dm_protocol::kValueRequestRegister, |
+ _, _, _, _, _)) |
.Times(AtMost(1)) |
.WillOnce( |
DoAll(SaveArg<4>(&client_id_), SaveArg<5>(®ister_request_))); |
@@ -449,9 +486,13 @@ class DeviceCloudPolicyManagerChromeOSEnrollmentTest |
ASSERT_TRUE(owner_settings_service); |
EnrollmentConfig enrollment_config; |
- enrollment_config.mode = EnrollmentConfig::MODE_MANUAL; |
+ enrollment_config.auth_mechanism = |
+ EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; |
+ enrollment_config.mode = with_cert ? EnrollmentConfig::MODE_ATTESTATION |
+ : EnrollmentConfig::MODE_MANUAL; |
+ std::string token = with_cert ? "" : "auth token"; |
initializer_->StartEnrollment( |
- &device_management_service_, enrollment_config, "auth token", modes, |
+ &device_management_service_, enrollment_config, token, modes, |
base::Bind(&DeviceCloudPolicyManagerChromeOSEnrollmentTest::Done, |
base::Unretained(this))); |
base::RunLoop().RunUntilIdle(); |
@@ -579,35 +620,43 @@ class DeviceCloudPolicyManagerChromeOSEnrollmentTest |
DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyManagerChromeOSEnrollmentTest); |
}; |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Success) { |
+// TODO(drcrash): Handle cert-based tests (http://crbug.com/641447). |
+TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Reenrollment) { |
+ LockDevice(); |
RunTest(); |
ExpectSuccessfulEnrollment(); |
+ EXPECT_TRUE(register_request_.register_request().reregister()); |
+ EXPECT_EQ(PolicyBuilder::kFakeDeviceId, client_id_); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Reenrollment) { |
- LockDevice(); |
+class ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest |
+ : public DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ public testing::WithParamInterface<bool> { |
+ protected: |
+ bool ShouldRegisterWitCert() const override { return GetParam(); } |
+}; |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, Success) { |
RunTest(); |
ExpectSuccessfulEnrollment(); |
- EXPECT_TRUE(register_request_.register_request().reregister()); |
- EXPECT_EQ(PolicyBuilder::kFakeDeviceId, client_id_); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, RegistrationFailed) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ RegistrationFailed) { |
register_status_ = DM_STATUS_REQUEST_FAILED; |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_REGISTRATION_FAILED); |
EXPECT_EQ(DM_STATUS_REQUEST_FAILED, status_.client_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
RobotAuthCodeFetchFailed) { |
robot_auth_fetch_status_ = DM_STATUS_REQUEST_FAILED; |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_AUTH_FETCH_FAILED); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
RobotRefreshTokenFetchResponseCodeFailed) { |
url_fetcher_response_code_ = 400; |
RunTest(); |
@@ -615,14 +664,14 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
EXPECT_EQ(400, status_.http_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
RobotRefreshTokenFetchResponseStringFailed) { |
url_fetcher_response_string_ = "invalid response json"; |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_FETCH_FAILED); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
RobotRefreshEncryptionFailed) { |
// The encryption lib is a noop for tests, but empty results from encryption |
// is an error, so we simulate an encryption error by returning an empty |
@@ -634,14 +683,16 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_STORE_FAILED); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, PolicyFetchFailed) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ PolicyFetchFailed) { |
policy_fetch_status_ = DM_STATUS_REQUEST_FAILED; |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_POLICY_FETCH_FAILED); |
EXPECT_EQ(DM_STATUS_REQUEST_FAILED, status_.client_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, ValidationFailed) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ ValidationFailed) { |
device_policy_.policy().set_policy_data_signature("bad"); |
policy_fetch_response_.clear_policy_response(); |
policy_fetch_response_.mutable_policy_response()->add_response()->CopyFrom( |
@@ -652,7 +703,8 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, ValidationFailed) { |
status_.validation_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, StoreError) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ StoreError) { |
store_result_ = false; |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_STORE_ERROR); |
@@ -660,7 +712,7 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, StoreError) { |
status_.store_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) { |
loaded_blob_.clear(); |
RunTest(); |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_STORE_ERROR); |
@@ -668,7 +720,8 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) { |
status_.store_status()); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, UnregisterSucceeds) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ UnregisterSucceeds) { |
// Enroll first. |
RunTest(); |
ExpectSuccessfulEnrollment(); |
@@ -688,7 +741,8 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, UnregisterSucceeds) { |
base::Unretained(this))); |
} |
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, UnregisterFails) { |
+TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ UnregisterFails) { |
// Enroll first. |
RunTest(); |
ExpectSuccessfulEnrollment(); |
@@ -723,5 +777,10 @@ TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentBlankSystemSaltTest, |
ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_STORE_FAILED); |
} |
+INSTANTIATE_TEST_CASE_P( |
+ Cert, |
+ ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, |
+ ::testing::Values(false, true)); |
+ |
} // namespace |
} // namespace policy |