13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 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
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_auth_cache.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "googleurl/src/gurl.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing net::FtpAuthCache;
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kBogus(ASCIIToUTF16("bogus"));
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kOthername(ASCIIToUTF16("othername"));
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kOtherword(ASCIIToUTF16("otherword"));
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kPassword(ASCIIToUTF16("password"));
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kPassword1(ASCIIToUTF16("password1"));
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kPassword2(ASCIIToUTF16("password2"));
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kPassword3(ASCIIToUTF16("password3"));
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kUsername(ASCIIToUTF16("username"));
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kUsername1(ASCIIToUTF16("username1"));
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kUsername2(ASCIIToUTF16("username2"));
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst string16 kUsername3(ASCIIToUTF16("username3"));
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpAuthCacheTest, LookupAddRemove) {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache cache;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL origin1("ftp://foo1");
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL origin2("ftp://foo2");
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Lookup non-existent entry.
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add entry for origin1.
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(origin1, kUsername1, kPassword1);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache::Entry* entry1 = cache.Lookup(origin1);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(entry1);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(origin1, entry1->origin);
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kUsername1, entry1->username);
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kPassword1, entry1->password);
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for origin2.
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(origin2, kUsername2, kPassword2);
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache::Entry* entry2 = cache.Lookup(origin2);
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(entry2);
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(origin2, entry2->origin);
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kUsername2, entry2->username);
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kPassword2, entry2->password);
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The original entry1 should still be there.
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(origin1));
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Overwrite the entry for origin1.
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(origin1, kUsername3, kPassword3);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache::Entry* entry3 = cache.Lookup(origin1);
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(entry3);
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(origin1, entry3->origin);
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kUsername3, entry3->username);
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kPassword3, entry3->password);
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove entry of origin1.
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Remove(origin1, kUsername3, kPassword3);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove non-existent entry.
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Remove(origin1, kUsername3, kPassword3);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Check that if the origin differs only by port number, it is considered
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a separate origin.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpAuthCacheTest, LookupWithPort) {
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache cache;
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL origin1("ftp://foo:80");
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL origin2("ftp://foo:21");
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(origin1, kUsername, kPassword);
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(origin2, kUsername, kPassword);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(cache.Lookup(origin1), cache.Lookup(origin2));
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpAuthCacheTest, NormalizedKey) {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // GURL is automatically canonicalized. Hence the following variations in
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // url format should all map to the same entry (case insensitive host,
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // default port of 21).
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache cache;
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add.
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(GURL("ftp://HoSt:21"), kUsername, kPassword);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Lookup.
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache::Entry* entry1 = cache.Lookup(GURL("ftp://HoSt:21"));
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(entry1);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(GURL("ftp://host:21")));
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(GURL("ftp://host")));
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Overwrite.
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(GURL("ftp://host"), kOthername, kOtherword);
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache::Entry* entry2 = cache.Lookup(GURL("ftp://HoSt:21"));
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(entry2);
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(GURL("ftp://host"), entry2->origin);
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOthername, entry2->username);
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOtherword, entry2->password);
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Remove(GURL("ftp://HOsT"), kOthername, kOtherword);
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == NULL);
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpAuthCacheTest, OnlyRemoveMatching) {
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache cache;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(GURL("ftp://host"), kUsername, kPassword);
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")));
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Auth data doesn't match, shouldn't remove.
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Remove(GURL("ftp://host"), kBogus, kBogus);
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")));
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Auth data matches, should remove.
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Remove(GURL("ftp://host"), kUsername, kPassword);
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == NULL);
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpAuthCacheTest, EvictOldEntries) {
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FtpAuthCache cache;
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < FtpAuthCache::kMaxEntries; i++) {
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cache.Add(GURL("ftp://host" + base::IntToString(i)),
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              kUsername, kPassword);
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // No entries should be evicted before reaching the limit.
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < FtpAuthCache::kMaxEntries; i++) {
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_TRUE(cache.Lookup(GURL("ftp://host" + base::IntToString(i))));
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Adding one entry should cause eviction of the first entry.
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Add(GURL("ftp://last_host"), kUsername, kPassword);
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://host0")) == NULL);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remaining entries should not get evicted.
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 1; i < FtpAuthCache::kMaxEntries; i++) {
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_TRUE(cache.Lookup(GURL("ftp://host" + base::IntToString(i))));
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(GURL("ftp://last_host")));
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
157