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 2d73098bb7029c152b507f06d90fb9a3c9743774..a09f46fd2b2f6a967239172b2cd0aea9ecef8a3e 100644 |
--- a/chrome/browser/policy/device_management_service_unittest.cc |
+++ b/chrome/browser/policy/device_management_service_unittest.cc |
@@ -15,6 +15,9 @@ |
#include "content/browser/browser_thread.h" |
#include "content/test/test_url_fetcher_factory.h" |
#include "net/base/escape.h" |
+#include "net/base/load_flags.h" |
+#include "net/base/net_errors.h" |
+#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request_status.h" |
#include "net/url_request/url_request_test_util.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -521,4 +524,75 @@ TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { |
EXPECT_FALSE(backend_.get()); |
} |
+TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
+ // Make a request. |
+ DeviceRegisterResponseDelegateMock mock; |
+ EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); |
+ EXPECT_CALL(mock, OnError(_)).Times(0); |
+ |
+ em::DeviceRegisterRequest request; |
+ backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, |
+ kDeviceId, request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_TRUE((fetcher->load_flags() & net::LOAD_BYPASS_PROXY) == 0); |
+ const GURL original_url(fetcher->original_url()); |
+ const std::string upload_data(fetcher->upload_data()); |
+ |
+ // Generate a callback with a proxy failure. |
+ net::URLRequestStatus status(net::URLRequestStatus::FAILED, |
+ net::ERR_PROXY_CONNECTION_FAILED); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher, |
+ GURL(kServiceUrl), |
+ status, |
+ 0, |
+ net::ResponseCookies(), |
+ ""); |
+ |
+ // Verify that a new URLFetcher was started that bypasses the proxy. |
+ fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_TRUE(fetcher->load_flags() & net::LOAD_BYPASS_PROXY); |
+ EXPECT_EQ(original_url, fetcher->original_url()); |
+ EXPECT_EQ(upload_data, fetcher->upload_data()); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { |
+ // Make a request. |
+ DeviceRegisterResponseDelegateMock mock; |
+ EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); |
+ EXPECT_CALL(mock, OnError(_)).Times(0); |
+ |
+ em::DeviceRegisterRequest request; |
+ backend_->ProcessRegisterRequest(kGaiaAuthToken, kOAuthToken, |
+ kDeviceId, request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_TRUE((fetcher->load_flags() & net::LOAD_BYPASS_PROXY) == 0); |
+ const GURL original_url(fetcher->original_url()); |
+ const std::string upload_data(fetcher->upload_data()); |
+ fetcher->set_was_fetched_via_proxy(true); |
+ scoped_refptr<net::HttpResponseHeaders> headers; |
+ headers = new net::HttpResponseHeaders( |
+ "HTTP/1.1 200 OK\0Content-type: bad/type\0\0"); |
+ fetcher->set_response_headers(headers); |
+ |
+ // Generate a callback with a valid http response, that was generated by |
+ // a bad/wrong proxy. |
+ net::URLRequestStatus status; |
+ fetcher->delegate()->OnURLFetchComplete(fetcher, |
+ GURL(kServiceUrl), |
+ status, |
+ 200, |
+ net::ResponseCookies(), |
+ ""); |
+ |
+ // Verify that a new URLFetcher was started that bypasses the proxy. |
+ fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ EXPECT_TRUE((fetcher->load_flags() & net::LOAD_BYPASS_PROXY) != 0); |
+ EXPECT_EQ(original_url, fetcher->original_url()); |
+ EXPECT_EQ(upload_data, fetcher->upload_data()); |
+} |
+ |
} // namespace policy |