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