Chromium Code Reviews| 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 <ostream> | 5 #include <ostream> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/bind.h" | |
| 8 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 9 #include "base/string_split.h" | 10 #include "base/string_split.h" |
| 10 #include "chrome/browser/policy/device_management_backend_impl.h" | 11 #include "chrome/browser/policy/cloud_policy_constants.h" |
| 11 #include "chrome/browser/policy/device_management_backend_mock.h" | |
| 12 #include "chrome/browser/policy/device_management_service.h" | 12 #include "chrome/browser/policy/device_management_service.h" |
| 13 #include "chrome/browser/policy/proto/device_management_constants.h" | |
| 14 #include "chrome/test/base/testing_browser_process.h" | 13 #include "chrome/test/base/testing_browser_process.h" |
| 15 #include "content/test/test_browser_thread.h" | 14 #include "content/test/test_browser_thread.h" |
| 16 #include "content/test/test_url_fetcher_factory.h" | 15 #include "content/test/test_url_fetcher_factory.h" |
| 17 #include "net/base/escape.h" | 16 #include "net/base/escape.h" |
| 18 #include "net/base/load_flags.h" | 17 #include "net/base/load_flags.h" |
| 19 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
| 20 #include "net/http/http_response_headers.h" | 19 #include "net/http/http_response_headers.h" |
| 21 #include "net/url_request/url_request_status.h" | 20 #include "net/url_request/url_request_status.h" |
| 22 #include "net/url_request/url_request_test_util.h" | 21 #include "net/url_request/url_request_test_util.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 24 |
| 26 using content::BrowserThread; | 25 using content::BrowserThread; |
| 27 using testing::IgnoreResult; | |
| 28 using testing::InvokeWithoutArgs; | 26 using testing::InvokeWithoutArgs; |
|
Joao da Silva
2012/01/02 16:14:43
Nit: not used
Mattias Nissler (ping if slow)
2012/01/02 17:53:23
Done.
| |
| 29 using testing::_; | 27 using testing::_; |
| 30 | 28 |
| 31 namespace em = enterprise_management; | 29 namespace em = enterprise_management; |
| 32 | 30 |
| 33 namespace policy { | 31 namespace policy { |
| 34 | 32 |
| 35 const char kServiceUrl[] = "https://example.com/management_service"; | 33 const char kServiceUrl[] = "https://example.com/management_service"; |
| 36 | 34 |
| 37 // Encoded empty response messages for testing the error code paths. | 35 // Encoded empty response messages for testing the error code paths. |
| 38 const char kResponseEmpty[] = "\x08\x00"; | 36 const char kResponseEmpty[] = "\x08\x00"; |
| 39 | 37 |
| 40 #define PROTO_STRING(name) (std::string(name, arraysize(name) - 1)) | 38 #define PROTO_STRING(name) (std::string(name, arraysize(name) - 1)) |
| 41 | 39 |
| 42 // Some helper constants. | 40 // Some helper constants. |
| 43 const char kGaiaAuthToken[] = "gaia-auth-token"; | 41 const char kGaiaAuthToken[] = "gaia-auth-token"; |
| 44 const char kOAuthToken[] = "oauth-token"; | 42 const char kOAuthToken[] = "oauth-token"; |
| 45 const char kDMToken[] = "device-management-token"; | 43 const char kDMToken[] = "device-management-token"; |
| 46 const char kDeviceId[] = "device-id"; | 44 const char kClientID[] = "device-id"; |
| 47 | 45 |
| 48 // Unit tests for the device management policy service. The tests are run | 46 // Unit tests for the device management policy service. The tests are run |
| 49 // against a TestURLFetcherFactory that is used to short-circuit the request | 47 // against a TestURLFetcherFactory that is used to short-circuit the request |
| 50 // without calling into the actual network stack. | 48 // without calling into the actual network stack. |
| 51 template<typename TESTBASE> | 49 class DeviceManagementServiceTestBase : public testing::Test { |
| 52 class DeviceManagementServiceTestBase : public TESTBASE { | |
| 53 protected: | 50 protected: |
| 54 DeviceManagementServiceTestBase() | 51 DeviceManagementServiceTestBase() |
| 55 : ui_thread_(BrowserThread::UI, &loop_), | 52 : ui_thread_(BrowserThread::UI, &loop_), |
| 56 io_thread_(BrowserThread::IO, &loop_) { | 53 io_thread_(BrowserThread::IO, &loop_) { |
| 57 ResetService(); | 54 ResetService(); |
| 58 InitializeService(); | 55 InitializeService(); |
| 59 } | 56 } |
| 60 | 57 |
| 61 virtual void TearDown() { | 58 virtual void TearDown() { |
| 62 backend_.reset(); | |
| 63 service_.reset(); | 59 service_.reset(); |
| 64 loop_.RunAllPending(); | 60 loop_.RunAllPending(); |
| 65 TESTBASE::TearDown(); | |
| 66 } | 61 } |
| 67 | 62 |
| 68 void ResetService() { | 63 void ResetService() { |
| 69 backend_.reset(); | |
| 70 service_.reset(new DeviceManagementService(kServiceUrl)); | 64 service_.reset(new DeviceManagementService(kServiceUrl)); |
| 71 backend_.reset(service_->CreateBackend()); | |
| 72 } | 65 } |
| 73 | 66 |
| 74 void InitializeService() { | 67 void InitializeService() { |
| 75 service_->ScheduleInitialization(0); | 68 service_->ScheduleInitialization(0); |
| 76 loop_.RunAllPending(); | 69 loop_.RunAllPending(); |
| 77 } | 70 } |
| 78 | 71 |
| 72 DeviceManagementRequestJob* StartRegistrationJob() { | |
| 73 DeviceManagementRequestJob* job = | |
| 74 service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION); | |
| 75 job->SetGaiaToken(kGaiaAuthToken); | |
| 76 job->SetOAuthToken(kOAuthToken); | |
| 77 job->SetClientID(kClientID); | |
| 78 job->GetRequest()->mutable_register_request(); | |
| 79 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, | |
| 80 base::Unretained(this))); | |
| 81 return job; | |
| 82 } | |
| 83 | |
| 84 DeviceManagementRequestJob* StartUnregistrationJob() { | |
| 85 DeviceManagementRequestJob* job = | |
| 86 service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION); | |
| 87 job->SetDMToken(kDMToken); | |
| 88 job->SetClientID(kClientID); | |
| 89 job->GetRequest()->mutable_unregister_request(); | |
| 90 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, | |
| 91 base::Unretained(this))); | |
| 92 return job; | |
| 93 } | |
| 94 | |
| 95 DeviceManagementRequestJob* StartPolicyFetchJob() { | |
| 96 DeviceManagementRequestJob* job = | |
| 97 service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH); | |
| 98 job->SetGaiaToken(kGaiaAuthToken); | |
| 99 job->SetOAuthToken(kOAuthToken); | |
| 100 job->SetClientID(kClientID); | |
| 101 em::PolicyFetchRequest* fetch_request = | |
| 102 job->GetRequest()->mutable_policy_request()->add_request(); | |
| 103 fetch_request->set_policy_type(dm_protocol::kChromeUserPolicyType); | |
| 104 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, | |
| 105 base::Unretained(this))); | |
| 106 return job; | |
| 107 } | |
| 108 | |
| 109 DeviceManagementRequestJob* StartAutoEnrollmentJob() { | |
| 110 DeviceManagementRequestJob* job = | |
| 111 service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT); | |
| 112 job->SetClientID(kClientID); | |
| 113 em::DeviceAutoEnrollmentRequest* request = | |
| 114 job->GetRequest()->mutable_auto_enrollment_request(); | |
| 115 request->set_modulus(1); | |
| 116 request->set_remainder(0); | |
| 117 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, | |
| 118 base::Unretained(this))); | |
| 119 return job; | |
| 120 } | |
| 121 | |
| 122 void SendResponse(TestURLFetcher* fetcher, | |
| 123 const net::URLRequestStatus request_status, | |
| 124 int http_status, | |
| 125 const std::string& response) { | |
| 126 fetcher->set_url(GURL(kServiceUrl)); | |
| 127 fetcher->set_status(request_status); | |
| 128 fetcher->set_response_code(http_status); | |
| 129 fetcher->SetResponseString(response); | |
| 130 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 131 } | |
| 132 | |
| 133 MOCK_METHOD2(OnJobDone, void(DeviceManagementStatus, | |
| 134 const em::DeviceManagementResponse&)); | |
| 135 | |
| 79 TestURLFetcherFactory factory_; | 136 TestURLFetcherFactory factory_; |
| 80 scoped_ptr<DeviceManagementService> service_; | 137 scoped_ptr<DeviceManagementService> service_; |
| 81 scoped_ptr<DeviceManagementBackend> backend_; | |
| 82 | 138 |
| 83 private: | 139 private: |
| 84 MessageLoopForUI loop_; | 140 MessageLoopForUI loop_; |
| 85 content::TestBrowserThread ui_thread_; | 141 content::TestBrowserThread ui_thread_; |
| 86 content::TestBrowserThread io_thread_; | 142 content::TestBrowserThread io_thread_; |
| 87 }; | 143 }; |
| 88 | 144 |
| 89 struct FailedRequestParams { | 145 struct FailedRequestParams { |
| 90 FailedRequestParams(DeviceManagementBackend::ErrorCode expected_error, | 146 FailedRequestParams(DeviceManagementStatus expected_status, |
| 91 net::URLRequestStatus::Status request_status, | 147 net::URLRequestStatus::Status request_status, |
| 92 int http_status, | 148 int http_status, |
| 93 const std::string& response) | 149 const std::string& response) |
| 94 : expected_error_(expected_error), | 150 : expected_status_(expected_status), |
| 95 request_status_(request_status, 0), | 151 request_status_(request_status, 0), |
| 96 http_status_(http_status), | 152 http_status_(http_status), |
| 97 response_(response) {} | 153 response_(response) {} |
| 98 | 154 |
| 99 DeviceManagementBackend::ErrorCode expected_error_; | 155 DeviceManagementStatus expected_status_; |
| 100 net::URLRequestStatus request_status_; | 156 net::URLRequestStatus request_status_; |
| 101 int http_status_; | 157 int http_status_; |
| 102 std::string response_; | 158 std::string response_; |
| 103 }; | 159 }; |
| 104 | 160 |
| 105 void PrintTo(const FailedRequestParams& params, std::ostream* os) { | 161 void PrintTo(const FailedRequestParams& params, std::ostream* os) { |
| 106 *os << "FailedRequestParams " << params.expected_error_ | 162 *os << "FailedRequestParams " << params.expected_status_ |
| 107 << " " << params.request_status_.status() | 163 << " " << params.request_status_.status() |
| 108 << " " << params.http_status_; | 164 << " " << params.http_status_; |
| 109 } | 165 } |
| 110 | 166 |
| 111 // A parameterized test case for erroneous response situations, they're mostly | 167 // A parameterized test case for erroneous response situations, they're mostly |
| 112 // the same for all kinds of requests. | 168 // the same for all kinds of requests. |
| 113 class DeviceManagementServiceFailedRequestTest | 169 class DeviceManagementServiceFailedRequestTest |
| 114 : public DeviceManagementServiceTestBase< | 170 : public DeviceManagementServiceTestBase, |
| 115 testing::TestWithParam<FailedRequestParams> > { | 171 public testing::WithParamInterface<FailedRequestParams> { |
| 116 }; | 172 }; |
| 117 | 173 |
| 118 TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) { | 174 TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) { |
| 119 DeviceRegisterResponseDelegateMock mock; | 175 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
| 120 EXPECT_CALL(mock, OnError(GetParam().expected_error_)); | 176 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 121 em::DeviceRegisterRequest request; | |
| 122 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 123 kDeviceId, request, &mock); | |
| 124 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 177 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 125 ASSERT_TRUE(fetcher); | 178 ASSERT_TRUE(fetcher); |
| 126 | 179 |
| 127 fetcher->set_url(GURL(kServiceUrl)); | 180 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
| 128 fetcher->set_status(GetParam().request_status_); | 181 GetParam().response_); |
| 129 fetcher->set_response_code(GetParam().http_status_); | |
| 130 fetcher->SetResponseString(GetParam().response_); | |
| 131 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 132 } | 182 } |
| 133 | 183 |
| 134 TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) { | 184 TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) { |
| 135 DeviceUnregisterResponseDelegateMock mock; | 185 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
| 136 EXPECT_CALL(mock, OnError(GetParam().expected_error_)); | 186 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
| 137 em::DeviceUnregisterRequest request; | |
| 138 backend_->ProcessUnregisterRequest(kDMToken, kDeviceId, request, &mock); | |
| 139 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 187 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 140 ASSERT_TRUE(fetcher); | 188 ASSERT_TRUE(fetcher); |
| 141 | 189 |
| 142 fetcher->set_url(GURL(kServiceUrl)); | 190 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
| 143 fetcher->set_status(GetParam().request_status_); | 191 GetParam().response_); |
| 144 fetcher->set_response_code(GetParam().http_status_); | |
| 145 fetcher->SetResponseString(GetParam().response_); | |
| 146 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 147 } | 192 } |
| 148 | 193 |
| 149 TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) { | 194 TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) { |
| 150 DevicePolicyResponseDelegateMock mock; | 195 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
| 151 EXPECT_CALL(mock, OnError(GetParam().expected_error_)); | 196 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
| 152 em::DevicePolicyRequest request; | |
| 153 request.set_policy_scope(kChromePolicyScope); | |
| 154 em::DevicePolicySettingRequest* setting_request = | |
| 155 request.add_setting_request(); | |
| 156 setting_request->set_key(kChromeDevicePolicySettingKey); | |
| 157 backend_->ProcessPolicyRequest(kDMToken, kDeviceId, | |
| 158 CloudPolicyDataStore::USER_AFFILIATION_NONE, | |
| 159 request, NULL, &mock); | |
| 160 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 197 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 161 ASSERT_TRUE(fetcher); | 198 ASSERT_TRUE(fetcher); |
| 162 | 199 |
| 163 fetcher->set_url(GURL(kServiceUrl)); | 200 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
| 164 fetcher->set_status(GetParam().request_status_); | 201 GetParam().response_); |
| 165 fetcher->set_response_code(GetParam().http_status_); | |
| 166 fetcher->SetResponseString(GetParam().response_); | |
| 167 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 168 } | 202 } |
| 169 | 203 |
| 170 TEST_P(DeviceManagementServiceFailedRequestTest, AutoEnrollmentRequest) { | 204 TEST_P(DeviceManagementServiceFailedRequestTest, AutoEnrollmentRequest) { |
| 171 DeviceAutoEnrollmentResponseDelegateMock mock; | 205 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
| 172 EXPECT_CALL(mock, OnError(GetParam().expected_error_)); | 206 scoped_ptr<DeviceManagementRequestJob> request_job(StartAutoEnrollmentJob()); |
| 173 em::DeviceAutoEnrollmentRequest request; | |
| 174 request.set_modulus(1); | |
| 175 request.set_remainder(0); | |
| 176 backend_->ProcessAutoEnrollmentRequest(kDeviceId, request, &mock); | |
| 177 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 207 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 178 ASSERT_TRUE(fetcher); | 208 ASSERT_TRUE(fetcher); |
| 179 | 209 |
| 180 fetcher->set_url(GURL(kServiceUrl)); | 210 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
| 181 fetcher->set_status(GetParam().request_status_); | 211 GetParam().response_); |
| 182 fetcher->set_response_code(GetParam().http_status_); | |
| 183 fetcher->SetResponseString(GetParam().response_); | |
| 184 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 185 } | 212 } |
| 186 | 213 |
| 187 INSTANTIATE_TEST_CASE_P( | 214 INSTANTIATE_TEST_CASE_P( |
| 188 DeviceManagementServiceFailedRequestTestInstance, | 215 DeviceManagementServiceFailedRequestTestInstance, |
| 189 DeviceManagementServiceFailedRequestTest, | 216 DeviceManagementServiceFailedRequestTest, |
| 190 testing::Values( | 217 testing::Values( |
| 191 FailedRequestParams( | 218 FailedRequestParams( |
| 192 DeviceManagementBackend::kErrorRequestFailed, | 219 DM_STATUS_REQUEST_FAILED, |
| 193 net::URLRequestStatus::FAILED, | 220 net::URLRequestStatus::FAILED, |
| 194 200, | 221 200, |
| 195 PROTO_STRING(kResponseEmpty)), | 222 PROTO_STRING(kResponseEmpty)), |
| 196 FailedRequestParams( | 223 FailedRequestParams( |
| 197 DeviceManagementBackend::kErrorHttpStatus, | 224 DM_STATUS_HTTP_STATUS_ERROR, |
| 198 net::URLRequestStatus::SUCCESS, | 225 net::URLRequestStatus::SUCCESS, |
| 199 666, | 226 666, |
| 200 PROTO_STRING(kResponseEmpty)), | 227 PROTO_STRING(kResponseEmpty)), |
| 201 FailedRequestParams( | 228 FailedRequestParams( |
| 202 DeviceManagementBackend::kErrorResponseDecoding, | 229 DM_STATUS_RESPONSE_DECODING_ERROR, |
| 203 net::URLRequestStatus::SUCCESS, | 230 net::URLRequestStatus::SUCCESS, |
| 204 200, | 231 200, |
| 205 PROTO_STRING("Not a protobuf.")), | 232 PROTO_STRING("Not a protobuf.")), |
| 206 FailedRequestParams( | 233 FailedRequestParams( |
| 207 DeviceManagementBackend::kErrorServiceManagementNotSupported, | 234 DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED, |
| 208 net::URLRequestStatus::SUCCESS, | 235 net::URLRequestStatus::SUCCESS, |
| 209 403, | 236 403, |
| 210 PROTO_STRING(kResponseEmpty)), | 237 PROTO_STRING(kResponseEmpty)), |
| 211 FailedRequestParams( | 238 FailedRequestParams( |
| 212 DeviceManagementBackend::kErrorServiceInvalidSerialNumber, | 239 DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER, |
| 213 net::URLRequestStatus::SUCCESS, | 240 net::URLRequestStatus::SUCCESS, |
| 214 405, | 241 405, |
| 215 PROTO_STRING(kResponseEmpty)), | 242 PROTO_STRING(kResponseEmpty)), |
| 216 FailedRequestParams( | 243 FailedRequestParams( |
| 217 DeviceManagementBackend::kErrorServiceDeviceIdConflict, | 244 DM_STATUS_SERVICE_DEVICE_ID_CONFLICT, |
| 218 net::URLRequestStatus::SUCCESS, | 245 net::URLRequestStatus::SUCCESS, |
| 219 409, | 246 409, |
| 220 PROTO_STRING(kResponseEmpty)), | 247 PROTO_STRING(kResponseEmpty)), |
| 221 FailedRequestParams( | 248 FailedRequestParams( |
| 222 DeviceManagementBackend::kErrorServiceDeviceNotFound, | 249 DM_STATUS_SERVICE_DEVICE_NOT_FOUND, |
| 223 net::URLRequestStatus::SUCCESS, | 250 net::URLRequestStatus::SUCCESS, |
| 224 410, | 251 410, |
| 225 PROTO_STRING(kResponseEmpty)), | 252 PROTO_STRING(kResponseEmpty)), |
| 226 // TODO(pastarmovj): Remove once DM server is deployed. | 253 // TODO(pastarmovj): Remove once DM server is deployed. |
| 227 FailedRequestParams( | 254 FailedRequestParams( |
| 228 DeviceManagementBackend::kErrorServiceDeviceNotFound, | 255 DM_STATUS_SERVICE_DEVICE_NOT_FOUND, |
| 229 net::URLRequestStatus::SUCCESS, | 256 net::URLRequestStatus::SUCCESS, |
| 230 901, | 257 901, |
| 231 PROTO_STRING(kResponseEmpty)), | 258 PROTO_STRING(kResponseEmpty)), |
| 232 FailedRequestParams( | 259 FailedRequestParams( |
| 233 DeviceManagementBackend::kErrorServiceManagementTokenInvalid, | 260 DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID, |
| 234 net::URLRequestStatus::SUCCESS, | 261 net::URLRequestStatus::SUCCESS, |
| 235 401, | 262 401, |
| 236 PROTO_STRING(kResponseEmpty)), | 263 PROTO_STRING(kResponseEmpty)), |
| 237 FailedRequestParams( | 264 FailedRequestParams( |
| 238 DeviceManagementBackend::kErrorRequestInvalid, | 265 DM_STATUS_REQUEST_INVALID, |
| 239 net::URLRequestStatus::SUCCESS, | 266 net::URLRequestStatus::SUCCESS, |
| 240 400, | 267 400, |
| 241 PROTO_STRING(kResponseEmpty)), | 268 PROTO_STRING(kResponseEmpty)), |
| 242 FailedRequestParams( | 269 FailedRequestParams( |
| 243 DeviceManagementBackend::kErrorTemporaryUnavailable, | 270 DM_STATUS_TEMPORARY_UNAVAILABLE, |
| 244 net::URLRequestStatus::SUCCESS, | 271 net::URLRequestStatus::SUCCESS, |
| 245 404, | 272 404, |
| 246 PROTO_STRING(kResponseEmpty)), | 273 PROTO_STRING(kResponseEmpty)), |
| 247 FailedRequestParams( | 274 FailedRequestParams( |
| 248 DeviceManagementBackend::kErrorServiceActivationPending, | 275 DM_STATUS_SERVICE_ACTIVATION_PENDING, |
| 249 net::URLRequestStatus::SUCCESS, | 276 net::URLRequestStatus::SUCCESS, |
| 250 412, | 277 412, |
| 251 PROTO_STRING(kResponseEmpty)), | 278 PROTO_STRING(kResponseEmpty)), |
| 252 // TODO(pastarmovj): Remove once DM server is deployed. | 279 // TODO(pastarmovj): Remove once DM server is deployed. |
| 253 FailedRequestParams( | 280 FailedRequestParams( |
| 254 DeviceManagementBackend::kErrorServiceActivationPending, | 281 DM_STATUS_SERVICE_ACTIVATION_PENDING, |
| 255 net::URLRequestStatus::SUCCESS, | 282 net::URLRequestStatus::SUCCESS, |
| 256 491, | 283 491, |
| 257 PROTO_STRING(kResponseEmpty)))); | 284 PROTO_STRING(kResponseEmpty)))); |
| 258 | 285 |
| 259 // Simple query parameter parser for testing. | 286 // Simple query parameter parser for testing. |
| 260 class QueryParams { | 287 class QueryParams { |
| 261 public: | 288 public: |
| 262 explicit QueryParams(const std::string& query) { | 289 explicit QueryParams(const std::string& query) { |
| 263 base::SplitStringIntoKeyValuePairs(query, '=', '&', ¶ms_); | 290 base::SplitStringIntoKeyValuePairs(query, '=', '&', ¶ms_); |
| 264 } | 291 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 290 } | 317 } |
| 291 return found; | 318 return found; |
| 292 } | 319 } |
| 293 | 320 |
| 294 private: | 321 private: |
| 295 typedef std::vector<std::pair<std::string, std::string> > ParamMap; | 322 typedef std::vector<std::pair<std::string, std::string> > ParamMap; |
| 296 ParamMap params_; | 323 ParamMap params_; |
| 297 }; | 324 }; |
| 298 | 325 |
| 299 class DeviceManagementServiceTest | 326 class DeviceManagementServiceTest |
| 300 : public DeviceManagementServiceTestBase<testing::Test> { | 327 : public DeviceManagementServiceTestBase { |
| 301 public: | |
| 302 void ResetBackend() { | |
| 303 backend_.reset(); | |
| 304 } | |
| 305 | |
| 306 protected: | 328 protected: |
| 307 void CheckURLAndQueryParams(const GURL& request_url, | 329 void CheckURLAndQueryParams(const GURL& request_url, |
| 308 const std::string& request_type, | 330 const std::string& request_type, |
| 309 const std::string& device_id) { | 331 const std::string& device_id) { |
| 310 const GURL service_url(kServiceUrl); | 332 const GURL service_url(kServiceUrl); |
| 311 EXPECT_EQ(service_url.scheme(), request_url.scheme()); | 333 EXPECT_EQ(service_url.scheme(), request_url.scheme()); |
| 312 EXPECT_EQ(service_url.host(), request_url.host()); | 334 EXPECT_EQ(service_url.host(), request_url.host()); |
| 313 EXPECT_EQ(service_url.port(), request_url.port()); | 335 EXPECT_EQ(service_url.port(), request_url.port()); |
| 314 EXPECT_EQ(service_url.path(), request_url.path()); | 336 EXPECT_EQ(service_url.path(), request_url.path()); |
| 315 | 337 |
| 316 QueryParams query_params(request_url.query()); | 338 QueryParams query_params(request_url.query()); |
| 317 EXPECT_TRUE(query_params.Check( | 339 EXPECT_TRUE(query_params.Check(dm_protocol::kParamRequest, request_type)); |
| 318 DeviceManagementBackendImpl::kParamRequest, request_type)); | 340 EXPECT_TRUE(query_params.Check(dm_protocol::kParamDeviceID, device_id)); |
| 319 EXPECT_TRUE(query_params.Check( | 341 EXPECT_TRUE(query_params.Check(dm_protocol::kParamDeviceType, |
| 320 DeviceManagementBackendImpl::kParamDeviceID, device_id)); | 342 dm_protocol::kValueDeviceType)); |
| 321 EXPECT_TRUE(query_params.Check( | 343 EXPECT_TRUE(query_params.Check(dm_protocol::kParamAppType, |
| 322 DeviceManagementBackendImpl::kParamDeviceType, | 344 dm_protocol::kValueAppType)); |
| 323 DeviceManagementBackendImpl::kValueDeviceType)); | |
| 324 EXPECT_TRUE(query_params.Check( | |
| 325 DeviceManagementBackendImpl::kParamAppType, | |
| 326 DeviceManagementBackendImpl::kValueAppType)); | |
| 327 EXPECT_TRUE(query_params.Check( | |
| 328 DeviceManagementBackendImpl::kParamAgent, | |
| 329 DeviceManagementBackendImpl::GetAgentString())); | |
| 330 } | 345 } |
| 331 }; | 346 }; |
| 332 | 347 |
| 333 MATCHER_P(MessageEquals, reference, "") { | 348 MATCHER_P(MessageEquals, reference, "") { |
| 334 std::string reference_data; | 349 std::string reference_data; |
| 335 std::string arg_data; | 350 std::string arg_data; |
| 336 return arg.SerializeToString(&arg_data) && | 351 return arg.SerializeToString(&arg_data) && |
| 337 reference.SerializeToString(&reference_data) && | 352 reference.SerializeToString(&reference_data) && |
| 338 arg_data == reference_data; | 353 arg_data == reference_data; |
| 339 } | 354 } |
| 340 | 355 |
| 341 TEST_F(DeviceManagementServiceTest, RegisterRequest) { | 356 TEST_F(DeviceManagementServiceTest, RegisterRequest) { |
| 342 DeviceRegisterResponseDelegateMock mock; | 357 em::DeviceManagementResponse expected_response; |
| 343 em::DeviceRegisterResponse expected_response; | 358 expected_response.mutable_register_response()-> |
| 344 expected_response.set_device_management_token(kDMToken); | 359 set_device_management_token(kDMToken); |
| 345 EXPECT_CALL(mock, HandleRegisterResponse(MessageEquals(expected_response))); | 360 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, |
| 346 em::DeviceRegisterRequest request; | 361 MessageEquals(expected_response))); |
| 347 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | 362 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 348 kDeviceId, request, &mock); | |
| 349 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 363 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 350 ASSERT_TRUE(fetcher); | 364 ASSERT_TRUE(fetcher); |
| 351 | 365 |
| 352 CheckURLAndQueryParams(fetcher->GetOriginalURL(), | 366 CheckURLAndQueryParams(fetcher->GetOriginalURL(), |
| 353 DeviceManagementBackendImpl::kValueRequestRegister, | 367 dm_protocol::kValueRequestRegister, |
| 354 kDeviceId); | 368 kClientID); |
| 355 | 369 |
| 356 em::DeviceManagementRequest expected_request_wrapper; | 370 std::string expected_data; |
| 357 expected_request_wrapper.mutable_register_request()->CopyFrom(request); | 371 ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data)); |
| 358 std::string expected_request_data; | 372 EXPECT_EQ(expected_data, fetcher->upload_data()); |
| 359 ASSERT_TRUE(expected_request_wrapper.SerializeToString( | |
| 360 &expected_request_data)); | |
| 361 EXPECT_EQ(expected_request_data, fetcher->upload_data()); | |
| 362 | 373 |
| 363 // Generate the response. | 374 // Generate the response. |
| 364 std::string response_data; | 375 std::string response_data; |
| 365 em::DeviceManagementResponse response_wrapper; | 376 ASSERT_TRUE(expected_response.SerializeToString(&response_data)); |
| 366 response_wrapper.mutable_register_response()->CopyFrom(expected_response); | |
| 367 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); | |
| 368 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); | 377 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); |
| 369 fetcher->set_url(GURL(kServiceUrl)); | 378 SendResponse(fetcher, status, 200, response_data); |
| 370 fetcher->set_status(status); | |
| 371 fetcher->set_response_code(200); | |
| 372 fetcher->SetResponseString(response_data); | |
| 373 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 374 } | 379 } |
| 375 | 380 |
| 376 TEST_F(DeviceManagementServiceTest, UnregisterRequest) { | 381 TEST_F(DeviceManagementServiceTest, UnregisterRequest) { |
| 377 DeviceUnregisterResponseDelegateMock mock; | 382 em::DeviceManagementResponse expected_response; |
| 378 em::DeviceUnregisterResponse expected_response; | 383 expected_response.mutable_unregister_response(); |
| 379 EXPECT_CALL(mock, HandleUnregisterResponse(MessageEquals(expected_response))); | 384 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, |
| 380 em::DeviceUnregisterRequest request; | 385 MessageEquals(expected_response))); |
| 381 backend_->ProcessUnregisterRequest(kDMToken, kDeviceId, request, &mock); | 386 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
| 382 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 387 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 383 ASSERT_TRUE(fetcher); | 388 ASSERT_TRUE(fetcher); |
| 384 | 389 |
| 385 // Check the data the fetcher received. | 390 // Check the data the fetcher received. |
| 386 const GURL& request_url(fetcher->GetOriginalURL()); | 391 const GURL& request_url(fetcher->GetOriginalURL()); |
| 387 const GURL service_url(kServiceUrl); | 392 const GURL service_url(kServiceUrl); |
| 388 EXPECT_EQ(service_url.scheme(), request_url.scheme()); | 393 EXPECT_EQ(service_url.scheme(), request_url.scheme()); |
| 389 EXPECT_EQ(service_url.host(), request_url.host()); | 394 EXPECT_EQ(service_url.host(), request_url.host()); |
| 390 EXPECT_EQ(service_url.port(), request_url.port()); | 395 EXPECT_EQ(service_url.port(), request_url.port()); |
| 391 EXPECT_EQ(service_url.path(), request_url.path()); | 396 EXPECT_EQ(service_url.path(), request_url.path()); |
| 392 | 397 |
| 393 CheckURLAndQueryParams(fetcher->GetOriginalURL(), | 398 CheckURLAndQueryParams(fetcher->GetOriginalURL(), |
| 394 DeviceManagementBackendImpl::kValueRequestUnregister, | 399 dm_protocol::kValueRequestUnregister, |
| 395 kDeviceId); | 400 kClientID); |
| 396 | 401 |
| 397 em::DeviceManagementRequest expected_request_wrapper; | 402 std::string expected_data; |
| 398 expected_request_wrapper.mutable_unregister_request()->CopyFrom(request); | 403 ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data)); |
| 399 std::string expected_request_data; | 404 EXPECT_EQ(expected_data, fetcher->upload_data()); |
| 400 ASSERT_TRUE(expected_request_wrapper.SerializeToString( | |
| 401 &expected_request_data)); | |
| 402 EXPECT_EQ(expected_request_data, fetcher->upload_data()); | |
| 403 | 405 |
| 404 // Generate the response. | 406 // Generate the response. |
| 405 std::string response_data; | 407 std::string response_data; |
| 406 em::DeviceManagementResponse response_wrapper; | 408 ASSERT_TRUE(expected_response.SerializeToString(&response_data)); |
| 407 response_wrapper.mutable_unregister_response()->CopyFrom(expected_response); | |
| 408 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); | |
| 409 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); | 409 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); |
| 410 fetcher->set_url(GURL(kServiceUrl)); | 410 SendResponse(fetcher, status, 200, response_data); |
| 411 fetcher->set_status(status); | |
| 412 fetcher->set_response_code(200); | |
| 413 fetcher->SetResponseString(response_data); | |
| 414 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 415 } | 411 } |
| 416 | 412 |
| 417 TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) { | 413 TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) { |
| 418 DeviceRegisterResponseDelegateMock mock; | 414 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 419 EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); | 415 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 420 em::DeviceRegisterRequest request; | |
| 421 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 422 kDeviceId, request, &mock); | |
| 423 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 416 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 424 ASSERT_TRUE(fetcher); | 417 ASSERT_TRUE(fetcher); |
| 425 | 418 |
| 426 // There shouldn't be any callbacks. | 419 // There shouldn't be any callbacks. |
| 427 backend_.reset(); | 420 request_job.reset(); |
| 428 } | 421 } |
| 429 | 422 |
| 430 TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) { | 423 TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) { |
| 431 DeviceUnregisterResponseDelegateMock mock; | 424 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 432 EXPECT_CALL(mock, HandleUnregisterResponse(_)).Times(0); | 425 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
| 433 em::DeviceUnregisterRequest request; | |
| 434 backend_->ProcessUnregisterRequest(kDMToken, kDeviceId, request, &mock); | |
| 435 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 426 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 436 ASSERT_TRUE(fetcher); | 427 ASSERT_TRUE(fetcher); |
| 437 | 428 |
| 438 // There shouldn't be any callbacks. | 429 // There shouldn't be any callbacks. |
| 439 backend_.reset(); | 430 request_job.reset(); |
| 440 } | 431 } |
| 441 | 432 |
| 442 TEST_F(DeviceManagementServiceTest, CancelPolicyRequest) { | 433 TEST_F(DeviceManagementServiceTest, CancelPolicyRequest) { |
| 443 DevicePolicyResponseDelegateMock mock; | 434 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 444 EXPECT_CALL(mock, HandlePolicyResponse(_)).Times(0); | 435 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
| 445 em::DevicePolicyRequest request; | |
| 446 request.set_policy_scope(kChromePolicyScope); | |
| 447 em::DevicePolicySettingRequest* setting_request = | |
| 448 request.add_setting_request(); | |
| 449 setting_request->set_key(kChromeDevicePolicySettingKey); | |
| 450 setting_request->set_watermark("stale"); | |
| 451 backend_->ProcessPolicyRequest(kDMToken, kDeviceId, | |
| 452 CloudPolicyDataStore::USER_AFFILIATION_NONE, | |
| 453 request, NULL, &mock); | |
| 454 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 436 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 455 ASSERT_TRUE(fetcher); | 437 ASSERT_TRUE(fetcher); |
| 456 | 438 |
| 457 // There shouldn't be any callbacks. | 439 // There shouldn't be any callbacks. |
| 458 backend_.reset(); | 440 request_job.reset(); |
| 459 } | 441 } |
| 460 | 442 |
| 461 TEST_F(DeviceManagementServiceTest, JobQueueing) { | 443 TEST_F(DeviceManagementServiceTest, JobQueueing) { |
| 462 // Start with a non-initialized service. | 444 // Start with a non-initialized service. |
| 463 ResetService(); | 445 ResetService(); |
| 464 | 446 |
| 447 em::DeviceManagementResponse expected_response; | |
| 448 expected_response.mutable_register_response()-> | |
| 449 set_device_management_token(kDMToken); | |
| 450 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, | |
| 451 MessageEquals(expected_response))); | |
| 452 | |
| 465 // Make a request. We should not see any fetchers being created. | 453 // Make a request. We should not see any fetchers being created. |
| 466 DeviceRegisterResponseDelegateMock mock; | 454 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 467 em::DeviceRegisterResponse expected_response; | |
| 468 expected_response.set_device_management_token(kDMToken); | |
| 469 EXPECT_CALL(mock, HandleRegisterResponse(MessageEquals(expected_response))); | |
| 470 em::DeviceRegisterRequest request; | |
| 471 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 472 kDeviceId, request, &mock); | |
| 473 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 455 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 474 ASSERT_FALSE(fetcher); | 456 ASSERT_FALSE(fetcher); |
| 475 | 457 |
| 476 // Now initialize the service. That should start the job. | 458 // Now initialize the service. That should start the job. |
| 477 InitializeService(); | 459 InitializeService(); |
| 478 fetcher = factory_.GetFetcherByID(0); | 460 fetcher = factory_.GetFetcherByID(0); |
| 479 ASSERT_TRUE(fetcher); | 461 ASSERT_TRUE(fetcher); |
| 480 factory_.RemoveFetcherFromMap(0); | 462 factory_.RemoveFetcherFromMap(0); |
| 481 | 463 |
| 482 // Check that the request is processed as expected. | 464 // Check that the request is processed as expected. |
| 483 std::string response_data; | 465 std::string response_data; |
| 484 em::DeviceManagementResponse response_wrapper; | 466 ASSERT_TRUE(expected_response.SerializeToString(&response_data)); |
| 485 response_wrapper.mutable_register_response()->CopyFrom(expected_response); | |
| 486 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); | |
| 487 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); | 467 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); |
| 488 fetcher->set_url(GURL(kServiceUrl)); | 468 SendResponse(fetcher, status, 200, response_data); |
| 489 fetcher->set_status(status); | |
| 490 fetcher->set_response_code(200); | |
| 491 fetcher->SetResponseString(response_data); | |
| 492 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 493 } | 469 } |
| 494 | 470 |
| 495 TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) { | 471 TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) { |
| 496 DevicePolicyResponseDelegateMock mock; | 472 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 497 EXPECT_CALL(mock, HandlePolicyResponse(_)).Times(0); | 473 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
| 498 em::DevicePolicyRequest request; | |
| 499 request.set_policy_scope(kChromePolicyScope); | |
| 500 em::DevicePolicySettingRequest* setting_request = | |
| 501 request.add_setting_request(); | |
| 502 setting_request->set_key(kChromeDevicePolicySettingKey); | |
| 503 setting_request->set_watermark("stale"); | |
| 504 backend_->ProcessPolicyRequest(kDMToken, kDeviceId, | |
| 505 CloudPolicyDataStore::USER_AFFILIATION_NONE, | |
| 506 request, NULL, &mock); | |
| 507 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 474 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 508 ASSERT_TRUE(fetcher); | 475 ASSERT_TRUE(fetcher); |
| 509 | 476 |
| 510 // Shutdown the service and cancel the job afterwards. | 477 // Shutdown the service and cancel the job afterwards. |
| 511 service_->Shutdown(); | 478 service_->Shutdown(); |
| 512 backend_.reset(); | 479 request_job.reset(); |
| 480 } | |
| 481 | |
| 482 ACTION_P(ResetPointer, pointer) { | |
| 483 pointer->reset(); | |
| 513 } | 484 } |
| 514 | 485 |
| 515 TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { | 486 TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { |
| 516 // Make a request. | 487 // Make a request. |
| 517 DeviceRegisterResponseDelegateMock mock; | 488 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 518 EXPECT_CALL(mock, OnError(_)) | |
| 519 .WillOnce(InvokeWithoutArgs(this, | |
| 520 &DeviceManagementServiceTest::ResetBackend)) | |
| 521 .RetiresOnSaturation(); | |
| 522 em::DeviceRegisterRequest request; | |
| 523 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 524 kDeviceId, request, &mock); | |
| 525 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 489 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 526 ASSERT_TRUE(fetcher); | 490 ASSERT_TRUE(fetcher); |
| 527 | 491 |
| 492 EXPECT_CALL(*this, OnJobDone(_, _)) | |
| 493 .WillOnce(ResetPointer(&request_job)); | |
| 494 | |
| 528 // Generate a callback. | 495 // Generate a callback. |
| 529 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); | 496 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); |
| 530 fetcher->set_url(GURL(kServiceUrl)); | 497 SendResponse(fetcher, status, 500, ""); |
| 531 fetcher->set_status(status); | |
| 532 fetcher->set_response_code(500); | |
| 533 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 534 | 498 |
| 535 // Backend should have been reset. | 499 // Job should have been reset. |
| 536 EXPECT_FALSE(backend_.get()); | 500 EXPECT_FALSE(request_job.get()); |
| 537 } | 501 } |
| 538 | 502 |
| 539 TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { | 503 TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
| 540 // Make a request. | 504 // Make a request. |
| 541 DeviceRegisterResponseDelegateMock mock; | 505 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 542 EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); | |
| 543 EXPECT_CALL(mock, OnError(_)).Times(0); | |
| 544 | 506 |
| 545 em::DeviceRegisterRequest request; | 507 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 546 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 547 kDeviceId, request, &mock); | |
| 548 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 508 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 549 ASSERT_TRUE(fetcher); | 509 ASSERT_TRUE(fetcher); |
| 550 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); | 510 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); |
| 551 const GURL original_url(fetcher->GetOriginalURL()); | 511 const GURL original_url(fetcher->GetOriginalURL()); |
| 552 const std::string upload_data(fetcher->upload_data()); | 512 const std::string upload_data(fetcher->upload_data()); |
| 553 | 513 |
| 554 // Generate a callback with a proxy failure. | 514 // Generate a callback with a proxy failure. |
| 555 net::URLRequestStatus status(net::URLRequestStatus::FAILED, | 515 net::URLRequestStatus status(net::URLRequestStatus::FAILED, |
| 556 net::ERR_PROXY_CONNECTION_FAILED); | 516 net::ERR_PROXY_CONNECTION_FAILED); |
| 557 fetcher->set_url(GURL(kServiceUrl)); | 517 SendResponse(fetcher, status, 200, ""); |
| 558 fetcher->set_status(status); | |
| 559 fetcher->set_response_code(200); | |
| 560 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 561 | 518 |
| 562 // Verify that a new URLFetcher was started that bypasses the proxy. | 519 // Verify that a new URLFetcher was started that bypasses the proxy. |
| 563 fetcher = factory_.GetFetcherByID(0); | 520 fetcher = factory_.GetFetcherByID(0); |
| 564 ASSERT_TRUE(fetcher); | 521 ASSERT_TRUE(fetcher); |
| 565 EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY); | 522 EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY); |
| 566 EXPECT_EQ(original_url, fetcher->GetOriginalURL()); | 523 EXPECT_EQ(original_url, fetcher->GetOriginalURL()); |
| 567 EXPECT_EQ(upload_data, fetcher->upload_data()); | 524 EXPECT_EQ(upload_data, fetcher->upload_data()); |
| 568 } | 525 } |
| 569 | 526 |
| 570 TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { | 527 TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { |
| 571 // Make a request. | 528 // Make a request. |
| 572 DeviceRegisterResponseDelegateMock mock; | 529 EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
| 573 EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); | |
| 574 EXPECT_CALL(mock, OnError(_)).Times(0); | |
| 575 | 530 |
| 576 em::DeviceRegisterRequest request; | 531 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
| 577 backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, | |
| 578 kDeviceId, request, &mock); | |
| 579 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); | 532 TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| 580 ASSERT_TRUE(fetcher); | 533 ASSERT_TRUE(fetcher); |
| 581 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); | 534 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); |
| 582 const GURL original_url(fetcher->GetOriginalURL()); | 535 const GURL original_url(fetcher->GetOriginalURL()); |
| 583 const std::string upload_data(fetcher->upload_data()); | 536 const std::string upload_data(fetcher->upload_data()); |
| 584 fetcher->set_was_fetched_via_proxy(true); | 537 fetcher->set_was_fetched_via_proxy(true); |
| 585 scoped_refptr<net::HttpResponseHeaders> headers; | 538 scoped_refptr<net::HttpResponseHeaders> headers; |
| 586 headers = new net::HttpResponseHeaders( | 539 headers = new net::HttpResponseHeaders( |
| 587 "HTTP/1.1 200 OK\0Content-type: bad/type\0\0"); | 540 "HTTP/1.1 200 OK\0Content-type: bad/type\0\0"); |
| 588 fetcher->set_response_headers(headers); | 541 fetcher->set_response_headers(headers); |
| 589 | 542 |
| 590 // Generate a callback with a valid http response, that was generated by | 543 // Generate a callback with a valid http response, that was generated by |
| 591 // a bad/wrong proxy. | 544 // a bad/wrong proxy. |
| 592 net::URLRequestStatus status; | 545 net::URLRequestStatus status; |
| 593 fetcher->set_url(GURL(kServiceUrl)); | 546 SendResponse(fetcher, status, 200, ""); |
| 594 fetcher->set_status(status); | |
| 595 fetcher->set_response_code(200); | |
| 596 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 597 | 547 |
| 598 // Verify that a new URLFetcher was started that bypasses the proxy. | 548 // Verify that a new URLFetcher was started that bypasses the proxy. |
| 599 fetcher = factory_.GetFetcherByID(0); | 549 fetcher = factory_.GetFetcherByID(0); |
| 600 ASSERT_TRUE(fetcher); | 550 ASSERT_TRUE(fetcher); |
| 601 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) != 0); | 551 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) != 0); |
| 602 EXPECT_EQ(original_url, fetcher->GetOriginalURL()); | 552 EXPECT_EQ(original_url, fetcher->GetOriginalURL()); |
| 603 EXPECT_EQ(upload_data, fetcher->upload_data()); | 553 EXPECT_EQ(upload_data, fetcher->upload_data()); |
| 604 } | 554 } |
| 605 | 555 |
| 606 } // namespace policy | 556 } // namespace policy |
| OLD | NEW |