15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_cache.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAuthHandler : public HttpAuthHandler { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockAuthHandler(HttpAuth::Scheme scheme, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& realm, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::Target target) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't use initializer list since these are members of the base class. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_scheme_ = scheme; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm_ = realm; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) score_ = 1; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ = target; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_ = 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HttpAuth::AuthorizationResult HandleAnotherChallenge( 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HttpAuthChallengeTokenizer* challenge) OVERRIDE { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HttpAuth::AUTHORIZATION_RESULT_REJECT; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool Init(HttpAuthChallengeTokenizer* challenge) OVERRIDE { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Unused. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GenerateAuthTokenImpl(const AuthCredentials*, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestInfo*, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* auth_token) OVERRIDE { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *auth_token = "mock-credentials"; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockAuthHandler() {} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kRealm1 = "Realm1"; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kRealm2 = "Realm2"; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kRealm3 = "Realm3"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kRealm4 = "Realm4"; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kRealm5 = "Realm5"; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 k123(ASCIIToUTF16("123")); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 k1234(ASCIIToUTF16("1234")); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kAdmin(ASCIIToUTF16("admin")); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kAlice(ASCIIToUTF16("alice")); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kAlice2(ASCIIToUTF16("alice2")); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kPassword(ASCIIToUTF16("password")); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kRoot(ASCIIToUTF16("root")); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kUsername(ASCIIToUTF16("username")); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kWileCoyote(ASCIIToUTF16("wilecoyote")); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuthCredentials CreateASCIICredentials(const char* username, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* password) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AuthCredentials(ASCIIToUTF16(username), ASCIIToUTF16(password)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test adding and looking-up cache entries (both by realm and by path). 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, Basic) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://www.google.com"); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache cache; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add cache entries for 4 realms: "Realm1", "Realm2", "Realm3" and 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Realm4" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm1_handler( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm1, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm1_handler->realm(), realm1_handler->auth_scheme(), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Basic realm=Realm1", 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("realm1-user", "realm1-password"), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/foo/bar/index.html"); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm2_handler( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm2, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm2_handler->realm(), realm2_handler->auth_scheme(), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Basic realm=Realm2", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("realm2-user", "realm2-password"), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/foo2/index.html"); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm3_basic_handler( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm3, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_PROXY)); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cache.Add( 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) realm3_basic_handler->realm(), 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) realm3_basic_handler->auth_scheme(), 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Basic realm=Realm3", 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateASCIICredentials("realm3-basic-user", "realm3-basic-password"), 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm3_digest_handler( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler(HttpAuth::AUTH_SCHEME_DIGEST, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm3, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_PROXY)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm3_digest_handler->realm(), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "Digest realm=Realm3", 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("realm3-digest-user", 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "realm3-digest-password"), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/baz/index.html"); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm4_basic_handler( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler(HttpAuth::AUTH_SCHEME_BASIC, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm4, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm4_basic_handler->realm(), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm4_basic_handler->auth_scheme(), "Basic realm=Realm4", 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("realm4-basic-user", 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "realm4-basic-password"), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/"); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no Realm5 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup(origin, kRealm5, HttpAuth::AUTH_SCHEME_BASIC); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == entry); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // While Realm3 does exist, the origin scheme is wrong. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup(GURL("https://www.google.com"), kRealm3, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == entry); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Realm, origin scheme ok, authentication scheme wrong 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (GURL("http://www.google.com"), kRealm1, HttpAuth::AUTH_SCHEME_DIGEST); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == entry); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid lookup by origin, realm, scheme. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.google.com:80"), kRealm3, HttpAuth::AUTH_SCHEME_BASIC); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NULL == entry); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRealm3, entry->realm()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Basic realm=Realm3", entry->auth_challenge()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm3-basic-user"), entry->credentials().username()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm3-basic-password"), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->credentials().password()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid lookup by origin, realm, scheme when there's a duplicate 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin, realm in the cache 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.google.com:80"), kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NULL == entry); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(HttpAuth::AUTH_SCHEME_DIGEST, entry->scheme()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRealm3, entry->realm()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Digest realm=Realm3", entry->auth_challenge()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm3-digest-user"), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->credentials().username()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm3-digest-password"), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->credentials().password()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid lookup by realm. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.Lookup(origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NULL == entry); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRealm2, entry->realm()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Basic realm=Realm2", entry->auth_challenge()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm2-user"), entry->credentials().username()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("realm2-password"), entry->credentials().password()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that subpaths are recognized. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* realm2_entry = cache.Lookup( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* realm4_entry = cache.Lookup( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm4, HttpAuth::AUTH_SCHEME_BASIC); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == realm2_entry); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == realm4_entry); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Realm4 applies to '/' and Realm2 applies to '/foo2/'. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LookupByPath() should return the closest enclosing path. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Positive tests: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo2/index.html"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm2_entry == entry); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo2/foobar.html"); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm2_entry == entry); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo2/bar/index.html"); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm2_entry == entry); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo2/"); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm2_entry == entry); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo2"); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm4_entry == entry); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm4_entry == entry); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Negative tests: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/foo3/index.html"); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(realm2_entry == entry); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = cache.LookupByPath(origin, std::string()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(realm2_entry == entry); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm we find the same realm, different auth scheme by path lookup 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* realm3_digest_entry = 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == realm3_digest_entry); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz/index.html"); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm3_digest_entry == entry); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz/"); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm3_digest_entry == entry); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz"); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(realm3_digest_entry == entry); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm we find the same realm, different auth scheme by path lookup 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* realm3DigestEntry = 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == realm3DigestEntry); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz/index.html"); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm3DigestEntry == entry); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz/"); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(realm3DigestEntry == entry); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = cache.LookupByPath(origin, "/baz"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(realm3DigestEntry == entry); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lookup using empty path (may be used for proxy). 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = cache.LookupByPath(origin, std::string()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == entry); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, entry->scheme()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRealm3, entry->realm()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, AddPath) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry entry; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All of these paths have a common root /1/2/2/4/5/ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/2/3/4/5/x.txt"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/2/3/4/5/y.txt"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/2/3/4/5/z.txt"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, entry.paths_.size()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/2/3/4/5/", entry.paths_.front()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a new entry (not a subpath). 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/XXX/q"); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, entry.paths_.size()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/XXX/", entry.paths_.front()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/2/3/4/5/", entry.paths_.back()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add containing paths of /1/2/3/4/5/ -- should swallow up the deeper paths. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/2/3/4/x.txt"); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, entry.paths_.size()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/2/3/4/", entry.paths_.front()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/XXX/", entry.paths_.back()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/1/2/3/x"); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, entry.paths_.size()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/2/3/", entry.paths_.front()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/1/XXX/", entry.paths_.back()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.AddPath("/index.html"); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, entry.paths_.size()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", entry.paths_.front()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Calling Add when the realm entry already exists, should append that 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// path. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, AddToExistingEntry) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache cache; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://www.foobar.com:70"); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string auth_challenge = "Basic realm=MyRealm"; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> handler( 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, "MyRealm", HttpAuth::AUTH_SERVER)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* orig_entry = cache.Add( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("user1", "password1"), "/x/y/z/"); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("user2", "password2"), "/z/y/x/"); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, handler->realm(), handler->auth_scheme(), auth_challenge, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("user3", "password3"), "/z/y"); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry = cache.Lookup( 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, "MyRealm", HttpAuth::AUTH_SCHEME_BASIC); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == orig_entry); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("user3"), entry->credentials().username()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("password3"), entry->credentials().password()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, entry->paths_.size()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/z/", entry->paths_.front()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/x/y/z/", entry->paths_.back()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, Remove) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://foobar2.com"); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm1_handler( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm1, HttpAuth::AUTH_SERVER)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm2_handler( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm2, HttpAuth::AUTH_SERVER)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm3_basic_handler( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm3, HttpAuth::AUTH_SERVER)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm3_digest_handler( 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_DIGEST, kRealm3, HttpAuth::AUTH_SERVER)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache cache; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm1_handler->realm(), realm1_handler->auth_scheme(), 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "basic realm=Realm1", AuthCredentials(kAlice, k123), "/"); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm2_handler->realm(), realm2_handler->auth_scheme(), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "basic realm=Realm2", CreateASCIICredentials("bob", "princess"), 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/"); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm3_basic_handler->realm(), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_basic_handler->auth_scheme(), "basic realm=Realm3", 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAdmin, kPassword), "/"); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm3_digest_handler->realm(), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kRoot, kWileCoyote), "/"); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails, because there is no realm "Realm5". 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm5, HttpAuth::AUTH_SCHEME_BASIC, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123))); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails because the origin is wrong. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove(GURL("http://foobar2.com:100"), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm1, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123))); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails because the username is wrong. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice2, k123))); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails because the password is wrong. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove( 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k1234))); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails because the authentication type is wrong. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove( 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm1, HttpAuth::AUTH_SCHEME_DIGEST, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123))); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Succeeds. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache.Remove( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123))); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fails because we just deleted the entry! 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache.Remove( 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123))); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Succeed when there are two authentication types for the same origin,realm. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache.Remove( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kRoot, kWileCoyote))); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Succeed as above, but when entries were added in opposite order 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Add(origin, realm3_digest_handler->realm(), 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kRoot, kWileCoyote), "/"); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache.Remove( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm3, HttpAuth::AUTH_SCHEME_BASIC, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAdmin, kPassword))); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that removing one entry still leaves the other available for 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lookup. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry = cache.Lookup( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(NULL == entry); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, UpdateStaleChallenge) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache cache; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://foobar2.com"); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> digest_handler( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_DIGEST, kRealm1, HttpAuth::AUTH_PROXY)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry_pre = cache.Add( 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->realm(), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->auth_scheme(), 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Digest realm=Realm1," 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nonce=\"s3MzvFhaBAA=4c520af5acd9d8d7ae26947529d18c8eae1e98f4\"", 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateASCIICredentials("realm-digest-user", "realm-digest-password"), 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/baz/index.html"); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(entry_pre != NULL); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, entry_pre->IncrementNonceCount()); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, entry_pre->IncrementNonceCount()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, entry_pre->IncrementNonceCount()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool update_success = cache.UpdateStaleChallenge( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->realm(), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->auth_scheme(), 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Digest realm=Realm1," 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\"," 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stale=\"true\""); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(update_success); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After the stale update, the entry should still exist in the cache and 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the nonce count should be reset to 0. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry_post = cache.Lookup( 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->realm(), 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->auth_scheme()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(entry_post != NULL); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, entry_post->IncrementNonceCount()); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateStaleChallenge will fail if an entry doesn't exist in the cache. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool update_failure = cache.UpdateStaleChallenge( 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRealm2, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) digest_handler->auth_scheme(), 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Digest realm=Realm2," 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\"," 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stale=\"true\""); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(update_failure); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthCacheTest, UpdateAllFrom) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://example.com"); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path("/some/path"); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string another_path("/another/path"); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm1_handler( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm1, HttpAuth::AUTH_SERVER)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm2_handler( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm2, HttpAuth::AUTH_PROXY)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm3_digest_handler( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_DIGEST, kRealm3, HttpAuth::AUTH_SERVER)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> realm4_handler( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockAuthHandler( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, kRealm4, HttpAuth::AUTH_SERVER)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache first_cache; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache::Entry* entry; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_cache.Add(origin, realm1_handler->realm(), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm1_handler->auth_scheme(), "basic realm=Realm1", 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice, k123), path); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_cache.Add(origin, realm2_handler->realm(), 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm2_handler->auth_scheme(), "basic realm=Realm2", 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice2, k1234), path); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_cache.Add(origin, realm3_digest_handler->realm(), 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kRoot, kWileCoyote), path); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = first_cache.Add( 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, realm3_digest_handler->realm(), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kRoot, kWileCoyote), another_path); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, entry->IncrementNonceCount()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache second_cache; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will be overwritten by kRoot:kWileCoyote. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_cache.Add(origin, realm3_digest_handler->realm(), 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm3_digest_handler->auth_scheme(), "digest realm=Realm3", 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAlice2, k1234), path); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be left intact. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_cache.Add(origin, realm4_handler->realm(), 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm4_handler->auth_scheme(), "basic realm=Realm4", 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kAdmin, kRoot), path); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_cache.UpdateAllFrom(first_cache); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copied from first_cache. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = second_cache.Lookup(origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != entry); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kAlice, entry->credentials().username()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(k123, entry->credentials().password()); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copied from first_cache. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = second_cache.Lookup(origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != entry); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kAlice2, entry->credentials().username()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(k1234, entry->credentials().password()); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overwritten from first_cache. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = second_cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != entry); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRoot, entry->credentials().username()); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWileCoyote, entry->credentials().password()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nonce count should get copied. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, entry->IncrementNonceCount()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All paths should get copied. 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = second_cache.LookupByPath(origin, another_path); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != entry); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRoot, entry->credentials().username()); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWileCoyote, entry->credentials().password()); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Left intact in second_cache. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = second_cache.Lookup(origin, kRealm4, HttpAuth::AUTH_SCHEME_BASIC); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != entry); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kAdmin, entry->credentials().username()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRoot, entry->credentials().password()); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test fixture class for eviction tests (contains helpers for bulk 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// insertion and existence testing). 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthCacheEvictionTest : public testing::Test { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCacheEvictionTest() : origin_("http://www.google.com") { } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GenerateRealm(int realm_i) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("Realm %d", realm_i); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GeneratePath(int realm_i, int path_i) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("/%d/%d/x/y", realm_i, path_i); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddRealm(int realm_i) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPathToRealm(realm_i, 0); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPathToRealm(int realm_i, int path_i) { 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cache_.Add(origin_, 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GenerateRealm(realm_i), 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials(kUsername, kPassword), 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GeneratePath(realm_i, path_i)); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckRealmExistence(int realm_i, bool exists) { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpAuthCache::Entry* entry = 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_.Lookup( 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_, GenerateRealm(realm_i), HttpAuth::AUTH_SCHEME_BASIC); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exists) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(entry == NULL); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GenerateRealm(realm_i), entry->realm()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == NULL); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckPathExistence(int realm_i, int path_i, bool exists) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpAuthCache::Entry* entry = 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_.LookupByPath(origin_, GeneratePath(realm_i, path_i)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exists) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(entry == NULL); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GenerateRealm(realm_i), entry->realm()); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == NULL); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin_; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthCache cache_; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMaxPaths = HttpAuthCache::kMaxNumPathsPerRealmEntry; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMaxRealms = HttpAuthCache::kMaxNumRealmEntries; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add the maxinim number of realm entries to the cache. Each of these entries 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must still be retrievable. Next add three more entries -- since the cache is 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// full this causes FIFO eviction of the first three entries. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthCacheEvictionTest, RealmEntryEviction) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxRealms; ++i) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRealm(i); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxRealms; ++i) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRealmExistence(i, true); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRealm(i + kMaxRealms); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRealmExistence(i, false); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxRealms; ++i) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRealmExistence(i + 3, true); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add the maximum number of paths to a single realm entry. Each of these 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// paths should be retrievable. Next add 3 more paths -- since the cache is 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// full this causes FIFO eviction of the first three paths. 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthCacheEvictionTest, RealmPathEviction) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxPaths; ++i) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPathToRealm(0, i); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < kMaxRealms; ++i) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRealm(i); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPathToRealm(0, i + kMaxPaths); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPathExistence(0, i, false); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxPaths; ++i) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPathExistence(0, i + 3, true); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxRealms; ++i) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRealmExistence(i, true); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 629