1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/password_manager/core/browser/field_info_table.h"
6 
7 #include <vector>
8 
9 #include "base/files/scoped_temp_dir.h"
10 #include "build/build_config.h"
11 #include "components/autofill/core/browser/field_types.h"
12 #include "components/autofill/core/common/signatures.h"
13 #include "sql/database.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 using autofill::PASSWORD;
18 using autofill::SINGLE_USERNAME;
19 using autofill::USERNAME;
20 using base::Time;
21 using testing::ElementsAre;
22 
23 namespace password_manager {
24 namespace {
25 
26 class FieldInfoTableTest : public testing::Test {
27  protected:
SetUp()28   void SetUp() override {
29     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
30     ReloadDatabase();
31   }
32 
ReloadDatabase()33   void ReloadDatabase() {
34     base::FilePath file = temp_dir_.GetPath().AppendASCII("TestDatabase");
35     field_info_table_ = std::make_unique<FieldInfoTable>();
36     db_ = std::make_unique<sql::Database>();
37     db_->set_exclusive_locking();
38     ASSERT_TRUE(db_->Open(file));
39     field_info_table_->Init(db_.get());
40     ASSERT_TRUE(field_info_table_->CreateTableIfNecessary());
41 
42     test_data_.push_back({autofill::FormSignature(101u),
43                           autofill::FieldSignature(1u), USERNAME,
44                           Time::FromTimeT(1)});
45     test_data_.push_back({autofill::FormSignature(101u),
46                           autofill::FieldSignature(10u), PASSWORD,
47                           Time::FromTimeT(5)});
48     test_data_.push_back({autofill::FormSignature(102u),
49                           autofill::FieldSignature(1u), SINGLE_USERNAME,
50                           Time::FromTimeT(10)});
51   }
52 
53   base::ScopedTempDir temp_dir_;
54   std::unique_ptr<sql::Database> db_;
55   std::unique_ptr<FieldInfoTable> field_info_table_;
56   std::vector<FieldInfo> test_data_;
57 };
58 
59 #if !defined(OS_ANDROID)
TEST_F(FieldInfoTableTest,AddRow)60 TEST_F(FieldInfoTableTest, AddRow) {
61   EXPECT_TRUE(field_info_table_->AddRow(test_data_[0]));
62   EXPECT_EQ(test_data_[0], field_info_table_->GetAllRows()[0]);
63 }
64 
TEST_F(FieldInfoTableTest,Reload)65 TEST_F(FieldInfoTableTest, Reload) {
66   EXPECT_TRUE(field_info_table_->AddRow(test_data_[0]));
67   ReloadDatabase();
68   EXPECT_EQ(test_data_[0], field_info_table_->GetAllRows()[0]);
69 }
70 
TEST_F(FieldInfoTableTest,AddManyRow)71 TEST_F(FieldInfoTableTest, AddManyRow) {
72   for (const FieldInfo& field : test_data_)
73     EXPECT_TRUE(field_info_table_->AddRow(field));
74   EXPECT_EQ(test_data_, field_info_table_->GetAllRows());
75 }
76 
TEST_F(FieldInfoTableTest,RemoveRowsByTime)77 TEST_F(FieldInfoTableTest, RemoveRowsByTime) {
78   for (const FieldInfo& field : test_data_)
79     EXPECT_TRUE(field_info_table_->AddRow(field));
80   field_info_table_->RemoveRowsByTime(Time::FromTimeT(1), Time::FromTimeT(10));
81   std::vector<FieldInfo> expected_rows = {test_data_[2]};
82   EXPECT_EQ(expected_rows, field_info_table_->GetAllRows());
83 }
84 
TEST_F(FieldInfoTableTest,GetAllRowsForFormSignature)85 TEST_F(FieldInfoTableTest, GetAllRowsForFormSignature) {
86   for (const FieldInfo& field : test_data_)
87     EXPECT_TRUE(field_info_table_->AddRow(field));
88 
89   constexpr uint64_t kFirstFormSignature = 101u;
90   constexpr uint64_t kSecondFormSignature = 102u;
91   constexpr uint64_t kNotExistingSignature = 1001;
92 
93   std::vector<FieldInfo> expected_rows = {test_data_[0], test_data_[1]};
94   EXPECT_EQ(expected_rows,
95             field_info_table_->GetAllRowsForFormSignature(kFirstFormSignature));
96 
97   expected_rows = {test_data_[2]};
98   EXPECT_EQ(expected_rows, field_info_table_->GetAllRowsForFormSignature(
99                                kSecondFormSignature));
100 
101   EXPECT_TRUE(
102       field_info_table_->GetAllRowsForFormSignature(kNotExistingSignature)
103           .empty());
104 }
105 
TEST_F(FieldInfoTableTest,DropTableIfExists)106 TEST_F(FieldInfoTableTest, DropTableIfExists) {
107   ASSERT_TRUE(db_->DoesTableExist("field_info"));
108   EXPECT_TRUE(field_info_table_->DropTableIfExists());
109   EXPECT_FALSE(db_->DoesTableExist("field_info"));
110   EXPECT_FALSE(field_info_table_->DropTableIfExists());
111 }
112 
113 #else
TEST_F(FieldInfoTableTest,NoTable)114 TEST_F(FieldInfoTableTest, NoTable) {
115   EXPECT_FALSE(db_->DoesTableExist("field_info"));
116 }
117 
TEST_F(FieldInfoTableTest,AddRowNoOp)118 TEST_F(FieldInfoTableTest, AddRowNoOp) {
119   EXPECT_FALSE(field_info_table_->AddRow(test_data_[0]));
120   EXPECT_TRUE(field_info_table_->GetAllRows().empty());
121 }
122 
123 #endif  // !defined(OS_ANDROID)
124 
125 }  // namespace
126 }  // namespace password_manager
127