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..23731d11dfe7a999dcaab40f502641ffdf1915f3 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" |
@@ -22,6 +25,8 @@ |
using testing::IgnoreResult; |
using testing::InvokeWithoutArgs; |
+using testing::Mock; |
+using testing::StrictMock; |
using testing::_; |
namespace policy { |
@@ -521,4 +526,77 @@ TEST_F(DeviceManagementServiceTest, CancelDuringCallback) { |
EXPECT_FALSE(backend_.get()); |
} |
+TEST_F(DeviceManagementServiceTest, RetryOnProxyError) { |
+ // Make a request. |
+ StrictMock<DeviceRegisterResponseDelegateMock> mock; |
+ |
+ 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) != 0); |
Mattias Nissler (ping if slow)
2011/09/28 09:06:18
you can drop the != 0
Joao da Silva
2011/09/28 19:20:27
Done.
|
+ EXPECT_EQ(original_url, fetcher->original_url()); |
+ EXPECT_EQ(upload_data, fetcher->upload_data()); |
+ |
+ // No calls should have been made to the mock. |
Mattias Nissler (ping if slow)
2011/09/28 09:06:18
Other code uses EXPECT_CALL().Times(0) instead of
Joao da Silva
2011/09/28 19:20:27
Done.
|
+ Mock::VerifyAndClearExpectations(&mock); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, RetryOnBadResponseFromProxy) { |
+ // Make a request. |
+ StrictMock<DeviceRegisterResponseDelegateMock> mock; |
+ |
+ 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()); |
+ |
+ // No calls should have been made to the mock. |
+ Mock::VerifyAndClearExpectations(&mock); |
+} |
+ |
} // namespace policy |