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