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