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 b879efe8db23e350c518fea6a5adcd93928a53fb..2f37e93c052af50936b6bb091a64cbb79f813a0c 100644 |
--- a/net/http/http_auth_handler_mock.cc |
+++ b/net/http/http_auth_handler_mock.cc |
@@ -17,53 +17,11 @@ |
namespace net { |
HttpAuthHandlerMock::HttpAuthHandlerMock() |
- : generate_rv_(OK), weak_factory_(this) {} |
+ : expected_auth_scheme_("mock"), weak_factory_(this) {} |
HttpAuthHandlerMock::~HttpAuthHandlerMock() { |
} |
-void HttpAuthHandlerMock::SetResolveExpectation(Resolve resolve) { |
- EXPECT_EQ(RESOLVE_INIT, resolve_); |
- resolve_ = resolve; |
-} |
- |
-bool HttpAuthHandlerMock::NeedsCanonicalName() { |
- switch (resolve_) { |
- case RESOLVE_SYNC: |
- case RESOLVE_ASYNC: |
- return true; |
- case RESOLVE_SKIP: |
- resolve_ = RESOLVE_TESTED; |
- return false; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-int HttpAuthHandlerMock::ResolveCanonicalName( |
- HostResolver* host_resolver, const CompletionCallback& callback) { |
- EXPECT_NE(RESOLVE_TESTED, resolve_); |
- int rv = OK; |
- switch (resolve_) { |
- case RESOLVE_SYNC: |
- resolve_ = RESOLVE_TESTED; |
- break; |
- case RESOLVE_ASYNC: |
- EXPECT_TRUE(callback_.is_null()); |
- rv = ERR_IO_PENDING; |
- callback_ = callback; |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnResolveCanonicalName, |
- weak_factory_.GetWeakPtr())); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- return rv; |
-} |
- |
void HttpAuthHandlerMock::SetGenerateExpectation(bool async, int rv) { |
generate_async_ = async; |
generate_rv_ = rv; |
@@ -74,10 +32,13 @@ HttpAuth::AuthorizationResult HttpAuthHandlerMock::HandleAnotherChallenge( |
// 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()) |
+ if (!expect_multiple_challenges_ || challenge->base64_param().empty()) |
return HttpAuth::AUTHORIZATION_RESULT_REJECT; |
- if (!challenge->SchemeIs("mock")) |
+ if (!challenge->SchemeIs(auth_scheme_)) |
return HttpAuth::AUTHORIZATION_RESULT_INVALID; |
+ auth_token_ = auth_scheme_; |
+ auth_token_.append(" continuation,"); |
+ auth_token_.append(challenge->base64_param()); |
return HttpAuth::AUTHORIZATION_RESULT_ACCEPT; |
} |
@@ -94,7 +55,17 @@ bool HttpAuthHandlerMock::AllowsExplicitCredentials() { |
} |
bool HttpAuthHandlerMock::Init(HttpAuthChallengeTokenizer* challenge) { |
- auth_scheme_ = "mock"; |
+ EXPECT_TRUE(challenge->SchemeIs(expected_auth_scheme_)) |
+ << "Mismatched scheme for challenge: " << challenge->challenge_text(); |
+ EXPECT_TRUE(auth_scheme_.empty()) << "Init was already called."; |
+ EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(expected_auth_scheme_)) |
+ << "Invalid expected auth scheme."; |
+ auth_scheme_ = expected_auth_scheme_; |
+ auth_token_ = expected_auth_scheme_ + " auth_token"; |
+ if (challenge->params_end() != challenge->params_begin()) { |
+ auth_token_ += ","; |
+ auth_token_.append(challenge->params_begin(), challenge->params_end()); |
+ } |
return true; |
} |
@@ -105,58 +76,65 @@ int HttpAuthHandlerMock::GenerateAuthTokenImpl( |
std::string* auth_token) { |
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 { |
+ EXPECT_TRUE(AllowsExplicitCredentials()) << "Explicit credentials can only " |
+ "be specified if the handler " |
+ "supports it."; |
+ } |
+ |
if (generate_async_) { |
- EXPECT_TRUE(callback_.is_null()); |
- EXPECT_TRUE(auth_token_ == NULL); |
+ EXPECT_TRUE(callback_.is_null()) << "GenerateAuthTokenImpl() called while " |
+ "a pending request is in progress"; |
+ EXPECT_EQ(nullptr, generate_auth_token_buffer_) |
+ << "GenerateAuthTokenImpl() called before previous token was retrieved"; |
callback_ = callback; |
- auth_token_ = auth_token; |
+ generate_auth_token_buffer_ = auth_token; |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnGenerateAuthToken, |
weak_factory_.GetWeakPtr())); |
return ERR_IO_PENDING; |
} else { |
if (generate_rv_ == OK) |
- *auth_token = "auth_token"; |
+ *auth_token = auth_token_; |
return generate_rv_; |
} |
} |
-void HttpAuthHandlerMock::OnResolveCanonicalName() { |
- EXPECT_EQ(RESOLVE_ASYNC, resolve_); |
- EXPECT_TRUE(!callback_.is_null()); |
- resolve_ = RESOLVE_TESTED; |
- CompletionCallback callback = callback_; |
- callback_.Reset(); |
- callback.Run(OK); |
-} |
- |
void HttpAuthHandlerMock::OnGenerateAuthToken() { |
EXPECT_TRUE(generate_async_); |
EXPECT_TRUE(!callback_.is_null()); |
if (generate_rv_ == OK) |
- *auth_token_ = "auth_token"; |
- auth_token_ = NULL; |
+ *generate_auth_token_buffer_ = auth_token_; |
+ generate_auth_token_buffer_ = nullptr; |
CompletionCallback callback = callback_; |
callback_.Reset(); |
callback.Run(generate_rv_); |
} |
-HttpAuthHandlerMock::Factory::Factory() |
- : do_init_from_challenge_(false) { |
- // TODO(cbentzel): Default do_init_from_challenge_ to true. |
-} |
+HttpAuthHandlerMock::Factory::Factory() {} |
HttpAuthHandlerMock::Factory::~Factory() { |
} |
void HttpAuthHandlerMock::Factory::AddMockHandler( |
- HttpAuthHandler* handler, HttpAuth::Target target) { |
- handlers_[target].push_back(handler); |
+ scoped_ptr<HttpAuthHandler> handler, |
+ CreateReason reason, |
+ HttpAuth::Target target) { |
+ if (reason == CREATE_PREEMPTIVE) |
+ preemptive_handlers_[target].push_back(handler.Pass()); |
+ else |
+ challenge_handlers_[target].push_back(handler.Pass()); |
} |
bool HttpAuthHandlerMock::Factory::HaveAuthHandlers( |
HttpAuth::Target target) const { |
- return !handlers_[target].empty(); |
+ return !challenge_handlers_[target].empty() || |
+ !preemptive_handlers_[target].empty(); |
} |
int HttpAuthHandlerMock::Factory::CreateAuthHandler( |
@@ -167,13 +145,14 @@ int HttpAuthHandlerMock::Factory::CreateAuthHandler( |
int nonce_count, |
const BoundNetLog& net_log, |
scoped_ptr<HttpAuthHandler>* handler) { |
- if (handlers_[target].empty()) |
+ ScopedVector<HttpAuthHandler>& handler_list = |
+ reason == CREATE_PREEMPTIVE ? preemptive_handlers_[target] |
+ : challenge_handlers_[target]; |
+ if (handler_list.empty()) |
return ERR_UNEXPECTED; |
- scoped_ptr<HttpAuthHandler> tmp_handler(handlers_[target][0]); |
- std::vector<HttpAuthHandler*>& handlers = handlers_[target].get(); |
- handlers.erase(handlers.begin()); |
- if (do_init_from_challenge_ && |
- !tmp_handler->InitFromChallenge(challenge, target, origin, net_log)) |
+ scoped_ptr<HttpAuthHandler> tmp_handler(handler_list.front()); |
+ handler_list.weak_erase(handler_list.begin()); |
+ if (!tmp_handler->InitFromChallenge(challenge, target, origin, net_log)) |
return ERR_INVALID_RESPONSE; |
handler->swap(tmp_handler); |
return OK; |