Index: net/http/http_auth_handler_mock.cc |
diff --git a/net/http/http_auth_handler_mock.cc b/net/http/http_auth_handler_mock.cc |
index c35bde579cc939d2c11e9fad6b20bbbb04d00b51..f43e0d383309fd711897f3d264b747095d85eeac 100644 |
--- a/net/http/http_auth_handler_mock.cc |
+++ b/net/http/http_auth_handler_mock.cc |
@@ -5,6 +5,7 @@ |
#include "net/http/http_auth_handler_mock.h" |
#include "base/bind.h" |
+#include "base/callback_helpers.h" |
#include "base/location.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/string_util.h" |
@@ -21,6 +22,11 @@ HttpAuthHandlerMock::HttpAuthHandlerMock() |
HttpAuthHandlerMock::~HttpAuthHandlerMock() {} |
+void HttpAuthHandlerMock::SetInitExpectation(bool async, int rv) { |
+ init_async_ = async; |
+ init_rv_ = rv; |
+} |
+ |
void HttpAuthHandlerMock::SetGenerateExpectation(bool async, int rv) { |
generate_async_ = async; |
generate_rv_ = rv; |
@@ -28,42 +34,104 @@ void HttpAuthHandlerMock::SetGenerateExpectation(bool async, int rv) { |
HttpAuth::AuthorizationResult HttpAuthHandlerMock::HandleAnotherChallenge( |
const HttpAuthChallengeTokenizer& challenge) { |
- EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)); |
+ EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)) |
+ << "Auth scheme of challenge doesn't match scheme of AuthHandler."; |
+ EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init."; |
+ EXPECT_TRUE(initialization_succeeded) << __FUNCTION__ |
+ << " called after a failed Init."; |
// If we receive a second challenge for a regular scheme, assume it's a |
// rejection. Receiving an empty second challenge when expecting multiple |
// rounds is also considered a rejection. |
- if (!expect_multiple_challenges_ || challenge.base64_param().empty()) |
+ base::StringPiece challenge_params(challenge.params_begin(), |
+ challenge.params_end()); |
+ if (!expect_multiple_challenges_ || challenge_params.empty()) |
return HttpAuth::AUTHORIZATION_RESULT_REJECT; |
- if (!challenge.SchemeIs(auth_scheme_)) |
- return HttpAuth::AUTHORIZATION_RESULT_INVALID; |
auth_token_ = auth_scheme_; |
auth_token_.append(" continuation,"); |
- auth_token_.append(challenge.base64_param()); |
+ auth_token_.append(challenge.params_begin(), challenge.params_end()); |
return HttpAuth::AUTHORIZATION_RESULT_ACCEPT; |
} |
bool HttpAuthHandlerMock::NeedsIdentity() { |
+ EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init."; |
+ EXPECT_TRUE(initialization_succeeded) << __FUNCTION__ |
+ << " called after a failed Init."; |
return first_round_; |
} |
bool HttpAuthHandlerMock::AllowsDefaultCredentials() { |
+ EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init."; |
+ EXPECT_TRUE(initialization_succeeded) << __FUNCTION__ |
+ << " called after a failed Init."; |
return allows_default_credentials_; |
} |
bool HttpAuthHandlerMock::AllowsExplicitCredentials() { |
+ EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init."; |
+ EXPECT_TRUE(initialization_succeeded) << __FUNCTION__ |
+ << " called after a failed Init."; |
return allows_explicit_credentials_; |
} |
-int HttpAuthHandlerMock::Init(const HttpAuthChallengeTokenizer& challenge) { |
+int HttpAuthHandlerMock::InitializeFromChallengeInternal( |
+ const HttpAuthChallengeTokenizer& challenge, |
+ const HttpResponseInfo& response_with_challenge, |
+ const CompletionCallback& callback) { |
+ EXPECT_FALSE(initialized_) << "Init already called once."; |
EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)) |
<< "Mismatched scheme for challenge: " << challenge.challenge_text(); |
EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(auth_scheme_)) |
<< "Invalid expected auth scheme."; |
+ |
+ base::StringPiece challenge_params(challenge.params_begin(), |
+ challenge.params_end()); |
+ initialized_ = true; |
+ |
auth_token_ = auth_scheme_ + " auth_token"; |
- if (challenge.params_end() != challenge.params_begin()) { |
+ if (!challenge_params.empty()) { |
+ auth_token_ += ","; |
+ auth_token_.append(challenge.params_begin(), challenge.params_end()); |
+ } |
+ |
+ if (init_async_) { |
+ callback_ = callback; |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnInitializeComplete, |
+ weak_factory_.GetWeakPtr())); |
+ return ERR_IO_PENDING; |
+ } |
+ |
+ initialization_succeeded = (init_rv_ == OK); |
+ return init_rv_; |
+} |
+ |
+void HttpAuthHandlerMock::OnInitializeComplete() { |
+ ASSERT_FALSE(callback_.is_null()); |
+ initialization_succeeded = (init_rv_ == OK); |
+ base::ResetAndReturn(&callback_).Run(init_rv_); |
+} |
+ |
+int HttpAuthHandlerMock::InitializeFromCacheEntryInternal( |
+ HttpAuthCache::Entry* cache_entry) { |
+ EXPECT_FALSE(initialized_) << "Init already called once."; |
+ EXPECT_EQ(auth_scheme_, cache_entry->scheme()) |
+ << "Mismatched scheme for challenge: " << cache_entry->auth_challenge(); |
+ EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(auth_scheme_)) |
+ << "Invalid expected auth scheme."; |
+ |
+ HttpAuthChallengeTokenizer challenge(cache_entry->auth_challenge().begin(), |
+ cache_entry->auth_challenge().end()); |
+ EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)) |
+ << "Mismatched scheme for challenge: " << challenge.challenge_text(); |
+ |
+ auth_token_ = auth_scheme_ + " preemptive_auth_token"; |
+ if (challenge.params_begin() != challenge.params_end()) { |
auth_token_ += ","; |
auth_token_.append(challenge.params_begin(), challenge.params_end()); |
} |
+ |
+ initialized_ = true; |
+ initialization_succeeded = true; |
return OK; |
} |
@@ -72,17 +140,20 @@ int HttpAuthHandlerMock::GenerateAuthTokenImpl( |
const HttpRequestInfo& request, |
const CompletionCallback& callback, |
std::string* auth_token) { |
+ EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init."; |
+ EXPECT_TRUE(initialization_succeeded) << __FUNCTION__ |
+ << " called after a failed Init."; |
first_round_ = false; |
request_url_ = request.url; |
- if (!credentials || credentials->Empty()) { |
- EXPECT_TRUE(AllowsDefaultCredentials()) << "Credentials must be specified " |
- "if the handler doesn't support " |
- "default credentials."; |
- } else { |
+ if (credentials) { |
EXPECT_TRUE(AllowsExplicitCredentials()) << "Explicit credentials can only " |
"be specified if the handler " |
"supports it."; |
+ } else { |
+ EXPECT_TRUE(AllowsDefaultCredentials()) << "Credentials must be specified " |
+ "if the handler doesn't support " |
+ "default credentials."; |
} |
if (generate_async_) { |
@@ -93,7 +164,7 @@ int HttpAuthHandlerMock::GenerateAuthTokenImpl( |
callback_ = callback; |
generate_auth_token_buffer_ = auth_token; |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnGenerateAuthToken, |
+ FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnGenerateAuthTokenComplete, |
weak_factory_.GetWeakPtr())); |
return ERR_IO_PENDING; |
} else { |
@@ -103,15 +174,13 @@ int HttpAuthHandlerMock::GenerateAuthTokenImpl( |
} |
} |
-void HttpAuthHandlerMock::OnGenerateAuthToken() { |
+void HttpAuthHandlerMock::OnGenerateAuthTokenComplete() { |
EXPECT_TRUE(generate_async_); |
EXPECT_TRUE(!callback_.is_null()); |
if (generate_rv_ == OK) |
*generate_auth_token_buffer_ = auth_token_; |
generate_auth_token_buffer_ = nullptr; |
- CompletionCallback callback = callback_; |
- callback_.Reset(); |
- callback.Run(generate_rv_); |
+ base::ResetAndReturn(&callback_).Run(generate_rv_); |
} |
HttpAuthHandlerMock::Factory::Factory() {} |
@@ -149,21 +218,18 @@ HttpAuthHandlerMock::Factory::CreateAuthHandlerForScheme( |
EXPECT_TRUE(!handler || handler->auth_scheme() == scheme) |
<< "Next auth handler is for scheme " << handler->auth_scheme() |
<< " while request scheme is " << scheme; |
- return handler.Pass(); |
+ return handler; |
} |
scoped_ptr<HttpAuthHandler> |
HttpAuthHandlerMock::Factory::CreateAndInitPreemptiveAuthHandler( |
HttpAuthCache::Entry* cache_entry, |
- const HttpAuthChallengeTokenizer& tokenizer, |
HttpAuth::Target target, |
const BoundNetLog& net_log) { |
scoped_ptr<HttpAuthHandler> handler = |
GetNextAuthHandler(&preemptive_handlers_); |
- if (handler) { |
- handler->HandleInitialChallenge(tokenizer, target, cache_entry->origin(), |
- net_log); |
- } |
+ if (handler) |
+ handler->InitializeFromCacheEntry(cache_entry, target, net_log); |
return handler; |
} |