Index: chrome/browser/policy/device_management_service_unittest.cc |
diff --git a/chrome/browser/policy/device_management_service_unittest.cc b/chrome/browser/policy/device_management_service_unittest.cc |
index b4447bbdbd274ae453425a34b29318ea660a0539..4a74cf32c0ad2f6b4eac535aaa39ff1e1630205b 100644 |
--- a/chrome/browser/policy/device_management_service_unittest.cc |
+++ b/chrome/browser/policy/device_management_service_unittest.cc |
@@ -23,6 +23,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
using content::BrowserThread; |
+using testing::Mock; |
using testing::_; |
namespace em = enterprise_management; |
@@ -68,6 +69,10 @@ class DeviceManagementServiceTestBase : public testing::Test { |
loop_.RunUntilIdle(); |
} |
+ net::TestURLFetcher* GetFetcher() { |
+ return factory_.GetFetcherByID(DeviceManagementService::kURLFetcherID); |
+ } |
+ |
DeviceManagementRequestJob* StartRegistrationJob() { |
DeviceManagementRequestJob* job = |
service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION); |
@@ -75,6 +80,8 @@ class DeviceManagementServiceTestBase : public testing::Test { |
job->SetOAuthToken(kOAuthToken); |
job->SetClientID(kClientID); |
job->GetRequest()->mutable_register_request(); |
+ job->SetRetryCallback(base::Bind( |
+ &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this))); |
job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, |
base::Unretained(this))); |
return job; |
@@ -86,6 +93,8 @@ class DeviceManagementServiceTestBase : public testing::Test { |
job->SetDMToken(kDMToken); |
job->SetClientID(kClientID); |
job->GetRequest()->mutable_unregister_request(); |
+ job->SetRetryCallback(base::Bind( |
+ &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this))); |
job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, |
base::Unretained(this))); |
return job; |
@@ -100,6 +109,8 @@ class DeviceManagementServiceTestBase : public testing::Test { |
em::PolicyFetchRequest* fetch_request = |
job->GetRequest()->mutable_policy_request()->add_request(); |
fetch_request->set_policy_type(dm_protocol::kChromeUserPolicyType); |
+ job->SetRetryCallback(base::Bind( |
+ &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this))); |
job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, |
base::Unretained(this))); |
return job; |
@@ -113,6 +124,8 @@ class DeviceManagementServiceTestBase : public testing::Test { |
job->GetRequest()->mutable_auto_enrollment_request(); |
request->set_modulus(1); |
request->set_remainder(0); |
+ job->SetRetryCallback(base::Bind( |
+ &DeviceManagementServiceTestBase::OnJobRetry, base::Unretained(this))); |
job->Start(base::Bind(&DeviceManagementServiceTestBase::OnJobDone, |
base::Unretained(this))); |
return job; |
@@ -132,6 +145,8 @@ class DeviceManagementServiceTestBase : public testing::Test { |
MOCK_METHOD2(OnJobDone, void(DeviceManagementStatus, |
const em::DeviceManagementResponse&)); |
+ MOCK_METHOD1(OnJobRetry, void(DeviceManagementRequestJob*)); |
+ |
net::TestURLFetcherFactory factory_; |
scoped_ptr<DeviceManagementService> service_; |
@@ -172,8 +187,9 @@ class DeviceManagementServiceFailedRequestTest |
TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) { |
EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
@@ -182,8 +198,9 @@ TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) { |
TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) { |
EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
@@ -192,8 +209,9 @@ TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) { |
TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) { |
EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
@@ -202,8 +220,9 @@ TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) { |
TEST_P(DeviceManagementServiceFailedRequestTest, AutoEnrollmentRequest) { |
EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartAutoEnrollmentJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
SendResponse(fetcher, GetParam().request_status_, GetParam().http_status_, |
@@ -351,8 +370,9 @@ TEST_F(DeviceManagementServiceTest, RegisterRequest) { |
set_device_management_token(kDMToken); |
EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, |
MessageEquals(expected_response))); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
CheckURLAndQueryParams(fetcher->GetOriginalURL(), |
@@ -375,8 +395,9 @@ TEST_F(DeviceManagementServiceTest, UnregisterRequest) { |
expected_response.mutable_unregister_response(); |
EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, |
MessageEquals(expected_response))); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
// Check the data the fetcher received. |
@@ -404,8 +425,9 @@ TEST_F(DeviceManagementServiceTest, UnregisterRequest) { |
TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) { |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
// There shouldn't be any callbacks. |
@@ -414,8 +436,9 @@ TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) { |
TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) { |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartUnregistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
// There shouldn't be any callbacks. |
@@ -424,8 +447,9 @@ TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) { |
TEST_F(DeviceManagementServiceTest, CancelPolicyRequest) { |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
// There shouldn't be any callbacks. |
@@ -441,17 +465,18 @@ TEST_F(DeviceManagementServiceTest, JobQueueing) { |
set_device_management_token(kDMToken); |
EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, |
MessageEquals(expected_response))); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
// Make a request. We should not see any fetchers being created. |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_FALSE(fetcher); |
// Now initialize the service. That should start the job. |
InitializeService(); |
- fetcher = factory_.GetFetcherByID(0); |
+ fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
- factory_.RemoveFetcherFromMap(0); |
+ factory_.RemoveFetcherFromMap(DeviceManagementService::kURLFetcherID); |
// Check that the request is processed as expected. |
std::string response_data; |
@@ -462,8 +487,9 @@ TEST_F(DeviceManagementServiceTest, JobQueueing) { |
TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) { |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartPolicyFetchJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
// Shutdown the service and cancel the job afterwards. |
@@ -478,11 +504,12 @@ ACTION_P(ResetPointer, pointer) { |
TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { |
// Make a request. |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
EXPECT_CALL(*this, OnJobDone(_, _)) |
.WillOnce(ResetPointer(&request_job)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
// Generate a callback. |
net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0); |
@@ -495,9 +522,10 @@ TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { |
TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
// Make a request. |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); |
const GURL original_url(fetcher->GetOriginalURL()); |
@@ -509,7 +537,7 @@ TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
SendResponse(fetcher, status, 200, ""); |
// Verify that a new URLFetcher was started that bypasses the proxy. |
- fetcher = factory_.GetFetcherByID(0); |
+ fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY); |
EXPECT_EQ(original_url, fetcher->GetOriginalURL()); |
@@ -519,9 +547,10 @@ TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { |
// Make a request. |
EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)); |
scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
- net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) == 0); |
const GURL original_url(fetcher->GetOriginalURL()); |
@@ -538,11 +567,68 @@ TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { |
SendResponse(fetcher, status, 200, ""); |
// Verify that a new URLFetcher was started that bypasses the proxy. |
- fetcher = factory_.GetFetcherByID(0); |
+ fetcher = GetFetcher(); |
ASSERT_TRUE(fetcher); |
EXPECT_TRUE((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) != 0); |
EXPECT_EQ(original_url, fetcher->GetOriginalURL()); |
EXPECT_EQ(upload_data, fetcher->upload_data()); |
} |
+TEST_F(DeviceManagementServiceTest, RetryOnNetworkChanges) { |
+ // Make a request. |
+ EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)); |
+ |
+ scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
+ ASSERT_TRUE(fetcher); |
+ const GURL original_url(fetcher->GetOriginalURL()); |
+ const std::string original_upload_data(fetcher->upload_data()); |
+ |
+ // Make it fail with ERR_NETWORK_CHANGED. |
+ fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
+ net::ERR_NETWORK_CHANGED)); |
+ fetcher->set_url(GURL(kServiceUrl)); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ |
+ // Verify that a new URLFetcher was started that retries this job, after |
+ // having called OnJobRetry. |
+ Mock::VerifyAndClearExpectations(this); |
+ fetcher = GetFetcher(); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_EQ(original_url, fetcher->GetOriginalURL()); |
+ EXPECT_EQ(original_upload_data, fetcher->upload_data()); |
+ EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, RetryLimit) { |
+ scoped_ptr<DeviceManagementRequestJob> request_job(StartRegistrationJob()); |
+ |
+ // Simulate 3 failed network requests. |
+ for (int i = 0; i < 3; ++i) { |
+ // Make the current fetcher fail with ERR_NETWORK_CHANGED. |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_CALL(*this, OnJobDone(_, _)).Times(0); |
+ EXPECT_CALL(*this, OnJobRetry(_)); |
+ fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
+ net::ERR_NETWORK_CHANGED)); |
+ fetcher->set_url(GURL(kServiceUrl)); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ Mock::VerifyAndClearExpectations(this); |
+ } |
+ |
+ // At the next failure the DeviceManagementService should give up retrying and |
+ // pass the error code to the job's owner. |
+ net::TestURLFetcher* fetcher = GetFetcher(); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_CALL(*this, OnJobDone(DM_STATUS_REQUEST_FAILED, _)); |
+ EXPECT_CALL(*this, OnJobRetry(_)).Times(0); |
+ fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
+ net::ERR_NETWORK_CHANGED)); |
+ fetcher->set_url(GURL(kServiceUrl)); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ Mock::VerifyAndClearExpectations(this); |
+} |
+ |
} // namespace policy |