1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string> 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_auth_cache.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_auth_handler.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MockAuthHandler : public HttpAuthHandler { 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockAuthHandler(HttpAuth::Scheme scheme, 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& realm, 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::Target target) { 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Can't use initializer list since these are members of the base class. 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen auth_scheme_ = scheme; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott realm_ = realm; 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott score_ = 1; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott target_ = target; 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott properties_ = 0; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual HttpAuth::AuthorizationResult HandleAnotherChallenge( 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuth::ChallengeTokenizer* challenge) { 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return HttpAuth::AUTHORIZATION_RESULT_REJECT; 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool Init(HttpAuth::ChallengeTokenizer* challenge) { 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; // Unused. 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual int GenerateAuthTokenImpl(const string16*, 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16*, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const HttpRequestInfo*, 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback, 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* auth_token) { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *auth_token = "mock-credentials"; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return OK; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~MockAuthHandler() {} 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* kRealm1 = "Realm1"; 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* kRealm2 = "Realm2"; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* kRealm3 = "Realm3"; 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* kRealm4 = "Realm4"; 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kRealm5 = "Realm5"; 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 k123(ASCIIToUTF16("123")); 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 k1234(ASCIIToUTF16("1234")); 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kAdmin(ASCIIToUTF16("admin")); 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kAlice(ASCIIToUTF16("alice")); 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kAlice2(ASCIIToUTF16("alice2")); 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kPassword(ASCIIToUTF16("password")); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kRoot(ASCIIToUTF16("root")); 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kUsername(ASCIIToUTF16("username")); 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kWileCoyote(ASCIIToUTF16("wilecoyote")); 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test adding and looking-up cache entries (both by realm and by path). 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthCacheTest, Basic) { 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL origin("http://www.google.com"); 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache cache; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache::Entry* entry; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Add cache entries for 4 realms: "Realm1", "Realm2", "Realm3" and 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // "Realm4" 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm1_handler( 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kRealm1, 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SERVER)); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, realm1_handler->realm(), realm1_handler->auth_scheme(), 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Basic realm=Realm1", ASCIIToUTF16("realm1-user"), 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm1-password"), "/foo/bar/index.html"); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm2_handler( 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kRealm2, 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SERVER)); 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, realm2_handler->realm(), realm2_handler->auth_scheme(), 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Basic realm=Realm2", ASCIIToUTF16("realm2-user"), 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm2-password"), "/foo2/index.html"); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm3_basic_handler( 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kRealm3, 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_PROXY)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.Add(origin, realm3_basic_handler->realm(), 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen realm3_basic_handler->auth_scheme(), "Basic realm=Realm3", 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm3-basic-user"), 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm3-basic-password"), ""); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm3_digest_handler( 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler(HttpAuth::AUTH_SCHEME_DIGEST, 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kRealm3, 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_PROXY)); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.Add(origin, realm3_digest_handler->realm(), 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen realm3_digest_handler->auth_scheme(), "Digest realm=Realm3", 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm3-digest-user"), 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm3-digest-password"), "/baz/index.html"); 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<HttpAuthHandler> realm4_basic_handler( 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen kRealm4, 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpAuth::AUTH_SERVER)); 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cache.Add(origin, realm4_basic_handler->realm(), 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen realm4_basic_handler->auth_scheme(), "Basic realm=Realm4", 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASCIIToUTF16("realm4-basic-user"), 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASCIIToUTF16("realm4-basic-password"), "/"); 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // There is no Realm5 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen entry = cache.Lookup(origin, kRealm5, HttpAuth::AUTH_SCHEME_BASIC); 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(NULL == entry); 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // While Realm3 does exist, the origin scheme is wrong. 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry = cache.Lookup(GURL("https://www.google.com"), kRealm3, 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC); 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(NULL == entry); 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Realm, origin scheme ok, authentication scheme wrong 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry = cache.Lookup 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (GURL("http://www.google.com"), kRealm1, HttpAuth::AUTH_SCHEME_DIGEST); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(NULL == entry); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Valid lookup by origin, realm, scheme. 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry = cache.Lookup( 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://www.google.com:80"), kRealm3, HttpAuth::AUTH_SCHEME_BASIC); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(NULL == entry); 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kRealm3, entry->realm()); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("Basic realm=Realm3", entry->auth_challenge()); 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm3-basic-user"), entry->username()); 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm3-basic-password"), entry->password()); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Valid lookup by origin, realm, scheme when there's a duplicate 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // origin, realm in the cache 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry = cache.Lookup( 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://www.google.com:80"), kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(NULL == entry); 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(HttpAuth::AUTH_SCHEME_DIGEST, entry->scheme()); 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kRealm3, entry->realm()); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("Digest realm=Realm3", entry->auth_challenge()); 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm3-digest-user"), entry->username()); 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm3-digest-password"), entry->password()); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Valid lookup by realm. 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry = cache.Lookup(origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(NULL == entry); 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kRealm2, entry->realm()); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("Basic realm=Realm2", entry->auth_challenge()); 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm2-user"), entry->username()); 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("realm2-password"), entry->password()); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Check that subpaths are recognized. 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuthCache::Entry* realm2_entry = cache.Lookup( 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC); 173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpAuthCache::Entry* realm4_entry = cache.Lookup( 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen origin, kRealm4, HttpAuth::AUTH_SCHEME_BASIC); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(NULL == realm2_entry); 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(NULL == realm4_entry); 177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Realm4 applies to '/' and Realm2 applies to '/foo2/'. 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // LookupByPath() should return the closest enclosing path. 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Positive tests: 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, "/foo2/index.html"); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm2_entry == entry); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, "/foo2/foobar.html"); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm2_entry == entry); 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, "/foo2/bar/index.html"); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm2_entry == entry); 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, "/foo2/"); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm2_entry == entry); 188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen entry = cache.LookupByPath(origin, "/foo2"); 189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(realm4_entry == entry); 190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen entry = cache.LookupByPath(origin, "/"); 191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(realm4_entry == entry); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Negative tests: 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, "/foo3/index.html"); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(realm2_entry == entry); 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, ""); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(realm2_entry == entry); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Confirm we find the same realm, different auth scheme by path lookup 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuthCache::Entry* realm3_digest_entry = 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(NULL == realm3_digest_entry); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz/index.html"); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm3_digest_entry == entry); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz/"); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm3_digest_entry == entry); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz"); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(realm3_digest_entry == entry); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Confirm we find the same realm, different auth scheme by path lookup 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuthCache::Entry* realm3DigestEntry = 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(NULL == realm3DigestEntry); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz/index.html"); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm3DigestEntry == entry); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz/"); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(realm3DigestEntry == entry); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = cache.LookupByPath(origin, "/baz"); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(realm3DigestEntry == entry); 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Lookup using empty path (may be used for proxy). 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry = cache.LookupByPath(origin, ""); 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(NULL == entry); 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kRealm3, entry->realm()); 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthCacheTest, AddPath) { 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache::Entry entry; 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // All of these paths have a common root /1/2/2/4/5/ 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/2/3/4/5/x.txt"); 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/2/3/4/5/y.txt"); 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/2/3/4/5/z.txt"); 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1U, entry.paths_.size()); 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/2/3/4/5/", entry.paths_.front()); 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Add a new entry (not a subpath). 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/XXX/q"); 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2U, entry.paths_.size()); 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/XXX/", entry.paths_.front()); 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/2/3/4/5/", entry.paths_.back()); 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Add containing paths of /1/2/3/4/5/ -- should swallow up the deeper paths. 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/2/3/4/x.txt"); 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2U, entry.paths_.size()); 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/2/3/4/", entry.paths_.front()); 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/XXX/", entry.paths_.back()); 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/1/2/3/x"); 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2U, entry.paths_.size()); 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/2/3/", entry.paths_.front()); 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/1/XXX/", entry.paths_.back()); 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry.AddPath("/index.html"); 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1U, entry.paths_.size()); 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/", entry.paths_.front()); 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Calling Add when the realm entry already exists, should append that 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// path. 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthCacheTest, AddToExistingEntry) { 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache cache; 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL origin("http://www.foobar.com:70"); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string auth_challenge = "Basic realm=MyRealm"; 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> handler( 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, "MyRealm", HttpAuth::AUTH_SERVER)); 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache::Entry* orig_entry = cache.Add( 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("user1"), ASCIIToUTF16("password1"), "/x/y/z/"); 27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("user2"), ASCIIToUTF16("password2"), "/z/y/x/"); 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("user3"), ASCIIToUTF16("password3"), "/z/y"); 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuthCache::Entry* entry = cache.Lookup( 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, "MyRealm", HttpAuth::AUTH_SCHEME_BASIC); 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry == orig_entry); 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("user3"), entry->username()); 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ASCIIToUTF16("password3"), entry->password()); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2U, entry->paths_.size()); 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/z/", entry->paths_.front()); 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("/x/y/z/", entry->paths_.back()); 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthCacheTest, Remove) { 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL origin("http://foobar2.com"); 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm1_handler( 29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, kRealm1, HttpAuth::AUTH_SERVER)); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm2_handler( 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, kRealm2, HttpAuth::AUTH_SERVER)); 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm3_basic_handler( 30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, kRealm3, HttpAuth::AUTH_SERVER)); 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> realm3_digest_handler( 30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_DIGEST, kRealm3, HttpAuth::AUTH_SERVER)); 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache cache; 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, realm1_handler->realm(), realm1_handler->auth_scheme(), 3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "basic realm=Realm1", kAlice, k123, "/"); 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache.Add(origin, realm2_handler->realm(), realm2_handler->auth_scheme(), 3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "basic realm=Realm2", ASCIIToUTF16("bob"), ASCIIToUTF16("princess"), 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "/"); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.Add(origin, realm3_basic_handler->realm(), 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen realm3_basic_handler->auth_scheme(), "basic realm=Realm3", 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kAdmin, kPassword, "/"); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.Add(origin, realm3_digest_handler->realm(), 31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kRoot, kWileCoyote, "/"); 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Fails, because there is no realm "Realm5". 32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove( 324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen origin, kRealm5, HttpAuth::AUTH_SCHEME_BASIC, kAlice, k123)); 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Fails because the origin is wrong. 32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove(GURL("http://foobar2.com:100"), 32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kRealm1, 32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, 33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kAlice, 33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen k123)); 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Fails because the username is wrong. 33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove( 33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, kAlice2, k123)); 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Fails because the password is wrong. 33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove( 33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, kAlice, k1234)); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fails because the authentication type is wrong. 34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove( 34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm1, HttpAuth::AUTH_SCHEME_DIGEST, kAlice, k123)); 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Succeeds. 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cache.Remove( 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, kAlice, k123)); 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Fails because we just deleted the entry! 35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(cache.Remove( 35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, kAlice, k123)); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Succeed when there are two authentication types for the same origin,realm. 35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cache.Remove( 35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST, kRoot, kWileCoyote)); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Succeed as above, but when entries were added in opposite order 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.Add(origin, realm3_digest_handler->realm(), 35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kRoot, kWileCoyote, "/"); 36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cache.Remove( 36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm3, HttpAuth::AUTH_SCHEME_BASIC, kAdmin, kPassword)); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure that removing one entry still leaves the other available for 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // lookup. 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuthCache::Entry* entry = cache.Lookup( 36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(NULL == entry); 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(HttpAuthCacheTest, UpdateStaleChallenge) { 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuthCache cache; 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL origin("http://foobar2.com"); 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<HttpAuthHandler> digest_handler( 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new MockAuthHandler( 37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_DIGEST, kRealm1, HttpAuth::AUTH_PROXY)); 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuthCache::Entry* entry_pre = cache.Add( 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick origin, 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick digest_handler->realm(), 38072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen digest_handler->auth_scheme(), 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Digest realm=Realm1," 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "nonce=\"s3MzvFhaBAA=4c520af5acd9d8d7ae26947529d18c8eae1e98f4\"", 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm-digest-user"), 3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASCIIToUTF16("realm-digest-password"), 3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "/baz/index.html"); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(entry_pre != NULL); 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2, entry_pre->IncrementNonceCount()); 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(3, entry_pre->IncrementNonceCount()); 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(4, entry_pre->IncrementNonceCount()); 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool update_success = cache.UpdateStaleChallenge( 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick origin, 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick digest_handler->realm(), 39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen digest_handler->auth_scheme(), 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Digest realm=Realm1," 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\"," 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "stale=\"true\""); 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(update_success); 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // After the stale update, the entry should still exist in the cache and 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // the nonce count should be reset to 0. 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuthCache::Entry* entry_post = cache.Lookup( 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick origin, 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick digest_handler->realm(), 40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen digest_handler->auth_scheme()); 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(entry_post != NULL); 4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2, entry_post->IncrementNonceCount()); 4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // UpdateStaleChallenge will fail if an entry doesn't exist in the cache. 4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool update_failure = cache.UpdateStaleChallenge( 4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick origin, 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kRealm2, 41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen digest_handler->auth_scheme(), 4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Digest realm=Realm2," 4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\"," 4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "stale=\"true\""); 4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(update_failure); 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test fixture class for eviction tests (contains helpers for bulk 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// insertion and existence testing). 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpAuthCacheEvictionTest : public testing::Test { 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCacheEvictionTest() : origin_("http://www.google.com") { } 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string GenerateRealm(int realm_i) { 4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return base::StringPrintf("Realm %d", realm_i); 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string GeneratePath(int realm_i, int path_i) { 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return base::StringPrintf("/%d/%d/x/y", realm_i, path_i); 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddRealm(int realm_i) { 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddPathToRealm(realm_i, 0); 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddPathToRealm(int realm_i, int path_i) { 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache_.Add(origin_, GenerateRealm(realm_i), HttpAuth::AUTH_SCHEME_BASIC, "", 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kUsername, kPassword, GeneratePath(realm_i, path_i)); 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void CheckRealmExistence(int realm_i, bool exists) { 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const HttpAuthCache::Entry* entry = 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cache_.Lookup( 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin_, GenerateRealm(realm_i), HttpAuth::AUTH_SCHEME_BASIC); 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (exists) { 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(entry == NULL); 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(GenerateRealm(realm_i), entry->realm()); 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry == NULL); 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void CheckPathExistence(int realm_i, int path_i, bool exists) { 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const HttpAuthCache::Entry* entry = 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_.LookupByPath(origin_, GeneratePath(realm_i, path_i)); 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (exists) { 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(entry == NULL); 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(GenerateRealm(realm_i), entry->realm()); 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry == NULL); 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL origin_; 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuthCache cache_; 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const int kMaxPaths = HttpAuthCache::kMaxNumPathsPerRealmEntry; 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const int kMaxRealms = HttpAuthCache::kMaxNumRealmEntries; 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Add the maxinim number of realm entries to the cache. Each of these entries 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// must still be retrievable. Next add three more entries -- since the cache is 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// full this causes FIFO eviction of the first three entries. 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(HttpAuthCacheEvictionTest, RealmEntryEviction) { 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxRealms; ++i) 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddRealm(i); 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxRealms; ++i) 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckRealmExistence(i, true); 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 3; ++i) 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddRealm(i + kMaxRealms); 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 3; ++i) 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckRealmExistence(i, false); 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxRealms; ++i) 491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckRealmExistence(i + 3, true); 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Add the maximum number of paths to a single realm entry. Each of these 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// paths should be retrievable. Next add 3 more paths -- since the cache is 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// full this causes FIFO eviction of the first three paths. 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(HttpAuthCacheEvictionTest, RealmPathEviction) { 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxPaths; ++i) 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddPathToRealm(0, i); 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 1; i < kMaxRealms; ++i) 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddRealm(i); 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 3; ++i) 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddPathToRealm(0, i + kMaxPaths); 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 3; ++i) 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckPathExistence(0, i, false); 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxPaths; ++i) 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckPathExistence(0, i + 3, true); 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kMaxRealms; ++i) 514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CheckRealmExistence(i, true); 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 518