Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: chrome/browser/policy/cloud/device_management_service_unittest.cc

Issue 109743002: Move policy code into components/policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moar fixes Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 <ostream>
6 #include <vector>
7
8 #include "base/bind.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/message_loop/message_loop_proxy.h"
11 #include "base/run_loop.h"
12 #include "base/strings/string_split.h"
13 #include "chrome/browser/policy/cloud/cloud_policy_constants.h"
14 #include "chrome/browser/policy/cloud/device_management_service.h"
15 #include "chrome/browser/policy/cloud/mock_device_management_service.h"
16 #include "net/base/escape.h"
17 #include "net/base/load_flags.h"
18 #include "net/base/net_errors.h"
19 #include "net/http/http_response_headers.h"
20 #include "net/url_request/test_url_fetcher_factory.h"
21 #include "net/url_request/url_request_status.h"
22 #include "net/url_request/url_request_test_util.h"
23 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25
26 using testing::Mock;
27 using testing::_;
28
29 namespace em = enterprise_management;
30
31 namespace policy {
32
33 const char kServiceUrl[] = "https://example.com/management_service";
34
35 // Encoded empty response messages for testing the error code paths.
36 const char kResponseEmpty[] = "\x08\x00";
37
38 #define PROTO_STRING(name) (std::string(name, arraysize(name) - 1))
39
40 // Some helper constants.
41 const char kGaiaAuthToken[] = "gaia-auth-token";
42 const char kOAuthToken[] = "oauth-token";
43 const char kDMToken[] = "device-management-token";
44 const char kClientID[] = "device-id";
45 const char kRobotAuthCode[] = "robot-oauth-auth-code";
46
47 // Unit tests for the device management policy service. The tests are run
48 // against a TestURLFetcherFactory that is used to short-circuit the request
49 // without calling into the actual network stack.
50 class DeviceManagementServiceTestBase : public testing::Test {
51 protected:
52 DeviceManagementServiceTestBase() {
53 request_context_ =
54 new net::TestURLRequestContextGetter(loop_.message_loop_proxy());
55 ResetService();
56 InitializeService();
57 }
58
59 ~DeviceManagementServiceTestBase() {
60 service_.reset();
61 base::RunLoop().RunUntilIdle();
62 }
63
64 void ResetService() {
65 scoped_ptr<DeviceManagementService::Configuration> configuration(
66 new MockDeviceManagementServiceConfiguration(kServiceUrl));
67 service_.reset(new DeviceManagementService(configuration.Pass()));
68 }
69
70 void InitializeService() {
71 service_->ScheduleInitialization(0);
72 base::RunLoop().RunUntilIdle();
73 }
74
75 net::TestURLFetcher* GetFetcher() {
76 return factory_.GetFetcherByID(DeviceManagementService::kURLFetcherID);
77 }
78
79 DeviceManagementRequestJob* StartRegistrationJob() {
80 DeviceManagementRequestJob* job =
81 service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
82 request_context_);
83 job->SetGaiaToken(kGaiaAuthToken);
84 job->SetOAuthToken(kOAuthToken);
85 job->SetClientID(kClientID);
86 job->GetRequest()->mutable_register_request();
87 job->SetRetryCallback(base::Bind(
88 &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this)));
89 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone,
90 base::Unretained(this)));
91 return job;
92 }
93
94 DeviceManagementRequestJob* StartApiAuthCodeFetchJob() {
95 DeviceManagementRequestJob* job = service_->CreateJob(
96 DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
97 request_context_);
98 job->SetGaiaToken(kGaiaAuthToken);
99 job->SetOAuthToken(kOAuthToken);
100 job->SetClientID(kClientID);
101 job->GetRequest()->mutable_service_api_access_request();
102 job->SetRetryCallback(base::Bind(
103 &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this)));
104 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone,
105 base::Unretained(this)));
106 return job;
107 }
108
109 DeviceManagementRequestJob* StartUnregistrationJob() {
110 DeviceManagementRequestJob* job =
111 service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
112 request_context_);
113 job->SetDMToken(kDMToken);
114 job->SetClientID(kClientID);
115 job->GetRequest()->mutable_unregister_request();
116 job->SetRetryCallback(base::Bind(
117 &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this)));
118 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone,
119 base::Unretained(this)));
120 return job;
121 }
122
123 DeviceManagementRequestJob* StartPolicyFetchJob() {
124 DeviceManagementRequestJob* job =
125 service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
126 request_context_);
127 job->SetGaiaToken(kGaiaAuthToken);
128 job->SetOAuthToken(kOAuthToken);
129 job->SetClientID(kClientID);
130 em::PolicyFetchRequest* fetch_request =
131 job->GetRequest()->mutable_policy_request()->add_request();
132 fetch_request->set_policy_type(dm_protocol::kChromeUserPolicyType);
133 job->SetRetryCallback(base::Bind(
134 &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this)));
135 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone,
136 base::Unretained(this)));
137 return job;
138 }
139
140 DeviceManagementRequestJob* StartAutoEnrollmentJob() {
141 DeviceManagementRequestJob* job =
142 service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT,
143 request_context_);
144 job->SetClientID(kClientID);
145 em::DeviceAutoEnrollmentRequest* request =
146 job->GetRequest()->mutable_auto_enrollment_request();
147 request->set_modulus(1);
148 request->set_remainder(0);
149 job->SetRetryCallback(base::Bind(
150 &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this)));
151 job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone,
152 base::Unretained(this)));
153 return job;
154 }
155
156 void SendResponse(net::TestURLFetcher* fetcher,
157 const net::URLRequestStatus request_status,
158 int http_status,
159 const std::string& response) {
160 fetcher->set_url(GURL(kServiceUrl));
161 fetcher->set_status(request_status);
162 fetcher->set_response_code(http_status);
163 fetcher->SetResponseString(response);
164 fetcher->delegate()->OnURLFetchComplete(fetcher);
165 }
166
167 MOCK_METHOD3(OnJobDone, void(DeviceManagementStatus, int,
168 const em::DeviceManagementResponse&));
169
170 MOCK_METHOD1(OnJobRetry, void(DeviceManagementRequestJob*));
171
172 base::MessageLoop loop_;
173 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
174 net::TestURLFetcherFactory factory_;
175 scoped_ptr<DeviceManagementService> service_;
176 };
177
178 struct FailedRequestParams {
179 FailedRequestParams(DeviceManagementStatus expected_status,
180 net::URLRequestStatus::Status request_status,
181 int http_status,
182 const std::string& response)
183 : expected_status_(expected_status),
184 request_status_(request_status, 0),
185 http_status_(http_status),
186 response_(response) {}
187
188 DeviceManagementStatus expected_status_;
189 net::URLRequestStatus request_status_;
190 int http_status_;
191 std::string response_;
192 };
193
194 void PrintTo(const FailedRequestParams& params, std::ostream* os) {
195 *os << "FailedRequestParams " << params.expected_status_
196 << " " << params.request_status_.status()
197 << " " << params.http_status_;
198 }
199
200 // A parameterized test case for erroneous response situations, they're mostly
201 // the same for all kinds of requests.
202 class DeviceManagementServiceFailedRequestTest
203 : public DeviceManagementServiceTestBase,
204 public testing::WithParamInterface<FailedRequestParams> {
205 };
206
207 TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) {
208 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
209 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
210 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
211 net::TestURLFetcher* fetcher = GetFetcher();
212 ASSERT_TRUE(fetcher);
213
214 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_,
215 GetParam().response_);
216 }
217
218 TEST_P(DeviceManagementServiceFailedRequestTest, ApiAuthCodeFetchRequest) {
219 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
220 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
221 scoped_ptr<DeviceManagementRequestJob> request_job(
222 StartApiAuthCodeFetchJob());
223 net::TestURLFetcher* fetcher = GetFetcher();
224 ASSERT_TRUE(fetcher);
225
226 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_,
227 GetParam().response_);
228 }
229
230 TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) {
231 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
232 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
233 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob());
234 net::TestURLFetcher* fetcher = GetFetcher();
235 ASSERT_TRUE(fetcher);
236
237 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_,
238 GetParam().response_);
239 }
240
241 TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) {
242 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
243 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
244 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob());
245 net::TestURLFetcher* fetcher = GetFetcher();
246 ASSERT_TRUE(fetcher);
247
248 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_,
249 GetParam().response_);
250 }
251
252 TEST_P(DeviceManagementServiceFailedRequestTest, AutoEnrollmentRequest) {
253 EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
254 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
255 scoped_ptr<DeviceManagementRequestJob> request_job(StartAutoEnrollmentJob());
256 net::TestURLFetcher* fetcher = GetFetcher();
257 ASSERT_TRUE(fetcher);
258
259 SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_,
260 GetParam().response_);
261 }
262
263 INSTANTIATE_TEST_CASE_P(
264 DeviceManagementServiceFailedRequestTestInstance,
265 DeviceManagementServiceFailedRequestTest,
266 testing::Values(
267 FailedRequestParams(
268 DM_STATUS_REQUEST_FAILED,
269 net::URLRequestStatus::FAILED,
270 200,
271 PROTO_STRING(kResponseEmpty)),
272 FailedRequestParams(
273 DM_STATUS_HTTP_STATUS_ERROR,
274 net::URLRequestStatus::SUCCESS,
275 666,
276 PROTO_STRING(kResponseEmpty)),
277 FailedRequestParams(
278 DM_STATUS_RESPONSE_DECODING_ERROR,
279 net::URLRequestStatus::SUCCESS,
280 200,
281 PROTO_STRING("Not a protobuf.")),
282 FailedRequestParams(
283 DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED,
284 net::URLRequestStatus::SUCCESS,
285 403,
286 PROTO_STRING(kResponseEmpty)),
287 FailedRequestParams(
288 DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER,
289 net::URLRequestStatus::SUCCESS,
290 405,
291 PROTO_STRING(kResponseEmpty)),
292 FailedRequestParams(
293 DM_STATUS_SERVICE_DEVICE_ID_CONFLICT,
294 net::URLRequestStatus::SUCCESS,
295 409,
296 PROTO_STRING(kResponseEmpty)),
297 FailedRequestParams(
298 DM_STATUS_SERVICE_DEVICE_NOT_FOUND,
299 net::URLRequestStatus::SUCCESS,
300 410,
301 PROTO_STRING(kResponseEmpty)),
302 FailedRequestParams(
303 DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID,
304 net::URLRequestStatus::SUCCESS,
305 401,
306 PROTO_STRING(kResponseEmpty)),
307 FailedRequestParams(
308 DM_STATUS_REQUEST_INVALID,
309 net::URLRequestStatus::SUCCESS,
310 400,
311 PROTO_STRING(kResponseEmpty)),
312 FailedRequestParams(
313 DM_STATUS_TEMPORARY_UNAVAILABLE,
314 net::URLRequestStatus::SUCCESS,
315 404,
316 PROTO_STRING(kResponseEmpty)),
317 FailedRequestParams(
318 DM_STATUS_SERVICE_ACTIVATION_PENDING,
319 net::URLRequestStatus::SUCCESS,
320 412,
321 PROTO_STRING(kResponseEmpty)),
322 FailedRequestParams(
323 DM_STATUS_SERVICE_MISSING_LICENSES,
324 net::URLRequestStatus::SUCCESS,
325 402,
326 PROTO_STRING(kResponseEmpty))));
327
328 // Simple query parameter parser for testing.
329 class QueryParams {
330 public:
331 explicit QueryParams(const std::string& query) {
332 base::SplitStringIntoKeyValuePairs(query, '=', '&', &params_);
333 }
334
335 bool Check(const std::string& name, const std::string& expected_value) {
336 bool found = false;
337 for (ParamMap::const_iterator i(params_.begin()); i != params_.end(); ++i) {
338 std::string unescaped_name(net::UnescapeURLComponent(
339 i->first,
340 net::UnescapeRule::NORMAL |
341 net::UnescapeRule::SPACES |
342 net::UnescapeRule::URL_SPECIAL_CHARS |
343 net::UnescapeRule::CONTROL_CHARS |
344 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE));
345 if (unescaped_name == name) {
346 if (found)
347 return false;
348 found = true;
349 std::string unescaped_value(net::UnescapeURLComponent(
350 i->second,
351 net::UnescapeRule::NORMAL |
352 net::UnescapeRule::SPACES |
353 net::UnescapeRule::URL_SPECIAL_CHARS |
354 net::UnescapeRule::CONTROL_CHARS |
355 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE));
356 if (unescaped_value != expected_value)
357 return false;
358 }
359 }
360 return found;
361 }
362
363 private:
364 typedef std::vector<std::pair<std::string, std::string> > ParamMap;
365 ParamMap params_;
366 };
367
368 class DeviceManagementServiceTest
369 : public DeviceManagementServiceTestBase {
370 protected:
371 void CheckURLAndQueryParams(const GURL& request_url,
372 const std::string& request_type,
373 const std::string& device_id) {
374 const GURL service_url(kServiceUrl);
375 EXPECT_EQ(service_url.scheme(), request_url.scheme());
376 EXPECT_EQ(service_url.host(), request_url.host());
377 EXPECT_EQ(service_url.port(), request_url.port());
378 EXPECT_EQ(service_url.path(), request_url.path());
379
380 QueryParams query_params(request_url.query());
381 EXPECT_TRUE(query_params.Check(dm_protocol::kParamRequest, request_type));
382 EXPECT_TRUE(query_params.Check(dm_protocol::kParamDeviceID, device_id));
383 EXPECT_TRUE(query_params.Check(dm_protocol::kParamDeviceType,
384 dm_protocol::kValueDeviceType));
385 EXPECT_TRUE(query_params.Check(dm_protocol::kParamAppType,
386 dm_protocol::kValueAppType));
387 }
388 };
389
390 MATCHER_P(MessageEquals, reference, "") {
391 std::string reference_data;
392 std::string arg_data;
393 return arg.SerializeToString(&arg_data) &&
394 reference.SerializeToString(&reference_data) &&
395 arg_data == reference_data;
396 }
397
398 TEST_F(DeviceManagementServiceTest, RegisterRequest) {
399 em::DeviceManagementResponse expected_response;
400 expected_response.mutable_register_response()->
401 set_device_management_token(kDMToken);
402 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _,
403 MessageEquals(expected_response)));
404 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
405 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
406 net::TestURLFetcher* fetcher = GetFetcher();
407 ASSERT_TRUE(fetcher);
408
409 CheckURLAndQueryParams(fetcher->GetOriginalURL(),
410 dm_protocol::kValueRequestRegister,
411 kClientID);
412
413 std::string expected_data;
414 ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
415 EXPECT_EQ(expected_data, fetcher->upload_data());
416
417 // Generate the response.
418 std::string response_data;
419 ASSERT_TRUE(expected_response.SerializeToString(&response_data));
420 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
421 SendResponse(fetcher, status, 200, response_data);
422 }
423
424 TEST_F(DeviceManagementServiceTest, ApiAuthCodeFetchRequest) {
425 em::DeviceManagementResponse expected_response;
426 expected_response.mutable_service_api_access_response()->set_auth_code(
427 kRobotAuthCode);
428 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _,
429 MessageEquals(expected_response)));
430 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
431 scoped_ptr<DeviceManagementRequestJob> request_job(
432 StartApiAuthCodeFetchJob());
433 net::TestURLFetcher* fetcher = GetFetcher();
434 ASSERT_TRUE(fetcher);
435
436 CheckURLAndQueryParams(fetcher->GetOriginalURL(),
437 dm_protocol::kValueRequestApiAuthorization,
438 kClientID);
439
440 std::string expected_data;
441 ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
442 EXPECT_EQ(expected_data, fetcher->upload_data());
443
444 // Generate the response.
445 std::string response_data;
446 ASSERT_TRUE(expected_response.SerializeToString(&response_data));
447 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
448 SendResponse(fetcher, status, 200, response_data);
449 }
450
451 TEST_F(DeviceManagementServiceTest, UnregisterRequest) {
452 em::DeviceManagementResponse expected_response;
453 expected_response.mutable_unregister_response();
454 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _,
455 MessageEquals(expected_response)));
456 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
457 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob());
458 net::TestURLFetcher* fetcher = GetFetcher();
459 ASSERT_TRUE(fetcher);
460
461 // Check the data the fetcher received.
462 const GURL& request_url(fetcher->GetOriginalURL());
463 const GURL service_url(kServiceUrl);
464 EXPECT_EQ(service_url.scheme(), request_url.scheme());
465 EXPECT_EQ(service_url.host(), request_url.host());
466 EXPECT_EQ(service_url.port(), request_url.port());
467 EXPECT_EQ(service_url.path(), request_url.path());
468
469 CheckURLAndQueryParams(fetcher->GetOriginalURL(),
470 dm_protocol::kValueRequestUnregister,
471 kClientID);
472
473 std::string expected_data;
474 ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
475 EXPECT_EQ(expected_data, fetcher->upload_data());
476
477 // Generate the response.
478 std::string response_data;
479 ASSERT_TRUE(expected_response.SerializeToString(&response_data));
480 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
481 SendResponse(fetcher, status, 200, response_data);
482 }
483
484 TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) {
485 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
486 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
487 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
488 net::TestURLFetcher* fetcher = GetFetcher();
489 ASSERT_TRUE(fetcher);
490
491 // There shouldn't be any callbacks.
492 request_job.reset();
493 }
494
495 TEST_F(DeviceManagementServiceTest, CancelApiAuthCodeFetch) {
496 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
497 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
498 scoped_ptr<DeviceManagementRequestJob> request_job(
499 StartApiAuthCodeFetchJob());
500 net::TestURLFetcher* fetcher = GetFetcher();
501 ASSERT_TRUE(fetcher);
502
503 // There shouldn't be any callbacks.
504 request_job.reset();
505 }
506
507 TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) {
508 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
509 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
510 scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob());
511 net::TestURLFetcher* fetcher = GetFetcher();
512 ASSERT_TRUE(fetcher);
513
514 // There shouldn't be any callbacks.
515 request_job.reset();
516 }
517
518 TEST_F(DeviceManagementServiceTest, CancelPolicyRequest) {
519 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
520 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
521 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob());
522 net::TestURLFetcher* fetcher = GetFetcher();
523 ASSERT_TRUE(fetcher);
524
525 // There shouldn't be any callbacks.
526 request_job.reset();
527 }
528
529 TEST_F(DeviceManagementServiceTest, JobQueueing) {
530 // Start with a non-initialized service.
531 ResetService();
532
533 em::DeviceManagementResponse expected_response;
534 expected_response.mutable_register_response()->
535 set_device_management_token(kDMToken);
536 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _,
537 MessageEquals(expected_response)));
538 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
539
540 // Make a request. We should not see any fetchers being created.
541 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
542 net::TestURLFetcher* fetcher = GetFetcher();
543 ASSERT_FALSE(fetcher);
544
545 // Now initialize the service. That should start the job.
546 InitializeService();
547 fetcher = GetFetcher();
548 ASSERT_TRUE(fetcher);
549 factory_.RemoveFetcherFromMap(DeviceManagementService::kURLFetcherID);
550
551 // Check that the request is processed as expected.
552 std::string response_data;
553 ASSERT_TRUE(expected_response.SerializeToString(&response_data));
554 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
555 SendResponse(fetcher, status, 200, response_data);
556 }
557
558 TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) {
559 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
560 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
561 scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob());
562 net::TestURLFetcher* fetcher = GetFetcher();
563 ASSERT_TRUE(fetcher);
564
565 // Shutdown the service and cancel the job afterwards.
566 service_->Shutdown();
567 request_job.reset();
568 }
569
570 ACTION_P(ResetPointer, pointer) {
571 pointer->reset();
572 }
573
574 TEST_F(DeviceManagementServiceTest, CancelDuringCallback) {
575 // Make a request.
576 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
577 net::TestURLFetcher* fetcher = GetFetcher();
578 ASSERT_TRUE(fetcher);
579
580 EXPECT_CALL(*this, OnJobDone(_, _, _))
581 .WillOnce(ResetPointer(&request_job));
582 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
583
584 // Generate a callback.
585 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
586 SendResponse(fetcher, status, 500, std::string());
587
588 // Job should have been reset.
589 EXPECT_FALSE(request_job.get());
590 }
591
592 TEST_F(DeviceManagementServiceTest, RetryOnProxyError) {
593 // Make a request.
594 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
595 EXPECT_CALL(*this, OnJobRetry(_));
596
597 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
598 net::TestURLFetcher* fetcher = GetFetcher();
599 ASSERT_TRUE(fetcher);
600 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0);
601 const GURL original_url(fetcher->GetOriginalURL());
602 const std::string upload_data(fetcher->upload_data());
603
604 // Generate a callback with a proxy failure.
605 net::URLRequestStatus status(net::URLRequestStatus::FAILED,
606 net::ERR_PROXY_CONNECTION_FAILED);
607 SendResponse(fetcher, status, 200, std::string());
608
609 // Verify that a new URLFetcher was started that bypasses the proxy.
610 fetcher = GetFetcher();
611 ASSERT_TRUE(fetcher);
612 EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
613 EXPECT_EQ(original_url, fetcher->GetOriginalURL());
614 EXPECT_EQ(upload_data, fetcher->upload_data());
615 }
616
617 TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) {
618 // Make a request.
619 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
620 EXPECT_CALL(*this, OnJobRetry(_));
621
622 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
623 net::TestURLFetcher* fetcher = GetFetcher();
624 ASSERT_TRUE(fetcher);
625 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0);
626 const GURL original_url(fetcher->GetOriginalURL());
627 const std::string upload_data(fetcher->upload_data());
628 fetcher->set_was_fetched_via_proxy(true);
629 scoped_refptr<net::HttpResponseHeaders> headers;
630 headers = new net::HttpResponseHeaders(
631 "HTTP/1.1 200 OK\0Content-type: bad/type\0\0");
632 fetcher->set_response_headers(headers);
633
634 // Generate a callback with a valid http response, that was generated by
635 // a bad/wrong proxy.
636 net::URLRequestStatus status;
637 SendResponse(fetcher, status, 200, std::string());
638
639 // Verify that a new URLFetcher was started that bypasses the proxy.
640 fetcher = GetFetcher();
641 ASSERT_TRUE(fetcher);
642 EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) != 0);
643 EXPECT_EQ(original_url, fetcher->GetOriginalURL());
644 EXPECT_EQ(upload_data, fetcher->upload_data());
645 }
646
647 TEST_F(DeviceManagementServiceTest, RetryOnNetworkChanges) {
648 // Make a request.
649 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
650 EXPECT_CALL(*this, OnJobRetry(_));
651
652 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
653 net::TestURLFetcher* fetcher = GetFetcher();
654 ASSERT_TRUE(fetcher);
655 const GURL original_url(fetcher->GetOriginalURL());
656 const std::string original_upload_data(fetcher->upload_data());
657
658 // Make it fail with ERR_NETWORK_CHANGED.
659 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
660 net::ERR_NETWORK_CHANGED));
661 fetcher->set_url(GURL(kServiceUrl));
662 fetcher->delegate()->OnURLFetchComplete(fetcher);
663
664 // Verify that a new URLFetcher was started that retries this job, after
665 // having called OnJobRetry.
666 Mock::VerifyAndClearExpectations(this);
667 fetcher = GetFetcher();
668 ASSERT_TRUE(fetcher);
669 EXPECT_EQ(original_url, fetcher->GetOriginalURL());
670 EXPECT_EQ(original_upload_data, fetcher->upload_data());
671 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
672 }
673
674 TEST_F(DeviceManagementServiceTest, RetryLimit) {
675 scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob());
676
677 // Simulate 3 failed network requests.
678 for (int i = 0; i < 3; ++i) {
679 // Make the current fetcher fail with ERR_NETWORK_CHANGED.
680 net::TestURLFetcher* fetcher = GetFetcher();
681 ASSERT_TRUE(fetcher);
682 EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
683 EXPECT_CALL(*this, OnJobRetry(_));
684 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
685 net::ERR_NETWORK_CHANGED));
686 fetcher->set_url(GURL(kServiceUrl));
687 fetcher->delegate()->OnURLFetchComplete(fetcher);
688 Mock::VerifyAndClearExpectations(this);
689 }
690
691 // At the next failure the DeviceManagementService should give up retrying and
692 // pass the error code to the job's owner.
693 net::TestURLFetcher* fetcher = GetFetcher();
694 ASSERT_TRUE(fetcher);
695 EXPECT_CALL(*this, OnJobDone(DM_STATUS_REQUEST_FAILED, _, _));
696 EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
697 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
698 net::ERR_NETWORK_CHANGED));
699 fetcher->set_url(GURL(kServiceUrl));
700 fetcher->delegate()->OnURLFetchComplete(fetcher);
701 Mock::VerifyAndClearExpectations(this);
702 }
703
704 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/policy/cloud/device_management_service_browsertest.cc ('k') | chrome/browser/policy/cloud/enterprise_metrics.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698