| Index: components/policy/core/common/cloud/cloud_policy_client_unittest.cc
|
| diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
|
| index ac995ec1fbcf8f70065babcf19aeb1e216e4cff5..8273e98aad6600f7047dee02eec5b48ce249e72a 100644
|
| --- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
|
| +++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
|
| @@ -52,6 +52,9 @@ const char kResultPayload[] = "output_payload";
|
| const char kAssetId[] = "fake-asset-id";
|
| const char kLocation[] = "fake-location";
|
| const char kGcmID[] = "fake-gcm-id";
|
| +const char kEnrollmentCertificate[] = "fake-certificate";
|
| +const char kSignedDataNonce[] = "+nonce";
|
| +const char kSignature[] = "fake-signature";
|
|
|
| const int64_t kAgeOfCommand = 123123123;
|
| const int64_t kLastCommandId = 123456789;
|
| @@ -80,6 +83,42 @@ class MockRemoteCommandsObserver {
|
| const std::vector<em::RemoteCommand>&));
|
| };
|
|
|
| +// A mock SigningService.
|
| +class FakeSigningService : public CloudPolicyClient::SigningService {
|
| + public:
|
| + static void SignRegistrationData(
|
| + em::CertificateBasedDeviceRegistrationData* registration_data,
|
| + em::SignedData* signed_data) {
|
| + DoSignData(registration_data->SerializeAsString(), signed_data);
|
| + }
|
| +
|
| + void SignData(const std::string& data, const SigningCallback& callback)
|
| + override {
|
| + em::SignedData signed_data;
|
| + const bool success = !ShouldSignDataFail();
|
| + if (success)
|
| + DoSignData(data, &signed_data);
|
| + callback.Run(success, signed_data);
|
| + }
|
| +
|
| + protected:
|
| + virtual bool ShouldSignDataFail() const {
|
| + return false;
|
| + }
|
| +
|
| + private:
|
| + static void DoSignData(const std::string& data, em::SignedData* signed_data) {
|
| + signed_data->set_data(data + kSignedDataNonce);
|
| + signed_data->set_signature(kSignature);
|
| + signed_data->set_extra_data_bytes(sizeof(kSignedDataNonce) - 1);
|
| + }
|
| +};
|
| +
|
| +class MockSigningService : public FakeSigningService {
|
| + public:
|
| + MOCK_CONST_METHOD0(ShouldSignDataFail, bool());
|
| +};
|
| +
|
| } // namespace
|
|
|
| class CloudPolicyClientTest : public testing::Test {
|
| @@ -94,8 +133,24 @@ class CloudPolicyClientTest : public testing::Test {
|
| register_request->set_machine_model(kMachineModel);
|
| register_request->set_flavor(
|
| em::DeviceRegisterRequest::FLAVOR_USER_REGISTRATION);
|
| - registration_response_.mutable_register_response()->
|
| - set_device_management_token(kDMToken);
|
| +
|
| + em::CertificateBasedDeviceRegistrationData data;
|
| + data.set_certificate_type(em::CertificateBasedDeviceRegistrationData::
|
| + ENTERPRISE_ENROLLMENT_CERTIFICATE);
|
| + data.set_device_certificate(kEnrollmentCertificate);
|
| +
|
| + em::DeviceRegisterRequest* request = data.mutable_device_register_request();
|
| + request->set_type(em::DeviceRegisterRequest::DEVICE);
|
| + request->set_machine_id(kMachineID);
|
| + request->set_machine_model(kMachineModel);
|
| + request->set_flavor(
|
| + em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_ATTESTATION);
|
| +
|
| + em::CertificateBasedDeviceRegisterRequest* cert_based_register_request =
|
| + cert_based_registration_request_.mutable_cert_based_register_request();
|
| + // We are not testing signature.
|
| + FakeSigningService::SignRegistrationData(&data,
|
| + cert_based_register_request->mutable_signed_request());
|
|
|
| em::PolicyFetchRequest* policy_fetch_request =
|
| policy_request_.mutable_policy_request()->add_request();
|
| @@ -105,6 +160,9 @@ class CloudPolicyClientTest : public testing::Test {
|
| policy_response_.mutable_policy_response()->add_response()->set_policy_data(
|
| CreatePolicyData("fake-policy-data"));
|
|
|
| + registration_response_.mutable_register_response()->
|
| + set_device_management_token(kDMToken);
|
| +
|
| unregistration_request_.mutable_unregister_request();
|
| unregistration_response_.mutable_unregister_response();
|
| upload_certificate_request_.mutable_cert_upload_request()->
|
| @@ -173,7 +231,8 @@ class CloudPolicyClientTest : public testing::Test {
|
| client_.reset(new CloudPolicyClient(kMachineID, kMachineModel,
|
| kPolicyVerificationKeyHash,
|
| &service_,
|
| - request_context_));
|
| + request_context_,
|
| + &signing_service_));
|
| client_->AddPolicyTypeToFetch(policy_type_, std::string());
|
| client_->AddObserver(&observer_);
|
| }
|
| @@ -190,6 +249,18 @@ class CloudPolicyClientTest : public testing::Test {
|
| .WillOnce(SaveArg<4>(&client_id_));
|
| }
|
|
|
| + void ExpectCertBasedRegistration() {
|
| + EXPECT_CALL(service_, CreateJob(
|
| + DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
|
| + request_context_))
|
| + .WillOnce(service_.SucceedJob(registration_response_));
|
| + EXPECT_CALL(service_,
|
| + StartJob(dm_protocol::kValueRequestCertBasedRegister,
|
| + std::string(), _, std::string(), _,
|
| + MatchProto(cert_based_registration_request_)))
|
| + .WillOnce(SaveArg<4>(&client_id_));
|
| + }
|
| +
|
| void ExpectPolicyFetch(const std::string& dm_token) {
|
| EXPECT_CALL(service_,
|
| CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
|
| @@ -296,6 +367,7 @@ class CloudPolicyClientTest : public testing::Test {
|
|
|
| // Request protobufs used as expectations for the client requests.
|
| em::DeviceManagementRequest registration_request_;
|
| + em::DeviceManagementRequest cert_based_registration_request_;
|
| em::DeviceManagementRequest policy_request_;
|
| em::DeviceManagementRequest unregistration_request_;
|
| em::DeviceManagementRequest upload_certificate_request_;
|
| @@ -322,6 +394,7 @@ class CloudPolicyClientTest : public testing::Test {
|
| MockDeviceManagementService service_;
|
| StrictMock<MockCloudPolicyClientObserver> observer_;
|
| StrictMock<MockStatusCallbackObserver> callback_observer_;
|
| + MockSigningService signing_service_;
|
| std::unique_ptr<CloudPolicyClient> client_;
|
| // Pointer to the client's request context.
|
| scoped_refptr<net::URLRequestContextGetter> request_context_;
|
| @@ -365,6 +438,36 @@ TEST_F(CloudPolicyClientTest, RegistrationAndPolicyFetch) {
|
| CheckPolicyResponse();
|
| }
|
|
|
| +TEST_F(CloudPolicyClientTest, RegistrationWithCertificateAndPolicyFetch) {
|
| + ExpectCertBasedRegistration();
|
| + EXPECT_CALL(signing_service_, ShouldSignDataFail())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(observer_, OnRegistrationStateChanged(_));
|
| + client_->RegisterWithCertificate(em::DeviceRegisterRequest::DEVICE,
|
| + em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_ATTESTATION,
|
| + kEnrollmentCertificate, std::string(), std::string(), std::string());
|
| + EXPECT_TRUE(client_->is_registered());
|
| + EXPECT_FALSE(client_->GetPolicyFor(policy_type_, std::string()));
|
| + EXPECT_EQ(DM_STATUS_SUCCESS, client_->status());
|
| +
|
| + ExpectPolicyFetch(kDMToken);
|
| + EXPECT_CALL(observer_, OnPolicyFetched(_));
|
| + client_->FetchPolicy();
|
| + EXPECT_EQ(DM_STATUS_SUCCESS, client_->status());
|
| + CheckPolicyResponse();
|
| +}
|
| +TEST_F(CloudPolicyClientTest, RegistrationWithCertificateFailToSignRequest) {
|
| + EXPECT_CALL(signing_service_, ShouldSignDataFail())
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(observer_, OnClientError(_));
|
| + client_->RegisterWithCertificate(em::DeviceRegisterRequest::DEVICE,
|
| + // TODO(drcrash): Use FLAVOR_ATTESTATION after 2186623002 has landed.
|
| + em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_MANUAL,
|
| + kEnrollmentCertificate, std::string(), std::string(), std::string());
|
| + EXPECT_FALSE(client_->is_registered());
|
| + EXPECT_EQ(DM_STATUS_CANNOT_SIGN_REQUEST, client_->status());
|
| +}
|
| +
|
| TEST_F(CloudPolicyClientTest, RegistrationParametersPassedThrough) {
|
| registration_request_.mutable_register_request()->set_reregister(true);
|
| registration_request_.mutable_register_request()->set_requisition(
|
|
|