device_management_service_browsertest.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
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 3// found in the LICENSE file. 4 5#include "base/bind.h" 6#include "base/bind_helpers.h" 7#include "base/memory/scoped_ptr.h" 8#include "base/message_loop/message_loop.h" 9#include "base/stl_util.h" 10#include "chrome/browser/policy/cloud/cloud_policy_constants.h" 11#include "chrome/browser/policy/cloud/device_management_service.h" 12#include "chrome/browser/policy/cloud/test_request_interceptor.h" 13#include "chrome/browser/policy/test/local_policy_test_server.h" 14#include "chrome/test/base/in_process_browser_test.h" 15#include "net/base/upload_bytes_element_reader.h" 16#include "net/base/upload_data_stream.h" 17#include "net/url_request/url_fetcher.h" 18#include "net/url_request/url_request.h" 19#include "net/url_request/url_request_test_job.h" 20#include "testing/gmock/include/gmock/gmock.h" 21#include "testing/gtest/include/gtest/gtest.h" 22 23using testing::DoAll; 24using testing::Invoke; 25using testing::InvokeWithoutArgs; 26using testing::_; 27 28namespace em = enterprise_management; 29 30namespace policy { 31 32namespace { 33 34// Parses the DeviceManagementRequest in |request_data| and writes a serialized 35// DeviceManagementResponse to |response_data|. 36void ConstructResponse(const char* request_data, 37 uint64 request_data_length, 38 std::string* response_data) { 39 em::DeviceManagementRequest request; 40 ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length)); 41 em::DeviceManagementResponse response; 42 if (request.has_register_request()) { 43 response.mutable_register_response()->set_device_management_token( 44 "fake_token"); 45 } else if (request.has_service_api_access_request()) { 46 response.mutable_service_api_access_response()->set_auth_code( 47 "fake_auth_code"); 48 } else if (request.has_unregister_request()) { 49 response.mutable_unregister_response(); 50 } else if (request.has_policy_request()) { 51 response.mutable_policy_response()->add_response(); 52 } else if (request.has_auto_enrollment_request()) { 53 response.mutable_auto_enrollment_response(); 54 } else { 55 FAIL() << "Failed to parse request."; 56 } 57 ASSERT_TRUE(response.SerializeToString(response_data)); 58} 59 60// JobCallback for the interceptor. 61net::URLRequestJob* ResponseJob( 62 net::URLRequest* request, 63 net::NetworkDelegate* network_delegate) { 64 const net::UploadDataStream* upload = request->get_upload(); 65 if (upload != NULL && 66 upload->element_readers().size() == 1 && 67 upload->element_readers()[0]->AsBytesReader()) { 68 std::string response_data; 69 const net::UploadBytesElementReader* bytes_reader = 70 upload->element_readers()[0]->AsBytesReader(); 71 ConstructResponse(bytes_reader->bytes(), 72 bytes_reader->length(), 73 &response_data); 74 return new net::URLRequestTestJob( 75 request, 76 network_delegate, 77 net::URLRequestTestJob::test_headers(), 78 response_data, 79 true); 80 } 81 82 return NULL; 83} 84 85} // namespace 86 87class DeviceManagementServiceIntegrationTest 88 : public InProcessBrowserTest, 89 public testing::WithParamInterface< 90 std::string (DeviceManagementServiceIntegrationTest::*)(void)> { 91 public: 92 MOCK_METHOD3(OnJobDone, void(DeviceManagementStatus, int, 93 const em::DeviceManagementResponse&)); 94 95 std::string InitCannedResponse() { 96 interceptor_.reset(new TestRequestInterceptor("localhost")); 97 return "http://localhost"; 98 } 99 100 std::string InitTestServer() { 101 StartTestServer(); 102 return test_server_->GetServiceURL().spec(); 103 } 104 105 void RecordAuthCode(DeviceManagementStatus status, 106 int net_error, 107 const em::DeviceManagementResponse& response) { 108 robot_auth_code_ = response.service_api_access_response().auth_code(); 109 } 110 111 protected: 112 void ExpectRequest() { 113 if (interceptor_) 114 interceptor_->PushJobCallback(base::Bind(&ResponseJob)); 115 } 116 117 void PerformRegistration() { 118 ExpectRequest(); 119 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _)) 120 .WillOnce( 121 DoAll(Invoke(this, 122 &DeviceManagementServiceIntegrationTest::RecordToken), 123 InvokeWithoutArgs(base::MessageLoop::current(), 124 &base::MessageLoop::Quit))); 125 scoped_ptr<DeviceManagementRequestJob> job( 126 service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION)); 127 job->SetGaiaToken("gaia_auth_token"); 128 job->SetOAuthToken("oauth_token"); 129 job->SetClientID("testid"); 130 job->GetRequest()->mutable_register_request(); 131 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 132 base::Unretained(this))); 133 base::MessageLoop::current()->Run(); 134 } 135 136 virtual void SetUpOnMainThread() OVERRIDE { 137 std::string service_url((this->*(GetParam()))()); 138 service_.reset(new DeviceManagementService(service_url)); 139 service_->ScheduleInitialization(0); 140 } 141 142 virtual void CleanUpOnMainThread() OVERRIDE { 143 service_.reset(); 144 test_server_.reset(); 145 interceptor_.reset(); 146 } 147 148 void StartTestServer() { 149 test_server_.reset( 150 new LocalPolicyTestServer("device_management_service_browsertest")); 151 ASSERT_TRUE(test_server_->Start()); 152 } 153 154 void RecordToken(DeviceManagementStatus status, 155 int net_error, 156 const em::DeviceManagementResponse& response) { 157 token_ = response.register_response().device_management_token(); 158 } 159 160 std::string token_; 161 std::string robot_auth_code_; 162 scoped_ptr<DeviceManagementService> service_; 163 scoped_ptr<LocalPolicyTestServer> test_server_; 164 scoped_ptr<TestRequestInterceptor> interceptor_; 165}; 166 167IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Registration) { 168 PerformRegistration(); 169 EXPECT_FALSE(token_.empty()); 170} 171 172IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, 173 ApiAuthCodeFetch) { 174 PerformRegistration(); 175 176 ExpectRequest(); 177 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _)) 178 .WillOnce( 179 DoAll(Invoke(this, 180 &DeviceManagementServiceIntegrationTest::RecordAuthCode), 181 InvokeWithoutArgs(base::MessageLoop::current(), 182 &base::MessageLoop::Quit))); 183 scoped_ptr<DeviceManagementRequestJob> job(service_->CreateJob( 184 DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH)); 185 job->SetDMToken(token_); 186 job->SetClientID("testid"); 187 em::DeviceServiceApiAccessRequest* request = 188 job->GetRequest()->mutable_service_api_access_request(); 189 request->add_auth_scope("authScope4Test"); 190 request->set_oauth2_client_id("oauth2ClientId4Test"); 191 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 192 base::Unretained(this))); 193 base::MessageLoop::current()->Run(); 194 ASSERT_EQ("fake_auth_code", robot_auth_code_); 195} 196 197IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, PolicyFetch) { 198 PerformRegistration(); 199 200 ExpectRequest(); 201 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _)) 202 .WillOnce(InvokeWithoutArgs(base::MessageLoop::current(), 203 &base::MessageLoop::Quit)); 204 scoped_ptr<DeviceManagementRequestJob> job( 205 service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH)); 206 job->SetDMToken(token_); 207 job->SetUserAffiliation(USER_AFFILIATION_NONE); 208 job->SetClientID("testid"); 209 em::DevicePolicyRequest* request = 210 job->GetRequest()->mutable_policy_request(); 211 request->add_request()->set_policy_type(dm_protocol::kChromeUserPolicyType); 212 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 213 base::Unretained(this))); 214 base::MessageLoop::current()->Run(); 215} 216 217IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Unregistration) { 218 PerformRegistration(); 219 220 ExpectRequest(); 221 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _)) 222 .WillOnce(InvokeWithoutArgs(base::MessageLoop::current(), 223 &base::MessageLoop::Quit)); 224 scoped_ptr<DeviceManagementRequestJob> job( 225 service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION)); 226 job->SetDMToken(token_); 227 job->SetClientID("testid"); 228 job->GetRequest()->mutable_unregister_request(); 229 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 230 base::Unretained(this))); 231 base::MessageLoop::current()->Run(); 232} 233 234IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, AutoEnrollment) { 235 ExpectRequest(); 236 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _)) 237 .WillOnce(InvokeWithoutArgs(base::MessageLoop::current(), 238 &base::MessageLoop::Quit)); 239 scoped_ptr<DeviceManagementRequestJob> job( 240 service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT)); 241 job->SetClientID("testid"); 242 job->GetRequest()->mutable_auto_enrollment_request()->set_remainder(0); 243 job->GetRequest()->mutable_auto_enrollment_request()->set_modulus(1); 244 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 245 base::Unretained(this))); 246 base::MessageLoop::current()->Run(); 247} 248 249INSTANTIATE_TEST_CASE_P( 250 DeviceManagementServiceIntegrationTestInstance, 251 DeviceManagementServiceIntegrationTest, 252 testing::Values(&DeviceManagementServiceIntegrationTest::InitCannedResponse, 253 &DeviceManagementServiceIntegrationTest::InitTestServer)); 254 255} // namespace policy 256