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