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