1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/login_database.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/password_form.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::PasswordForm; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginDatabaseTest : public testing::Test { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::DIR_TEST_DATA, &file_); 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string test_db = 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "TestMetadataStoreMacDatabase" + 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::Int64ToString(base::Time::Now().ToInternalValue()) + ".db"; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_ = file_.AppendASCII(test_db); 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::Delete(file_, false); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown() { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::Delete(file_, false); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(LoginDatabaseTest, Logins) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<LoginDatabase> db(new LoginDatabase()); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(db->Init(file_)); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> result; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verify the database is empty. 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Example password form. 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.origin = GURL("http://www.google.com/accounts/LoginAuth"); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.action = GURL("http://www.google.com/accounts/Login"); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.username_element = ASCIIToUTF16("Email"); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.username_value = ASCIIToUTF16("test@gmail.com"); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.password_element = ASCIIToUTF16("Passwd"); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.password_value = ASCIIToUTF16("test"); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.submit_element = ASCIIToUTF16("signIn"); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.signon_realm = "http://www.google.com/"; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.ssl_valid = false; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.preferred = false; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.scheme = PasswordForm::SCHEME_HTML; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add it and make sure it is there. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->AddLogin(form)); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Match against an exact copy. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form, &result)); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The example site changes... 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form2(form); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form2.origin = GURL("http://www.google.com/new/accounts/LoginAuth"); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form2.submit_element = ASCIIToUTF16("reallySignIn"); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Match against an inexact copy 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form2, &result)); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Uh oh, the site changed origin & action URLs all at once! 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form3(form2); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form3.action = GURL("http://www.google.com/new/accounts/Login"); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // signon_realm is the same, should match. 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form3, &result)); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Imagine the site moves to a secure server for login. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form4(form3); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form4.signon_realm = "https://www.google.com/"; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form4.ssl_valid = true; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We have only an http record, so no match for this. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form4, &result)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's imagine the user logs into the secure site. 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->AddLogin(form4)); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, result.size()); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[1]; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now the match works 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form4, &result)); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The user chose to forget the original but not the new. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->RemoveLogin(form)); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The old form wont match the new site (http vs https). 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form, &result)); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The user's request for the HTTPS site is intercepted 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by an attacker who presents an invalid SSL cert. 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form5(form4); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form5.ssl_valid = 0; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // It will match in this case. 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form5, &result)); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // User changes his password. 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form6(form5); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form6.password_value = ASCIIToUTF16("test6"); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form6.preferred = true; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We update, and check to make sure it matches the 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // old form, and there is only one record. 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rows_changed = 0; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->UpdateLogin(form6, &rows_changed)); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, rows_changed); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // matches 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form5, &result)); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Only one record. 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Password element was updated. 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On the Mac we should never be storing passwords in the database. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(string16(), result[0]->password_value); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(form6.password_value, result[0]->password_value); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Preferred login. 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(form6.preferred); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result[0]; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.clear(); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure everything can disappear. 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->RemoveLogin(form4)); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool AddTimestampedLogin(LoginDatabase* db, std::string url, 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& unique_string, 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const base::Time& time) { 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Example password form. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.origin = GURL(url + std::string("/LoginAuth")); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.username_element = ASCIIToUTF16(unique_string); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.username_value = ASCIIToUTF16(unique_string); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.password_element = ASCIIToUTF16(unique_string); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.submit_element = ASCIIToUTF16("signIn"); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.signon_realm = url; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.date_created = time; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return db->AddLogin(form); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void ClearResults(std::vector<PasswordForm*>* results) { 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < results->size(); ++i) { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete (*results)[i]; 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch results->clear(); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(LoginDatabaseTest, ClearPrivateData_SavedPasswords) { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<LoginDatabase> db(new LoginDatabase()); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->Init(file_)); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> result; 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verify the database is empty. 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time now = base::Time::Now(); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta one_day = base::TimeDelta::FromDays(1); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create one with a 0 time. 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AddTimestampedLogin(db.get(), "1", "foo1", base::Time())); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create one for now and +/- 1 day. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AddTimestampedLogin(db.get(), "2", "foo2", now - one_day)); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AddTimestampedLogin(db.get(), "3", "foo3", now)); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AddTimestampedLogin(db.get(), "4", "foo4", now + one_day)); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verify inserts worked. 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(4U, result.size()); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearResults(&result); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get everything from today's date and on. 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLoginsCreatedBetween(now, base::Time(), &result)); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, result.size()); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearResults(&result); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete everything from today's date and on. 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db->RemoveLoginsCreatedBetween(now, base::Time()); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should have deleted half of what we inserted. 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, result.size()); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearResults(&result); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete with 0 date (should delete all). 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db->RemoveLoginsCreatedBetween(base::Time(), base::Time()); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verify nothing is left. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, result.size()); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(LoginDatabaseTest, BlacklistedLogins) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<LoginDatabase> db(new LoginDatabase()); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->Init(file_)); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> result; 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verify the database is empty. 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetBlacklistLogins(&result)); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0U, result.size()); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Save a form as blacklisted. 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PasswordForm form; 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.origin = GURL("http://www.google.com/accounts/LoginAuth"); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.action = GURL("http://www.google.com/accounts/Login"); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.username_element = ASCIIToUTF16("Email"); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.password_element = ASCIIToUTF16("Passwd"); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.submit_element = ASCIIToUTF16("signIn"); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.signon_realm = "http://www.google.com/"; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.ssl_valid = false; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.preferred = true; 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.blacklisted_by_user = true; 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form.scheme = PasswordForm::SCHEME_HTML; 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->AddLogin(form)); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get all non-blacklisted logins (should be none). 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetAutofillableLogins(&result)); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0U, result.size()); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // GetLogins should give the blacklisted result. 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetLogins(form, &result)); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearResults(&result); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // So should GetAllBlacklistedLogins. 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db->GetBlacklistLogins(&result)); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, result.size()); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearResults(&result); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 284