Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: net/http/http_auth_handler_digest_unittest.cc

Issue 1391053002: [net/http auth] Make HttpAuthHandler challenge handling asynchronous. Base URL: https://chromium.googlesource.com/chromium/src.git@auth-handler-init-split
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/http/http_auth_handler_digest.cc ('k') | net/http/http_auth_handler_factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
11 #include "net/base/test_completion_callback.h" 11 #include "net/base/test_completion_callback.h"
12 #include "net/http/http_auth_challenge_tokenizer.h" 12 #include "net/http/http_auth_challenge_tokenizer.h"
13 #include "net/http/http_auth_handler_digest.h" 13 #include "net/http/http_auth_handler_digest.h"
14 #include "net/http/http_request_info.h" 14 #include "net/http/http_request_info.h"
15 #include "net/http/http_response_info.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
17 namespace net { 18 namespace net {
18 19
19 namespace { 20 namespace {
20 21
21 const char* const kSimpleChallenge = 22 const char* const kSimpleChallenge =
22 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; 23 "Digest realm=\"Oblivion\", nonce=\"nonce-value\"";
23 24
24 // RespondToChallenge creates an HttpAuthHandlerDigest for the specified 25 // RespondToChallenge creates an HttpAuthHandlerDigest for the specified
(...skipping 24 matching lines...) Expand all
49 new HttpAuthHandlerDigest::Factory()); 50 new HttpAuthHandlerDigest::Factory());
50 HttpAuthHandlerDigest::NonceGenerator* nonce_generator = 51 HttpAuthHandlerDigest::NonceGenerator* nonce_generator =
51 new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce"); 52 new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce");
52 factory->set_nonce_generator(nonce_generator); 53 factory->set_nonce_generator(nonce_generator);
53 54
54 // Create a handler for a particular challenge. 55 // Create a handler for a particular challenge.
55 GURL url_origin(target == HttpAuth::AUTH_SERVER ? request_url : proxy_name); 56 GURL url_origin(target == HttpAuth::AUTH_SERVER ? request_url : proxy_name);
56 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end()); 57 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end());
57 scoped_ptr<HttpAuthHandler> handler = 58 scoped_ptr<HttpAuthHandler> handler =
58 factory->CreateAuthHandlerForScheme(tokenizer.NormalizedScheme()); 59 factory->CreateAuthHandlerForScheme(tokenizer.NormalizedScheme());
59 int rv = handler->HandleInitialChallenge( 60 HttpResponseInfo response_info;
60 tokenizer, target, url_origin.GetOrigin(), BoundNetLog()); 61 TestCompletionCallback callback;
62 int rv = handler->HandleInitialChallenge(tokenizer, response_info, target,
63 url_origin.GetOrigin(),
64 BoundNetLog(), callback.callback());
65 rv = callback.GetResult(rv);
61 if (rv != OK || handler.get() == NULL) { 66 if (rv != OK || handler.get() == NULL) {
62 ADD_FAILURE() << "Unable to create auth handler."; 67 ADD_FAILURE() << "Unable to create auth handler.";
63 return false; 68 return false;
64 } 69 }
65 70
66 // Create a token in response to the challenge. 71 // Create a token in response to the challenge.
67 // NOTE: HttpAuthHandlerDigest's implementation of GenerateAuthToken always 72 // NOTE: HttpAuthHandlerDigest's implementation of GenerateAuthToken always
68 // completes synchronously. That's why this test can get away with a 73 // completes synchronously. That's why this test can get away with a
69 // TestCompletionCallback without an IO thread. 74 // TestCompletionCallback without an IO thread.
70 TestCompletionCallback callback;
71 scoped_ptr<HttpRequestInfo> request(new HttpRequestInfo()); 75 scoped_ptr<HttpRequestInfo> request(new HttpRequestInfo());
72 request->url = GURL(request_url); 76 request->url = GURL(request_url);
73 AuthCredentials credentials(base::ASCIIToUTF16("foo"), 77 AuthCredentials credentials(base::ASCIIToUTF16("foo"),
74 base::ASCIIToUTF16("bar")); 78 base::ASCIIToUTF16("bar"));
75 rv = handler->GenerateAuthToken(&credentials, *request, callback.callback(), 79 rv = handler->GenerateAuthToken(&credentials, *request, callback.callback(),
76 token); 80 token);
77 if (rv != OK) { 81 if (rv != OK) {
78 ADD_FAILURE() << "Problems generating auth token"; 82 ADD_FAILURE() << "Problems generating auth token";
79 return false; 83 return false;
80 } 84 }
81 85
82 return true; 86 return true;
83 } 87 }
84 88
85 } // namespace 89 } // namespace
86 90
87 TEST(HttpAuthHandlerDigestTest, CreateAuthHandlerForScheme) { 91 TEST(HttpAuthHandlerDigestTest, CreateAuthHandlerForScheme) {
88 HttpAuthHandlerDigest::Factory digest_factory; 92 HttpAuthHandlerDigest::Factory digest_factory;
89 93
90 EXPECT_TRUE(digest_factory.CreateAuthHandlerForScheme("digest")); 94 EXPECT_TRUE(digest_factory.CreateAuthHandlerForScheme("digest"));
91 EXPECT_FALSE(digest_factory.CreateAuthHandlerForScheme("bogus")); 95 EXPECT_FALSE(digest_factory.CreateAuthHandlerForScheme("bogus"));
92 } 96 }
93 97
94 TEST(HttpAuthHandlerDigestTest, CreateAndInitPreemptiveAuthHandler_Valid) { 98 TEST(HttpAuthHandlerDigestTest, CreateAndInitPreemptiveAuthHandler_Valid) {
95 HttpAuthHandlerDigest::Factory digest_factory; 99 HttpAuthHandlerDigest::Factory digest_factory;
96 HttpAuthCache auth_cache; 100 HttpAuthCache auth_cache;
97 std::string challenge(kSimpleChallenge); 101 std::string challenge(kSimpleChallenge);
98 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end());
99 102
100 HttpAuthCache::Entry* entry = 103 HttpAuthCache::Entry* entry =
101 auth_cache.Add(GURL("http://example.com/foo").GetOrigin(), "foo", 104 auth_cache.Add(GURL("http://example.com/foo").GetOrigin(), "foo",
102 "digest", challenge, AuthCredentials(), "/foo"); 105 "digest", challenge, AuthCredentials(), "/foo");
103 EXPECT_TRUE(digest_factory.CreateAndInitPreemptiveAuthHandler( 106 EXPECT_TRUE(digest_factory.CreateAndInitPreemptiveAuthHandler(
104 entry, tokenizer, HttpAuth::AUTH_SERVER, BoundNetLog())); 107 entry, HttpAuth::AUTH_SERVER, BoundNetLog()));
105 } 108 }
106 109
107 TEST(HttpAuthHandlerDigestTest, CreateAndInitPreemptiveAuthHandler_Invalid) { 110 TEST(HttpAuthHandlerDigestTest, CreateAndInitPreemptiveAuthHandler_Invalid) {
108 HttpAuthHandlerDigest::Factory digest_factory; 111 HttpAuthHandlerDigest::Factory digest_factory;
109 HttpAuthCache auth_cache; 112 HttpAuthCache auth_cache;
110 std::string challenge("Basic realm=\"bar\""); 113 std::string challenge("Basic realm=\"bar\"");
111 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end());
112 114
113 HttpAuthCache::Entry* entry = 115 HttpAuthCache::Entry* entry =
114 auth_cache.Add(GURL("http://example.com").GetOrigin(), "bar", "basic", 116 auth_cache.Add(GURL("http://example.com").GetOrigin(), "bar", "basic",
115 challenge, AuthCredentials(), "/bar"); 117 challenge, AuthCredentials(), "/bar");
116 EXPECT_FALSE(digest_factory.CreateAndInitPreemptiveAuthHandler( 118 EXPECT_FALSE(digest_factory.CreateAndInitPreemptiveAuthHandler(
117 entry, tokenizer, HttpAuth::AUTH_SERVER, BoundNetLog())); 119 entry, HttpAuth::AUTH_SERVER, BoundNetLog()));
118 } 120 }
119 121
120 TEST(HttpAuthHandlerDigestTest, ParseChallenge) { 122 TEST(HttpAuthHandlerDigestTest, ParseChallenge) {
121 static const struct { 123 static const struct {
122 // The challenge string. 124 // The challenge string.
123 const char* challenge; 125 const char* challenge;
124 // Expected return value of ParseChallenge. 126 // Expected return value of ParseChallenge.
125 bool parsed_success; 127 bool parsed_success;
126 // The expected values that were parsed. 128 // The expected values that were parsed.
127 const char* parsed_realm; 129 const char* parsed_realm;
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 374
373 GURL origin("http://www.example.com"); 375 GURL origin("http://www.example.com");
374 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( 376 scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
375 new HttpAuthHandlerDigest::Factory()); 377 new HttpAuthHandlerDigest::Factory());
376 for (size_t i = 0; i < arraysize(tests); ++i) { 378 for (size_t i = 0; i < arraysize(tests); ++i) {
377 std::string challenge = tests[i].challenge; 379 std::string challenge = tests[i].challenge;
378 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end()); 380 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end());
379 scoped_ptr<HttpAuthHandler> handler = 381 scoped_ptr<HttpAuthHandler> handler =
380 factory->CreateAuthHandlerForScheme(tokenizer.NormalizedScheme()); 382 factory->CreateAuthHandlerForScheme(tokenizer.NormalizedScheme());
381 ASSERT_TRUE(handler); 383 ASSERT_TRUE(handler);
382 int rv = handler->HandleInitialChallenge(tokenizer, HttpAuth::AUTH_SERVER, 384 HttpResponseInfo response_info;
383 origin, BoundNetLog()); 385 TestCompletionCallback callback;
386 int rv = handler->HandleInitialChallenge(
387 tokenizer, response_info, HttpAuth::AUTH_SERVER, origin, BoundNetLog(),
388 callback.callback());
389 rv = callback.GetResult(rv);
384 if (tests[i].parsed_success) { 390 if (tests[i].parsed_success) {
385 EXPECT_EQ(OK, rv); 391 EXPECT_EQ(OK, rv);
386 } else { 392 } else {
387 EXPECT_NE(OK, rv); 393 EXPECT_NE(OK, rv);
388 continue; 394 continue;
389 } 395 }
390 HttpAuthHandlerDigest* digest = 396 HttpAuthHandlerDigest* digest =
391 static_cast<HttpAuthHandlerDigest*>(handler.get()); 397 static_cast<HttpAuthHandlerDigest*>(handler.get());
392 EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str()); 398 EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str());
393 EXPECT_STREQ(tests[i].parsed_nonce, digest->nonce_.c_str()); 399 EXPECT_STREQ(tests[i].parsed_nonce, digest->nonce_.c_str());
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 } 539 }
534 }; 540 };
535 GURL origin("http://www.example.com"); 541 GURL origin("http://www.example.com");
536 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( 542 scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
537 new HttpAuthHandlerDigest::Factory()); 543 new HttpAuthHandlerDigest::Factory());
538 for (size_t i = 0; i < arraysize(tests); ++i) { 544 for (size_t i = 0; i < arraysize(tests); ++i) {
539 scoped_ptr<HttpAuthHandler> handler = 545 scoped_ptr<HttpAuthHandler> handler =
540 factory->CreateAuthHandlerForScheme("digest"); 546 factory->CreateAuthHandlerForScheme("digest");
541 std::string challenge = tests[i].challenge; 547 std::string challenge = tests[i].challenge;
542 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end()); 548 HttpAuthChallengeTokenizer tokenizer(challenge.begin(), challenge.end());
543 int rv = handler->HandleInitialChallenge(tokenizer, HttpAuth::AUTH_SERVER, 549 HttpResponseInfo response_info;
544 origin, BoundNetLog()); 550 TestCompletionCallback callback;
545 EXPECT_EQ(OK, rv); 551 int rv = handler->HandleInitialChallenge(
552 tokenizer, response_info, HttpAuth::AUTH_SERVER, origin, BoundNetLog(),
553 callback.callback());
554 EXPECT_EQ(OK, callback.GetResult(rv));
546 555
547 HttpAuthHandlerDigest* digest = 556 HttpAuthHandlerDigest* digest =
548 static_cast<HttpAuthHandlerDigest*>(handler.get()); 557 static_cast<HttpAuthHandlerDigest*>(handler.get());
549 std::string creds = 558 std::string creds =
550 digest->AssembleCredentials(tests[i].req_method, 559 digest->AssembleCredentials(tests[i].req_method,
551 tests[i].req_path, 560 tests[i].req_path,
552 AuthCredentials( 561 AuthCredentials(
553 base::ASCIIToUTF16(tests[i].username), 562 base::ASCIIToUTF16(tests[i].username),
554 base::ASCIIToUTF16(tests[i].password)), 563 base::ASCIIToUTF16(tests[i].password)),
555 tests[i].cnonce, 564 tests[i].cnonce,
556 tests[i].nonce_count); 565 tests[i].nonce_count);
557 566
558 EXPECT_STREQ(tests[i].expected_creds, creds.c_str()); 567 EXPECT_STREQ(tests[i].expected_creds, creds.c_str());
559 } 568 }
560 } 569 }
561 570
562 TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) { 571 TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) {
563 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( 572 scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
564 new HttpAuthHandlerDigest::Factory()); 573 new HttpAuthHandlerDigest::Factory());
565 std::string default_challenge = 574 std::string default_challenge =
566 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; 575 "Digest realm=\"Oblivion\", nonce=\"nonce-value\"";
567 HttpAuthChallengeTokenizer tok_default(default_challenge.begin(), 576 HttpAuthChallengeTokenizer tok_default(default_challenge.begin(),
568 default_challenge.end()); 577 default_challenge.end());
569 GURL origin("intranet.google.com"); 578 GURL origin("intranet.google.com");
570 scoped_ptr<HttpAuthHandler> handler = 579 scoped_ptr<HttpAuthHandler> handler =
571 factory->CreateAuthHandlerForScheme(tok_default.NormalizedScheme()); 580 factory->CreateAuthHandlerForScheme(tok_default.NormalizedScheme());
572 EXPECT_EQ(OK, handler->HandleInitialChallenge( 581 HttpResponseInfo response_info;
573 tok_default, HttpAuth::AUTH_SERVER, origin, BoundNetLog())); 582 TestCompletionCallback callback;
583 int rv = handler->HandleInitialChallenge(tok_default, response_info,
584 HttpAuth::AUTH_SERVER, origin,
585 BoundNetLog(), callback.callback());
586 EXPECT_EQ(OK, callback.GetResult(rv));
574 ASSERT_TRUE(handler.get() != NULL); 587 ASSERT_TRUE(handler.get() != NULL);
575 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT, 588 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT,
576 handler->HandleAnotherChallenge(tok_default)); 589 handler->HandleAnotherChallenge(tok_default));
577 590
578 std::string stale_challenge = default_challenge + ", stale=true"; 591 std::string stale_challenge = default_challenge + ", stale=true";
579 HttpAuthChallengeTokenizer tok_stale(stale_challenge.begin(), 592 HttpAuthChallengeTokenizer tok_stale(stale_challenge.begin(),
580 stale_challenge.end()); 593 stale_challenge.end());
581 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_STALE, 594 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_STALE,
582 handler->HandleAnotherChallenge(tok_stale)); 595 handler->HandleAnotherChallenge(tok_stale));
583 596
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", " 719 EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
707 "nonce=\"nonce-value\", uri=\"/path/to/resource\", " 720 "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
708 "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", " 721 "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", "
709 "opaque=\"opaque text\", " 722 "opaque=\"opaque text\", "
710 "qop=auth, nc=00000001, cnonce=\"client_nonce\"", 723 "qop=auth, nc=00000001, cnonce=\"client_nonce\"",
711 auth_token); 724 auth_token);
712 } 725 }
713 726
714 727
715 } // namespace net 728 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_auth_handler_digest.cc ('k') | net/http/http_auth_handler_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698