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